udf's do firebird pelo delphi
- 30 outubro, 2007 -
- banco de dados, delphi -
- Tags : delphi, firebird
- 0 Comments
Estava eu precisando criar uma função no firebird que me retornasse uma data, e isso deu trabalho.. pesquisei várias vezes, mas pouco encontrei. bem, até encontrei algumas páginas, mas essas eram muitas vezes traduções de umas páginas da codegear (essa ou essa), e que não estavam me esclarecendo muito não.. nesses exemplos é explicada a criação de quatro funções, módulo (retorna o resto de uma divisão), left (pegar os primeiros n caracteres de uma string), year e hour (retornar o ano e a hora de uma variável date e time respectivamente).
Até a função do módulo tudo funcionou corretamente, mas já a partir da função left a coisa começou a desandar. chega uma parte em que são declaradas variáveis do tipo ulong e o autor não menciona de onde isso vem, ou eu não vi mesmo relendo vários vezes. o maior problemas mesmo é com variáveis date.
Consegui fazer o que queria depois de baixar umas udf’s e fuçar os seus fontes. basicamente usei apenas a “freeudf otimizada por paulo henrique albanez” (linque original) que baixei na comunidade-firebird.org.
Nesse arquivo zipado existem os arquivos ib_externals.pas e ibase.pas. neles estão as declarações e transformações necessárias para que você crie uma udf com certa facilidade, basta coloca-los na seção uses da sua unit.
As variáveis contendo texto deverão ser tratadas com pchar, as datas como pisc_quad, as inteiras como integer mesmo, mas deverão ser declaradas com var.
Na unit da dll, no delphi:
uses
SysUtils, Classes,
ib_externals, ibase, { deve estar no search path ou no diretório, do projeto (dll)}
{$IFDEF WIN32}
Windows;
{$ELSE}
Types;
{$ENDIF}//*** variáveis contendo datas ***
function fUltDia(ib_date: PISC_QUAD) :PISC_QUAD; cdecl; export;//*** variáveis contendo textos e valores inteiros ***
function fLength(sz: PChar): Integer; cdecl; export;
implementation
Declaração da udf no banco de dados:
declare external function udf_ultdia
Date
returns Date
entry_point ‘fUltDia’ module_name ‘gsibfuncoes’;declare external function udf_Length
cstring(32767)
returns integer by value
entry_point ‘fLength’ module_name ‘gsibfuncoes’;