Не могу передать параметр в UDF

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
KVas
Сообщения: 31
Зарегистрирован: 01 июн 2005, 16:01

Не могу передать параметр в UDF

Сообщение KVas » 21 дек 2005, 13:01

Ситуация следующая: есть ХП

CREATE PROCEDURE CALCS1
RETURNS ( RES NUMERIC(15,2))
AS
DECLARE VARIABLE TMP_REAL DOUBLE PRECISION;
begin
tmp_real=1.256; /*тут будет результат вычисленя*/
res=R2(tmp_real); /*R2-округляет до двух знаков после запятой*/
suspend;
END

и есть UDF

function R2(X:Double):Double;cdecl;export;
begin
// тут будет что-то вычисляться и округляться
// пока только возвращаю значение входного параметра
result:=X;
end;

ХП объявлена как

DECLARE EXTERNAL FUNCTION R2
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'R2' MODULE_NAME 'udf_ib';

сервер Firebird 1.5.2, база имеет Dialect 1.

При выполнении процедуры в IBExpert'e переменная RES получает значение NULL. Если в R2 строку result:=X; заменить на result:=11.266; получаю 0. Round из rfunc.dll работает чудесно, но моя цель научиться писать свои UDF и первые шаги делаю на простых примерах. Вот на первом-же шаге уперся лбом в проблему - не могу даже вернуть в процедуру начальный параметр. Подскажите, что я делаю не так.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 21 дек 2005, 13:56

Ну а посмотреть как это сделано в той же rfunc не судьба?
Во-первых, function R2(X:PDouble):Double;cdecl;export;
Во-вторых, RETURNS DOUBLE PRECISION BY_VALUE

KVas
Сообщения: 31
Зарегистрирован: 01 июн 2005, 16:01

Сообщение KVas » 22 дек 2005, 10:02

Dimitry Sibiryakov писал(а):Ну а посмотреть как это сделано в той же rfunc не судьба?
Дык там на С++, а я и с Delphi-то не разобрался ещё как следует :oops: За совет спасибо, коротко и внятно и все заработало. Для таких же спецов как я добавлю - при использовании X:PDouble, вместо строки Result:=X, нужно писать Result:=X^; :D

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 дек 2005, 10:10

я добавлю, что Result:=X^ - это суперизврат. И специально для спецов рекомендую смотреть примеры на сайте и статью Кукарцева по написанию UDF.

KVas
Сообщения: 31
Зарегистрирован: 01 июн 2005, 16:01

Сообщение KVas » 22 дек 2005, 17:23

kdv писал(а):...специально для спецов рекомендую смотреть примеры на сайте и статью Кукарцева по написанию UDF.
Буду очень признателен за ссылочку и на статью и на примеры :roll:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 дек 2005, 17:33

статья и "ссылочки" - на сайте WWW.IBASE.RU
в Download - целый раздел по udf с тучей примеров. Или ты как на сайт зашел, сразу сиганул на форум вопросы задавать? :)

Ответить