PDA

Ver la Versión Completa : Ayuda con formula


paladincubano
10-12-2008, 10:17:02
Hola foreros. Tengo en un ComboBox valores fijos del 1 al 5, y en otro valores del 1 al 12, el primero representa el numero de la semana en el numero del mes del otro ComboBox. Ej. El usuario elije: ComboBox1=3 y ComboBox2=10 Esto significa la 3ra semana del mes de Octubre. Ahora, con esos dos datos necesito saber, a que numero de semana pertenece en el AÑO. Ej= 42 (hipotetico). Lo que necesito es lo mismo que lo que hace el WeekOf(TDate) de la unit DateUtils, que te devuelve de una fecha, el numero de la semana en el año. Con la diferencia que no tengo la fecha, sino, como dije antes, solo el numero de la semana en el mes y el mes por supuesto. Muchas gracias.

coso
10-12-2008, 15:06:21
Hola, echale un vistazo a EncodeDate

Lepe
10-12-2008, 15:34:57
Hola:

¿no puedes usar un TDateTimePicker? es un control donde eliges la fecha directamente y no tienes que lidiar con errores como 30/02/2010.

Saludos

paladincubano
10-12-2008, 15:39:05
Hola:

¿no puedes usar un TDateTimePicker? es un control donde eliges la fecha directamente y no tienes que lidiar con errores como 30/02/2010.

Saludos

Lepe, vuelve a leer mi pregunta, porque parece no has entendido.
Olvidate de fecha... No tengo fecha alguna, solo tengo un numero del 1 al 5 y otro del 1 al 12, el primero indica el NUMERO DE LA SEMANA del MES del segundo numero.
EJ: 3 y 10, significa, 3ra semana del mes de octubre.
y necesito:
de esos dos numeros, poder sacar el NUMERO de la semana del AÑO.
EJ: 3ra semana del mes de octubre = xx SEMANA DEL AÑO.
Gracias por tu comentario.

coso
10-12-2008, 16:37:57
Hola paladincubano,

si bien me parece que tienes toda la razon del mundo, creo que la agresividad estaba injustificada. Sobre como resolver tu duda, seria algo como :


var
d,m,y : word;
t : TDateTime;
s : integer;
begin
d := 7*inttostr(ComboBoxSemana.Text);
m := inttostr(ComboBoxMes.Text);
y := 2000;
t := EncodeDate(y,m,d);
s := WeekOf(t);
end;


es posible que a d le tengas que sumar o restar uno, segun tus necesidades. Saludos.

paladincubano
10-12-2008, 16:43:48
Muchas gracias, luego lo pruebo, ahora no estoy delante del ordenador. Con respecto a la agresividad, perdonenme si lo han entendido asi, pero afirmo, no hay agresividad ninguna en mis palabras, al menos es lo que siento, y cuando lo escribi, pues por supuesto no estab agresivo. Vuelvo y repito, si heri a alguien los sentimientos pues disculpadme pero no fue mi intencion.
Y menos en esta web que ayuda tanto a los demas y principalmente pues ami que lo necesito mucho de vez en cuando.
saludos y gracias por sus posts.

fidel
10-12-2008, 18:34:42
Hola:

Una pequeña idea que puedes ampliar, aunque quizás sea un poco enrevesada.

Semana del mes igual a 1 (el primer día)

Vas recorriendo día a día todos los días del mes pedido y cogiendo a que semana del año pertenece caa día.
Cuando cambie la semana del año a la que pertenece aumentas en uno la semana del mes y sabrás en que semana de ese més estás.
Comparas la semana del mes con la semana pedida y cuando coincida ya la tienes.

No se si se entiende muy bien en tan pocas líneas.

Un saludo.

Lepe
10-12-2008, 21:48:55
Lo que necesitas es la función EncodeDayOfWeekInMonth que te devuelve una fecha, ¿fecha?, ¿he dicho fecha? miedo me da pensar lo que puede decir nuestro amigo paladincubano como se enoje :rolleyes: :p

Una vez tienes tienes la fecha usa weekOf y sacas el número de la semana.

La verdad, he estado a punto de no responder porque, para hallar la semana del año, necesitas saber el año en cuestión, y en tu mensaje original no dices nada del año, solo tienes el número de mes y el número de semana dentro del més. He querido aclarar esto no vaya a ser que....:D

Saludos

coso
11-12-2008, 16:46:54
Bueno, la verdad es que es bastante mas sencillo...

semanadelaño = (mes-1)*4 + numerosemanames

...mas o menos...

esto seria mas correcto :


function SemanadelAño(n,m : integer) : integer;
const
diaspormes = [31,28,31,30,31,30,31,31,30,31,30,31]
begin
result := 0;
while m > 0 do
begin
result := result + diaspormes[m];
dec(m);
end;

result := result div 7 + n;
end;


aunque tambien daria fallos segun bisiesto, 1 de enero domingo, etc...

Lepe
11-12-2008, 16:54:10
...recuerda los años bisiestos ;)...

Edito:
Si te empeñas, puedes hacerlo a mano, por supuesto, pero ese mismo array creo haberlo visto en sysutils o en dateutils, con esto quiero decir que al final vas a reinventar la rueda, y posiblemente tenga algún que otro bug (siempre hay un detalle que se te olvida). La VCL y las rutinas de Borland suelen estr depuradas y bien pensadas, con lo cual, es mejor tirar de ellas que hacerlas de nuevo.

Por supuesto puedes hacerlo como quieras, pero mi consejo es usar lo que ya está hecho.

coso: ambos estamos editando nuestros mensajes... a ver que sale de todo esto :D

Saludos

coso
11-12-2008, 16:58:46
Nada, lo mejor es mi primer codigo, aunque creo que el ultimo daria error tansolo si el año empieza mas atras de miercoles y es bisiesto...en fin las herramientas para resolver la duda ya estan. saludos.

luisgutierrezb
11-12-2008, 21:07:50
Si buscan una formula sin el año va a estar muy dificil, por ejemplo la formula:

semanadelaño = (mes-1)*4 + numerosemanames

Semanadelaño = (12-1)*4 + 4 //buscando la ultima semana de diciembre

semanadelaño = 48 //que el año no trae 52 semanas? y en algunos casos 53? hay meses que traen 5 semanas otros 4, es por eso que se necesita el año para el calculo.

paladincubano
12-12-2008, 14:36:54
Perdonen por mi tardanza.
Estaba de viaje.
He leido todos los post y realmente interesantes.
Claro que dispongo del año, normalmente es el año en curso.
Por fin cual formula es la que me recomiendan?
saludos y gracias por todo.

Lepe
13-12-2008, 06:58:57
Pues cada uno te recomendará su fórmula :D

Supongo que eres tú el que tiene que valorar los pros y contras y elegir una u otra ;).

Saludos