GARANTIR DESCONTO

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 :

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

Eduardo Jr

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.

StrToCurr('9999,99');  // --> Assim é aceito

Já, dessa forma ocorre o erro de ponto flutuante:
StrToCurr('9999.99');  // --> Assim NÃO é aceito

Uma outra forma da qual não é aceito é assim:
StrToCurr('9.999,99');  // --> Assim NÃO é aceito

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:
ParamByName('VLR').AsCurrency := StrToCurr(Trim(lbValor.Items[i]));

Por:
ParamByName('VLR').AsCurrency := StrToCurr(StringReplace(Trim(lbValor.Items[i]), '.', '', [rfReplaceAll]));

Natanael Ferreira

Natanael Ferreira
Responder

Gostei + 1

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

Aceitar