Selecao DevMedia QUERO SER PRIME

Fórum Digito 8.000,00 e no banco de dados aparece 8,00? #334532

11/12/2006

0

Pessoal, nao etou entendendo o motivo que esta gravando no banco de dados desta forma

Digito 8.000,00 num edit e grava 8,00 no banco de dados

O banco de dados eh firebird 2.0 e o campo esta assim:
Field Name---------Field Type--------Size-----Scale
VALOR--------------NUMERIC----------15--------2--

Entao estou usando um edit e no evento onexit do edit esta assim
procedure TForm4.JvEdit1Exit(Sender: TObject);
begin
if jvedit1.text = ´´ then
jvedit1.text:=´´
else
jvedit1.text := StringReplace(jvedit1.text,´.´,´,´,[rfReplaceAll]);

jvedit1.text:= FormatFloat(´,0.00;(,0.00)´,StrToFloat(jvedit1.Text));
end;


Bom parece estar formatado certo, pelo menos nunca tive problemas antes com outros edits.

No fields do dataset mascarei o displayformat assim ,0.00, para mostrar no dbgrid

O problema eh que nao esta gravando certo. esta como citei acima.

Aonde estou errando? :cry:

Gravo assim usando um query e um button

Trexo do codigo:
SQL.clear;
   dm.qsaida.Close;
   sql.add(´ Insert Into SAIDAS (valor) ´);
   sql.add(´ Values (:valor) ´);
   ParamByName(´valor´).Value:=jvedit1.Text;
   ExecSQL 



Obrigado pela ajuda de todos
Adriano


Adriano_servitec

Adriano_servitec

Responder

Posts

12/12/2006

Micheus

[b:7ef396e3a7]Adriano[/b:7ef396e3a7], o problema está na instrução: [i:7ef396e3a7]StringReplace(jvedit1.text,´.´, [color=orange:7ef396e3a7][b:7ef396e3a7]´,´[/b:7ef396e3a7][/color:7ef396e3a7], [rfReplaceAll]);[/i:7ef396e3a7]
Se vc digitasse 8.000 no exit vc estaria modificando(StringReplace) o texto para 8,000 que convertido para Float, resultaria em 8.00;

Na verdade o que vc precisa é remover os pontos que possam existir, de modo que haja, no máximo, uma vírgula que será tratada como separador de decimal pela função StrToFloat.
Utilize apenas: [i:7ef396e3a7]StringReplace(jvedit1.text,´.´, [color=red:7ef396e3a7][b:7ef396e3a7]´´[/b:7ef396e3a7][/color:7ef396e3a7], [rfReplaceAll]);[/i:7ef396e3a7]

Acredito que vc terá que executar o mesmo procedimento ao atribuí-lo ao parâmetro de sua query.

[]s


Responder

Gostei + 0

12/12/2006

Adriano_servitec

Olah [b:06510099c1]Micheus[/b:06510099c1]
Bom segui o que vc me disse mais agora se eu digitar 8.000,00 grava como 800.000,00
Ja mudei os pontos e virgulas entre ´ ´,´ ´ e nada. se eu modifico para um lado fica 8,00 se eu modifico para o outro fica 800.000,00 :cry:

Olha como deixei o codigo no onexit
procedure TForm4.JvEdit1Exit(Sender: TObject); begin if jvEdit1.Text = ´´ then [color=blue:06510099c1][i:06510099c1]//jvedit1.text := StringReplace(jvedit1.text,´.´,´,´,[rfReplaceAll]);[/i:06510099c1][/color:06510099c1] StringReplace(jvedit1.text,´.´, ´´, [rfReplaceAll]); try jvEdit1.text:=formatfloat(´#,0.00´,StrToFloat(jvEdit1.text)); [color=blue:06510099c1][i:06510099c1]//jvEdit1.text:=FloatToStrF(StrToFloat(jvEdit1.text), ffCurrency, 15, 2); //converte em real[/i:06510099c1][/color:06510099c1] except jvEdit1.SetFocus; ShowMessage(´Deve ser informado um valor´); end; [color=blue:06510099c1][i:06510099c1]//dbEdit2.text:=jvEdit1.Text; //Edit5.text:=formatfloat(´0´,StrToFloat(Edit5.text)); //jvedit1.text:= FormatFloat(´#,0.00;()´,StrToFloat(jvedit1.Text)); //jvEdit1.text:=FloatToStrF(StrToFloat(jvEdit1.text), ffCurrency, 15, 2); //converte em real //jvEdit1.text:=formatfloat(´,0.00´,StrToFloat(jvEdit1.text)); {Nr := strtofloat(jvedit1.text); if jvEdit1.Text = ´´ then try jvEdit1.Text := FormatFloat(´,0.00´,Nr); except jvEdit1.SetFocus; ShowMessage(´Deve ser informado um valor´); end; jvedit1.text:=FloatToStr(Nr);}[/i:06510099c1][/color:06510099c1] end;

E na parte que grava tambem fir o replace olhe
SQL.clear; dm.qsaida.Close; sql.add(´ Insert Into SAIDAS (cnpjempresa, ano, CNPJS, CF, codigoF, valor, taxa, ipi, descr, hrlcto, data) ´); sql.add(´ Values (:cnpjempresa, :ano, :CNPJS, :CF, :codigoF, :valor, :taxa, :ipi, :descr, :hrlcto, :data) ´); ParamByName(´cnpjempresa´).AsString:=label20.caption; ParamByName(´ano´).AsString:=label21.caption; ParamByName(´cnpjs´).AsString:=edit1.Text; ParamByName(´cf´).AsString:=Edit3.Text; ParamByName(´codigof´).AsString:=Maskedit2.Text; ParamByName(´descr´).Value:=dbedit6.Text; ParamByName(´valor´).Value:=StringReplace(jvedit1.text,´.´,´´, [rfReplaceAll]); [color=blue:06510099c1][i:06510099c1]//ParamByName(´valor´).Value:=jvedit1.text;[/i:06510099c1][/color:06510099c1] ParamByName(´taxa´).AsString:=Edit3.Text; ParamByName(´IPI´).Value:=jvedit2.Text; ParamByName(´hrlcto´).Value:=Time; ParamByName(´data´).Value:=Date; try
Nao esta funcionando, nunca tive problemas como esse antes, ateh mudei o campo da tabela de [b:06510099c1]numeric 15,2[/b:06510099c1] para [b:06510099c1]decimal 15,2[/b:06510099c1] pra ver se funcionava e nada... :cry:


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

deixe o campo como numeric mesmo.
altere a linha de código para:

svalor := stringreplace(jvedit1.text, ´.´, ´´, [rfReplaceAll]);
svalor := stringreplace(jvedit1.text, ´,´, DecimalSeparator, [rfReplaceAll]);

ParamByName(´valor´).Value := svalor;

supondo que o valor digitado tenha sido 8.000,00 o que ocorrerá é o seguinte:
svalor := ´8000,00´; e depois
svalor := ´8000.00´, que é um valor de ponto flutuante válido

agora uma pergunta: porque você não usa um componente de edição de valores ao invés desse de edição de textos?


Responder

Gostei + 0

12/12/2006

Adriano_servitec

Olah Emerson, eu sempre fiz assim usando um componente de texto e nunca tive problemas, ou seja sempre usando um edit, mais este esta teimando em nao aceitar e converter para falores baixos.
porque você não usa um componente de edição de valores
Qual seria este componente que nao seja nenhum da paleta Data Controls?

Bom percebi que nao esta facil de fazer isso, pois no exemplo que vc me passou soh da para usar essa variavel como String

ai tive que fazer assim
var Form4: TForm4; sValor : String; //Variavel global para defeito das mascaras edit #,0.00 ... ... ... [color=blue:47fbe0a350][i:47fbe0a350]//ParamByName(´valor´).Value:=FormatFloat(´,0.00´,StrToFloat(jvEdit1.Text)); //ParamByName(´P_valor´).AsString:=StringReplace(jvedit1.text,´,´,´.´, [rfReplaceAll]);[/i:47fbe0a350][/color:47fbe0a350] svalor := stringreplace(jvedit1.text, ´.´, ´´, [rfReplaceAll]); svalor := stringreplace(jvedit1.text, ´,´, DecimalSeparator, [rfReplaceAll]); [color=blue:47fbe0a350][i:47fbe0a350] //svalor:=strtofloat(jvEdit1.text); Inaceitavel[/i:47fbe0a350][color] ParamByName(´P_valor´).Value:=sValor;


Ou seja se eu passar o parametro assim

ParamByName(´P_valor´).[b:47fbe0a350]AsString[/b:47fbe0a350]:=sValor; - Funciona mais converte o valor

Agora se eu passar assim
ParamByName(´P_valor´).[b:47fbe0a350]AsFloat[/b:47fbe0a350]:=StrToFloat(sValor); //Da erro
[color=red]Is not a valid floatng point value[/color:47fbe0a350]

Ja mudei o campo valor para decimal 15,2 e nada, tambem resolvi criar um novo campo e chamei-o de basecalculo numeric 15,2 e jogar o parametro pra ele e nada. Continua do mesmo jeito, e o pior que sempre fiz assim e nunca tive problemas, ateh testei outro programa que fiz igualzinho a este e funciona perfeitamente.


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

ParamByName(´P_valor´).[b:eb11373e13]AsFloat[/b:eb11373e13]:=StrToFloat(sValor); //Da erro

que erro, exatamente?


Responder

Gostei + 0

12/12/2006

Adriano_servitec

[quote:bdf2794fe8=´Adriano_Servitec´] ParamByName(´P_valor´).[b:bdf2794fe8]AsFloat[/b:bdf2794fe8]:=StrToFloat(sValor); //Da erro

que erro, exatamente?[/quote:bdf2794fe8]

[b]is not a valid floating point value[b]


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

a msg está incompleta. qual é o erro exatamente?


xxxxx is not a valid floating point value

o que é exibido em xxxxx ?


Responder

Gostei + 0

12/12/2006

Adriano_servitec

a msg está incompleta. qual é o erro exatamente? xxxxx is not a valid floating point value o que é exibido em xxxxx ?


[b:79d3f8de30]Project IPI2006.exe Raised Exception class EConvertError with message ´15.000,00´ is not a valid floating point value. Process stoped. Use Step or Run to Continue[/b:79d3f8de30]


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

putz, Adriano!

eu vacilei no código e você nem percebeu...

o correto é:
svalor := stringreplace(jvedit1.text, ´.´, ´´, [rfReplaceAll]);
svalor := stringreplace([b:7f69709b66]svalor[/b:7f69709b66], ´,´, DecimalSeparator, [rfReplaceAll]);


Responder

Gostei + 0

12/12/2006

Adriano_servitec

Ainda nada consegui amigo

svalor := stringreplace(jvedit1.text, ´.´, ´´, [rfReplaceAll]);
svalor := stringreplace(svalor, ´,´, DecimalSeparator, [rfReplaceAll]);
ParamByName(´P_valor´).Value:=sValor;

Ai fica pior se eu digitar 1.500,00 no edit grava 1.500.000,00...rsrsrs :D

Mais falando serio. Ta Brabo :cry:


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

e assim:
svalor := stringreplace(jvedit1.text, ´.´, ´´, [rfReplaceAll]);
svalor := stringreplace(svalor, ´,´, ´.´, [rfReplaceAll]);
ParamByName(´P_valor´).Value:=sValor;


Responder

Gostei + 0

12/12/2006

Adriano_servitec

e assim: svalor := stringreplace(jvedit1.text, ´.´, ´´, [rfReplaceAll]); svalor := stringreplace(svalor, ´,´, ´.´, [rfReplaceAll]); ParamByName(´P_valor´).Value:=sValor;


Eita que esse pedaço do projeto deu trabalho heim amigo...rsrsrsrs :D

Ufa ateh que enfim, vc matou a charada deste codigo maluco. :idea: :shock:

Tinha mudado tudo, ponto por virgula, virgula por ponto, menos incluido esse novo ´,´ depois do sValor. :oops:

Bom Emerson, mais uma vez, obrigado por ter paciencia e ter me ajudado mais uma vez.

Valeu mesmo amigo, caso resolvido
Abraços


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar