Учусь писать udf

Модераторы: kdv, CyberMax

Ответить
Nikos52
Сообщения: 3
Зарегистрирован: 26 апр 2012, 06:03

Учусь писать udf

Сообщение Nikos52 » 30 апр 2012, 13:06

Здравствуйте,

WinXP SP3, FireBird 2.5 Version 5.2.1.26351, IBExpert 2012.04.18, Delphi 7.0 (Build 8.1)

Цель: Научиться писать собственные UDF функции. Например для начала написал две простые UDF функции для обработки даты.

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

function fDateOf (Value: double): double;
begin
 Result := DateOf(Value);
end;
function fTimeOf(Value: double): double;
begin
 Result := TimeOf(Value);
end;
Проверяю, работает.
Изображение
Подключаю UDF в IBExpert

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

SET SQL dialect 3;
--/*
DROP external FUNCTION Date_Of;
DROP external FUNCTION Time_Of;
--*/
DECLARE external FUNCTION Date_Of
DOUBLE precision by DESCRIPTOR
returns DOUBLE precision by DESCRIPTOR
entry_point 'fDateOf' module_name 'date_time_udf';

DECLARE external FUNCTION Time_Of
DOUBLE precision by DESCRIPTOR
returns DOUBLE precision by DESCRIPTOR
entry_point 'fTimeOf' module_name 'date_time_udf';
Изображение

Пробую запустить

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

select  date_of((select current_date from rdb$database)) as "Дата"
       ,time_of((select current_time from rdb$database)) as "Время"
from rdb$database
     rows 1
Результат
Изображение
Тот же самый результат если

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

select  date_of(0) as "Дата"
       ,time_of(0) as "Время"
from rdb$database
     rows 1
Догадываюсь, что проблема м.б. в разных форматах
- Delphi TDateTime = double
- FireBird

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

type
   TIBDate = integer;
   TIBTime = Cardinal;
   TIBTimeStamp= packed record
                    Date: TIBDate;
                    Time: TIBTime;
                 end;
Вопрос :
Если только в этом причина, то почему select date_of(0) as "Дата" возвращает null ?
В чем мои ошибки ? Буду рад прочитать замечания.
Статью http://www.ibase.ru/devinfo/udf_ok.htm читал, но что-то наверное не понял. Как говорится... если что, извините :)

Убедительно прошу "не мазать мордой лица по фейсу", типа: погугли, а слабо почитай доку и т.д. :)
Спасибо.
Николай.
Последний раз редактировалось Nikos52 30 апр 2012, 13:25, всего редактировалось 1 раз.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Учусь писать udf

Сообщение hvlad » 30 апр 2012, 13:22

Ты ошибся везде :
а) в БД объявил пар-ры ф-ций с BY DESCRIPTOR, но твой код работает не c дескрипторами.
б) где cdecl ?
в) дата\время не передаются в UDF как double

Читай статью ещё раз, внимательно и полностью, а не по диагонали через слово

Nikos52
Сообщения: 3
Зарегистрирован: 26 апр 2012, 06:03

Re: Учусь писать udf

Сообщение Nikos52 » 01 май 2012, 04:31

Вот что получилось.
http://youtu.be/wNTxHtyohFU
Качество неважное, слишком большой размер экрана снимал. :oops: Если будет интересно кому, могу переснять.
В grid IBExpert не отображается время, появляется только если grid перевести в режим Form View,
после того как установить и снять Null.

Проблема в формате даты.
Продолжаю копать .... :roll:

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

Re: Учусь писать udf

Сообщение kdv » 02 май 2012, 20:22

видео пока не смотрел, но прошу объяснить - зачем видео, если есть статья и примеры? Вы творите что-то новое? Или сейчас люди неспособны ничего кроме ютуба воспринимать? :)

Nikos52
Сообщения: 3
Зарегистрирован: 26 апр 2012, 06:03

Re: Учусь писать udf

Сообщение Nikos52 » 03 май 2012, 09:48

kdv писал(а):видео пока не смотрел, но прошу объяснить - зачем видео, если есть статья и примеры? Вы творите что-то новое? Или сейчас люди неспособны ничего кроме ютуба воспринимать? :)
Эх ... просто хотел показать что чтение статьи помогло разобраться, но не до конца. А remote debug пробовал сделать еще в приснопамятные времена Baikonur,
но все забыл... :( Статья помогла вспомнить .

Ответить