Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com data me tirando do sério


fajo

Pergunta

Possuo um sistema q dentre outras funções gera parcelas de pagamento, sendo permitido ao operador modificar essa data caso não seja uma data ideal para o cliente naquele mês (é feita uma ligação antes pra confirmar), a operadora escolhe a nova data em um DateTimePeacker, no closeup, tenho a seguinte rotina:

procedure TFrm_Recibos_Impressao.Cbo_DataCloseUp(Sender: TObject);
var Q_Qr:TSqlquery;
    dt: TDate;
    diautil,diadomes,diadasemana:boolean;
begin
   diautil := False;
   diadomes := False;
   diadasemana := false;

    dt:= cbo_data.Date;
    diautil := Data_util(datetostr(dt)) = 'N';
    diadomes := DayOfTheMonth(dt) = 1;
    diadasemana := DayOfWeek(dt) = 1;
    if (diautil) and (diadomes) then
     dt := IncDay(dt,1)
    else
    if diautil then
     dt := IncDay(dt,-1)
    else
    if (diadomes) and (diadasemana) then
     dt := IncDay(dt,1)
    else
    If diadasemana then
     dt := IncDay(dt,-1)
    else
     dt := Cbo_Data.Date;

    if Q_Doacoes_Impressao.RecordCount > 0 then
     begin
      Q_Qr := TSQLQuery.Create(nil);
      Q_Qr.SQLConnection := dm.Conexao;
      Q_Qr.SQL.Add('UPDATE TAB_DOACOES SET DOC_DATA_OPERACAO = :data WHERE DOC_ID ='+Q_Doacoes_ImpressaoDOC_ID.AsString);
      Q_Qr.Params.ParamByName('data').AsDate := dt;
      Q_Qr.ExecSQL;
      Q_Qr.Free;
     end;
end;
e a função Data_util, q verifica se é uma data válida e faz uma consulta a uma tabela de feriados pra saber se é feriados ou não.
function TFrm_Recibos_Impressao.Data_util(data: string): string;
begin
  If Not dm.F_Data_Valida(data) Then
  Begin
    Exit;
  End;
    Try
      dm.dsQ_Query2.Close;
      dm.dsQ_Query2.Params.ParamByName('DATA').AsDate := strtodate(data);
      dm.dsQ_Query2.Open;
    Except
      MessageDlg('Aconteceu um erro no momento da obtenção dos dados! Contacte o administrador do sistema!',mtError,[mbOK],0);
      Exit;
    End;

    if dm.dsQ_Query2.RecordCount = 0 then
     Result := 'S'
    else
     Result := 'N';

end;

e o problema é o seguinte:

quando se entra no sistema, tudo funciona perfeitamente, escolhe uma data, se for feriado ele decrementa um dia, se for domingo, decrementa um dia, se for um dia normal, fica na data escolhida; só que no decorrer da operação do sistema a coisa começa a desandar, toda data q é escolhida, independente de ser válida ou não, o sistema decrementa um dia, ai tem q fechar o sistema e abrí-lo quando tudo funciona normal de novo e assim fica o dia todo, deu problema, fecha e abre.

Será q estou esquecendo de retirar algo da memória?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
só que no decorrer da operação do sistema a coisa começa a desandar, toda data q é escolhida, independente de ser válida ou não, o sistema decrementa um dia, ai tem q fechar o sistema e abrí-lo quando tudo funciona normal de novo e assim fica o dia todo, deu problema, fecha e abre.

o erro esta no aninhamento dos ifs

refaça a lógica dos Ifs , procure faze-los separadamente que voce encontrará o erro

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, desculpe meu raciocinio lento, mas, não entendi o q está errado no aninhamento, pois como falei, o erro só ocorre depois de um tempo de uso do sistema, se está errado o aninhametno, porque não ocorre o tempo todo?

E como tb falei, o erro é q quando se escolhe a data no DateTimePeacker ele sempre antecipa um dia, ou seja, se escolho 15/07/09, ele grava no banco 14/07/09, independente de ser feriado, domingo, dia útil, etc..., ou seja, esta caindo no 2º ou no 4º if - sempre, quer dizer, depois de um tempo; mas estou encucado é exatamente porque funciona quando se abre o sistema e durante algum tempo, depois, começa o decremento.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
E como tb falei, o erro é q quando se escolhe a data no DateTimePeacker ele sempre antecipa um dia, ou seja, se escolho 15/07/09, ele grava no banco 14/07/09, independente de ser feriado, domingo, dia útil, etc..., ou seja, esta caindo no 2º ou no 4º if - sempre, quer dizer, depois de um tempo; mas estou encucado é exatamente porque funciona quando se abre o sistema e durante algum tempo, depois, começa o decremento.

Veja como fica muito mais simples

uses DateUtils;

Function ProximoDiaUtil (dData : TDateTime) : TDateTime;
begin
   if DayOfWeek(dData) = 7 then
      dData := dData + 2
   else
      if DayOfWeek(dData) = 1 then
         dData := dData + 1;
   ProximoDiaUtil := dData;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var s : string;
begin
    s := datetostr(ProximoDiaUtil(DateTimePicker1.Date));
    label1.Caption := s;

end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...