Como extrair mes/ano num laço?
02/06/2008
0
vamos supor que tenho que efetuar um carnê de recebimento coo todos vencimentos para o dia 05 por exemplo
05/06/2008
05/07/2008
...
...
05/06/2010
então quero fazer isso num laço usando como referencia o dia
não sei se usa o decodedate, ou algo, pois no momento não estou tendo como testar, mais o codigo seria algo + ou - assim
var I : integer; dia : string; mes, ano : Word; strData : String; begin dia := edtdias.text; try for I := 0 from quant_parcelas do {pega o dia + mes, ano proximo} DecodeDateTime(Now, ano, mes); StrData := dia + DateToStr(DecodeDateTime(mes)) + DateToStr(DecodeDateTime(ano)); begin with qry do begin append; fieldbyname(´data´).asDateTime := StrToDate(StrData); post; end; commit; end; except rollback; end;
[b:cdf525b981]Obs: Não sei se fiz direito o codigo, mais isso não é o importante, só foi pra mostrar que eu preciso fazer num laço para gravar no banco, o que eu preciso mesmo é saber como fazer para mostrar o proximo mes + o dia que eu digitar.[/b:cdf525b981]
Adriano_servitec
Posts
02/06/2008
Adriano_servitec
var I : integer; dia : string; mes, ano : Word; strData : String; begin dia := edtdias.text; try for I := 0 from quant_parcelas do {pega o dia + mes, ano proximo} DecodeDateTime(Now, ano, mes); StrData := dia + DateToStr(DecodeDateTime(mes)) + DateToStr(DecodeDateTime(ano)); begin with qry do begin append; //fieldbyname(´data´).asDateTime := StrToDate(StrData); //DATA recebe a data replicando conforme o numero das parcelas FieldByName(´DATA´).Value:= incMonth( Date, i - 1); post; end; commit; end; except rollback; end;
02/06/2008
Paulo
03/06/2008
Emerson Nascimento
tem certeza que a necessidade é somente incrementar o mês?
porque na prática isso não acontece. sempre são acrescidos 30 dias à data anterior. ou seja:
1a. - 05/08/2008
2a. - 04/09/2008
3a. - 04/10/2008
4a. - 03/11/2008
até porque o intervalo pode conter o mês de Fevereiro. isso limitaria sua data, pois você nunca poderia trabalhar com os dias 29, 30 e 31 e será necessário um bom controle para que isso não aconteça.
se você quiser mesmo acrescentar o mês:
var I, Quant_Parcelas: integer; dia, mdia, mes, ano: Word; dtData: TDateTime; begin // decodifica a data atual nas variáveis DecodeDate(SysUtils.Now, ano, mes, dia); // quantidade de parcelas Quant_Parcelas := 10; // pega o dia informado dia := StrToInt(edtDias.Text); try // iniciatransacao; for I := 1 to Quant_Parcelas do begin // incremente o mes em 1 inc(mes); // se o mês for maior que 12, // volta o mes para 1 a incrementa o ano if mes > 12 then begin mes := 1; inc(ano); end; // avalia se o dia informado é maior que o último dia do mês. // se for maior, pega o último dia do mês; senão, pega o dia informado mdia := MonthDays[IsLeapYear(ano), mes]; if dia > mdia then dtData := StrToDate(Format(´¬d/¬d/¬d´, [mdia, mes, ano])) else dtData := StrToDate(Format(´¬d/¬d/¬d´, [dia, mes, ano])); // grava a data with qry do begin append; //fieldbyname(´data´).asDateTime := StrToDate(StrData); //DATA recebe a data replicando conforme o numero das parcelas FieldByName(´DATA´).Value := dtData; post; end; end; // gravatransacao; except // desfazalterações; end; end;
03/06/2008
Adriano_servitec
Fiz assim e funcionou
var I : integer; dia : string; mes, ano : Word; strData : String; begin dia := edtdias.text; try for I := 0 from quant_parcelas do begin with qry do begin append; //DATA recebe a data replicando conforme o numero das parcelas FieldByName(´DATA´).Value:= incMonth( Date, i); post; end; commit; end; except rollback; end;
Teria que somar o periodo + date?
Mais assim não vai aumentar cfe. as datas, pois tenho datas de 30, 31 28 e 29 dias no mes. teria que criar uma função?
03/06/2008
Emerson Nascimento
como eu havia explicado, você terá problemas dependendo do dia do vencimento.
teste o IncMonth() com parcelas a vencer no dia 30, iniciadas em 30/12/2008 e finalizadas em Abril/2009.
veja o resultado.
06/06/2008
Adriano_servitec
Olá Emerson, testei aqui com o IncMonth e ficou assim
Data do documento
30/12/2008
Quantidade de Parcelas
04
Vencimentos
30/01/2009
28/02/2009
30/03/2009
30/04/2009
Não esta certo?
Ou seria assim
Data do Documento
30/12/2008
Parcelas
04
Quantidade de dias entre parcelas
30
vencimento
29/01/2009
28/02/2009
30/03/2009
29/04/2009
Fiz o codigo assim
function TfrmGerarRegAutom.GerarRegistros(ANumParcelas, ANumDias: Integer): Boolean; var I, Dias, tot_parc, t_parcelas : Integer; nr_doc, fornec, cont_contab, Histor, str_TipoCredor, strParcelas : String; dt_lanc, dt_doc : TDateTime; vl_total, vl_parcela : Real; begin Result := False; with frmCadContasaPagar.cdsCadContasPagar do begin try Dias := 1; dt_lanc := StrTodate(lbldtlcto.Caption); nr_doc := lblnrdoc.Caption; dt_doc := StrToDate(lbldtdoc.Caption); fornec := lblfornecedor.Caption; cont_contab := lblcontacontabil.Caption; tot_parc := StrToInt(lbltotalparcelas.Caption); vl_total := StrToCurr(lblvltotal.Caption); vl_parcela := StrToCurr(lblvlparcelas.Caption); Histor := lblhistorico.Text; {:Faço um laço aqui} t_parcelas := 0; {:variavel recebendo o valor do form frmCadContasaPagar} str_TipoCredor := frmCadContasaPagar.str_Tipo_Credor; for I := 1 to ANumParcelas do begin Dias := I * ANumDias; with cdsGeraautoreg do begin {:Gera + 1 a cada vez que passa no laço} t_parcelas := t_parcelas + 1; strParcelas := IntToStr(t_parcelas); if cdsGeraautoreg.Active = False then cdsGeraautoreg.Active := true; Append; FieldByName(´DT_LANCAMENTO´).AsDateTime := dt_lanc; FieldByName(´TIPO_CREDOR´).asString := str_TipoCredor; FieldByName(´NR_DOC´).asString := nr_doc+´/´+strParcelas; FieldByName(´NR_PARCELA´).asString := strParcelas; FieldByName(´EMISSAO´).AsDateTime := dt_doc; {Todo -cModulo GerarParcelas -oAdriano: Somente para teste, vou ter que incluir o codigo do fornecedor por ser um codigo de chave primaria/secundaria} FieldByName(´COD_FORNEC´).AsString := ´1´; FieldByName(´FORNEC_OUTROS´).AsString := fornec; FieldByName(´CONTA_CONTABIL´).AsString := cont_contab; FieldByName(´TOT_PARCELAS´).AsInteger := tot_parc; FieldByName(´VALOR_TOTAL´).AsCurrency := vl_total; FieldByName(´VL_PARCELA´).AsCurrency := vl_parcela; FieldByName(´HISTORICO´).AsString := histor; FieldByName(´LIQUIDADO´).AsString := ´N´; FieldByName(´STATUS´).AsString := ´S´; if cb1.Checked = True then FieldByName(´VENCIMENTO´).AsDateTime := IncMonth(dt_doc, I) else FieldByName(´VENCIMENTO´).AsDateTime := dt_doc + Dias; FieldByName(´DATA_HAB´).AsDateTime := Date; FieldByName(´VL_PAGO´).AsCurrency := 0.00; FieldByName(´VL_DUPLICATA´).asCurrency := StrToCurr(lblvlparcelas.Caption); FieldByName(´DESCONTOS´).AsCurrency := 0.00; FieldByName(´JUROS_MULTAS´).AsCurrency := 0.00; Post; end; end; DM.IBTransaction1.CommitRetaining; MessageDlg(´Processo efetuado com sucesso.´, mtInformation, [mbOK], 0); Result := True; except on E: Exception do begin dm.IBTransaction1.RollbackRetaining; MessageDlg(´Ocorreu um erro neste processo. ´ +1313 +´Erro gerado: ´+13+ E.Message + 1313 + ´Todo o processo foi abortado!´, mtError, [mbOk],0); Result := False; end; end; end; end;
Com destaque para a parte do TRadioButton1(CB1)
[b:bbf55438d5]if cb1.Checked = True then
FieldByName(´VENCIMENTO´).AsDateTime := IncMonth(dt_doc, I)
else
FieldByName(´VENCIMENTO´).AsDateTime := dt_doc + Dias;[/b:bbf55438d5]
Ou seja se o CB1 (RadioButton1) esta com o cheked = True usa o IncMont que foi o resultado do priemiro teste, se o CB1(RadioButton) estiver com o cheked = False então soma a data do documento + Dias no caso (30) dias e o resultado foi o segundo teste mostrado ai tambem.
Bom acho que o mais certo é p primeiro com IncMonth, mais ai eu não sei direito qual usar. Eu não cheguei a usar o codigo que vc postou ai, mais qual seria o resultado do código que vc postou? Poderia me dizer?
Grato
Adriano.
06/06/2008
Fknyght
var I : integer; dAux, dia, mes, ano : Word; begin dia := IntToStr(edtdias.text); try for I := 0 from quant_parcelas do DecodeDate(Now, ano, mes,dAux); begin with qry do begin append; fieldbyname(´data´).asDateTime := EncodDate(Ano,Mes,Dia); post; Inc(mes); if mes = 13 then begin mes := 1; Inc(ano); end; end; commit; end; except rollback; end;
06/06/2008
Fknyght
var I : integer; dAux, dia, mes, ano : Word; begin dia := IntToStr(edtdias.text); try for I := 0 from quant_parcelas do DecodeDate(Now, ano, mes,dAux); begin with qry do begin append; fieldbyname(´data´).asDateTime := EncodDate(Ano,Mes,Dia); post; Inc(mes); if mes = 13 then begin mes := 1; Inc(ano); end; end; commit; end; except rollback; end;
Clique aqui para fazer login e interagir na Comunidade :)