Anular uma data com firebird e dbexpress

Delphi

17/06/2005

Olá amigos, continuo com meu carma que é a anulação de uma data de pagamento. Já tentei todas as dicas aqui do fórum mas nada funcionou.

Utilizo firebird e dbexpress e já tentei dar um clear no componente data e ele acaba gravando a data atual.

Poderiam me ajudar

Abraços


Aldus

Aldus

Curtidas 0

Respostas

Danilorsa

Danilorsa

17/06/2005

a sua coluna não esta definida com valor default??

execute o clear, como você ja fez e no evento before post de um showmessage no campo data e veja o que tem...

caso esteja em branco, pode ter certeza que é alguma coisa do banco

Um abraço


GOSTEI 0
Aldus

Aldus

17/06/2005

Olá Danilo, segue abaixo o código que utilizo para salvar o pagamento e caso o valor pago esteja zerado eu também reabro a parcela.

procedure TfPagtos.BotaoSalvarClick(Sender: TObject);
var
   vvDataAlt:  string;
   vvHoraAlt:  string;
   Quitado:    integer;
   Trs: Ttransactiondesc;
begin
   inherited;
   Quitado:= 1;
   if EditDoc.Text = ´´ then
      begin
        wRequest(´Campo documento é de preenchimento obrigatório!´,1);
        EditDoc.SetFocus ;
        exit;
      end;
   if EditValDoc.Value = 0 then
      begin
        wRequest(´Campo valor é de preenchimento obrigatório!´,1);
        EditValDoc.SetFocus ;
        exit;
      end;
   try
      Trs.TransactionID  := 1;
      Trs.IsolationLevel := xilReadCommitted;
      DM.Conexao.StartTransaction(Trs);
      DM.CDS_Apagar.Close ;
      DM.SQL_Apagar.CommandText := ´SELECT * FROM Apagar WHERE CODEMP=:vCodEmp AND CodFor=:vCodFor AND Doc=:vDoc AND Pa=:vPa´;
      DM.SQL_Apagar.ParamByName(´vCodEmp´).AsInteger  := fMenu.CodEmpSelec ;
      DM.SQL_Apagar.ParamByName(´vCodFor´).AsCurrency := EditCodFor.Value ;
      DM.SQL_Apagar.ParamByName(´vDoc´).AsString      := EditDoc.Text ;
      DM.SQL_Apagar.ParamByName(´vPa´).AsCurrency     := EditPa.Value ;
      DM.CDS_Apagar.Open ;
      if not DM.CDS_Apagar.Eof then
         begin
            if (DM.CDS_Apagar.FieldByName(´QUITADO´).asInteger = 1) and (EditTotPag.Value = 0) then
               begin
                  if wRequest(´Esta parcela já foi recebida! Deseja reabrir?´,0) = idYes then
                     begin
                        EditFormPag.Text   := ´´;
                        EditJuros.Value    := 0;
                        EditDesconto.Value := 0;
                        EditDiasAtra.Value := 0;
                        Quitado            := 0;
                     end
                  else
                     begin
                        EditTotPag.SetFocus;
                        exit;
                     end
                  end;
            DM.SQL_Apagar.CommandText := ´UPDATE Apagar SET ´+
                                                ´DATPAG=:vDatPag, DIASATRA=:vDiasAtra, FORMPAG=:vFormPag, JUROS=:vJuros, DESCONTO=:vDesconto, TOTPAG=:vTotPag, OBSPAG1=:vObsPag1, OBSPAG2=:vObsPag2, QUITADO=:vQuitado, DATAALT=:vDataAlt, HORAALT=:vHoraAlt ´+
                                                ´WHERE CODEMP=:vCodEmp and CodFor=:vCodFor AND Doc=:vDoc AND Pa=:vPa´;
            vvDataAlt          := FormatDateTime(´dd/mm/yyyy´,Date);
            vvHoraAlt          := FormatDateTime(´hh:nn´,Now);
            DM.SQL_Apagar.ParamByName(´vCodEmp´).AsInteger         := fMenu.CodEmpSelec ;
            DM.SQL_Apagar.ParamByName(´vCodFor´).AsCurrency        := EditCodFor.Value ;
            DM.SQL_Apagar.ParamByName(´vDoc´).AsString             := EditDoc.Text ;
            DM.SQL_Apagar.ParamByName(´vPa´).AsCurrency            := EditPa.Value ;
            if Quitado = 0 then
               //Aqui é que não consigo zerar a data
               //Já tentei
               // DM.SQL_Apagar.ParamByName(´vDatPag´).AsDate      := StrTodate(´´)
               //Mas tudo dá errado
               DM.SQL_Apagar.ParamByName(´vDatPag´).Clear
            else
               DM.SQL_Apagar.ParamByName(´vDatPag´).AsDate         := StrTodate(EditDatPag.Text) ;
            DM.SQL_Apagar.ParamByName(´vDiasAtra´).AsCurrency      := EditDiasAtra.Value ;
            DM.SQL_Apagar.ParamByName(´vFormPag´).AsString         := EditFormPag.Text ;
            DM.SQL_Apagar.ParamByName(´vJuros´).AsCurrency         := EditJuros.Value ;
            DM.SQL_Apagar.ParamByName(´vDesconto´).AsCurrency      := EditDesconto.Value ;
            DM.SQL_Apagar.ParamByName(´vTotPag´).AsCurrency        := EditTotPag.Value ;
            DM.SQL_Apagar.ParamByName(´vObsPag1´).AsString         := EditObsPag1.Text  ;
            DM.SQL_Apagar.ParamByName(´vObsPag2´).AsString         := EditObsPag2.Text  ;
            DM.SQL_Apagar.ParamByName(´vQuitado´).AsInteger        := Quitado ;
            DM.SQL_Apagar.ParamByName(´vDataAlt´).AsDate           := StrToDate(vvDataAlt) ;
            DM.SQL_Apagar.ParamByName(´vHoraAlt´).AsString         := vvHoraAlt ;
            DM.SQL_Apagar.ExecSQL;
            DM.Conexao.Commit(Trs);
            if Quitado=1 then
               wRequest(´Documento pago com sucesso!´,1)
            else
               wRequest(´Documento reaberto!´,1);
         end;
   except
      DM.Conexao.RollBack(Trs);
      wRequest(´Erro ao salvar! Repita a operação´,1);
   end;
   DM.CDS_Apagar.Close ;
   DM.SQL_Apagar.CommandText := ´select * from Apagar where CODEMP=999´ ;
   DM.CDS_Apagar.Open ;
   Start2(self);
   EditDoc.SetFocus ;
end;



O que me dizes?


GOSTEI 0
Jairroberto

Jairroberto

17/06/2005

Olá, Aldus!

Como você está montando o CommandText a cada iteração com o banco, não é necessário utilizar parâmetros. Experimente alterar a parte problemática do código pelo seguinte:

var
  FDecimalSeparator: Char;
  ...
begin
  ...
          FDecimalSeparator := DecimalSeparator;
          DecimalSeparator := ´.´;
          try
            vvDataAlt          := FormatDateTime(´dd/mm/yyyy´,Date); 
            vvHoraAlt          := FormatDateTime(´hh:nn´,Now); 
            if Quitado = 0 then 
              DM.SQL_Apagar.CommandText := 
                ´UPDATE´
                + ´  Apagar´
                + ´ SET´
                + ´  DATPAG=NULL´
            else 
              DM.SQL_Apagar.CommandText := 
                ´UPDATE´
                + ´  Apagar´
                + ´ SET´
                + Format(´  DATAPAG=¬s´, [QuotedStr(FormatDateTime(´dd.mm.yyyy´, StrToDate(EditDatPag.Text)))])
                + Format(´  , DIASATRA=¬d´, [EditDiasAtra.Value])
                + Format(´  , FORMPAG=¬s´, [QuotedStr(EditFormaPag.Text)])
                + Format(´  , JUROS=¬s´, [FormatFloat(´0.00´, EditJuros.Value)])
                + Format(´  , DESCONTO=¬s´, [FormatFloat(´0.00´, EditDesconto.Value)])
                + Format(´  , TOTPAG=¬s´, [FormatFloat(´0.00´, EditTotPag.Value)])
                + Format(´  , OBSPAG1=¬s´, [QuotedStr(EditObsPag1.Text)])
                + Format(´  , OBSPAG2=¬s´, [QuotedStr(EditObsPag2.Text)])
                + Format(´  , QUITADO=¬d´, [Quitado])
                + Format(´  , DATAALT=¬s´, [QuotedStr(FormatDateTime(´dd.mm.yyyy´, StrToDate(vvDataAlt)))])
                + Format(´  , HORAALT=¬s´, [QuotedStr(vvHoraAlt)]);

              DM.SQL_Apagar.CommandText := 
                DM.SQL_Apagar.CommandText
                + ´ WHERE´
                + Format(´  (CODEMP=¬d)´, [fMenu.CodEmpSelec])
                + Format(´  AND (CodFor=¬d)´, [EditCodFor.Value])
                + Format(´  AND (Doc=¬s), [QuotedStr(EditDoc.Text)])
                + Format(´  AND (Pa=¬s)´, [FormatFloat(´0.00´, EditPa.Value)])

            DM.SQL_Apagar.ExecSQL; 
            DM.Conexao.Commit(Trs); 
            if Quitado=1 then 
               wRequest(´Documento pago com sucesso!´,1) 
            else 
               wRequest(´Documento reaberto!´,1); 
         end; 
      finally
        DecimalSeparator := FDecimalSeparator;
      end;


A formatação do texto de algumas variáveis podem precisar de algum ajuste em função do tipo de valor retornado pelos ´edits´ utilizados.

Um abraço,
Jair


GOSTEI 0
Danilorsa

Danilorsa

17/06/2005

Amigão, tente o seguinte

DM.SQL_Apagar.ParamByName(´vDatPag´).Value := null

Esse Value é do tipo Variant, permitindo você enviar nulo...

Talvez você precise declarar Variants na sua cláusula USES.

E ainda sim, por vc estar passando o comando direto para o banco(UPDATE TABELA SET...) aconselho a ver valores default no nanco

Um abraço, e espero que dê certo


GOSTEI 0
Aldus

Aldus

17/06/2005

Olá amigos, enfim consegui resolver o problema conforme a dica do amigo Jair, anulando o valor diretamente na instrução.

Obrigado a todos que ajudaram

Mario


GOSTEI 0
Eniorm

Eniorm

17/06/2005

Uma vez eu tive problemas com data no IB6 e pode ser algo que ainda acontece no FB.

Eu tentava gravar a data ´em branco´ mas isso não dava certo, dai resolvi o problema gravando uma data padrão do Ib, que era 30/12/1899 ou 12/30/1989... só não lembro ao certo que data era, mas era a data mais antiga que o Ib aceitava para um campo tipo date.

Dai... para controlar isso no meu sistema eu ignorava aquela data nos select´s etc.


GOSTEI 0
POSTAR