[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