Запрос на Выборку по Дате из Delphi в TIBQuery

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
DPF
Сообщения: 5
Зарегистрирован: 17 фев 2005, 02:16

Запрос на Выборку по Дате из Delphi в TIBQuery

Сообщение DPF » 17 фев 2005, 02:49

Помогите, прошу Вас Запутался чего-то:

Давлю на "Кнопку" и:

Код: Выделить всё

var
  dA, dB: String;
...
   
    dA := DateToStr(MonthCalendar1.Date);
    dB := DateToStr(MonthCalendar2.Date);

    MastData.IBQuery2.Close;
    MastData.IBQuery2.SQL.Clear;
    MastData.IBQuery2.SQL.Add( 
          'SELECT SUM(KOLVO*CENZAK) SUMALL ' +
          'FROM SKLAD ' +
          'WHERE ((IDMC = ' + DBEdit1.Field.AsString +
          ') ADD (DATZAK >= ' + QuotedStr(dA) +
          ')) ADD (DATZAK <= ' + QuotedStr(dB) + ')' );
          MastData.IBQuery2.Open;
и в результате ОШИБКА -104 ... Я так полагаю надо дату в ' ' а
не получается .... пробовал и CAST(' + dA + 'AS DATE) ....
Посоветуйте что сделать заранее благодарен ...


kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 фев 2005, 10:14

"ошибка 104" - это сильно, можно подумать кто-то помнит ошибки по номерам. ты лучше бы текст сообщения привел. Заодно посмотри, что у тебя получается в da и db, может просто строковый формат даты не соответствует тому, что хочет сервер. у него же жесткий формат конвертации.
Возможно, проще не морочить голову, и даты передавать в виде параметров

Код: Выделить всё

var
   MastData.IBQuery2.Close;
   MastData.IBQuery2.SQL.Clear;
   MastData.IBQuery2.SQL.Add(
          'SELECT SUM(KOLVO*CENZAK) SUMALL ' +
          'FROM SKLAD ' +
          'WHERE IDMC = :idmc '+
          ' AND DATZAK >= :da ' +
          ' AND DATZAK <= :db' );        MastData.IBQuery2.ParamByName('idmc').asInteger:=DBEdit1.Field.asInteger;
MastData.IBQuery2.ParamByName('da').asDate:=MonthCalendar1.Date;
MastData.IBQuery2.ParamByName('db').asDate:=MonthCalendar2.Date;
MastData.IBQuery2.Open;
насчет типа idmc не уверен, я не знаю что за столбец у тебя IDMC в SKLAD.

DPF
Сообщения: 5
Зарегистрирован: 17 фев 2005, 02:16

Сообщение DPF » 17 фев 2005, 15:15

[quote]
Спасибо за ответ... Ошибка -104: ... Token unknown - line1, char 65
ADD' ....

в IBExpert этот же запрос пишется с датами в виде '01.10.2004' и все нормально ....

перед тем как посылать ЭТОТ Запрос на выборку ....
в другой проге я сохранял записи в БД вот таким кодом:

DMIB.IBQuery2.SQL.Clear;
DMIB.IBQuery2.SQL.Add('INSERT INTO Sklad (idmc, datzak, kolvo,
cenzak) ' +
'VALUES ( ' + sP2 + ', ' + QuotedStr(sP3) + ', '
+ sP4 + ', ' + sP5 + ')');
DMIB.IBQuery2.ExecSQL;

функция QuotedStr добавляет кавычки и ТУТ ЗНАЧИТ IB смог перевести строку в дату А В SELECT'e НЕ МОЖЕТ потому как ему надо не в виде "01.01.2004" а в виде '01.01.2004' но как то не получается передать значение переменной с апострофом

неужели единственный выход писать Запрос с Параметром (Paradox или BDE глотал легко ... токой вид ПАРАМЕТРОВ: + sP2 + ', ' + QuotedStr(sP3) + ', ' в Запросах а IBQuery НЕ МОЖЕТ? ) ....

Или Следует писать UDF по конвертации?
Статейку соответствующую уже распечатал но что-то боязно ....

Пробую освоить ПАРАМЕТРЫ в IBQuery по вашему примеру ....

Олег
Сообщения: 5
Зарегистрирован: 17 фев 2005, 15:27

Сообщение Олег » 17 фев 2005, 15:49

...но как то не получается передать значение переменной с апострофом?
Попробуй так:

Код: Выделить всё

MastData.IBQuery2.Close; 
MastData.IBQuery2.SQL.Clear; 
MastData.IBQuery2.SQL.Add( 
  'SELECT SUM(KOLVO*CENZAK) SUMALL ' + 
  'FROM SKLAD ' + 
  'WHERE IDMC = ' + DBEdit1.Field.AsString +  
  ' ADD DATZAK >= ' + #39 + 
     FormatDateTime('mm/dd/yyyy',MonthCalendar1.Date) + #39 + 
  ' ADD DATZAK <= ' + #39 + 
     FormatDateTime('mm/dd/yyyy',MonthCalendar2.Date) + #39); 
MastData.IBQuery2.Open;

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 фев 2005, 16:28

гм, никаких проблем вставить одинарные кавычки в строку нет.
Двойные кавычки в третьем диалекте используются для идентификаторов (см. Faq и "руководство по переходу...").

так что, проблема не в сервере, а в твоем коде.

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Сообщение Дмитрий » 17 фев 2005, 18:21

По моему, в коде ошибка. Что это за слово такое "ADD"? Может "AND" подразумевается? Тогда либо код в форуме с ошибкой, либо в тексте проги ошибка. Отсюда и сообщение
Ошибка -104: ... Token unknown - line1, char 65
ADD'

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 фев 2005, 19:53

вот я и говорю - кто их помнит, коды ошибок. ТЕКСТ ОШИБКИ НАДО ПРИВОДИТЬ ПОЛНОСТЬЮ! ](*,)

:)

p.s. и не только приводить, но еще и самому ВНИМАТЕЛЬНО ЧИТАТЬ.

DPF
Сообщения: 5
Зарегистрирован: 17 фев 2005, 02:16

Сообщение DPF » 17 фев 2005, 22:14

ADD ADD ADD ....
какое? ADD? должно то быть AND
ну Я и "Лопух" ПРОШУ ПРОЩЕНИЯ за свою
НЕВНИМАТЕЛЬНОСТЬ точно ПЕРЕСИДЕЛ, почаще отдыхать
надо (хотя такие ошибки, у начинающих
осваивать новое для себя, часто происходят)

Вот работающие варианты:

// Вариант 1 ---------------------------------------

var
dA, dB, sK: String;
...

dA := DateToStr(MonthCalendar1.Date); // Дата С ...
dB := DateToStr(MonthCalendar2.Date); // Дата По ...
sK := DBEdit1.Field.AsString; // Код Товара

MastData.IBQuery2.Close;
MastData.IBQuery2.SQL.Clear;
MastData.IBQuery2.SQL.Add(
'SELECT SUM(KOLVO*CENZAK) SUMALL ' +
'FROM SKLAD ' +
'WHERE ( (IDMC = ' + sK +
') AND ((DATZAK >= ' + QuotedStr(dA) +
') AND (DATZAK <= ' + QuotedStr(dB) + ')) )' );
MastData.IBQuery2.Open;

Здесь Дата в "кавычках" прокатывает ... с помощью функции QuotedStr

// Вариант 2 ---------------------------------------

var
dA, dB, sK: String;
...

dA := DateToStr(MonthCalendar1.Date); // Дата С ...
dB := DateToStr(MonthCalendar2.Date); // Дата По ...
sK := DBEdit1.Field.AsString; // Код Товара

dA := AnsiQuotedStr(dA, Chr(Ord(''''))); // Дополнительно апострофы клеем
dB := AnsiQuotedStr(dB, Chr(Ord(''''))); // Дополнительно апострофы клеем

MastData.IBQuery2.Close;
MastData.IBQuery2.SQL.Clear;
MastData.IBQuery2.SQL.Add(
'SELECT SUM(KOLVO*CENZAK) SUMALL ' +
'FROM SKLAD ' +
'WHERE ( (IDMC = ' + sK +
') AND ((DATZAK >= ' + dA +
') AND (DATZAK <= ' + dB + ')) )' );
MastData.IBQuery2.Open;

Здесь Дата в 'апострофах' прокатывает ... с помощью функции AnsiQuotedStr

// Вариант 3 НЕ РАБОТАЕТ ****************************************

var
dA, dB, sK: String;
...

dA := DateToStr(MonthCalendar1.Date); // Дата С ...
dB := DateToStr(MonthCalendar2.Date); // Дата По ...
sK := DBEdit1.Field.AsString; // Код Товара

MastData.IBQuery2.Close;
MastData.IBQuery2.SQL.Clear;
MastData.IBQuery2.SQL.Add(
'SELECT SUM(KOLVO*CENZAK) SUMALL ' +
'FROM SKLAD ' +
'WHERE ( (IDMC = ' + sK +
') AND ((DATZAK >= ' + dA +
') AND (DATZAK <= ' + dB + ')) )' );
MastData.IBQuery2.Open;

Здесь Дата в <ГОЛОЙ> строке получается....??????

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 фев 2005, 22:49

Вариант 3 НЕ РАБОТАЕТ
а с какого бодуна он должен работать?

p.s. нафига ты для and ставишь столько скобок? я тебе еще в первом ответе их повырезал.

Ответить