![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование 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 ';