PDA

Ver la Versión Completa : calculos con fechas


Jheysson13
07-10-2006, 19:18:20
hola y saludos a todos.

en esta ocacion me gustaria que me ayudaran a resolver 2 problemitas, jeje.

1: es que me gustaria saber como es puedo sumar las fechas, o realizar un calculo, es decir:

suponiendo que la fecha actual es 26/10/82 como puedo referirme a una fecha de 4 mese depues, o 30 dias despues, o un año mas etc. espero ser algo claro
esto lo nececito para obtener una fecha limite de pago en mi tarea. es decir para decir que si un cliente tomo un prestamo hoy x dia su limite de pago sera en 1 mes exacto despues de dicha fecha, para poder ponerle un recargo.

2: lo segundo es que quiero saber porque cuando hago una conversion de fecha con decodedate, para obtener la fecha en formato de numeros, cuando ago un calculo con los meses es decir si el mes actual esta entre 1 al 9 me depliega un mensage. esto va bien, pero cuando digo si esta entre 10 y 12 no me reconoce estos meses porque despues de 9 vuelve a 0. como puedo resolver esto.

espero con ansia sus repuestas y que me hallan podido entender . garcias de antemano y les salu2 nuevamente.:):)

vtdeleon
07-10-2006, 20:25:49
suponiendo que la fecha actual es 26/10/82 como puedo referirme a una fecha de 4 mese depues, o 30 dias despues, o un año mas etc. espero ser algo claro
esto lo nececito para obtener una fecha limite de pago en mi tarea. es decir para decir que si un cliente tomo un prestamo hoy x dia su limite de pago sera en 1 mes exacto despues de dicha fecha, para poder ponerle un recargo.
Sabias que podrias tener problemas con un prestamo realizados entre el 29 y 31 de un mes, puesto que algunos meses no llegan a 31 y Febrero no llega siquera a 30, solo a 28 y a veces a 29 (cada 4 años).

Una solucion es que los prestamos realizados entre el 29 al 31 sean llevados al dia 28 o al dia 1 del proximo mes. Asi no tendrias problemas.

Con respecto a sumar las fechas tienes :

IncDay(fecha) para sumar 1 dia
IncMounth(...) para sumar 1 mes
IncYear(...) Sumar 1 Año.

vtdeleon
07-10-2006, 20:27:04
Saludos2: lo segundo es que quiero saber porque cuando hago una conversion de fecha con decodedate, para obtener la fecha en formato de numeros, cuando ago un calculo con los meses es decir si el mes actual esta entre 1 al 9 me depliega un mensage. esto va bien, pero cuando digo si esta entre 10 y 12 no me reconoce estos meses porque despues de 9 vuelve a 0. como puedo resolver esto.:confused: Muestranos el codigo

Lepe
07-10-2006, 21:26:32
Dependiendo de cómo aborde la cuestion, puede ser muy sencillo el tema.

Como sabemos una fecha es un Flotante, la parte entera indica los días transcurridos desde el inicio del calendario (01/01/1900) y la parte fraccionaria es la hora transcurrida desde media noche.

Si a una fecha le sumamos un número entero, estamos sumando días, y no importa si el mes tiene 28 ó 31 días; la fecha resultante será una fecha válida.

Lo principal es entender la forma que quiere el cliente, me explico, si quiere sumar 1 mes a la fecha... pues vale, pero: ¿cuantos días se debe sumar? (Enero 31 días, Febrero 28 días, Marzo 30) ¿Cuantos días se debe sumar realmente?

Las rutinas:

IncDay
IncMonth
IncYear

simplemente suma la cantidad que se le pase por parámetro y garantiza que el resultado será una fecha válida, pero ¿realmente es lo que necesita tu cliente?

Ejemplo:
Desde el 15/01/2000 hasta el 15/02/2000 no van los mismos días de préstamo que desde el 15/02/2000 hasta el 15/03/2000 porque puede ser bisiesto, porque el mes tiene 28 días, etc.


Si no recuerdo mal, estan las rutinas
DaysInYear
DaysInAYear
etc. (mira la unidad DateUtils entera, tiene muy buenas rutinas)

Pasando todo a días y sumando jamás tendrás problemas.

Saludos

Jheysson13
08-10-2006, 00:18:01
gracias a los dos por las rutinas de para poder sumar la fechas esto me servira para mi tarea. es justo lo que estaba buscando gracias.:p

en cuanto a la segunda parte perdon por no haber mostrado el codigo lo pense justo despues que envie la pregunta y ya no tube mas tiempo para mostrarlo, pero aki le muestro a ver si me entienden:

var presente:tdatetime;
var mes,dia,ano:word;
begin
presente:=now;
decodedate(presente,ano,mes,dia);
fecha1.Caption:=inttostr(dia);
fecha2.Caption:=inttostr(mes);
fecha3.Caption:=inttostr(ano);

if fecha2.Caption<='4' then
begin n:='1';
end else
if ((fecha2.Caption>'4') and (fecha2.Caption<='8')) then
begin n:='2';
end else
if (fecha2.Caption>'8')then begin
n:='3';
end;

en las dos primeras condiciones todo funciona bien, pero cuando el mes supera el numero 9 me parece que toma el valor de 0 (cero) y vuelve a contar desde 1 en ves de 10,11,12 que serian octubre,nov,dic. por lo que no obtengo los resultados a partir del mes 10.
espero entiendan esto.
gracias de nuevo.

seoane
08-10-2006, 00:44:04
Hola Jheysson13, el problema es sencillo. Estas comparando texto y no números, cuando tu comparas:


if (fecha2.Caption>'8')then begin


si fecha2.caption vale '10' la comparación devuelve FALSE porque la cadena de texto '10' es menor que la cadena de texto '8', ya que cuando se compara texto se realiza carácter a carácter, es decir es mayor el que tiene el primer carácter mayor.

Jheysson13
08-10-2006, 00:47:56
oooooooooooooooooooooooooooooo, pero que error mas bobo y no lo pude ver. gracias amigo y disculpa mi ignorancia. gracias de nuevo y salu2 :D :D

vtdeleon
08-10-2006, 04:20:02
Si no recuerdo mal, estan las rutinas
DaysInYear
DaysInAYear
etc. (mira la unidad DateUtils entera, tiene muy buenas rutinas)

Pasando todo a días y sumando jamás tendrás problemas. Tienes razon en que no habra problemas, pero como él habia dichoesto lo nececito para obtener una fecha limite de pago en mi tarea. es decir para decir que si un cliente tomo un prestamo hoy x dia su limite de pago sera en 1 mes exacto despues de dicha fecha, para poder ponerle un recargo.Queria aclararle esos puntos, qeu a mi entender seria mejor cuadrarlo a dias entre 1 y 28, los cuales todo mes tiene.

Jheysson13, edita tu mensaje y chequea como he puesto tu codigo. Veras que tiene unas etiquetas que resaltan el codigo. Seria bueno que estudiaras como se utilizan las etiquetas para delphi, sql y demas... en mi firma puedes encontrar los enlaces.

Jheysson13
08-10-2006, 05:59:09
jejej tienes razon con la forma que explicas lo que estaba buscando sobre obtener la fecha cuadrando a 28 dias el mes. gracias por ello.


por otra parte me causo gracia ver el codigo que habia puesto para mostrar las conversiones de fechas. jejeje por un momento pense que se edito solo el codigo en delphi hasta que lei mas abajo tu recomendaciones gracias nuevamente y lo tomare en cuenta.

Jheysson13, edita tu mensaje y chequea como he puesto tu codigo. Veras que tiene unas etiquetas que resaltan el codigo. Seria bueno que estudiaras como se utilizan las etiquetas para delphi, sql y demas... en mi firma puedes encontrar los enlaces.

vtdeleon
08-10-2006, 06:19:23
Bien ;)

Saludos