IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
Solo
- Сообщения: 108
- Зарегистрирован: 18 апр 2005, 04:05
Сообщение
Solo » 26 дек 2006, 09:18
Хм... торможу что-то...
UDF имеет только одну функцию:
Код: Выделить всё
function ShortYearStr(Dat : TDateTime): PChar; cdecl; export;
begin
[b]Result := PChar(FormatDateTime('YY', Dat));[/b]
end;
Задекларируем ее в базе:
Код: Выделить всё
DECLARE EXTERNAL FUNCTION YEARTOSTR
DATE
RETURNS CHAR(2)
ENTRY_POINT 'ShortYearStr' MODULE_NAME 'UDFYear.dll'
И используем её:
Код: Выделить всё
for select contracts.locationcode
from contracts
where contracts.ncontcode = :IN_NCONT
into :v_locationcode
do
begin
out_locationcode = :v_locationcode||:v_delimeter||:in_ncont||:v_delimeter||
:in_ndoc||:v_delimeter||yeartostr(:in_doc_begin)||:v_pyaticod;
suspend;
end
Входящая величина - дата 01.01.2006, То-есть, выходящая строка должна быть "06", две последних цифры года. А получается почему-то вот что:
33-1111-000001-
99/98-71
То-есть 99 вместо 06
Что я не так делаю?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 26 дек 2006, 09:33
фигня какая то, а не функция. берет и возвращает какой-то pchar, возникающий из воздуха. Да еще не просто pchar, а char.
1. из функций возвращать надо cstring, а не char или pchar
2. кто-то должен аллокировать выходную строку. примеров на сайте достаточно, например safeudf
3. вместо udf в этом конкретном случае можно было воспользоваться функцией extract(year from ...
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 26 дек 2006, 12:15
Кроме того, что использовать нужно EXTRACT, автор ещё и с входным параметром облажался. Переданный сервером TIBDateTime пытается
обработать как дельфёвый TDateTime.
-
Solo
- Сообщения: 108
- Зарегистрирован: 18 апр 2005, 04:05
Сообщение
Solo » 26 дек 2006, 17:36
WildSery писал(а):Кроме того, что использовать нужно EXTRACT, автор ещё и с входным параметром облажался. Переданный сервером
TIBDateTime пытается обработать как дельфёвый TDateTime.
Ну вот, отбили охоту связываться с UDF
Сделал так:
v_year = extract(year from :in_doc_begin);
v_yeartwo = substring(:v_year from 3 for 4);
И все заработало...
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 26 дек 2006, 17:49
Ну вот, отбили охоту связываться с UDF
а ты не пиши ерунду, а читай статьи на ibase.ru и используй в качестве
болванок для своих функций ПРИМЕРЫ udf, коих на ibase.ru достаточно.
-
Solo
- Сообщения: 108
- Зарегистрирован: 18 апр 2005, 04:05
Сообщение
Solo » 27 дек 2006, 09:19
kdv писал(а):Ну вот, отбили охоту связываться с UDF
а ты не пиши ерунду, а читай статьи на ibase.ru и используй в качестве
болванок для своих функций ПРИМЕРЫ udf, коих на ibase.ru достаточно.
Вчера даже книгу сходил купил мир InterBase к новому году. Вот начитаюсь, и буду вопросы не задавать, а отвечать еще вперед вас

-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 27 дек 2006, 09:48
да без проблем
