[firebase-br] Sql erro de coverção valor motetario

Sandro Souza escovadordebits em gmail.com
Qui Ago 23 17:10:58 -03 2012


Bom dia/tarde Marcio.

Meu nobre, a função "FormatFloat" do Delphi segue a formatação de valores
reais definido no painel de controle, ou seja, no nosso português
brasileiro, o ponto decimal é a vírgula, e as casas das milhares são
separadas por pontos.

Na grande maioria dos SGBDs, senão todos, o ponto decimal é ponto mesmo, e
não há separação das casas das milhares, ou seja, a função "FormatFloat"
está retornando a string "2,36" para o valor 2.36, e o Firebird, assim como
os outros SGBDs, está "entendendo" como dois valores separados por vírgula
(2 e 36).

Evite usar essas funções que seguem a configuração do painel de controle.

Sugiro que você use uma das mais antigas procedures existentes no nosso bom
e velho pascal de cada dia, ou seja, a procedure "Str" (veja em
http://www.irietools.com/iriepascal/progref296.html).

Crie uma variável do tipo string, que receberá a string resultante da
conversão do valor numérico, seja ele inteiro ou decimal.

O primeiro parâmetro da procedure Str é o valor a ser convertido, e o
segundo parâmetro (por referência) é a variável string que receberá a
string de resultado.

Exemplo:

procedure teste;
var S: String;
begin
  // Formantando inteiros.
  Str(123, S); // S = '123';
  // Formantando inteiros e informando a quantidade desejada de caracteres.
  Str(123*:5*, S); // S = '  123'; (2 espaços em branco mais '123' que são
5 caracteres no total)
  // Formatando números reais/decimais.
  Str(123.456, S); // S = '1.23456E+02'; => 1.23456 * 10 ^ 2 = 1.23456 *
100 = 123.456
  // Formatando números reais/decimais com formato específico.
  Str(123.456*:7:3*, S); // S = '123.456'; => :7:3 = total de 7 caracteres,
com 3 decimais.
  Str(123.456*:9:3*, S); // S = '  123.456'; => :9:3 = 2 espaços mais
'123.456' = total de 9 caracteres, com 3 decimais.
  Str(123.456*:9:4*, S); // S = ' 123.4560'; => :9:4 = 1 espaço mais
'123.4560' = total de 9 caracteres, com 4 decimais.
end;

Que tal fazer uma função genérica?

function DoubleFormatado(const Valor: Double; TamanhoTotal, CasasDecimais:
Byte): String;
begin
  Str(Valor:TamanhoTotal:CasasDecimais, Result);
end;

Aí pode usar da seguinte forma:

Modulo.Q_ALTURA_COMANDO.SQL.Text := 'Select * from ALTURA_COMANDO WHERE
(ALTURA_COMANDO.ALTURA_INI >
DoubleFormatado(Modulo.Q_ItensPedidosItPed_Altura.AsFloat,18,2)+')';

Não use a função "QuotedStr" em valores numéricos, apenas em valores
alfanuméricos (strings) e datas e/ou horas.

Espero ter ajudado mais que atrapalhado. :D

Em 23 de agosto de 2012 16:46, Marcio Alves de Almeida <net.marcio em gmail.com>
escreveu:
>  Alguem Pode me ajudar da erro de converção  nao consigo fazer um
> select em campo com valores
>
>     ALTURA_COMANDO.ALTURA_INI NUMERIC (9, 2)
>
>     ITPED_ALTURA  NUMERIC (18, 3),
>
>
>    DA UM ERRO conversion from string '2,36'
>
>          Modulo.Q_ALTURA_COMANDO.SQL.Add('Select * from ALTURA_COMANDO
> WHERE (ALTURA_COMANDO.ALTURA_INI >
>
'+QuotedStr(FormatFloat('###,###,###,###,###.00',Modulo.Q_ItensPedidosItPed_Altura.Value))+')
>  ');
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa



Mais detalhes sobre a lista de discussão lista