Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Проблемма с созданием 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
3-1104840678
Jey
2005-01-04 15:11
2005.02.06
Фильтрация


14-1105711357
klyg
2005-01-14 17:02
2005.02.06
Выбор темы для дипломного проекта


1-1106542851
romal
2005-01-24 08:00
2005.02.06
Delphi .Net и железо


4-1103374683
Zodchi
2004-12-18 15:58
2005.02.06
Получение списка устройств системы


1-1106521601
ninja
2005-01-24 02:06
2005.02.06
прокрутка StringGrid