Anular uma data com firebird e dbexpress
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
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
Curtidas 0
Respostas
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
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
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.
O que me dizes?
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
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:
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
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
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
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
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
Obrigado a todos que ajudaram
Mario
GOSTEI 0
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.
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