PDA

Ver la Versión Completa : Rango de Semanas en un mes


Caro
12-09-2007, 16:49:45
Hola a todos

Como puedo obtener los rangos de las semanas de un mes X. por ejemplo mes de agosto tiene 5 semanas (1-5, 6-12, 13-19, 20-26, 27-31), eso es lo que quiero saber donde empieza y termina digamos la semana 1 que seria del 1 de agosto al 5 de agosto. Me pueden dar ideas por favor, que funciones de fechas debo usar mas o menos.

Lo unico que he encontrado es saber cuantas semanas tiene un mes con la función WeekOfTheMonth.

Muchisimas gracias por adelantado y que tengan un bonito dia.

gluglu
12-09-2007, 17:28:29
No creo que tengas una función que te dé el resultado que buscas.

Tendrás que hacerla tu.

El principio de dicha función sería más o menos el siguiente:

1. Todos los meses empiezan por 1 :D ! (Trivial).
2. Saber el día de la semana del primer día del mes que buscas. (Función DayOfTheWeek). Tendrás que componer tu la fecha del primer mes que buscas con Encode.
3. A 8 le restas el resultado obtenido y tendrás el día final de la 1a semana.
4. A partir de ahí puedes obtener facilmente el resto de las semanas, teniendo en cuenta el número máximo de días que tenga el mes que estes tratando.

Espero haberte ayudado.

Saludos ;)

Caro
12-09-2007, 18:11:33
Muchisimas gracias Gluglu, asi me ha quedado con tu explicación, solo funciona para el mes de agosto, ya es facil aumentar para que funcione cualquier mes.


var
fechaIni,fechaFin:TDateTime;
i, diaIni,diaFin,dia31, cantSem, cantDias :Integer;
begin

fechaIni := EncodeDate(2007, 08, 01);
cantSem := WeekOfTheMonth(EncodeDate(2007, 08, 31));

diaIni := DayOfTheWeek(fechaIni);
diaFin := 7-diaIni;

fechaFin := IncDay(fechaIni, diaFin);

showmessage(DateToStr(fechaIni)+'-'+DateToStr(fechaFin));
for i:=2 to cantSem do
begin
fechaIni:=IncDay(fechaFin,1);

if i=cantSem then
begin
cantDias := DaysInAMonth(2007,8);
dia31 := DayOfTheWeek(EncodeDate(2007, 08, cantDias));
fechaFin := IncDay(FechaFin,dia31)
end
else
fechaFin:=IncDay(fechaFin,7);

showmessage(DateToStr(fechaIni)+'-'+DateToStr(fechaFin));
end;



Dime que te parece o puedo mejorarlo.

gluglu
12-09-2007, 18:40:57
Creo que se podría optimizar de esta manera :

var
fechaIni, fechaFin : TDateTime;
i : Integer;
begin

i := 1;

while true do begin

fechaIni := EncodeDate(2007, 08, i);
if DayOfTheWeek(fechaIni) <> 1 then begin
fechaFin := EncodeDate(2007, 08, 8-DayOfTheWeek(fechaIni))
i := 8-DayOfTheWeek(fechaIni) + 1;
end
else begin
i := i + 7;
if i > DaysInAMonth(2007,8) then
fechafin := EndOfTheMonth(fechaIni)
else
fechaFin := DayInc(fechaIni,7);
end;

showmessage(DateToStr(fechaIni)+'-'+DateToStr(fechaFin));

if i > DaysInAMonth(2007,8) then Break;

end;

end;

No lo he probado, por lo que no te puedo asegurar si funciona correctamente. :o

Caro
12-09-2007, 19:09:34
Muchas gracias de nuevo, ya lo he probado y funciona perfectamente, solo faltaba esto.

fechaFin := EncodeDate(2007, 08, 8-DayOfTheWeek(fechaIni)) un ; al final

fechaFin := DayInc(fechaIni,7); -> fechaFin := IncDay(fechaIni,6);

Saluditos

maeyanes
12-09-2007, 19:32:18
Aquí te dejo una función que recibe un año y mes cualquiera y te va mostrando los rangos de las semanas del mes:


procedure ShowWeekRanges(AYear, AMonth: Word);
var
StartDay: Integer;
DaysInMonth: Integer;
EndDay: Integer;

begin
StartDay := 1;
DaysInMonth := DaysInAMonth(AYear, AMonth);
EndDay := 8 - DayOfWeek(EncodeDate(AYear, AMonth, 1));
repeat
ShowMessage(Format('%d - %d', [StartDay, EndDay]));
StartDay := EndDay + 1;
Inc(EndDay, 7);
if EndDay > DaysInMonth then
EndDay := DaysInMonth
until
StartDay > DaysInMonth;
end;



Saludos...

Caro
13-09-2007, 01:31:00
Muchas gracias a ti también maeyanes.