Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con rango de fechas (https://www.clubdelphi.com/foros/showthread.php?t=72261)

microbiano 07-02-2011 16:42:44

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.

afxe 07-02-2011 17:59:22

En la libreria DateUtils tienes la funcion MonthsBetween (a partir de Delphi 7)

Bye

microbiano 12-02-2011 05:59:51

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.

ecfisa 12-02-2011 08:56:53

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.

microbiano 12-02-2011 09:06:18

Excelente Muchas Gracias es lo que estaba buscando muchas gracias Amigo.

microbiano 14-02-2011 21:21:42

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.

ecfisa 14-02-2011 22:35:02

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.

microbiano 15-02-2011 02:55:49

hola como estas muchas gracias por la respuesta lo considerare, solo que ahora estoy en otra pc

microbiano 16-02-2011 04:50:17

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.

ecfisa 16-02-2011 06:37:03

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.

microbiano 18-02-2011 17:33:57

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.

ecfisa 18-02-2011 18:52:43

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.

microbiano 18-02-2011 22:11:19

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?

microbiano 19-02-2011 04:41:19

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

microbiano 19-02-2011 04:42:40

no encuentro la forma de poder solucionarlo, me lleva

Chris 19-02-2011 07:22:30

Cita:

Empezado por microbiano (Mensaje 391421)
...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


La franja horaria es GMT +2. Ahora son las 08:54:36.

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