[firebase-br] Meio OFF-TOPIC - Dúvida com formatação de valor fracionário para insert com sql D2009

Sandro Souza escovadordebits em gmail.com
Ter Jun 16 17:28:43 -03 2009


Bom dia/tarde Papaia.

Grande Papaia, o problema é que as funções de formatação de data e de
números do Delphi, assim como fazem outras linguagens de programação para
M$$$ Windows, seguem a configuração do painel de controle do M$$$ Windows.

Ou seja, se está configurado que o separador de milhares é o ponto e o ponto
decimal é a vírgula (como no nosso português brasileiro), então o resultado
de FormatFloat('#.00', 1.23) retornará 1,23, ou seja, com uma vírgula no
lugar do ponto decimal, e no comando SQL, isso significa separação de
valores.

Sendo assim, tente utilizar a seguinte função no lugar do FormatFloat:

function DoubleToStr(const Valor: Double; CasasDecimais: Byte = 2): String;
begin
  // Converte o valor informado para sua representação string,
  // sem as configurações do painel de controle.
  Str(Valor:0:CasasDecimais, Result);
end; // function DoubleToStr

Por questões de maior precisão numérica, procure sempre trabalhar com o tipo
Currency, e nesse caso, vai aqui mais uma função de formatação:

function CurrencyToStr(const Valor: Currency; CasasDecimais: Byte = 2):
String;
begin
  // Converte o valor informado para sua representação string,
  // sem as configurações do painel de controle.
  Str(Valor:0:CasasDecimais, Result);
end; // function CurrencyToStr

Agora, tente substituir todos os FormatFloat('#.00', xyz) por DoubleToStr(
xyz, 2) ou até CurrencyToStr(xyz, 2).

Espero ter ajudado mais que atrapalhado. :D

2009/6/16 papaia.forum <papaia.forum em gmail.com>

> Primeiramente desculpe-me se a pergunta fugir do escopo do grupo, mas como
> é
> delphi + Firebird, penso que é pertinente.
> Cenário: D2009 + DataSnap + Firebird + Drive do Thiago Borges.
> Tenho que gravar em uma tabela filho e uma "neta", mas não dá para usar
> master/detail, pois essa gravação é condicional; portanto estou utilizado o
> evento AfterUpdateRecord do provider da tabela "Pai", onde testo a condição
> pelo DeltaDS. Até aí tudo bem. O problema ocorre porque tenho que gravar um
> valor fracionario (tipo 0.50 centavos) na tabela "neta", e já usei todo
> tipo
> de formatação na instrução sql e não consigo gravar o valor com as casas
> decimais (se usar uma mascara que arredonda aí consigo gravar). Segue a
> instrução sql:
>
>
>          // grava da tabela neta.
>          Ssql:='insert into
> COMISSOES_CONFIG_DETALHE(id_comissoes_config_detalhe, '
>              + 'id_comissoes_config,data,comissao_supervisor_tipo,'
>              + 'comissao_supervisor_valor, comissao_vendedor_tipo,'
>              + 'comissao_vendedor_valor,id_usuario, datahoradigitacao)'
>              + ' values (gen_id(gen_comissoes_config_detalhe_id,1) '
>              + ', ' + IntToStr(cont)
>              + ', ' +
> quotedstr(FormatDateTime('mm/dd/yyyy',DeltaDS.FieldByName('DATA').AsDateTime))
>              + ', ' +
> DeltaDS.FieldByName('COMISSAO_SUPERVISOR_TIPO').AsString
>              + ', ' + quotedstr(FormatFloat('#.00',
> DeltaDS.FieldByName('COMISSAO_SUPERVISOR_VALOR').AsCurrency))
>              + ', ' +
> DeltaDS.FieldByName('COMISSAO_VENDEDOR_TIPO').AsString
>              + ', ' + quotedstr(FormatFloat('#.00',
> DeltaDS.FieldByName('COMISSAO_VENDEDOR_VALOR').AsCurrency))
>              + ', ' + DeltaDS.FieldByName('ID_USUARIO').AsString
>              + ', current_timestamp)';
>          sqlAux.Close;
>          sqlAux.CommandText:=Ssql;
>          sqlAux.ExecSQL(True);
>
> O erro está na linha que tem o QuotedStr.
> Já pesquisei nesta lista e em outras, e acho que já usei todas as opções de
> máscaras, mas nenhum funcionou.
> Se alguem puder dar alguma dica, antecipadamente deixo meus agradecimentos.
>
> waldir silva.
>
>
> ______________________________________________
> 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