Fórum Desdobrar por datas, cfe. período de data lançados? #355776
23/03/2008
0
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}
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
Curtir tópico
+ 0Posts
25/03/2008
Adriano_servitec
Gostei + 0
25/03/2008
José Henrique
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.
Gostei + 0
26/03/2008
Adriano_servitec
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
Gostei + 0
27/03/2008
José Henrique
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.
Gostei + 0
03/04/2008
Adriano_servitec
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.
Gostei + 0
07/04/2008
Adriano_servitec
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.
Gostei + 0
07/04/2008
Martins
[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.
Gostei + 0
07/04/2008
Martins
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;
Gostei + 0
08/04/2008
Adriano_servitec
Abraços
T+
Gostei + 0
08/04/2008
Martins
Tranquilo [b:c62a9704b4]Adriano[/b:c62a9704b4], qualquer coisa, é só postar ok!
Gostei + 0
08/04/2008
Adriano_servitec
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
Gostei + 0
08/04/2008
José Henrique
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;
Gostei + 0
09/04/2008
Emerson Nascimento
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;
Gostei + 0
09/04/2008
Martins
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.
Gostei + 0
10/04/2008
Adriano_servitec
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
Bom vou testar os códigos postados pra ver o resultado. Depois informo se funcionou.
Valeu pessoal, mais uma vez obrigado pela ajuda.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)