![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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) а почему бы тебе готовую не взять?