Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

UDF [D6, IB6.x]


DmitryB ©   (2002-12-17 08:51:00) 

Понадобилась функция конвертации varchar в numeric.
Вот текст dll:
library my_util;
uses
SysUtils;
{$R *.res}

function StrToNum(var InStr:PChar):Currency;cdecl;export;
begin
Result:=StrToCurr(InStr);
end;

exports StrToNum;

begin
end.

Dll помещается в каталог ib\bin
Далее в IBExpert описываю функцию:

DECLARE EXTERNAL FUNCTION STRTONUM
CSTRING(80)
RETURNS NUMERIC(18,2) BY VALUE
ENTRY_POINT "StrToNum" MODULE_NAME "my_util.dll";

Функция успешно регистрируется, но когда к ней обращаешься из хран. процедуры или из запроса, выдается следующее:

Invalid token.
Invalid request BLR at offset 43.
functiom STRTONUM is not defined.
module name or entrypoint could not be found.

Делал возвращение результата также и по ссылке, менял ctring на varchar, делал все названия функции в одинаковом регистре - результат один, вышеприведенный.

(поставляемая с ib готовая udf работает - ок!)

Как бы все это привести к рабочему состоянию ?


Digitman   (2002-12-17 10:18:00) [1]


> DmitryB


Еще один привет Хвастунову Саше))))))... Я уж как-то раз передавал ему на эту тему свое "фи" .. не отреагировал, к сожалению) ... а дело было еще во времена v2.5.0.1, кажись))


DmitryB   (2002-12-17 10:06:00) [2]

Всем большое спасибо за информацию. Действительно дело в кавычках. :-)


Digitman   (2002-12-17 09:42:00) [3]

Ты как UDF-декларацию выполняешь ? В виз. UDF-редакторе или "вручную" текст скрипта (того что ты привел) запускаешь ?

Если в виз.UDF-редакторе, то - да, есть там такая "плюха". Никак ее Хвастунов не хочет довести до ума)

При указании имени UDF-ф-ции (по которому ты будешь обращаться к ней из SP/триггеров) в виз.редакторе вот в таком вот виде StrToNumIBExpert сформирует вот такое предложение :

DECLARE EXTERNAL FUNCTION "StrToNum"
CSTRING(80)
RETURNS NUMERIC(18,2) BY VALUE
ENTRY_POINT "StrToNum" MODULE_NAME "my_util.dll";

Обрати внимание на кавычки - "StrToNum"!
В рез-те сервер запишет имя ф-ции в таблицу RDB$FUNCTIONS именно в таком виде, в каком ты ввел это имя (as is, т.е. с учетом оригинального регистра символов).

А искать ф-цию при последующем обращении к ней сервер будет в этой таблице
- по имени в верх.регистре (если обращаться к ф-ции StrToNum(..))
- либо по имени с оригинальными регистрами (если обращаться к ф-ции "StrToNum "(..))

В первом случае сервер не найдет ф-ции (ибо она регистрировалась в кавычках и хранится в ориг.регистре) и вернет ту самую ошибку, что ты и получаешь.

Во втором случае ошибки не будет (ибо поиск в таблице осущесчтвляется с учетом регистра, т.е. без предв.преобразования имени в UpperCase)

Вот такая вот байда))


Alexandr   (2002-12-17 09:39:00) [4]

где ж ты читать умеешь, если я тебе 3 пункта привел, а ты только http://www.ibase.ru/develop.htm
http://www.ibase.ru/d_udf.htm


DmitryB   (2002-12-17 09:35:00) [5]

>Reindeer Moss Eater
Читать умею, вот если подскажете дельное, - спасибо.


Reindeer Moss Eater   (2002-12-17 09:24:00) [6]

Тебе же по русски сказано было о причине неудачи:
module name or entrypoint could not be found.


DmitryB   (2002-12-17 09:21:00) [7]

>Если речь о готовой UDF, то ее исходник к сожалению на С++.
То есть не хотелось бы эксперементировать с С-ным кодом.


DmitryB   (2002-12-17 09:07:00) [8]

>а почему бы тебе готовую не взять?
А какая есть готовая функция ?

Если речь о готовой UDF, то ее исходник к сожалению на С++.


Alexandr   (2002-12-17 08:55:00) [9]

1) сервер перезапусти.
2) В IB6 функции должны быть в каталоге UDF по-моему...
3) а почему бы тебе готовую не взять?


Наверх

Титульная страница Поиск, карта сайта Написать письмо