Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
slc
- Сообщения: 15
- Зарегистрирован: 22 авг 2006, 11:45
Сообщение
slc » 03 апр 2007, 14:24
Доброго времени суток!
Использую IB 5.5, Delphi 7. Есть тестовая UDF следующего содержания
Код: Выделить всё
CREATE PROCEDURE TEST (
DATE_BEGIN DATE,
DATE_END DATE)
RETURNS (
D1 DATE,
D2 DATE)
AS
begin
D1 = :Date_Begin;
D2 = :Date_End;
end
===
Фрагмент текста программы:
===
date1:=Yesterday;
date2:=Tomorrow;
with IBQuery1 do
begin
ParamByName('date_begin').AsDateTime:=date1;
ParamByName('date_end').AsDateTime:=date2;
SQL.Clear;
SQL.Add('SELECT d1, d2 FROM TEST(:date_begin, :date_end)');
Open;
with Memo1.Lines do
begin
Clear;
Add('Значение переменной:');
Add('date1 = ' + DateToStr(date1));
Add('date2 = ' + DateToStr(date2));
Add('Значение параметра:');
Add('date_begin = ' + DateToStr(ParamByName('date_begin').AsDate));
Add('date_end = ' + DateToStr(ParamByName('date_end').AsDate));
Add('Значение функции:');
Add('d1 = ' + DateToStr(FieldByName('d1').AsDateTime));
Add('d2 = ' + DateToStr(FieldByName('d2').AsDateTime));
end;
end;
Проблемы заключаются в следующем:
1) При первом исполнении данного кода значения переменной и параметра выводятся правильно, а возвращаемое функцией - 30.12.1899.
2) При втором и т.д. исполнении - верным остается только значение переменной, а значения параметра и возвращаемое функцией - 30.12.1899.
Подскажите, где ошибка?
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 03 апр 2007, 15:46
1. Пользуйся кнопкой "Code" для выделения кода
2.Код: Выделить всё
ParamByName('date_end').AsDateTime:=date2;
SQL.Clear;
SQL.Add('SELECT d1, d2 FROM TEST(:date_begin, :date_end)');
У тебя сперва присваивается значение параметру, затем меняется сам текст SQL, и неизвестно (сервер не телепат), будет ли там вообще такой параметр.
Надо так:
Код: Выделить всё
SQL.Text:='SELECT d1, d2 FROM TEST(:date_begin, :date_end)';
Prepare;
ParamByName('date_end').AsDateTime:=date2;
3. При чём тут UDF?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 03 апр 2007, 15:47
Использую IB 5.5
плохо, очень плохо. Надо 5.6.
Проблемы заключаются в следующем
отвечаю, в чем проблема:
1. процедура это не UDF
2. в процедуре надо было написать волшебное слово SUSPEND
3. читай документацию или книжки.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 03 апр 2007, 15:50
Да, кстати, про саспенд забыл

-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 03 апр 2007, 15:50
kdv писал(а):плохо, очень плохо. Надо 5.6.
Кстати, а он ещё продаётся?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 03 апр 2007, 15:52
Кстати, а он ещё продаётся?
только под заказ, запросом через представительство Borland/Codegear. И понятно, в количестве не 1 шт.
Медиакитов нет, все, они сгинули. У меня есть диск медиакита, могу сдублировать (при покупке лицензий через нас).
-
slc
- Сообщения: 15
- Зарегистрирован: 22 авг 2006, 11:45
Сообщение
slc » 03 апр 2007, 15:56
WildSery писал(а):
Надо так:
Код: Выделить всё
SQL.Text:='SELECT d1, d2 FROM TEST(:date_begin, :date_end)';
Prepare;
ParamByName('date_end').AsDateTime:=date2;
Спасибо, помогло.
WildSery писал(а):
3. При чём тут UDF?
Да, не при чем. Ошибся в термине.