[РЕШЕНО] Разная работа TZQuery при загрузке SQL из файла

Модератор: Модераторы

[РЕШЕНО] Разная работа TZQuery при загрузке SQL из файла

Сообщение java73 » 29.07.2015 16:33:22

Добрый день.
В прошлый раз я сочинял сложноватый SQL запрос, в итоге получился такой код:
Код: Выделить всё
DM1.TMSelected.SQL.Add('SELECT DISTINCT trademarks.Number, CASE trademarks.IsJurholder');
DM1.TMSelected.SQL.Add('WHEN 1 THEN (SELECT Shortname FROM investpatents.jurlica WHERE ID=HolderID)');
DM1.TMSelected.SQL.Add('WHEN 0 THEN (SELECT CONCAT(Familia,'' '',LEFT(Name,1),''.'',LEFT(Otchestvo,1),''.'') FROM investpatents.fizlica WHERE ID=HolderID)');
DM1.TMSelected.SQL.Add('WHERE trademarks.ID IN ('+ID+')');
DM1.TMSelected.Open;

где в ID строка, в которой формируется перечень номеров, выбранных пользователем.
Этот код отлично работает.
Однако, тот же SQL запрос, перенесенный в файл с параметром вместо ручного добавления ID при форматировании строки, работает криво - а именно возвращает лишь только одну первую строку из выбранного набора.
не могу понять причину.
Код: Выделить всё
DM1.TMSelected.SQL.LoadFromFile('TMselect.sql');
DM1.TMSelected.ParamByName('IDlist').AsString:=ID;
       DM1.TMSelected.Open;

Текст SQL запроса тот же самый:
Код: Выделить всё
SELECT DISTINCT trademarks.Number, CASE trademarks.IsJurholder
WHEN 1 THEN
(SELECT Shortname FROM investpatents.jurlica WHERE ID=HolderID)
WHEN 0 THEN
(SELECT CONCAT(Familia,' ',LEFT(Name,1),'.',LEFT(Otchestvo,1),'.') FROM investpatents.fizlica WHERE ID=HolderID)
END AS Shortname
FROM investpatents.trademarks, investpatents.jurlica, investpatents.fizlica
WHERE trademarks.ID IN (:IDlist);


Добавлено спустя 51 минуту 8 секунд:
SQL запрос в консоле mysql работает правильно. Видимо проблема в момент отработки DM1.TMSelected.ParamByName('IDlist').AsString:=ID случается.
Но что там может быть-то???
Последний раз редактировалось java73 30.07.2015 19:46:42, всего редактировалось 1 раз.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Разная работа TZQuery при загрузке SQL из файла и ручном

Сообщение grot » 29.07.2015 17:31:00

Посмотри еще раз на эту свою "ID строка"...
Точнее, на двойные и одинарные кавычки там - строка в fpc - это одинарные кавычки, строка в SQL может быть и так и сяк - убедись, что у тебя двойные кавычки для строк в SQL ...
grot
новенький
 
Сообщения: 74
Зарегистрирован: 13.02.2010 16:33:03

Re: Разная работа TZQuery при загрузке SQL из файла и ручном

Сообщение java73 » 29.07.2015 18:17:32

grot писал(а):grot » 29.07.2015 17:31:00

Посмотри еще раз на эту свою "ID строка"...
Точнее, на двойные и одинарные кавычки там - строка в fpc - это одинарные кавычки, строка в SQL может быть и так и сяк - убедись, что у тебя двойные кавычки для строк в SQL ...

В этом ошибки нет. Двойные кавычки в коде, чтобы записать именно символ кавычки в SQL запрос.

Добавлено спустя 1 минуту 48 секунд:
Re: Разная работа TZQuery при загрузке SQL из файла и ручном наб
ID формируется как последовательность выбранных индексов, т.е. ID='1,2,3...n'
Повторю, запрос из файла нормально работает в консоле, в mysqlworkbench, а в программе выдает только первую строку...
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Разная работа TZQuery при загрузке SQL из файла и ручном

Сообщение Vadim » 29.07.2015 18:58:31

java73
После того, как Вы присвоили значение параметру, проверьте, что именно в этом параметре находится.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Разная работа TZQuery при загрузке SQL из файла и ручном

Сообщение java73 » 29.07.2015 19:10:31

Код
Код: Выделить всё
DM1.TMSelected.Open;
ShowMessage(DM1.TMSelected.ParamByName('IDlist').AsString);

выделил первые четыре записи, сообщение вывело строку 1,9,8,6
следовательно в параметр строка правильно передается.

Добавлено спустя 16 минут 33 секунды:
Re: Разная работа TZQuery при загрузке SQL из файла и ручном наб
Решение:
Код: Выделить всё
DM1.TMSelected.SQL.Text:=StringReplace(DM1.TMSelected.SQL.Text,':IDlist',ID,[rfReplaceAll]);


то есть парсинг текста SQL запроса не с помощью параметра, а тупо найти/заменить.

На форуме оракловодов прочитал, что у них тоже проблемы с передачей параметра в оператор IN...
Будто это страшное что-то. Ладно, так работает.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Разная работа TZQuery при загрузке SQL из файла и ручном

Сообщение Vadim » 29.07.2015 20:00:43

java73
Тогда просто меняйте последнюю строку Вашего запроса:
Код: Выделить всё
DM1.TMSelected.SQL[7]:='WHERE trademarks.ID IN '+ID+')';
If DM1.TMSelected.Active Then
  DM1.TMSelected.Refresh
Else
  DM1.TMSelected.Open;

не трогая всех остальных строк запроса.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru