Страница 1 из 1

Некорректная работа UDF

Добавлено: 03 апр 2007, 14:24
slc
Доброго времени суток!

Использую 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.

Подскажите, где ошибка?

Добавлено: 03 апр 2007, 15:46
WildSery
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?

Добавлено: 03 апр 2007, 15:47
kdv
Использую IB 5.5
плохо, очень плохо. Надо 5.6.
Проблемы заключаются в следующем
отвечаю, в чем проблема:

1. процедура это не UDF
2. в процедуре надо было написать волшебное слово SUSPEND
3. читай документацию или книжки.

Добавлено: 03 апр 2007, 15:50
WildSery
Да, кстати, про саспенд забыл :oops:

Добавлено: 03 апр 2007, 15:50
WildSery
kdv писал(а):плохо, очень плохо. Надо 5.6.
Кстати, а он ещё продаётся?

Добавлено: 03 апр 2007, 15:52
kdv
Кстати, а он ещё продаётся?
только под заказ, запросом через представительство Borland/Codegear. И понятно, в количестве не 1 шт.

Медиакитов нет, все, они сгинули. У меня есть диск медиакита, могу сдублировать (при покупке лицензий через нас).

Добавлено: 03 апр 2007, 15:56
slc
WildSery писал(а): Надо так:

Код: Выделить всё

SQL.Text:='SELECT d1, d2 FROM TEST(:date_begin, :date_end)';
Prepare;
ParamByName('date_end').AsDateTime:=date2;

Спасибо, помогло.

WildSery писал(а):
3.
При чём тут UDF?
Да, не при чем. Ошибся в термине.