Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
Ayuda con rango de fechas

bien resulta que tengo que hacer una funcion que determine cuantos meses hay entre un rango de fechas, ejemplo.

fecha inicio :7/01/2011 //realmente seria la fecha del ultimo pago
fecha fin: 07/03/2011// seria la fecha que tendria el sistema al dia que el usuario quiere realizar el pago.


a mi entender en numero de meses en este rango seia 1 el cual corresponderia a febrero, bien pues no se como ahcer jjajajaj, alguna suregencia. es para calcular que meses no ha pagado un usuario.


saludos y de antemano muchas gracias.
Responder Con Cita
  #2  
Antiguo 07-02-2011
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
En la libreria DateUtils tienes la funcion MonthsBetween (a partir de Delphi 7)

Bye
__________________
Amar al mundo apasionadamente.
Responder Con Cita
  #3  
Antiguo 12-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
amigo tendras algun ejemplo de como se usa esa funcion por que ya lo intenten asi (MonthsBetween(date2,date1)) pero me manda error. no compatible, el resultado en que tipo de variable tendria que guardarlo.
Responder Con Cita
  #4  
Antiguo 12-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola microbiano.

Ejemplo:
Código Delphi [-]
uses DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  D1,D2: TDate;
  R: Integer;
begin
  D1:= StrToDate('07/01/2011');
  D2:= StrToDate('07/03/2011');
  R:= MonthsBetween(D1,D2);
  ShowMessage('Meses comprendidos entre ' + DateToStr(D1) + ' y ' +
              DateToStr(D2) + ':  ' + IntToStr(R));
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 12-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
Excelente Muchas Gracias es lo que estaba buscando muchas gracias Amigo.
Responder Con Cita
  #6  
Antiguo 14-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
hola hasta ahora me ha funcionado lo del rango de fechas, pero ahora necesito saber el nombre de los meses :-( que estan en ese ranfo por ejemplo 01/01/2001 al 01/04/2011, bien con la instruccion anterior me da el numero de meses esw decir me dice 2 meses, pero como puedo sabe el nombre de los meses en este caso seria Febrero y Marzo.

alguna sugerencia?.


de antemano muchas gracias por su respuesta.
Responder Con Cita
  #7  
Antiguo 14-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola microbiano.

Código Delphi [-]
uses DateUtils;

function MesesANombres(D1, D2: TDate): TStrings;
var
  i, m, Tot: Integer;
begin
  Result:= TStringList.Create;
  Tot:= MonthsBetween(D1, D2);
  m:= MonthOf(D1) - 1;
  for i:= MonthOf(D1) to Tot + MonthOf(D1) do
  begin
    if m = 12 then
      m:= 1
    else 
      Inc(m);
    Result.Add(LongMonthNames[m])
  end;
end;

Ejemplo de llamada:
Código Delphi [-]
   Memo1.Clear;
   Memo1.ScrollBars:= ssVertical; //según las fechas de tu último post, vas a necesitar esta línea... 
   Memo1.Lines:= MesesANombres(StrToDate('01/01/2001'), StrToDate('01/04/2011'));

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 15-02-2011 a las 04:54:50.
Responder Con Cita
  #8  
Antiguo 15-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
hola como estas muchas gracias por la respuesta lo considerare, solo que ahora estoy en otra pc
Responder Con Cita
  #9  
Antiguo 16-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
bien provando la funcion si llamo a dicha funcion de la siguiente manera
Código Delphi [-]
 mmo1.Lines:= MesesANombres(StrToDate('01/02/2011'), StrToDate('01/04/2011'));

me muestra los meses de febrero y marzo, cuando realmente solo tendria que ser marzo .

hay alguna sugerencia con la que me pueda ayudar. muchas gracias.
Responder Con Cita
  #10  
Antiguo 16-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola microbiano.

Es cierto no tiene que incluir el mes inicial.

Se soluciona con un simple cambio:
Código Delphi [-]
function MesesANombres(D1, D2: TDate): TStrings;
var
  i, m, Tot: Integer;
begin
  Result:= TStringList.Create;
  Tot:= MonthsBetween(D1, D2);
  m:= MonthOf(D1); //-1 ------------------>
  for i:= MonthOf(D1) to Tot + MonthOf(D1) -1 do
  begin
    if m = 12 then
      m:= 1
    else
      Inc(m);
    Result.Add(LongMonthNames[m])
  end;
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-02-2011 a las 06:43:49.
Responder Con Cita
  #11  
Antiguo 18-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
sigo con el problema de rango de fechas

bien resulta que uso la siguiente funcion para determinar las fechas
Código Delphi [-]
function TFcobro.MesesANombres(D1, D2: TDate): TStrings;
var
  i, m, Tot: Integer;
begin
  Result:= TStringList.Create;
  Tot:= MonthsBetween(D1, D2);
  m:= MonthOf(D1);// - 1;
  for i:= MonthOf(D1) to Tot + MonthOf(D1)-1 do
  begin
    if m = 12 then
      m:= 1
    else
      Inc(m);
    Result.Add(LongMonthNames[m])
  end;
end;


y hago la llamada de la siguiente manera.

Código Delphi [-]
 mmo1.Clear;
 mmo1.ScrollBars:= ssVertical; //según las fechas de tu último post, vas a necesitar esta línea...
 mmo1.Lines:= MesesANombres(StrToDate('01/02/2011'), StrToDate('30/04/2011'));

en este caso me muestra 2 meses que son marzo y abril, cuando deberia ser marzo, sin embargo cuando hago la llamada de al siguiente manera me muestra solo marzo.

Código Delphi [-]
 mmo1.Clear;
 mmo1.ScrollBars:= ssVertical; //según las fechas de tu último post, vas a necesitar esta línea...
 mmo1.Lines:= MesesANombres(StrToDate('01/02/2011'), StrToDate('01/04/2011'));

hay alguna sugerencia para que determine los meses correctamente ya trate de truncar el resultado para que me tome el valor real pero no funciona.

Última edición por microbiano fecha: 18-02-2011 a las 17:42:35. Razón: modificaciones
Responder Con Cita
  #12  
Antiguo 18-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola microbiano.

La ayuda de Delphi dice que la función MonthsBetween, devuelve el número aproximado de meses entre dos fechas...
Cita:
Returns the approximate number of months between two specified TDateTime values.
...
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.
Una solución entonces, es ajustar la primer fecha al día 1 y la segunda al día máximo de ese mes:
Código Delphi [-]
function TForm1.MesesANombres(D1, D2: TDate): TStrings;
var
  i, c, Tot: Integer;
  y,m,d: word;
begin
  // dias en D1 = 1
  DecodeDate(D1,y,m,d);
  D1:= EncodeDate(y , m, 1);
  // dias en D2 = máximo día del mes
  DecodeDate(D2,y,m,d);
  D2:= EncodeDate(y, m, DaysInMonth(D2));
  // El resto no varía...
  Result:= TStringList.Create;
  Tot:= MonthsBetween(D1, D2);
  c:= MonthOf(D1);
  for i:= MonthOf(D1) to Tot + MonthOf(D1)-1 do
  begin
    if c = 12 then
      c:= 1
    else
      Inc(c);
    Result.Add(LongMonthNames[c])
  end;
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 18-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
sigo sin poderlo resolver creo que me estoy complicando la vida miren lo que quiero hacer es que el usuario hace un pago cada mes. entonces en un año debe hacer 12 pago, pero puede darse el caso de que desde el mes de enero pague los doces meses que tiene el año, lo qu quiero hacer es que cuando el usuario se atrasa un mes por ejemplo en este caso que estamos en febrero y no pago enero se cobre el mes de enero con intereses, pero no logro hacerlo. alguien tiene algo parecido?
Responder Con Cita
  #14  
Antiguo 19-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
ayuda

resulta que no tngo indea de como hacer un formulario de cobro de agua potable, necesito determinar cuantos meses exisnten entre un rango de fechas para verificar cuantos meses se deben cobrar con recargo, pero que pasa si el usuario paga todo el año completo.

alguien tiene una aplicacion para cobro de algun servicio que a la vez sea por mes y que a la vez se vea que mes ya se pago que me de una idea de como se hace
Responder Con Cita
  #15  
Antiguo 19-02-2011
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
no encuentro la forma de poder solucionarlo, me lleva
Responder Con Cita
  #16  
Antiguo 19-02-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por microbiano Ver Mensaje
...necesito determinar cuantos meses exisnten entre un rango de fechas para verificar cuantos meses se deben cobrar con recargo, pero que pasa si el usuario paga todo el año completo.
OK OK OK OK! Estás desesperado creo. Eso no es bueno. Tómalo con calma que nada es para tanto

La solución de tu problema va por "volver a la mesa de dibujo o diseño", cómo quieras llamarle. Por lógica se deduce que si un cliente ya pago con antelación todo el año, él ni siquiera debería aparecer en la tabla de morosos. Si con los datos brindados por la DB no puedes deducir cuando un cliente ha pagado con antelación, pues creo que estás en un grave problema y necesitas revisar el diseño de tu sistema.

Con respecto a la diferencia de meses entre dos fechas, es un poco más complicado. A cómo se te ha mencionado, la función MonthBetween no puede garantizar ser exacta. Por lo delicado del asunto, no puedes pasar por alto esa impresión de la función. Ahorita, con sueño y con ganas más de dormir que de otra cosa, sólo se me ocurre que deberías de adentrarte a tratar de construir un algoritmo adecuado específicamente para la circunstancia que te premia. Gracias a Dios que los desarrolladores de Delphi nos dejaron rutinas para saber en qué mes estamos, en que día del año también. Cuando estamos en un año bisiesto y así sucesivamente. Creo que una ensalada de estas funciones puede ayudarte a determinar con mayor precisión cuando un cliente ha cumplido uno o más meses de mora.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta Mysql Suma entre rango de fechas kaeltas MySQL 4 22-06-2012 21:30:44
Ayuda SQL Between con rango de fechas darkbits SQL 16 26-07-2010 21:20:37
Ayuda SQL Between con rango de fechas darkbits SQL 3 14-04-2010 22:31:30
Rango de fechas roberasturias Varios 2 23-05-2005 18:02:35
Rango de fechas JODELSA Varios 8 22-05-2003 20:45:43


La franja horaria es GMT +2. Ahora son las 07:59:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi