GARANTIR DESCONTO

Fórum Trabalhando com datas... Como criar? #336688

24/01/2007

0

Olá amigos,

Estou desenvolvendo um sistema para o TCC da facudade e nele criei uma função para pagamento de mensalidade de uma escola, no cadastro de clientes tem um campo que é o dia do pagamento, e tem outra tabela que é do recebimento da mensalidade, então quando faz o cadastro de cliente e clica em Grava ele já gera uma mensalidade automática no dia (ex: Cadastrei no mês de janeiro no dia 23, ele já gera na tabela mensalidade no campo Vencimento: 23/01/2007, quando eu clicar no Receber na tabela Mensalidade ele gera 23/02/2007 e assim por diante.

Minha pergunta é alguêm tem alguma idéia de como posso fazer para ele gerar a parcela para o outro mês. Tendo em conta que se o pagamento cadastrado é no dia 31 os meses que não tem ele gera para 30, e também tem fevereiro que é 28 ou 29.

Como faço isso?

Obrigado,


Rodrigo


Rodrigorpb

Rodrigorpb

Responder

Posts

24/01/2007

Aleriopreto

vc pode fazer uma func

Function Nova_Data(mdata:tdatetime):tdatetime;
var wdias:integer;
begin
case month(mdata) of
1,3,5,7,8,10,12: wdias := 31
4,6,9,11 : wdias := 30
else wdias := 28;
end;
Result := wdata+wdias;
end;

ai vc pode fazer uma func para verificar se é bissexto (fev)


Responder

Gostei + 0

24/01/2007

Rodrigorpb

O que está errado neste código aqui:

Este é quando faz o cadastro e crica em gravar (no cadastro tem um campo para colocar somente o dia do Vencimento):

procedure TFCadAluno.BtnGravarClick(Sender: TObject);
begin
Try
  Screen.Cursor := crSQLWait;

  If Not(Transaction.InTransaction) Then
    Transaction.StartTransaction;

    GerarMensalidade(´Sim´);

    Query.Post;
    Query.ApplyUpdates;

    Transaction.CommitRetaining;
    //MessageDlg(´O(A) Aluno(A) [ ´+DM.qAlunoALU_NOME.Value +´ ] foi Salvo(a) com Sucesso !´, mtWarning, [mbOK], 0);
    HabilitarBotoes;
 Finally
  Screen.Cursor := crDefault;
   If DBEdit2.Text <> ´´ Then
    begin
      BtnIncluir.SetFocus;
    end;
End;
end;


[b:0b79fc3642]Aqui é a Procedure Gera Mensalidade.[/b:0b79fc3642]

procedure TFCadAluno.GerarMensalidade(varVerificar: String);
var ano,mes,dia: Word;
    DataVencimento: TDateTime;
    varReceber: String[3];
begin
DecodeDate(Date,ano,mes,dia);
dia:= Query.FieldByName(´ALU_VENCIMENTO´).AsInteger;

With DM.qMensAluno do
  begin
    If varVerificar = ´Sim´ then
      begin
        Close;
        SQL.Clear;
        SQL.Add(´SELECT * FROM Mens_Aluno´);
        SQL.Add(´WHERE Mens_CodigoAluno = ´+39+DBEdit1.Text+39);
        Prepare;
        Open;

        If RecordCount = 0 then
          begin
            Open;
            Last;
            Insert;

            If (dia in [30,31])and
               (mes = 2)then
              dia:= 28;

            DataVencimento:= StrToDate((IntToStr(dia)+´/´+IntToStr(mes)+´/´+IntToStr(ano)));

            FieldByName(´MENS_VALOR´).AsFloat:= Query.FieldByName(´ValorTotal´).AsFloat;
            FieldByName(´MENS_DTVENC´).AsDateTime:= Date;

            If MessageDlg(´Deseja receber a primeira mensalidade?´,MtInformation,[MbYes,MbNo],0)=mrNo then
              FieldByName(´MENS_STATUS´).AsString:= ´NAO´
             else
              begin
                FieldByName(´MENS_STATUS´).AsString:= ´SIM´;
                FieldByName(´MENS_DTPAG´).AsDateTime:= Date;
                rRecibo.Print;
                varReceber:= ´Sim´;
              end;

            Post;
            Refresh;

            If varReceber = ´Sim´ then
              begin
                Last;
                Insert;

                FieldByName(´MENS_VALOR´).AsFloat:= Query.FieldByName(´ValorTotal´).AsFloat;
                FieldByName(´MENS_DTVENC´).AsDateTime:= PegarProximaData(´Não´);
                FieldByName(´MENS_STATUS´).AsString:= ´NAO´;

                Post;
                Refresh;
              end;
          end;
      end;

    If varVerificar = ´Não´ then
      begin
        Open;
        Last;
        Insert;

        FieldByName(´MENS_VALOR´).AsFloat:= Query.FieldByName(´ValorTotal´).AsFloat;
        FieldByName(´MENS_DTVENC´).AsDateTime:= PegarProximaData(´Sim´);
        FieldByName(´MENS_STATUS´).AsString:= ´NAO´;

        Post;
        Refresh;

      end;
  end;


[b:0b79fc3642]Função Gera Proxima data da mensalidade[/b:0b79fc3642]

function TFCadAluno.PegarProximaData(varBuscarData: String): TDateTime;
var ano,mes,dia: Word;
    varProsseguir, varCodigo: String;
begin
If varBuscarData = ´Não´ then
  begin
    DecodeDate(Date,ano,mes,dia);
    dia:= Query.FieldByName(´ALU_VENCIMENTO´).AsInteger;
  end
 else
  begin
    With Dm.qTemp do
      begin
        Close;
        SQL.Clear;
        SQL.Add(´SELECT Max(Mens_Codigo) as Codigo FROM MENS_ALUNO´);
        SQL.Add(´WHERE Mens_CodigoAluno = ´+#39+DBEdit1.Text+39+
                ´AND Mens_Status = ´+39+´SIM´+39);
        Open;

        varCodigo:= FieldByName(´Codigo´).AsString;

        Close;
        SQL.Clear;
        SQL.Add(´SELECT * FROM MENS_ALUNO´);
        SQL.Add(´WHERE Mens_Codigo = ´+39+varCodigo+39);
        Open;

        DecodeDate(FieldByName(´Mens_DTVenc´).AsDateTime,ano,mes,dia);
        dia:= Query.FieldByName(´ALU_VENCIMENTO´).AsInteger;

        Close;
      end;
  end;

If mes in[4,6,9,11] then
  begin
    mes:= mes+1;
    varProsseguir:= ´Não´;
  end;

If (mes in[1,3,5,7,8,10,12])and
   (varProsseguir <> ´Não´) then
  begin
    mes:= mes+1;

    If mes = 13 then
      begin
        mes:= 1;
        Ano:= Ano+1;
      end;

    If mes = 2 then
      varProsseguir:= ´Não´;  
  end;

If (mes = 2)and
   (dia in [30,31])and
   (varProsseguir <> ´Não´) then
  begin
    mes:= mes+1;
    dia:= Query.FieldByName(´ALU_VENCIMENTO´).AsInteger;
  end;

If (mes = 2) and
   (Not(dia in [30,31])) then
  mes:= mes+1;

Result:= StrToDate((IntToStr(dia)+´/´+IntToStr(mes)+´/´+IntToStr(ano)));
Result:= Result;
end;


[b:0b79fc3642]O problema é o seguinte tem uns cadastros quando vai fazer pela primeira fez ele comoca uma data do ano de 1900, alguem sabe onde esta o erro no código. Sendo que se eu Cadastrar uma pessoa hoje e voltar a data 1 dia e receber ele tb da erro.[/b:0b79fc3642]


Obnrigado.


Responder

Gostei + 0

24/01/2007

Rodrigorpb

Alguém poderia ajudar,


Responder

Gostei + 0

25/01/2007

Aleriopreto

cara, faz um debug na func ai voce pega onde esta o erro... vai ser mais rapido


Responder

Gostei + 0

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

Aceitar