[firebase-br] Problema com Firebird 2.1

Carlos H. Cantu listas em warmboot.com.br
Sex Nov 21 09:34:59 -03 2008


UDFs usando strings são mais complicadas, pois exigem a correta
manipulação de memória, senão quebra o servidor mesmo.

Na sua UDF, vc usou FREE_IT, no entanto não está alocando memória
dinâmica para o resultado. Outra coisa, cstring é um string "null
terminated" (padrão do C), portanto vc deveria usar PCHAR e não string
no Pascal.

[]s
Carlos H. Cantu
www.warmboot.com.br - www.firebirdnews.org
www.FireBase.com.br - blog.firebase.com.br

R> Bom dia Carlos, Agradeço pela atenção e colaboração,

R> Não entendo muito de UDFs, peguei um artigo seu no site e tentei me basear
R> nele, por causa da necessidade de funcionar
R> as procedures que tenho em meu sistema que no Firebird 1.5 estao funcionando
R> bem. Ouvi falar que o 2.1 é bem mais rapido
R> entao resolvi mudar. Mas ja estou dois dias procurando na internet e esta
R> dificil, mas em ultimo caso fico com o 1.5 até conseguir
R> com o 2.1.

R> De qualquer forma, muito obrigado.

R> Rodrigo




R> ----- Original Message ----- 
R> From: "Carlos H. Cantu" <listas em warmboot.com.br>
R> To: "FireBase" <lista em firebase.com.br>
R> Sent: Thursday, November 20, 2008 9:10 PM
R> Subject: Re: [firebase-br] Problema com Firebird 2.1


R> Sua UDF não está escrita corretamente. O tema é muito extenso para
R> escrever num email. Sugiro que você pesquise os artigos sobre UDFs que
R> estão disponíveis na internet, ou se tiver algum dos meus livros,
R> ambos têm um capítulo dedicado ao assunto.

R> PS: Sobre a procedure funcionar com o FB 1.5 e não com o 2.1, tem algo
R> "cheirando" mal aí, mas baseado só nas informações que vc passou, eu
R> não sei o que é. O FB sempre trata "," como separador de milhar,
R> portanto 20,00 seria entendido como 20.000

R> []s
R> Carlos H. Cantu
R> www.warmboot.com.br - www.firebirdnews.org
R> www.FireBase.com.br - blog.firebase.com.br

R>> Boa Noite a Todos...
R>> Estou com o seguinte problema,
R>> Migrei o Firebird 1.5 para o 2.1 e algumas procedures que funcionavam bem
R>> antes agora estao com problemas:
R>> Ex.  tenho um Cast(VTotal as Numeric(8,2))

R>> onde VTotal é um Varchar(20) com a string 20,00.

R>> Quando vai converter exibe erro.
R>> Overflow occurred during data type conversion.conversion error from 
R> string
R>> "20,00".

R>> Dae se mudar para 20.00 funciona.

R>> Entao resolvi fazer uma UDF pra fazer a conversão, fiz do seguinte modo:

R>> na unit Func:

R>> unit Func;

R>> interface

R>> function TrocaVirgPonto(Valor: string): string; cdecl; export;

R>> implementation

R>> function TrocaVirgPonto(Valor: string): string;
R>> var  i: integer;
R>> begin
R>>      try
R>>      for i := 1 to Length(Valor) do
R>>      if Valor[i] = ',' then
R>>      Valor[i] := '.';
R>>      except
R>>      //
R>>      end;
R>>      Result := valor;
R>> end;

R>> end.

R>> e no projeto:

R>> library Funcoes;
R>> uses
R>>   SysUtils,
R>>   Classes,
R>>   IB_Utils,
R>>   Func in 'Func.pas';

R>> {$R *.res}

R>> exports
R>> TrocaVirgPonto;

R>> begin
R>> end.

R>> no registro fiz assim:
R>> declare external function Func
R>> cstring(64)
R>> returns cstring(64) free_it
R>> entry_point 'TrocaVirPonto' module_name 'Funcoes.dll"';


R>> Só que sempre que vou usar a função cai o servidor Firebird...

R>> Se alguem puder dar uma ajuda...

R>> Atenciosamente,
R>> Rodrigo






Mais detalhes sobre a lista de discussão lista