[firebase-br] PROBLEMAS COM UDF - URGENTE!!!!

Euler Jr. euler em siginformatica.com.br
Qui Jun 30 17:04:08 -03 2005


UDF´s escritas em Delphi devem seguir algumas regras. Para rotinas que
devolvem algum tipo de string, deve-se incluir a unit ShareMem na cláusula
uses ( tem que ser a primeira ).
Verifique tb as conversões de chamada dos argumentos (pascal,stdcall,cdecl,
etc). O padrão de chamada para UDF´s é stdcall.
Cuidado com a manipulação de strings. A sua rotina deve gerenciar a memória
alocada.
Os tipos de dados devem ser compatíveis com o padrao C. Veja os tipos em
ibase.h.
UDF´s que geram qualquer exceção podem "derrubar" o servidor.

[]s
Euler Jr.
----- Original Message -----
From: "Evandro Paloschi" <epaloschi em yahoo.com.br>
To: <lista em firebase.com.br>
Sent: Thursday, June 30, 2005 3:45 PM
Subject: [firebase-br] PROBLEMAS COM UDF - URGENTE!!!!


> Olá Amigos,
>
>     Criamos uma UDF que recebe 3 parametros PChar e devolve a concatenação
dos mesmos. O problema é que quando passamos valores nulos para a UDF está
derrubando a conexão com o FIREBIRD.
>
>     Alguém saberia o porque que a UDF está derrubando a conexão??? Tem
algo a ver com os valores nulos Se for isto como posso codificar minha UDF,
pois ela foi criada com o proposito de devolver os parametros concatenados,
mesmo que algum deles fosse nulo.
>
>     Abaixo segue o codigo da UDF em delphi e a sua declaração no banco.
>
> function Udf_DescrItem( DescrItem, DescrLin, DescrCol: PChar ): PChar;
> var
>   StrRet: string;
> begin
>   StrRet := '';
>   if  ( DescrItem <> nil ) and ( StrLen(DescrItem) > 0 ) then
>       StrRet := ( StrRet + DescrItem + ' ' )
>   {endif};
>   if  ( DescrLin <> nil ) and ( StrLen(DescrLin) > 0 ) then
>       StrRet := ( StrRet + DescrLin + ' ' )
>   {endif};
>   if  ( DescrCol <> nil ) and ( StrLen(DescrCol) > 0 ) then
>       StrRet := ( StrRet + Trim(DescrCol) )
>   {endif};
>   Result := RetornaString( PChar( StrRet ) );
> end;
> function RetornaString( Texto: PChar ): PChar;
> var
>   Tamanho: DWord;
> begin
>   Tamanho := StrLen( Texto ) + 1;
>   Result := GetMemory( Tamanho );
>   if  Tamanho = 1 then
>       Result[0] := #0
>   else
>       Move( Texto^, Result^, Tamanho )
>   {endif};
> end;
>
> /*  External Function declarations */
> DECLARE EXTERNAL FUNCTION UDF_DESCRITEM
> CSTRING(50) CHARACTER SET WIN1252, CSTRING(30) CHARACTER SET WIN1252,
CSTRING(30) CHARACTER SET WIN1252
> RETURNS CSTRING(112) CHARACTER SET WIN1252 FREE_IT
> ENTRY_POINT 'Udf_DescrItem' MODULE_NAME 'RGLibUdf';
>
>
> Desde já,
>
> Agradeço.
>
> __________________________________________________
> Converse com seus amigos em tempo real com o Yahoo! Messenger
> http://br.download.yahoo.com/messenger/
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>





Mais detalhes sobre a lista de discussão lista