Форум: "Базы";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизПроблемма с созданием UDF. Найти похожие ветки
← →
|Denis| © (2005-01-05 11:53) [0]Здравствуйте. Пытаюсь создать пользовательскую функцию. Вот содержание dll:
library my_lib1;
uses
SysUtils,
Classes;
{$R *.res}
function my_procent(seloe: integer; chast: integer): real48;
cdecl;
begin
result := chast*100/seloe ; //к примеру 1*100/2=50
end;
exports
my_procent;
begin
end.
Вот так объявляю её:
declare external function my_procent
smallint, smallint
returns float
entry_point "my_procent"
module_name "my_lib1.dll";
Таким запросом вызываю:
select my_procent (field1, field2) from table1
В итоге, к примеру, при следующих значениях:
Field1 Field2
4 2
10 3
Выдается столбец:
My_procent
2,90103422213275E-38
2,90103422213275E-38
Возникает закономерный вопрос: что не так?
← →
|Denis| © (2005-01-05 12:58) [1]Как вариант, не могли бы вы педоставить какую-нить свою UDF? Чтобы я попробовал разобраться сам.
← →
Digitman © (2005-01-05 13:10) [2]library my_lib1;
uses
SysUtils,
Classes;
{$R *.res}
function my_procent(var seloe, chast: SmallInt): Double; cdecl;
begin
result := chast*100/seloe;
end;
exports
my_procent;
begin
end.
declare external function my_procent
smallint, smallint
returns double
entry_point "my_procent"
module_name "my_lib1.dll";
select my_procent (field1, field2) from table1
← →
|Denis| © (2005-01-05 14:30) [3]Теперь при тех же данных выдает другие значения:
1.97626258336499У-323
4.94065645841247У-323
... не совсем то, что нужно (тип Double Precision, ибо просто Double вроде как не существует для IB).
В качестве эксперимента, попробовал изменить dll-ку следующим образом:
function my_procent(var seloe, chast: SmallInt): SmallInt; cdecl;
begin
result := chast + seloe;
end;
И соответственно:
declare external function my_procent
smallint, smallint
returns smallint
entry_point "my_procent"
module_name "my_lib1.dll";
Теперь, при попытке выполнить запрос, происходит "...connection lost to database".
Возможно ошибка в самом принципе создания dll? Я выбираю dll wizard, пишу обозначенный код, компилю - вылазит сообщение:
"cannot debug project unless a host application is defined. Use Run|Parametrs... dialog box". dll-ка создавалась и меня это устраивало ))
Возможно что-то нужно указать в Run|Parametrs? Что?
← →
|Denis| © (2005-01-05 20:24) [4]Ни ужели никто никогда не писал пользовательских функций? Или вопрос настолько глуп, что не стоит на него отвечать?
← →
Desdechado © (2005-01-05 21:04) [5]declare external function my_procent
smallint, smallint
returns double precision by value
entry_point "my_procent"
module_name "my_lib1.dll";
← →
|Denis| © (2005-01-05 21:34) [6]
> Desdechado © (05.01.05 21:04) [5]
Огромное спасибо.
← →
DSKalugin © (2005-01-06 11:39) [7]есть большая разница передавать переменные в процедуру по значению или по ссылке (c VAR)
если по значению надо писать в обявлении by value
← →
|Denis| © (2005-01-06 22:04) [8]
> DSKalugin © (06.01.05 11:39) [7]
> есть большая разница передавать переменные в процедуру по
> значению или по ссылке (c VAR)
>
> если по значению надо писать в обявлении by value
Немного не понимаю.
Возможно вы имеете ввиду - возвращать переменные? Потому что, согласно структуре sql, объявляющего процедуру, ко входным параметрам by value не применим.
И при чем тут наличие или отсутсвие Var?
ЗЫ: Буду признателен, если поясните свой пост.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.047 c