Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problemas com campo do tipo BCD


K!ko

Pergunta

Boa tarde senhores.

Estou com o seguinte problema:

Estou trabalhando com Firebird 2.5 e Delphi 2006.

Possuo uma tabela em minha base de dados com um campo do tipo Numeric(16,13).

Na minha aplicação eu cheguei a realizar a inserção do seguinte valor: 0,00000121.

Salvou normalmente na base de dados e consigo enchergar este valor através de uma consulta SQL no IBExpert, por exemplo.

No entando, quando executo uma consulta SQL para retornar este valor num ClientDataSet da minha aplicação, a mesma me retorna a seguinte mensagem de erro:

"1,21E-6 is not a valid BCD value";

Eu realizei alguns testes e notei que esta "conversão" de valores ocorre a partir da 5ª casa decimal dos valores inseridos neste campo, ou seja, com o valor 0,0001 o erro não ocorre, já com o valor 0,00001 o erro passa a ocorrer pois este valor é convertido para "1E-5" e por algum motivo ele não é suportado no delphi.

OBS.: A mensagem de erro mensionada anteriormente só aparace quando habilito a opção de visualização de excessões do Delphi na parte de opções da aba Tools. Mesmo aparecendo a mensagem de erro, minha aplicação consegue trazer todos os registros que possuem valores maiores ou iguais a 0,0001.

Existe alguma maneira de retornar o valor que realmente está armazenado na base de dados, quero dizer, sem conversão?

Espero ter sido claro quanto ao meu problema.

Fico no aguardo de uma resposta.

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Fala Kiko,

Existe a possibilidade para fazer um "cast" para Float / Double ou algum tipo numérico de maior capacidade?

Cara, eu nunca trabalhei com essa versão de Delphi ou IB, mas... Sempre tive problemas com dados "BCD". Geralmente eu conecto em SQL ou Oracle, eu sei também que nas versões de Delphi que eu uso / usei, o BCD era um tipo do Delphi, não sei dizer se no IB esse tipo também existe.

Se o BCD estiver na base, tenta fazer um cast. Se for no Delphi que esse tipo existe, tenta mudar o tipo.

Espero ter ajudado de alguma forma,

Snax.

Link para o comentário
Compartilhar em outros sites

  • 0
Fala Kiko,

Existe a possibilidade para fazer um "cast" para Float / Double ou algum tipo numérico de maior capacidade?

Cara, eu nunca trabalhei com essa versão de Delphi ou IB, mas... Sempre tive problemas com dados "BCD". Geralmente eu conecto em SQL ou Oracle, eu sei também que nas versões de Delphi que eu uso / usei, o BCD era um tipo do Delphi, não sei dizer se no IB esse tipo também existe.

Se o BCD estiver na base, tenta fazer um cast. Se for no Delphi que esse tipo existe, tenta mudar o tipo.

Espero ter ajudado de alguma forma,

Snax.

Boa Tarde Bispo Snake.

Então, na base de dados o campo é do tipo NUMERIC(16,13). Equivalente ao Numeric do MSSQL.

Eu creio que esta conversão de tipos está ocorrendo no delphi.

No entanto, eu faço a criação dos campos em tempo de execução aqui no delphi, e realmente crio ele como Float. O problema é que ele está convertendo também o valor do campo, ou seja, na base de dados o campo está com valor "0,00000121" e quando da o erro no delphi ele apresenta o campo com o valor "1,21E-6".

Uma coisa que eu percebi também, não sei se tem alguma influência, eu peguei este valor na base de dados, selecionei e apertei ctrl+c e depois abri o bloco de notas e apertei ctrl+v. Ao invés de colar o valor 0,00000121... colou o valor 1,21E-6.

Será que não é nenhuma config. do proprio windows que esta convertendo os valores?

Grato desde já.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu acredito que não tenha a ver com Windows não, acho que é mais relacionado aos tipos mesmo.

Só para ter um exemplo rápido, experimenta abrir o Excel e colar o valor "0,00000121" numa coluna qualquer, e depois tente formatar a coluna como Texto e cola o valor de novo. Como tipo geral, vai haver conversão pra esse valor "1,21E-6", e para texto vai ser o valor "real".

Eu acredito que matematicamente haja uma espécie de representação do valor na forma resumida - que no frigir dos ovos vai ser a mesma coisa. Todo caso, se as operações que você está fazendo estão corretas... não vejo problema, a não ser pela visualização.

Alguém que manje mais de matemática aí pode explicar melhor, mas acho que é isso.

Espero ter ajudado de novo!

Snake.

Link para o comentário
Compartilhar em outros sites

  • 0
Eu acredito que não tenha a ver com Windows não, acho que é mais relacionado aos tipos mesmo.

Só para ter um exemplo rápido, experimenta abrir o Excel e colar o valor "0,00000121" numa coluna qualquer, e depois tente formatar a coluna como Texto e cola o valor de novo. Como tipo geral, vai haver conversão pra esse valor "1,21E-6", e para texto vai ser o valor "real".

Eu acredito que matematicamente haja uma espécie de representação do valor na forma resumida - que no frigir dos ovos vai ser a mesma coisa. Todo caso, se as operações que você está fazendo estão corretas... não vejo problema, a não ser pela visualização.

Alguém que manje mais de matemática aí pode explicar melhor, mas acho que é isso.

Espero ter ajudado de novo!

Snake.

Pode crer Snake.

Realmente isto ocorre, ao dar um cast no valor convertendo-o para Varchar, por exemplo, e depois colá-lo no bloco de notas ele trouxe o valor correto.

Bom... mais será que num tem alguma maneira de trazer este valor sem conversão? Por que quando eu salvei este valor na base de dados foi pela aplicação, ou seja, ele só converte quando eu tento resgatar este valor da base de dados.

Mesmo assim, em virtude do que você apresentou a unica solução que vejo no momento é usar o Cast e exibir o valor do campo como String na minha aplicação.

Pelo menos provisóriamente.

De qualquer forma, muito obrigado pela ajuda até o momento.

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0
Só para confirmar, quando você usa uma query, resgata o valor da base e joga num textBox ou label, aparece o valor no formato estranho, certo? Se você usar alguma IDE e fizer query na base, retorna certo?

Não entendi muito bem sua pergunta.

O processo que eu faço é o seguinte:

Eu monto o comando SQL e atribuo o mesmo pra propriedade CommandText do ClientDataSet que eu uso na tela.

Depois eu Atribuo os parâmetros necessários no ClientDataSet e em seguida dou um Open() nele.

No momento que eu dou o Open ele já retorna o Erro e só me traz os valores que não caem naquela situação da conversão.

É isso que você queria saber?

Link para o comentário
Compartilhar em outros sites

  • 0
Só para confirmar, quando você usa uma query, resgata o valor da base e joga num textBox ou label, aparece o valor no formato estranho, certo? Se você usar alguma IDE e fizer query na base, retorna certo?

Não entendi muito bem sua pergunta.

O processo que eu faço é o seguinte:

Eu monto o comando SQL e atribuo o mesmo pra propriedade CommandText do ClientDataSet que eu uso na tela.

Depois eu Atribuo os parâmetros necessários no ClientDataSet e em seguida dou um Open() nele.

No momento que eu dou o Open ele já retorna o Erro e só me traz os valores que não caem naquela situação da conversão.

É isso que você queria saber?

Exato, exato. Vai chegando fim de tarde, usuário ligando e daí já viu né... =D

É, não sei no Delphi2006 como isso funciona, mas dar o erro direto no Open é

estranho... Se tivesse que dar o erro, acredito que daria na hora em que você

fosse jogar o valor para algum campo, variável, etc.

Esse erro dá se você não fizer cast, se der cast pra varchar, vai na boa, é

isso? Já tentou fazer o cast para float também?

Link para o comentário
Compartilhar em outros sites

  • 0
Só para confirmar, quando você usa uma query, resgata o valor da base e joga num textBox ou label, aparece o valor no formato estranho, certo? Se você usar alguma IDE e fizer query na base, retorna certo?

Não entendi muito bem sua pergunta.

O processo que eu faço é o seguinte:

Eu monto o comando SQL e atribuo o mesmo pra propriedade CommandText do ClientDataSet que eu uso na tela.

Depois eu Atribuo os parâmetros necessários no ClientDataSet e em seguida dou um Open() nele.

No momento que eu dou o Open ele já retorna o Erro e só me traz os valores que não caem naquela situação da conversão.

É isso que você queria saber?

Exato, exato. Vai chegando fim de tarde, usuário ligando e daí já viu né... =D

É, não sei no Delphi2006 como isso funciona, mas dar o erro direto no Open é

estranho... Se tivesse que dar o erro, acredito que daria na hora em que você

fosse jogar o valor para algum campo, variável, etc.

Esse erro dá se você não fizer cast, se der cast pra varchar, vai na boa, é

isso? Já tentou fazer o cast para float também?

exato... Cast pra varchar funciona normal...

Vou tentar dar o cast pra Float...

Eu vou só confirmar mais uma coisa... depois que li seu ultimo post eu lembrei de uma outra coisa e pode ser isto que esteja ocasionando o erro...

Eu possuo um componente desenvolvido aqui na empresa onde trabalho e ele faz a atribuição de mascaras para exibição dependenedo do tipo do campo atribuido ao mesmo... vou dar uma verificada nisto também e já posto o resultado.

muito obrigado por enquanto.

Link para o comentário
Compartilhar em outros sites

  • 0

Então Snake.

Eu testei dando cast para Float no sql...

Ele não deu erro... no entando ele me retornou o valor convertido xD

Retornou 1,21000005037786E-6

De qualquer forma creio que estamos no caminho certo....

Uma forma que testei e funcionou do meu caso foi dar o Cast para Varchar no meu SQL...

Fiz vários testes de inserção, deleção e update... ele funcionou normalmente...

Mesmo assim fico com receio em ficar convertendo valores Numéricos com tantas casas decimais para serem trabalhados como String.

Mas como não encontrei outra solução até o momento vai assim mesmo....

muito obrigado por enquando Snake xD

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Snake... graças a você encontrei a solução.

Passei a estudar as possibilidades de trabalhar com o valor retornado pelo cast de float. E encontrei uma solução.

O cast me retorna 1,21000005037786E-6 sem dar erro... mediante a isto eu forcei uma mascara no display format do campo e.... vualá!

Ele retornou exatamente oque tinha no banco, ou seja, 0,00000121. xD

Sendo assim... Tópico Resolvido!

muito obrigado pela ajuda Snake!! xD

Grande Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0
Snake... graças a você encontrei a solução.

Passei a estudar as possibilidades de trabalhar com o valor retornado pelo cast de float. E encontrei uma solução.

O cast me retorna 1,21000005037786E-6 sem dar erro... mediante a isto eu forcei uma mascara no display format do campo e.... vualá!

Ele retornou exatamente oque tinha no banco, ou seja, 0,00000121. xD

Sendo assim... Tópico Resolvido!

muito obrigado pela ajuda Snake!! xD

Grande Abraço.

Perfeito! Que bom que deu certo. Pena que eu não ajudei muita

coisa, fiquei mais como um bonecão de posto de gasolina. =D

É isso aí, bola pra frente!

Snake.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...