В общем нужна функция округления до заданного числа знаков.
В стандартной поставке Firebird есть похожая функция в fbudf.dll - round, но
ее регистрация в БД такая:
Код: Выделить всё
declare external function Round
int by descriptor, int by descriptor
returns parameter 2
entry_point 'round' module_name 'fbudf';
Или я чего-то не понял?
Вообще, то задача тривиальная и этот параметр int меня озадачил, но в конце концов решил сам написать UDF.
Текст dll:
============================
Код: Выделить всё
#include <vcl.h>
#include <windows.h>
#include <Math.hpp>
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
__declspec(dllexport) double roundTo(double aValue, int digit)
{
return RoundTo(aValue, digit);
}
//---------------------------------------------------------------------------
Готовую fbudf.dll ложу в папку UDF сервера
Регистрирую ее в БД так:
Код: Выделить всё
declare external function F_ROUNDTO
double precision, integer
returns double precision by value
entry_point 'roundTo' module_name 'ar_fbUdf';
Когда пытаюсь использовать,
Код: Выделить всё
select f_roundto(12.6, 2) from rdb$database
Код: Выделить всё
Invalid token.
invalid request BLR at offset 59.
function F_ROUNDTO is not defined.
module name or entrypoint could not be found.
тут все нормально проходит. А нужно именно на C++Builder.
В голову пришло, что в С++ сигнатура функции включает и параметы - думал из-за этого не находится функция в dll-ке. Пытался регистрировать следующим образом
Код: Выделить всё
declare external function F_ROUNDTO
double precision, integer
returns double precision by value
entry_point 'roundTo(double,int)' module_name 'ar_fbUdf';
Код: Выделить всё
..
function F_ROUNDTO is not defined.
module name or entrypoint could not be found.
..