Como extrair mes/ano num laço?

02/06/2008

0

Pessoal preciso extrair os meses/anos das datas para jogar num laço em uma tabela.

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

Adriano_servitec

Responder

Posts

02/06/2008

Adriano_servitec

Não tenho como testar aqui, mais seria algo 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); 
         //DATA recebe a data replicando conforme o numero das parcelas
            FieldByName(´DATA´).Value:= incMonth( Date, i - 1);
        post; 
      end; 
      commit; 
  end;  
except 
   rollback; 
end;



Responder

02/06/2008

Paulo

pq vc não usa o IncMonth? Para cada nova data, vc incrementa um mes. A sintaxe seria assim:

for i := 1 to qtdparcelas do begin IncMonth(Data,1); Seus códigos aqui end;



Responder

03/06/2008

Emerson Nascimento

Pessoal preciso extrair os meses/anos das datas para jogar num laço em uma tabela. vamos supor que tenho que efetuar um carnê de recebimento coo todos vencimentos para o dia 05 por exemplo


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;



Responder

03/06/2008

Adriano_servitec

Olá pessoal o IncMoth fa o que eu preciso

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;
Mais me mostra parcelas fixas e se eu precisar fazer um que conte 15 dias de vencimento ou 45?

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?


Responder

03/06/2008

Emerson Nascimento

cuidado com o uso do IncMonth().

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.


Responder

06/06/2008

Adriano_servitec

cuidado com o uso do IncMonth(). 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.


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.


Responder

06/06/2008

Fknyght

Adriano so mudando um pouco o seu código

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;
[/code]


Responder

06/06/2008

Fknyght

Adriano so mudando um pouco o seu código

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;
[/code]


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar