Fórum Erro salvando valor monetario...e key violation #586295
27/09/2017
0
Ola !
Estou fazendo um programinha de troca de cheques com firebird. Este e o codigo do botao salvar troca :
no meu computador( o que estou fazendo o programa) funciona blz ja no do cliente da um erro na hora que executa a linha : ParamByName('VLR').AsCurrency := StrToCurr(Trim(lbValor.Items[I])); dizendo que o valor inserido no listbox lbvalor nao e um float valido e se cancelo e tento salvar de novo da erro de keyviolation na tabela cdstroca....
todos campos monetarios sao do tipo currency e estao com propriedade currency no fields editor setado pra true
o que devo fazer:
Estou fazendo um programinha de troca de cheques com firebird. Este e o codigo do botao salvar troca :
procedure TfrmTroca.btSalvaTrocaClick(Sender: TObject);
Var
I,J : Integer;
begin
With DM.cdsTroca do
Begin
Append;
FieldByName('AJIOTA').AsString := cmbAjiota.Text;
FieldByName('DATA_TROCA').AsDateTime := cmbDataComp.Date;
FieldByName('TAXA').AsString := lblTaxa.Caption;
FieldByName('TOTAL_BRUTO').AsCurrency := edtTotalBruto.AsCurrency;
FieldByName('TOTAL_DEDUCOES').AsCurrency := edtTotalDescontos.AsCurrency;
FieldByName('TOTAL_LIQ').AsCurrency := edtTotalLiquido.AsCurrency;
Post;
ApplyUpdates(0);
Close;
Open;
Last;
End;
for I := 0 to lbValor.Items.Count - 1 do
Begin
With DM.sqlExec do
Begin
CommandText := '';
CommandText := 'INSERT INTO BORDERO(DATA,DATA_CHEQUE,DESCONTO,NUM_DIAS,TROCAID,VALOR,VALOR_PAGO) VALUES(:DT,:DTCQ,:DESC,:NDIAS,:TID,:VLR,:VLRPG)';
ParamByName('DT').AsDate := cmbDataComp.Date;
ParamByName('DTCQ').AsDate := StrToDate(lbData.Items[I]);
ParambyName('DESC').AsCurrency := StrToCurr(lbDescontos.Items[I]);
ParamByName('NDIAS').AsInteger := StrToInt(lbNumDias.Items[I]);
ParamByName('TID').AsInteger := DM.cdsTroca.FieldByName('TROCA_ID').AsInteger;
ParamByName('VLR').AsCurrency := StrToCurr(Trim(lbValor.Items[I]));
ParamByName('VLRPG').AsCurrency := StrToCurr(lbValorPago.Items[I]);
ExecSql;
End;
End;
for J := 0 to Cheques.Count -1 do
Begin
if DM.cdsChequesTroca.Locate('NUM_CHEQUE',Cheques[J],[loCaseInSensitive]) then
Begin
With DM.sqlExec do
Begin
CommandText := '';
CommandText := 'UPDATE CHEQUES SET TROCADO = 1,TROCAID =:TID,DATA_TROCA =:DT,AJIOTA =:AJID WHERE NUM_CHEQUE =:NC';
ParamByName('TID').AsInteger := DM.cdsTroca.FieldByName('TROCA_ID').AsInteger;
ParamByName('DT').AsDate := cmbDataComp.Date;
ParamByName('AJID').AsString := cmbAjiota.Text;
ParamByName('NC').AsString := Cheques[J];
ExecSql;
End;
End;
End;
btSalvaTroca.Enabled := False;
cmbAjiota.Enabled := False;
btCancelaTroca.Enabled := False;
btAdiciona.Enabled := False;
DBGridEh1.Enabled := False;
DBNavigator1.Enabled := False;
cmbDataComp.Enabled := False;
btNovaTroca.Enabled := True;
btFechar.Enabled := True;
RzPanel3.Enabled := False;
PodeFechar := True;
end;
no meu computador( o que estou fazendo o programa) funciona blz ja no do cliente da um erro na hora que executa a linha : ParamByName('VLR').AsCurrency := StrToCurr(Trim(lbValor.Items[I])); dizendo que o valor inserido no listbox lbvalor nao e um float valido e se cancelo e tento salvar de novo da erro de keyviolation na tabela cdstroca....
todos campos monetarios sao do tipo currency e estao com propriedade currency no fields editor setado pra true
o que devo fazer:
Eduardo Jr
Curtir tópico
+ 0
Responder
Post mais votado
27/09/2017
Qual a mensagem de erro? O erro é este: "is not a valid floating point value"?
Se for, pode ser falha na conversão para currency. Provavelmente você está tentando salvar com o separador de milhar.
Para salvar no banco tenta remover os pontos, deixando apenas a virgula para o separador decimal.
Já, dessa forma ocorre o erro de ponto flutuante:
Uma outra forma da qual não é aceito é assim:
Nesse último, apesar do caracter separador de decimais ser a vírgula como no primeiro exemplo em que ele é aceito, há também o ponto de separação de milhar. Dessa forma não é aceito.
Tente trocar:
Por:
Se for, pode ser falha na conversão para currency. Provavelmente você está tentando salvar com o separador de milhar.
Para salvar no banco tenta remover os pontos, deixando apenas a virgula para o separador decimal.
StrToCurr('9999,99'); // --> Assim é aceitoJá, dessa forma ocorre o erro de ponto flutuante:
StrToCurr('9999.99'); // --> Assim NÃO é aceitoUma outra forma da qual não é aceito é assim:
StrToCurr('9.999,99'); // --> Assim NÃO é aceitoNesse último, apesar do caracter separador de decimais ser a vírgula como no primeiro exemplo em que ele é aceito, há também o ponto de separação de milhar. Dessa forma não é aceito.
Tente trocar:
ParamByName('VLR').AsCurrency := StrToCurr(Trim(lbValor.Items[i]));Por:
ParamByName('VLR').AsCurrency := StrToCurr(StringReplace(Trim(lbValor.Items[i]), '.', '', [rfReplaceAll]));Natanael Ferreira
Responder
Gostei + 1
Clique aqui para fazer login e interagir na Comunidade :)