GARANTIR DESCONTO

Fórum Desdobrar por datas, cfe. período de data lançados? #355776

23/03/2008

0

Pessoal, tenho um form de baixa que esta com a tabela assim:
ID_matricula varchar (10) Associado varchar (60) mesrefini date mesreffim date valor numeric 15,2 juros numeric 15,2 multa numeric 15,2 refmesini date refmesfim date


Bom neste form eu digito a ID_Matricula para chamar o associado referente esta ID, ai nos campos mesrefini e mesreffim digito as datas da baixa, no caso 01/2008 a 03/2008 (Neste caso tenho uma função que n ão precisa digitar os dias do mes apenas o mes/ano) ai digito o valor R$, e opcional multas/juros e nos campos refmesini e refmesfim apareçe automaticamente assim 01/01/2008 a 31/03/2008

Bom tudo certo ai, ou seja se eu digitar 01/2008 a 01/2008 aparece 01/01/2008 a 31/01/2008 se eu digitar 02/2008 a 03/2008 aparece 01/02/2008 a 31/03/2008, ou seja sempre vai mostrar a primeira e ultima data dos campos mesrefini e mesreffim que eu digitar.

Bom agora o que eu estou precisando é fazer uma tabeal com o desdobramento por mes destes valor lançados com os seguintes campos

{Os tipos são o mesmo da tabela acima}
ID_Matricula (FK) Associado RefMesIini RefMesFim Status Char (1)

Ai vamos supor que eu digitei no form baixa assim

[b:5b5f4773b4]001 - adriano - 01/2008 a 03/2008 - 150,00 - 01/01/2008 a 31/03/2008[/b:5b5f4773b4]

e nesta outra tabela ter alguma função que jogue assim
[b:5b5f4773b4]001-adriano-01/01/2008-31/01/2008-B
001-adriano-01/02/2008-29/02/2008-B
001-adriano-01/03/2008-31/03/2008-B[/b:5b5f4773b4]
Bom os exceptions pode deixar que eu sei criar caso repita algum destes valores gerar uma unique. Apenas não sei como fazer uma função para desdobrar estas datas.

Depois se eu tiver que dar uma nova baixa deste ID ele dar continuidade.

Bom espero ter explicado certo o que eu preciso.

Valeu pessoal


Adriano_servitec

Adriano_servitec

Responder

Posts

25/03/2008

Adriano_servitec

sobe


Responder

Gostei + 0

25/03/2008

José Henrique

Adriano,
Voce deve fazer, dentro de um loop pelos mesrefini e mesreffim:
1 - calcular o último dia do mês atual (que no início do loop é mesrefini);
2 - gravar na tabela desdobramento;
3 - comparar com mesreffim se igual, fim loop;
4 - caso contrário, incrementar de 1 (neste caso teremos dia 1º do próximo mês). Voltar ao passo 1, ie, next.


Responder

Gostei + 0

26/03/2008

Adriano_servitec

[quote:c3d01c45ca=´José Henrique´]Adriano,
Voce deve fazer, dentro de um loop pelos mesrefini e mesreffim:
1 - calcular o último dia do mês atual (que no início do loop é mesrefini);
2 - gravar na tabela desdobramento;
3 - comparar com mesreffim se igual, fim loop;
4 - caso contrário, incrementar de 1 (neste caso teremos dia 1º do próximo mês). Voltar ao passo 1, ie, next.[/quote:c3d01c45ca]

Olá José Henrique, bom já é um começo, mais vc poderia me ajudar? Como é que eu faria isso? Não tenho idéia de como seja.

Obrigado
Adriano


Responder

Gostei + 0

27/03/2008

José Henrique

Adriano,
ficaria assim:
procedure TForm1.Button1Click(Sender: TObject);
var
  dtMesRefFim : TDateTime;
  dtMesIni, dtMesFim : TDateTime;
  strRes : string;
begin
  dtMesIni := StrToDate(´01/01/2008´);
  dtMesRefFim := StrToDate(´31/12/2008´);
  repeat
     dtMesFim := FDM(dtMesIni);

   //aqui grava na tabela
     strRes := strRes + ´I: ´ + DateToStr(dtMesIni) + ´ - F: ´ + DateToStr(dtMesFim) + chr(10) + chr(13);
     dtMesIni := dtMesFim + 1;
  until (dtMesIni > dtMesRefFim);
  ShowMessage(strRes);
end;

function FDM (Data : TDateTime) : TDateTime;
//Devolve o último dia do mês
var
  Ano, Mes, Dia : word;
begin
   DecodeDate(Data, Ano, Mes, Dia);
   if Mes = 12 then
     Result := EncodeDate(Ano, 12, 31)
   else
     Result := EncodeDate(Ano, Mes+1, 1)-1;
end;


Cole e teste.


Responder

Gostei + 0

03/04/2008

Adriano_servitec

[quote:d2df10b8a0=´José Henrique´]Adriano,
ficaria assim:
procedure TForm1.Button1Click(Sender: TObject);
var
  dtMesRefFim : TDateTime;
  dtMesIni, dtMesFim : TDateTime;
  strRes : string;
begin
  dtMesIni := StrToDate(´01/01/2008´);
  dtMesRefFim := StrToDate(´31/12/2008´);
  repeat
     dtMesFim := FDM(dtMesIni);

   //aqui grava na tabela
     strRes := strRes + ´I: ´ + DateToStr(dtMesIni) + ´ - F: ´ + DateToStr(dtMesFim) + chr(10) + chr(13);
     dtMesIni := dtMesFim + 1;
  until (dtMesIni > dtMesRefFim);
  ShowMessage(strRes);
end;

function FDM (Data : TDateTime) : TDateTime;
//Devolve o último dia do mês
var
  Ano, Mes, Dia : word;
begin
   DecodeDate(Data, Ano, Mes, Dia);
   if Mes = 12 then
     Result := EncodeDate(Ano, 12, 31)
   else
     Result := EncodeDate(Ano, Mes+1, 1)-1;
end;


Cole e teste.[/quote:d2df10b8a0]Obrigado amigão, assim que eu testar retorno o resultado, mais acho que deve ser isso mesmo, valeu José Henrique, muito obrigado.


Responder

Gostei + 0

07/04/2008

Adriano_servitec

Não consegui ainda, qualquer dica é bem vinda.

Preciso apenas saber como fazer aparecer num listbox, memo, richedit, ou qualquer outro componente assim

Vamos supor que tenho dois maskeditsedits e digito neles campos tipo data

Mask1-01/01/2008
Mask2-31/03/2008

Então no listbox ou outro componente apareça desta forma

01/01/2008 - 31/01/2008
01/02/2008 - 29/02/2008
01/03/2008 - 31/03/2008

Apenas isso já esta de bom tamanho, pra eu começar

Pegar a primeira e a ultima data de cada ms eu sei, mais não estou sabendo como fazer num intervalo entre datas

Acho que precisa ser criado um FOR, mais como é que vou sabe entre estes intervalos de mes????

No aguardo
Adriano.


Responder

Gostei + 0

07/04/2008

Martins

Não consegui ainda, qualquer dica é bem vinda. Preciso apenas saber como fazer aparecer num listbox, memo, richedit, ou qualquer outro componente assim Vamos supor que tenho dois maskeditsedits e digito neles campos tipo data Mask1-01/01/2008 Mask2-31/03/2008 Então no listbox ou outro componente apareça desta forma 01/01/2008 - 31/01/2008 01/02/2008 - 29/02/2008 01/03/2008 - 31/03/2008 Apenas isso já esta de bom tamanho, pra eu começar Pegar a primeira e a ultima data de cada ms eu sei, mais não estou sabendo como fazer num intervalo entre datas Acho que precisa ser criado um FOR, mais como é que vou sabe entre estes intervalos de mes???? No aguardo Adriano.


[b:afee90234f]Adriano[/b:afee90234f], tente usando um laço [b:afee90234f]FOR.. TO .. DO[/b:afee90234f]

Algo mais ou menos assim.

var
 i, a, b: integer;
begin
//Supondo que nos Edit´s vc informe apenas o mês e ano ex: 01/2008  04/2008 
 a:= StrToInt(Copy(Edit1.Text,1 ,2));
 b:= StrToInt(Copy(Edit2.Text,1 ,2));
 for i := a to b do
 begin
 {  if i = 1 then
   begin
     Memo1.Lines.Add(´01/01/2008 - 31/01/2008 - B´);
   end;
   if i = 2 then
   begin
     Memo1.Lines.Add(´01/02/2008 - 29/02/2008 - B´);
   end;
   if i = 3 then
   begin
     Memo1.Lines.Add(´01/03/2008 - 31/03/2008 - B´);
   end;}
{Substitua o bloco comentado por sua função que traz o primeiro e o último dia de cada mês, pois essas linhas com memo foram meramente ilustrativas e só serviram como base para teste} 
 end;
end;


Boa sorte e bons códigos.


Responder

Gostei + 0

07/04/2008

Martins

Trocando os IF´s por sua função deve funcionar, qualquer coisa é só retornar aqui no fórum.
procedure TForm1.Button1Click(Sender: TObject);
var
 i, a, b: integer;
begin
 a:= StrToInt(Copy(Edit1.Text,1 ,2));
 b:= StrToInt(Copy(Edit2.Text,1 ,2));
 for i := a to b do
 begin
   if i = 1 then
     Memo1.Lines.Add(´01/01/2008 - 31/01/2008 - B´);
   if i = 2 then
     Memo1.Lines.Add(´01/02/2008 - 29/02/2008 - B´);
   if i = 3 then
     Memo1.Lines.Add(´01/03/2008 - 31/03/2008 - B´);
   if i = 4 then
     Memo1.Lines.Add(´01/04/2008 - 30/04/2008 - B´);
 end;
end;



Responder

Gostei + 0

08/04/2008

Adriano_servitec

Olá Martins, entendi, vou testar e depois falo o resultado, pois preciso vur num cyber para postar ...hehehehe

Abraços
T+


Responder

Gostei + 0

08/04/2008

Martins

Olá Martins, entendi, vou testar e depois falo o resultado, pois preciso vur num cyber para postar ...hehehehe Abraços T+


Tranquilo [b:c62a9704b4]Adriano[/b:c62a9704b4], qualquer coisa, é só postar ok!


Responder

Gostei + 0

08/04/2008

Adriano_servitec

[quote:0e945e526f=´Adriano_Servitec´]Olá Martins, entendi, vou testar e depois falo o resultado, pois preciso vur num cyber para postar ...hehehehe Abraços T+


Tranquilo [b:0e945e526f]Adriano[/b:0e945e526f], qualquer coisa, é só postar ok![/quote:0e945e526f]

Olá [b:0e945e526f]Martins[/b:0e945e526f], bom tá quase lá, o problema agora é se tiver datas entre anos diferentes tipo

01/2008 a 03/2009

Não estou sabendo como fazer

Olhe a procedure meio gambiarra que eu fiz

procedure TForm1.Button3Click(Sender: TObject);
var
  f, i, dataini, datafin, anoini : integer;
  vjan, vfev, vmar, vabr, vmai, vjun,
  vjul, vago, vset, vout, vnov, vdez : String;
begin
  {:Limpa as variaveis antes de começar novamente}
  dataini := StrToInt(Copy(MaskEdit1.Text, 1, 2));
  datafin := StrToInt(Copy(MaskEdit2.Text, 1, 2));
  anoini := StrToInt(Copy(MaskEdit1.Text, 4, 7));
  {:tem que limpar o memo fora do lacço FOR}
  memo1.Clear;
  {:Primeiro um laço num FOR dos meses}
  for f := dataini to datafin do
  begin
  if f = 1 then
     vjan := ´01/01/´+inttostr(anoini);
  if f = 2 then
     vfev := ´01/02/´+inttostr(anoini);
  if f = 3 then
     vmar := ´01/03/´+inttostr(anoini);
  if f = 4 then
     vabr := ´01/04/´+inttostr(anoini);
  if f = 5 then
     vmai := ´01/05/´+inttostr(anoini);
  if f = 6 then
     vjun := ´01/06/´+inttostr(anoini);
  if f = 7 then
     vjul := ´01/07/´+inttostr(anoini);
  if f = 8 then
     vago := ´01/08/´+inttostr(anoini);
  if f = 9 then
     vset := ´01/09/´+inttostr(anoini);
  if f = 10 then
     vout := ´01/10/´+inttostr(anoini);
  if f = 11 then
     vnov := ´01/11/´+inttostr(anoini);
  if f = 12 then
     vdez := ´01/12/´+inttostr(anoini);
  end;

  {:Depois um laço no FOR do resultado do maskedits}
  for i := dataini to datafin do
  begin
  if i = 1 then
     memo1.lines.add(vjan+´-´+DateToStr(EndOfTheMonth(strtodate(vJan)))+´ - B´);
  if i = 2 then
     memo1.Lines.add(vfev+´-´+DateToStr(EndOfTheMonth(strtodate(vFev)))+´ - B´);
  if i = 3 then
     memo1.lines.add(vmar+´-´+DateToStr(EndOfTheMonth(strtodate(vMar)))+´ - B´);
  if i = 4 then
     memo1.lines.add(vabr+´-´+DateToStr(EndOfTheMonth(strtodate(vabr)))+´ - B´);
  if i = 5 then
     memo1.Lines.add(vmai+´-´+DateToStr(EndOfTheMonth(strtodate(vmai)))+´ - B´);
  if i = 6 then
     memo1.lines.add(vjun+´-´+DateToStr(EndOfTheMonth(strtodate(vjun)))+´ - B´);
  if i = 7 then
     memo1.lines.add(vjul+´-´+DateToStr(EndOfTheMonth(strtodate(vJul)))+´ - B´);
  if i = 8 then
     memo1.Lines.add(vago+´-´+DateToStr(EndOfTheMonth(strtodate(vago)))+´ - B´);
  if i = 9 then
     memo1.lines.add(vset+´-´+DateToStr(EndOfTheMonth(strtodate(vset)))+´ - B´);
  if i = 10 then
     memo1.lines.add(vout+´-´+DateToStr(EndOfTheMonth(strtodate(vout)))+´ - B´);
  if i = 11 then
     memo1.Lines.add(vnov+´-´+DateToStr(EndOfTheMonth(strtodate(vnov)))+´ - B´);
  if i = 12 then
     memo1.lines.add(vdez+´-´+DateToStr(EndOfTheMonth(strtodate(vdez)))+´ - B´);
  end;

end;


Mais não esta ainda 100¬

Valeu amigo


Responder

Gostei + 0

08/04/2008

José Henrique

Adriano,
Vamos de novo
txtDtIni e txtDtFim são maskedits que recebem o mês e o ano.

procedure TForm1.Button1Click(Sender: TObject);
var
  dtMesRefFim, dtMesIni, dtMesFim : TDateTime;
  strRes : string;
begin
  dtMesIni := StrToDate(´01/´ + txtDtIni.EditText);
  dtMesRefFim := EndOfTheMonth(StrToDate(´01/´ + txtDtFim.EditText));
  Memo1.Clear;
  repeat
     dtMesFim := EndOfTheMonth(dtMesIni);
     Memo1.Lines.Add(DateToStr(dtMesIni) + ´ - ´ + DateToStr(dtMesFim) + ´ - B´);
     dtMesIni := dtMesFim + 1;
  until (dtMesIni > dtMesRefFim);
end;



Responder

Gostei + 0

09/04/2008

Emerson Nascimento

o José Herique matou a pau!!!

eu só trocaria o DateToStr por FormatDateTime:
procedure TForm1.Button1Click(Sender: TObject);
var
  dtMesRefFim, dtMesIni, dtMesFim : TDateTime;
  strRes : string;
begin
  dtMesIni := StartOfTheMonth(StrToDate(MaskEdit1.Text));
  dtMesRefFim := EndOfTheMonth(StrToDate(MaskEdit2.Text));
  Memo1.Clear;
  repeat
     dtMesFim := EndOfTheMonth(dtMesIni);
     Memo1.Lines.Add(
       FormatDateTime(´dd/mm/yyyy´,dtMesIni) + ´ - ´ +
       FormatDateTime(´dd/mm/yyyy´,dtMesFim) + ´ - B´
     );
     dtMesIni := dtMesFim + 1;
  until (dtMesIni > dtMesRefFim);
end;



Responder

Gostei + 0

09/04/2008

Martins

o José Herique matou a pau!!! eu só trocaria o DateToStr por FormatDateTime:
procedure TForm1.Button1Click(Sender: TObject);
var
  dtMesRefFim, dtMesIni, dtMesFim : TDateTime;
  strRes : string;
begin
  dtMesIni := StartOfTheMonth(StrToDate(MaskEdit1.Text));
  dtMesRefFim := EndOfTheMonth(StrToDate(MaskEdit2.Text));
  Memo1.Clear;
  repeat
     dtMesFim := EndOfTheMonth(dtMesIni);
     Memo1.Lines.Add(
       FormatDateTime(´dd/mm/yyyy´,dtMesIni) + ´ - ´ +
       FormatDateTime(´dd/mm/yyyy´,dtMesFim) + ´ - B´
     );
     dtMesIni := dtMesFim + 1;
  until (dtMesIni > dtMesRefFim);
end;


Esse código aqui não compilei ainda mas me parece muito funcional, valew [b:7a60bce8d7]Emerson.en[/b:7a60bce8d7], [b:7a60bce8d7]José Henrique[/b:7a60bce8d7] seu código tb ficou muito bom.

Ops! lembrando que vc vai ter q declarar a unit [b:7a60bce8d7]DateUtils[/b:7a60bce8d7] caso não esteja declarada, pq acredito q as funções [b:7a60bce8d7]StartOfTheMonth[/b:7a60bce8d7] e [b:7a60bce8d7]EndOfTheMonth[/b:7a60bce8d7] pertençam a ela.

Boa sorte e bons códigos.


Responder

Gostei + 0

10/04/2008

Adriano_servitec

Olá pessoal, obrigado por responder, vou testar estes códigos ai tambem, pq tentei com o MonthsBetween, mais não deu certo para o que eu preciso, olhem.

procedure TForm1.Button4Click(Sender: TObject);
var 
  i,
  meses : Integer;
  mesAnoIni,
  mesAnoFim: String; // variáveis que conterão o mês e ano por ex. ´01/2008´
  dias : Word; // apenas para descobrir quantos dias tem no mês
  data,
  dataInicial, dataFinal : TDateTime;
  anos : integer;
  anoini, anofin : TDateTime;
begin
  mesAnoIni := maskedit1.text;
  mesanofim := maskedit2.text;
  dataInicial := StrToDate( ´01/´ + mesAnoIni );
  dataFinal := StrToDate( ´01/´ + mesAnoFim );
  meses := MonthsBetween( dataInicial, dataFinal ) +1;
  {anoini := StrToDate( ´01/´ + mesAnoIni );
  anoFin := StrToDate( ´01/´ + mesAnoFim );
  anos := YearsBetween(anoini, anofin);
  meses := StrToInt(Copy(MaskEdit2.Text, 1, 2)) - StrToInt(Copy(MaskEdit1.Text, 1, 2)) + 1;
  anos := YearsBetween(anoini, anofin);}
  label3.caption := IntToStr(meses);
  {:tem que limpar o memo fora do laço FOR}
  memo1.Clear;
  for i := 1 to meses do
  begin
    memo1.Lines.Add( DateToStr( dataInicial ) + ´-´ + DateToStr( EndOfTheMonth( dataInicial )) + ´-B´ );
    dias := DaysInMonth( dataInicial );
    dataInicial :=  IncDay( dataInicial, dias );
  end;
end;


E o help do MontsBetween
MonthsBetween Routine Returns the approximate number of months between two specified TDateTime values. Unit DateUtils Syntax [Delphi] function MonthsBetween(const ANow: TDateTime; const AThen: TDateTime): Integer; Description Call MonthsBetween to obtain the difference, in months, between two TDateTime values. Because months are not all the same length, MonthsBetween returns an approximation based on an assumption of 30.4375 days per month. Fractional months are not counted. Thus, for example, MonthsBetween reports the difference between Feb 1 and Mar 1 as 0.


Bom vou testar os códigos postados pra ver o resultado. Depois informo se funcionou.

Valeu pessoal, mais uma vez obrigado pela ajuda.


Responder

Gostei + 0

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

Aceitar