![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемма с созданием UDF. [D7, IB6.x]
|Denis| © (2005-01-05 11:53:00)Здравствуйте. Пытаюсь создать пользовательскую функцию. Вот содержание 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-06 22:04:00) [1]
> DSKalugin © (06.01.05 11:39) [7]
> есть большая разница передавать переменные в процедуру по
> значению или по ссылке (c VAR)
>
> если по значению надо писать в обявлении by value
Немного не понимаю.
Возможно вы имеете ввиду - возвращать переменные? Потому что, согласно структуре sql, объявляющего процедуру, ко входным параметрам by valueне применим.
И при чем тут наличие или отсутсвие Var?
ЗЫ: Буду признателен, если поясните свой пост.
DSKalugin (2005-01-06 11:39:00) [2]есть большая разница передавать переменные в процедуру по значению или по ссылке (c VAR)
если по значению надо писать в обявлении by value
|Denis| (2005-01-05 21:34:00) [3]
> Desdechado © (05.01.05 21:04) [5]
Огромное спасибо.
Desdechado (2005-01-05 21:04:00) [4]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 20:24:00) [5]Ни ужели никто никогда не писал пользовательских функций? Или вопрос настолько глуп, что не стоит на него отвечать?
|Denis| (2005-01-05 14:30:00) [6]Теперь при тех же данных выдает другие значения:
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? Что?
Digitman (2005-01-05 13:10:00) [7]library my_lib1;
uses
SysUtils,
Classes;
{$R *.res}
function my_procent( varseloe, 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 12:58:00) [8]Как вариант, не могли бы вы педоставить какую-нить свою UDF? Чтобы я попробовал разобраться сам.