Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
DPF
- Сообщения: 5
- Зарегистрирован: 17 фев 2005, 02:16
Сообщение
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 ставишь столько скобок? я тебе еще в первом ответе их повырезал.