Greetings All,

I had to create a UDF using Delphi that can be imported into Firebird.

Currently using v1.5 but am studying up on how to move to the latest version 
of Firebird.

Using this article as my guide I created my first UDF:
http://www.firebirdsql.org/en/writing-udfs-for-interbase/

The UDF will take a SQL statement with parameters and replace the parameters 
with the actual value, and return a SQL statement that can then be used with 
EXECUTE STATEMENT.

The UDF works great.

My concern and question is since I'm using v1.5 of Firebird and I did 
include IB_Util in my uses clause do I need to use "function 
ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';"?

Or does anyone see anything wrong with my UDF that I should be made aware 
of?

Does ib_util.dll need to be in the windows\system directory on the office 
server?

Here is my UDF:

DPR Source:
****************************************************
library Softtech;

uses
  SysUtils,
  Classes,
  SQLFunctions in 'SQLFunctions.pas';

{$R *.RES}

exports SQLCondParamRepl;

begin
end.
****************************************************

Unit Source:
****************************************************
{-----------------------------------------------------------------------------
 Project Name:
 Project Dir : C:\Delphi 5\DLLs\Softtech UDF\
 Created     : 17-Dec-2012
 Unit Name   : SQLFunctions
 Purpose     :
 Author      : Michael G. Tuttle
 History     :
-----------------------------------------------------------------------------}
unit SQLFunctions;

interface

//* IB_Util.pas must be in the library path
uses Sysutils, IB_Util;

function SQLCondParamRepl(SQLCommandText: PChar; var AcctID, CaseID, DebtNo: 
Integer): PChar; cdecl; export;

implementation

{ Use this in the script editor of Database Workbench to install this 
function into Firebird:

  declare external function f_SQLCondParamRepl
  cString(32760), Integer, Integer, Integer
  returns cstring(32760) free_it
  entry_point 'SQLCondParamRepl' module_name 'softtech';

  Test it with this:
  SELECT F_SQLCONDPARAMREPL('SELECT D.LIST_DATE FROM DEBT D WHERE D.ACCT_ID 
= :Param1 AND D.CASE_ID = :Param2 AND D.DEBT_NO = :Param3', :V_ACCT_ID, 
:V_CASE_ID, :V_DEBT_NO) from RDB$Database

  Or from within a stored procedure:
  RESULT = F_SQLCONDPARAMREPL('SELECT D.LIST_DATE FROM DEBT D WHERE 
D.ACCT_ID = :Param1 AND D.CASE_ID = :Param2 AND D.DEBT_NO = :Param3', 
:V_ACCT_ID, :V_CASE_ID, :V_DEBT_NO);
  EXECUTE STATEMENT}

function SQLCondParamRepl(SQLCommandText: PChar; var AcctID, CaseID, DebtNo: 
Integer): PChar; cdecl; export;
var
  CT: String;
begin
  CT :=  String(SQLCommandtext);

  CT := StringReplace(CT, ':Param1', IntToStr(AcctID), [rfReplaceAll, 
rfIgnoreCase]);

  CT := StringReplace(CT, ':Param2', IntToStr(CaseID), [rfReplaceAll, 
rfIgnoreCase]);

  if DebtNo > 0 then
    CT := StringReplace(CT, ':Param3', IntToStr(DebtNo), [rfReplaceAll, 
rfIgnoreCase]);

  Result := PChar(CT);
end;

end.

**************************************************** 

Reply via email to