Fórum Problema com campos TFMTDBCField #272095
12/03/2005
0
Boa Tarde colegas.
Ja estou entrando em desespero... :cry:
Tenho uma aplicação que acessa a um banco de dados Interbase, nas tabelas, os campos numericos foram definidos como NUMERIC(13,2), quando gero os TFields no Delphi 7 eles são criados do tipo TFMTDBCField, que pelo que ja consultei nas outras duvidas do forum é o mais indicado para este tipo de campo.
Minha aplicação insere nas tabelas os valores de um arquivo texto, em um primeiro momento (quando não ha registros no arquivo) o processamento é correto, visto que apos todo o processamento eu verifico pelo IBConsole a gravação dos dados no arquivo, entretanto quando é feito nova importação dos dados (no caso de ter sido gerado novo arquivo e os mesmos precisarem ser somados) ocorre o seguinte erro:
Quando, no Banco de dados, encontra-se um campo que tenha um valor com casas decimais, por exemplo 12,03 ele me retorna o seguinte erro ´ ´12=´ is not a valid floating point value ´, pelo que percebi quando o valor possui casas decimais as mesmas não estão sendo encontradas, retornando um valor incoerente. Como fazer para obter o valor correto e trabalhar com este tipo de campo??? :?:
O codigo que estou usando é o seguinte:
Var Valor : Currency;
...
Begin
...
Valor:=StrToFloat(Copy(Linha, 102,13))/100;
...
Tabela.FieldByName(´VALOR´).AsCurrency:=Tabela.FieldByName(´VALOR´).AsCurrency+Valor;
Neste momento se o valor, ja existente no banco, para o campo VALOR contiver casas decimais da o erro. Depurando, quando paro para ver o valor do campo ele não me informa, diz que o valor é desconhecido.
Obs.: Tabela é um ClientDataSet que aponta para um componente DBExpress ligado a tabela do Banco.
Desde ja agradeço a toda ajuda.
Ja estou entrando em desespero... :cry:
Tenho uma aplicação que acessa a um banco de dados Interbase, nas tabelas, os campos numericos foram definidos como NUMERIC(13,2), quando gero os TFields no Delphi 7 eles são criados do tipo TFMTDBCField, que pelo que ja consultei nas outras duvidas do forum é o mais indicado para este tipo de campo.
Minha aplicação insere nas tabelas os valores de um arquivo texto, em um primeiro momento (quando não ha registros no arquivo) o processamento é correto, visto que apos todo o processamento eu verifico pelo IBConsole a gravação dos dados no arquivo, entretanto quando é feito nova importação dos dados (no caso de ter sido gerado novo arquivo e os mesmos precisarem ser somados) ocorre o seguinte erro:
Quando, no Banco de dados, encontra-se um campo que tenha um valor com casas decimais, por exemplo 12,03 ele me retorna o seguinte erro ´ ´12=´ is not a valid floating point value ´, pelo que percebi quando o valor possui casas decimais as mesmas não estão sendo encontradas, retornando um valor incoerente. Como fazer para obter o valor correto e trabalhar com este tipo de campo??? :?:
O codigo que estou usando é o seguinte:
Var Valor : Currency;
...
Begin
...
Valor:=StrToFloat(Copy(Linha, 102,13))/100;
...
Tabela.FieldByName(´VALOR´).AsCurrency:=Tabela.FieldByName(´VALOR´).AsCurrency+Valor;
Neste momento se o valor, ja existente no banco, para o campo VALOR contiver casas decimais da o erro. Depurando, quando paro para ver o valor do campo ele não me informa, diz que o valor é desconhecido.
Obs.: Tabela é um ClientDataSet que aponta para um componente DBExpress ligado a tabela do Banco.
Desde ja agradeço a toda ajuda.
Arc@njo
Curtir tópico
+ 0
Responder
Posts
14/03/2005
Rômulo Barros
Caro amigo. Este fato já aconteceu comigo no interbase 5.0 e 6.0. Eu realizava algo como:
Vamos supor que o retorno do SELECT teria que ser 300. Então, ao invés de me retorna 300, o que vinha como resposta era [b:643618d5c7]30=[/b:643618d5c7], ou seja, o SGBD substituia o último zero (0) do resultado da pesquisa pelo sinal de [b:643618d5c7]igual (=)[/b:643618d5c7].
Até hoje não sei o motivo disto ( resolvi trabalhar com o oracle ), mas eu me lembro muito bem como foi que resolvi: Abandonei a Query que executava o SELECT e substitui por uma [b:643618d5c7]Stored Procedure[/b:643618d5c7]. Faça o mesmo. Tenho certeza de que a Stored Procedure irá trazes o resultado correto.
SELECT SUM(CAMPO) FROM TABELA;
Vamos supor que o retorno do SELECT teria que ser 300. Então, ao invés de me retorna 300, o que vinha como resposta era [b:643618d5c7]30=[/b:643618d5c7], ou seja, o SGBD substituia o último zero (0) do resultado da pesquisa pelo sinal de [b:643618d5c7]igual (=)[/b:643618d5c7].
Até hoje não sei o motivo disto ( resolvi trabalhar com o oracle ), mas eu me lembro muito bem como foi que resolvi: Abandonei a Query que executava o SELECT e substitui por uma [b:643618d5c7]Stored Procedure[/b:643618d5c7]. Faça o mesmo. Tenho certeza de que a Stored Procedure irá trazes o resultado correto.
Responder
Gostei + 0
15/03/2005
Arc@njo
Valeu gente. :lol:
Consegui resolver da seguinte forma:
No select do componente SQLDataSet mudei a intrução de:
Select VALOR From Tabela Where <condição>
para
Select (VALOR CAST FLOAT) VALOR From Tabela Where <Condição>
Assim resolveu o problema, pois os valores dos campos TField vieram com Float e não mais como BCD. O problema de aparecer muitas casas decimais pode facilmente ser corrigido com mascara nos proprios TFields, e como o campo no banco é Numeric(13,2) não ira armazenar mais que duas casas decimais.
Sendo assim agradeço a todos.
Valeu.
Consegui resolver da seguinte forma:
No select do componente SQLDataSet mudei a intrução de:
Select VALOR From Tabela Where <condição>
para
Select (VALOR CAST FLOAT) VALOR From Tabela Where <Condição>
Assim resolveu o problema, pois os valores dos campos TField vieram com Float e não mais como BCD. O problema de aparecer muitas casas decimais pode facilmente ser corrigido com mascara nos proprios TFields, e como o campo no banco é Numeric(13,2) não ira armazenar mais que duas casas decimais.
Sendo assim agradeço a todos.
Valeu.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)