Fórum Como extrair mes/ano num laço? #359377
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
Curtir tópico
+ 0Posts
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;Gostei + 0
02/06/2008
Paulo
Gostei + 0
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;
Gostei + 0
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?
Gostei + 0
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.
Gostei + 0
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.
Gostei + 0
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;
Gostei + 0
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;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)