Erro ao comparar ou armazena campos numericos com Dbexpress
21/02/2012
0
alguém sabe me dizer comno resolve isso ?
Preciso apenas comparas se o valor de um campo do tipo DECIMAL
é <= 0
Porem quando faço isso
if cdEstoque.fieldbyname(quantidade).asfloat <=0 then
me apresenta o seguinte erro:
raised exception class EconvertError with message = is not a valid floating point value
Ao debugar na linha da comparação, apontando o point do debug em cima do ASFLOAT:
if cdEstoque.fieldbyname(quantidade).asfloat <=0 then
o Debug apresenta o seguinte:
cdEstoque.fieldbyname(quantidade).asfloat = delphi execption EconvertError at $9A9F949
ou seja, é como se não tivesse valor ou fosse um valor inválido, porém, neste CAMPO tem valor Zero ou maior que zero, neste caso específico do teste é 1...
Uso D7 + dbexpress + FB 2.1 campos de tipo flutuante como DECIMAL(12,2)
Me ajuda aí ???
Jeremias
Posts
21/02/2012
Marco Salles
21/02/2012
Marco Salles
E depedendo da sua resposta caso seje físico , tente apagar este field no cds e no sql respectivamente
se for o caso (feche a conexão) apague , abra a conexão (SqlCoonection) e adicione o campo novamente
No caso de voce trabalhar com os fielde definidos , apesar de voce estar utilizando o fieldBynAme
o que implica em não necessariamente na adição desses campos
22/02/2012
Jeremias
É físico
22/02/2012
Jeremias
E depedendo da sua resposta caso seje físico , tente apagar este field no cds e no sql respectivamente
se for o caso (feche a conexão) apague , abra a conexão (SqlCoonection) e adicione o campo novamente
No caso de voce trabalhar com os fielde definidos , apesar de voce estar utilizando o fieldBynAme
o que implica em não necessariamente na adição desses campos
Ok, fiz como orientado Marcos, mas continua o mesmo erro...
A única diferença é que no meu caso eu uso apenas
1 sqlDataSet + 1 DataSetProvider genéricos pra pesquisas
aí linko os ClientDataSet ao DataSetProvider genérico com
sua propriedade AllowCommandText = True, dessa forma
altero apenas a propriedade CommandText dos ClientDataSet
conforme a necessidade da pesquisa, portanto os campos
ficam relacionados apenas no ClientDataSet com seus
flags configurados devidamente...
Fechei minha conexão, apaguei-os, abri a conexão novmanete
e adicionei-os e configurei os provider flags...
Fiz o teste e continua o maledito erro...
É bem esquisito isso ....
Não faz sentido ???????
A pesquisa funciona normal, tem lá o valor do campo quantidade = 1
mas na comparação ou na tentativa de armazenar o valor do campo quantidade
em uma variável de qualquer tipo dá esse erro aí...
Se usar AsFloat, AsCurrency ou AsVariante ou AsBcd tudo dá erro...
O que mais pode ser ????
22/02/2012
Marco Salles
voce disse que usa
Uso D7 + dbexpress + FB 2.1 campos de tipo flutuante como DECIMAL(12,2)
voce esta utilizando qual driver ???
22/02/2012
Jeremias
voce disse que usa
Uso D7 + dbexpress + FB 2.1 campos de tipo flutuante como DECIMAL(12,2)
voce esta utilizando qual driver ???
É, pode ser ???????
Eu uso o Firebird com retrocompatibilidade com a GDS32.DLL portanto estou usando as configurações padrões que eu usava com o Interbase... Inclusive me banco continua com extensão GDB
É necessário usar um driver padrão do Firebrid neste caso ?
Se for, me dá umas dicas aí Marco Antonio...
Qual driver posso usar com esta versão, onde encontro e como configuro isso ai chapa ...
Se puder passar alguns exemplos era bom, hehehe
Me ajuda aí chapa ????
22/02/2012
Marco Salles
Problemas de Diver geralmente se deve a complexidade de Tipos ou de intruções Sql
a principio muito utilizam o próprio Driver do Interbase
1)
Esta Sql sua é complexa ou simples
2)
Tente utilizar o fieldByname no lugar do Tfield definido
apague todos para esta fazer este teste e utilize
cds.FieldByname(SeuCampo).TipoDeDaos
será que este teucampo Esta sendo carregado pelo Sql ???
faça este teste e nos retorne
ps) Por vafor quem quiser dar sugestões fiquem á vontade
este tópico é público
22/02/2012
Jeremias
Problemas de Diver geralmente se deve a complexidade de Tipos ou de intruções Sql
a principio muito utilizam o próprio Driver do Interbase
1)
Esta Sql sua é complexa ou simples
Nada é simples... são 5 campoos veja:
cdsEstoque.Close;
cdsEstoque.CommandText := SELECT ID,ID_PRODUTO,ID_CCUSTO,IDENTIFICADOR,QUANTIDADE FROM
+ ESTOQUE WHERE ID_PRODUTO = +#39+ strProduto +#39+ AND ID_CCUSTO =
+#39+ strCCusto + #39+ AND IDENTIFICADOR = +#39+ strIdentificador +#39;
cdsEstoque.Open;
2)
Tente utilizar o fieldByname no lugar do Tfield definido
apague todos para esta fazer este teste e utilize
cds.FieldByname(SeuCampo).TipoDeDaos
Sim é o que estou usando:
if cdsEstoque.FieldByName(quantidade).AsFloat <= 0 then
será que este teucampo Esta sendo carregado pelo Sql ???
Sim, coloque um dbgrid em um form e liguei a um datasorce e
a pesquisa é feita normal com os campos e conteudos... mas
não passa nem a pau ...
faça este teste e nos retorne
ps) Por vafor quem quiser dar sugestões fiquem á vontade
este tópico é público
23/02/2012
Marco Salles
23/02/2012
Jeremias
Tá como True
Eu uso 1 sqlDataSet + 1 DataSetProvider com a propriedade poAllowCommandText = True
pra ligo os CDS ao DataSetPrivider em questão...
23/02/2012
Jeremias
Eu consigo armazenar em variáveis o conteudo de todos os outros campos:
ID, ID_PRODUTO, ID_CCUSTO, IDENTIFICADOR que são dos tipos
INTEGER e VARCHAR
Consquentemente consigo fazer comparações com eles...
Só o campo QUANTIDADE que no meu caso é DECIMAL(12,2) é que dá esse erro aí..
Já tentei pegar ou armazenar como AsFloat, AsCurrency, AsBcd, AsString e nada...
Com AsVariant ele armazena o valor =
No debug ele mostra assim:
cdsEstoque.FielByBame(quantidade).AsVariant = =
Nos outros casos ele mostra:
cdsEstoque.FielByBame(quantidade).AsFloat = delphi exception EconvertError at $9A9F949
Conlcuo então que o problema está com este tipo de dado NUMERIC ou DECIMAL
Me dá uma luz aí pessoal, alguém que já se deparou com estes problemas...
Aliás estou com um probleminha semelhante pra armazenar datas também...
Me Ajuda aí ????
23/02/2012
Marco Salles
passei o seu problema para um outro companheiro (Imex), muito antecioso frofundo conhecedor
Aqui segue o que ele sugeriu
Complicado...
Uma certa curiosidade seria em relação ao tipo do campo (TFmtBCDField, etc) que está sendo atribuido quando o campo é adicionado de forma persistente na Fields Editor.
Não conheço muito a fundo o Firebird, mas acho que também deveria ser verificado o dialeto, pois pelo que vi no firebase.com.br é utilizado Double Precision para precisão entre 10 e 18 se o dialeto for igual a 1. Sei lá, de repente este campo está com um número enorme de casas decimais.
Mas tá complicado mesmo...
obs: não tenho conta, mas não precisa esquentar em relação aos créditos.
Abraço
Agora eu tb vou retornar no quesito Driver ...
Atente-se para algumas perguntas
1) Voce tem o Interbase rodando ???
2) O Seu firebird esta rodando tb ?
3) Voce especificou alguma porta para o Firebird # caso os dois esteja Rodando
4) A questão de compatibilidade não existe para o Firebird 2.1
5) Caso voce estja com o Firebird Rodando e o Interbase parado coloque deixe por
enquato o Driver da Interbase mas coloque no ventor Lib o fbclient.dll
24/02/2012
Jeremias
passei o seu problema para um outro companheiro (Imex), muito antecioso frofundo conhecedor
Aqui segue o que ele sugeriu
Complicado...
Uma certa curiosidade seria em relação ao tipo do campo (TFmtBCDField, etc) que está sendo atribuido quando o campo é adicionado de forma persistente na Fields Editor.
Não conheço muito a fundo o Firebird, mas acho que também deveria ser verificado o dialeto, pois pelo que vi no firebase.com.br é utilizado Double Precision para precisão entre 10 e 18 se o dialeto for igual a 1. Sei lá, de repente este campo está com um número enorme de casas decimais.
Mas tá complicado mesmo...
obs: não tenho conta, mas não precisa esquentar em relação aos créditos.
Abraço
Agora eu tb vou retornar no quesito Driver ...
Atente-se para algumas perguntas
1) Voce tem o Interbase rodando ???
2) O Seu firebird esta rodando tb ?
3) Voce especificou alguma porta para o Firebird # caso os dois esteja Rodando
4) A questão de compatibilidade não existe para o Firebird 2.1
5) Caso voce estja com o Firebird Rodando e o Interbase parado coloque deixe por
enquato o Driver da Interbase mas coloque no ventor Lib o fbclient.dll
R1. Não
R2. Sim, somente este com retrocompatibilidade
R3. Não, só fica rodando o FireBird
R5. Estou usando atualmente a GDS32.DLL, vou alterar pra fbclient e fazer os testes, pode ser que
esse seja o problema...
Daqui a pouco te reporto...
24/02/2012
Christian Giuliani
if cdEstoque.fieldbyname(quantidade).asCurrency <=0 then
Vai resolver. ;)
25/02/2012
Jeremias
Mudei a Vendor Lib como o Marco Antonio segeriu pra FBClient... mas tb não funciona...
Agora estou usando Padrão IB com dbexpint e Vendor Lib=Fbclient... continua o erro
Resolvi fazer um teste migrando a base de .GDB pra .FDB, fazendo um backup
em .GBK e o Restore pra .FDB mas também não funcionou...
A pesquisa no banco é feita normal, posso navegar entre os registros e seus conteudos,
e consigo armazenar em variáveis ou comparar o conteudo de todos os campos com tipos
diferentes de NUMERIC ou DECIMAL...
Tem uma CASCA DE BANANA aí no Dbexpress + D7 + Firebird
QUAL É O PULO DO GATO nessas tecnologias ???
Quem saberá me responder ????
Paulista, meu irmão cadê você... se manifesta aí ?
Renato, Romero, Guinther, Luciano, Rodrigo ...
Dá uma ajuda aí pro Aprendiz... hehehe
O Amigo aí do RS também...
Se não, meu irmão, vou pegar meu bonezinho e voltar pra Roça (IBX) que é melhor... hehehe
Clique aqui para fazer login e interagir na Comunidade :)