Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование UDF функции в запросе с параметрами [D5]


AlexeyMir ©   (2008-03-09 23:56:00) 

Подскажите, пожалуйста, я использую базу Firebird.
Я написал функцию UDF CheckA(CSTRING(254), CSTRING(2000)):INTEGER второй параметр состоит из списка значений разделенных ';', функция возвращает 1, если значение первого параметра присутствует в списке значений второго параметра, если нет то - 0.
Пишу IBQuery1.SQL.TEXT:='select * from tov where CheckA(kod,"1;2;3")=1'  - работает замечательно

а если
IBQuery1.SQL.TEXT:='select * from tov where CheckA(kod,:bb)=1';
IBQuery1.ParamByName('bb').AsString:='1;2;3';
IBQuery[i_query].Open;
Ругается: Dynamic SQL Error. SQL Error Code=-804. Data type unknown.

Пробовал и через инспектор объектов Params,  добавлять параметр bb, указывал DataType, ParamType, Value, Value.Type - все равно таже ошибка


AlexeyMir   (2008-03-11 16:25:00) [1]

Да, я попробовал последний пример, он работает, но это если параметр является числом. А если параметр строка, то опять таже ошибка: Dynamic SQL Error. SQL Error Code=-804. Data type unknown.

Пробовал предварительно поставить IBQuery1.ParamByName('bb').DataType:= ftString - не помогает.
Может быть нужно как-то по другому писать функцию для работы с параметрами?
сервер - Firebird-1.5.2.4731-Win32


Правильный_Вася   (2008-03-10 16:00:00) [2]


> Не поможет.

больно ты категоричен
версия сервера у автора не указана
у меня на D7, FB 1.53 прекрасно проходит запрос
select t.* from objnames t where substr(t.obj_name,1,:x)='1'
правда, юзаю dbexpress, а не ibexpress, но у автора ругается сервер, поэтому компоненты доступа тут ни при чем
procedure TForm1.Button1Click(Sender: TObject);
begin
sqldataset1.ParamByName('x').asinteger:=3;
sqldataset1.Open;
application.MessageBox('получилось','ура');
end;


PEAKTOP   (2008-03-10 14:50:00) [3]

> Ну а предварительное IBQuery1.ParamByName('bb').DataType:= ftString не поможет?

Не поможет.


DrPass   (2008-03-10 11:15:00) [4]


> IBQuery1.ParamByName('bb').AsString:='1;2;3';

Ну а предварительное IBQuery1.ParamByName('bb').DataType:= ftString не поможет?


PEAKTOP   (2008-03-10 03:31:00) [5]

Params - это параметры запроса, которые отправляются серверу, когда запросу уже скомпилирован. То есть это подходит для полей наборов данных. Тебе же нужно передать в UDF параметр, что IB/FB за тебя не сделает, т.к. этот механизм на UDF не распространяется.

Присваивай явно:

IBQuery1.SQL.TEXT:='select t.* from tov t where CheckA(t.kod,'''+'1;2;3'+''') = 1 ';


Наверх

Титульная страница Поиск, карта сайта Написать письмо