udf’s do firebird pelo delphi

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’;

DLL que fiz
Outras UDF’s

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s