Fórum Trabalhando com datas... Como criar? #336688
24/01/2007
0
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
Curtir tópico
+ 0Posts
24/01/2007
Aleriopreto
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)
Gostei + 0
24/01/2007
Rodrigorpb
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.
Gostei + 0
24/01/2007
Rodrigorpb
Gostei + 0
25/01/2007
Aleriopreto
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)