terça-feira, maio 10, 2011

Exibir dados a partir de uma procedure

HI,

Hoje tive uns probleminhas para exibir o resultado de uma procedure. Um cliente criou uma procedure para retornar os dados dos clientes. Nunca tinha usado isso no Delphi. Criei rapidinho uma tela para exibir esse resultado em um componente grid.

O primeiro problema que tive, e que recorri ao google, foi quando tentei setar o componente TStoredProc para true. Deu o seguinte erro: error creating cursor handle. Pesquisando no google, descobrir que só posso dá um StoredProc1.ExecProc;. Pois bem, associei um datasource ao componente StoredProc1 e em runtime, executei o ExecProc e não mostrou nada no grid. Aí pensei, deve ser por que esse troço só serve para executar comandos que não retornam dados. Foi aí que tive a idéia de dar um select na procedure e usar o componente query.

Ficou assim: Select * from Nome_Procedure. Dei um open e mostrou os resultados no Grid. Mas aí surgiu o segundo problema. Em algumas colunas tava mostrando (BYTES) ao invés do valor do campo.

Coloquei um Label para receber o conteúdo de campo, mas não mostrou nada. Label.caption := Query.FieldByName('codigo').AsString;

Fui a procura de uma rotina para converter de bytes para integer e achei esse código.

Fiz uma adaptação e criei essa função:

function BytesToInteger(Campo: TField): integer;
var MyBuffer : ^integer;
begin
with Campo do
begin
GetMem(MyBuffer, DataSize);
try
if not GetData(MyBuffer) then
result := 0
else
result := MyBuffer^;{ Do something with the data };
finally
{ Free the space }
FreeMem(MyBuffer, DataSize);
end;
end;
end;

Testei na tela e exibiu em um label o código correto, fiquei animado. Depois eu modifiquei a consulta para converter para float, com o resultado, desanimei. Mostrou o resultado em notação científica. Se eu fosse tentar resolver isso ia ficar muito complicado o código, cheio de conversões.


Foi aí que eu tive a idéia de tratar isso na query, fazendo um type cast.

A query tava assim
select codigo, nome, limite from EXPCLIENTES

Modificando a query
select cast(codigo as integer) codigo, nome, cast(limite as double precision) limite from EXPCLIENTES

Passou a apresentar corretamente os campos no Grid.


Espero que possa ser útil.

Fiquem na Paz

Nenhum comentário: