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 funcion para Determinas meses (https://www.clubdelphi.com/foros/showthread.php?t=79119)

microbiano 08-06-2012 19:45:02

Ayuda con funcion para Determinas meses
 
hola amigos recurro nuevamente a ustedes para poder realizar esta tarea.

quiero mostrar en un grid lo siguiente

periodo |meses


Enero 2010 -Diciembre 2010 | 12
Enero 2011 -Diciembre 2011 | 12
Enero 2012 -Junio 2012 | 6

La fecha Inicial seria 01/014/2010, esta puede variar dependiendo de la fecha de registro de un cliente
La fecha Final: es la Fecha que tiene el servidor que para el dia de hoy es 08/06/2012.

alguna sugerencia Amigos.

de antmano muchas gracias amigos se los agradezco mucho.

Casimiro Notevi 08-06-2012 20:02:22

Creo que has olvidado unos poquitos de datos ;)

microbiano 08-06-2012 20:16:27

es que no tengo idea de como iniciar la funcion o prodecimiento; los datos de entrada son:

Fecha Inicial : La tomo de una base de datos dependiendo del clientes

Fecha Final : es la que Tiene el servidor a la hora de hacer la consulta.

Ejemplo:

Cliente : Horacio Xochitemol
Fecha de Registro: 25/10/1980
Fecha del Servidor: 08/06/2012

funcion Meses(Fecha1:Tdate, Fecha2:Tdate)Date;
begin
determinar lo siguientes
periodo meses
noviembre 1980 - Diciembre 1980 2
Enero 1981 -diciembre 1981 12
enero 1982-diciembre 1982 12
Etc.....

Enero 2012-Junio 2012 6
end;


creo que es algo asi.

ecfisa 08-06-2012 20:24:21

Hola microbiano.

No se entiende bién lo que deseas hacer, por lo que veo pareciera que deseas obtener los meses entre dos fechas incluyendo los meses de la fecha incial y final....

Si es así podrías hacer:
Código Delphi [-]
uses DateUtils;

function Lapso(const f1, f2: TDate): Integer;
begin
  if (YearOf(f1)=YearOf(f2))and(MonthOf(f1)=MonthOf(f2)) then
    Result:= 1
  else
    Result:= MonthsBetween(f1, f2) + 2;
end;
Pero creo que debes explicar con más detalle cuál es el resultado que pretendes obtener.

Saludos.

microbiano 08-06-2012 20:36:32

lo que quiero hacer es saber cuantos años han pasado y cuantos meses por año.

maeyanes 08-06-2012 20:44:34

Hola...

Si bien entiendo el desea, dado un rango de fechas (una fecha inicial y la fecha actual del servidor de bd), obtener subrangos de fechas limitados por años:

Código:

F. Inicial: 23/04/2010
F. Actual: 08/06/2012

Rangos:
Abril 2010 - Diciembre 2010 | 9 meses
Enero 2011 - Diciembre 2011 | 12 meses
Enero 2012 - Junio 2012    | 6 meses



Saludos...

microbiano 08-06-2012 22:46:40

si amigo es correcta tu observacion amigo [maeyanes], eso es lo que necesito

microbiano 18-06-2012 17:52:21

Este es el reusltado de lo que quiero
 
1 Archivos Adjunto(s)
amigos este es el resultado de lo que quiero, me gustaria poder llegar a este resultado, pero no lo consigo espero me puedan ayudar.


muchas gracias

fpirovani 18-06-2012 21:26:28

MonthsBetween
 
Hola microbiano!

Agregando al uses la unidad DateUtils podes usar la funcion MonthsBetween, que hace exactamente lo que estas necesitando.

Espero te sirva.
Saludos ! :)

microbiano 18-06-2012 21:55:42

estoy sacando los mese asi
 
Código Delphi [-]
function tfrmrecibos.MesesANombres(D1, D2: TDate): TStrings;
var
   i,ii, Mes, TotMeses,TotAnios: Integer;
   AnioIni,MesIni,DiaIni,AnioFin,MesFin,DiaFin: word;
begin
  DecodeDate(D1,AnioIni,MesIni,DiaIni);
  D1:= EncodeDate(AnioIni , MesIni,1);//pongo el dia 1 al mes
  DecodeDate(D2,AnioFin,MesFin,DiaFin);
  D2:= EncodeDate(AnioFin,MesFin, daysInMonth(D2));//Pongo el ultimo dia del Mes
  Result:= TStringList.Create;
  TotMeses:= MonthsBetween(D1, D2);
  TotAnios:=YearsBetween(D1,D2);
  Mes:= MonthOf(D1);
  for ii:= MonthOf(D1) to TotMeses + MonthOf(D1)-1 do
    begin
        if Mes = 12 then
          Mes:= 1
        else
          Inc(Mes);
        Result.Add(LongMonthNames[Mes]+' '+IntTostr(i));
    end;
end;

voy a tratar de sacar los años y demas datos.

microbiano 20-06-2012 17:01:54

bueno estoy en eso creo que me estoy complicando demaciado
 
bueno ahora lo que hice fue sacarlo mas o menos asi lo que no se es como cambiar de año y que considere de enero a la fecha del calendario jejejejeje.

Código Delphi [-]
function tfrmrecibos.MesesANombres(D1, D2: TDate): TStrings;
var
   i,ii, Mes, TotMeses,TotAnios: Integer;
   Anio,AnioIni,MesIni,DiaIni,AnioFin,MesFin,DiaFin: word;
begin
  DecodeDate(D1,AnioIni,MesIni,DiaIni);
  D1:= EncodeDate(AnioIni , MesIni,1);//pongo el dia 1 al mes
  DecodeDate(D2,AnioFin,MesFin,DiaFin);
  D2:= EncodeDate(AnioFin,MesFin, daysInMonth(D2));//Pongo el ultimo dia del Mes
  Result:= TStringList.Create;
  TotMeses:= MonthsBetween(D1, D2);
  TotAnios:=YearsBetween(D1,D2);
  Mes:= MonthOf(D1);
  for i:=AnioIni to AnioFin do
   begin
    Anio:=i;
    DecodeDate(D1,Anio,MesIni,DiaIni);
    DecodeDate(D2,Anio,MesFin,DiaFin);
    D1:= EncodeDate(i , MesIni,1);//pongo el dia 1 al mes creo que aqui es a donde tendria que considerar los meses de cada año 
    D2:= EncodeDate(i,MesFin, daysInMonth(D2));//Pongo el ultimo dia del Mes creo que aqui es a donde tendria que considerar los meses de cada año
    TotMeses:= MonthsBetween(D1, D2);
    Result.Add(IntTostr(i)+ '  -     '+ IntToStr(TotMeses));//imprimo el año y el numero de meses
   end;
end;

jachguate 20-06-2012 23:31:28

Hola.

Te respondo rápidamente, pues no he leído todas las respuestas a tu pregunta original. Pero creo que lo que buscas es esto:

Código Delphi [-]
uses DateUtils;

function MesesTranscurridos(const F1, F2: TDate): Integer;
begin
  Assert(F2>=F1, 'La fecha 2 debe ser mayor que la fecha 1');
  F1 := StartOfTheMonth(F1);
  F2 := EndOfTheMonth(F2) + 1;
  Result := MonthsBetween(F1, F2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Format('Meses entre %s - %s = %d', [DateToStr(DateTimePicker1.Date)
    , DateToStr(DateTimePicker2.Date), MesesTranscurridos(DateTimePicker1.Date, DateTimePicker2.Date)]);
end;

El código lo he escrito aquí mismo y quizás haya algún error de sintaxis, eso te lo dejo a vos.

Un saludo.

marcoszorrilla 21-06-2012 21:52:01

Cita:

Empezado por jachguate (Mensaje 435719)
Hola.

Te respondo rápidamente, pues no he leído todas las respuestas a tu pregunta original. Pero creo que lo que buscas es esto:

Código Delphi [-]
uses DateUtils;  function MesesTranscurridos(F1, F2: TDate): Integer;
 begin
   Assert(F2>=F1, 'La fecha 2 debe ser mayor que la fecha 1');
   F1 := StartOfTheMonth(F1); 
  F2 := EndOfTheMonth(F2) + 1; 
  Result := MonthsBetween(F1, F2);
 end; 
 procedure TForm1.Button1Click(Sender: TObject);
 begin  
 Label1.Caption := Format('Meses entre %s - %s = %d', [DateToStr(DateTimePicker1.Date) ,
 DateToStr(DateTimePicker2.Date), MesesTranscurridos(DateTimePicker1.Date, DateTimePicker2.Date)]);
 end;
El código lo he escrito aquí mismo y quizás haya algún error de sintaxis, eso te lo dejo a vos.

Un saludo.

Hay que quitar la palabra const de la función MesesTranscurridos.

Un Saludo

jachguate 22-06-2012 00:02:40

Mil gracias Marcos!!!

Igual, ahora que vi con más calma la (mal redactada) pregunta, creo que la solución iba un poco más allá:

Código Delphi [-]
uses DateUtils;

{$R *.dfm}

function MesesTranscurridos(F1, F2: TDate): Integer;
begin
  F1 := StartOfTheMonth(F1);
  F2 := EndOfTheMonth(F2) + 1;
  Result := MonthsBetween(F1, F2);
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Year: Word;
  F1, F2: TDate;
begin
  Memo1.Lines.Clear;
  for Year := YearOf(DateTimePicker1.Date) to YearOf(DateTimePicker2.Date) do
  begin
    if Year = YearOf(DateTimePicker1.Date) then
      F1 := DateTimePicker1.Date
    else
      F1 := EncodeDate(Year, 1, 1);
    if Year = YearOf(DateTimePicker2.Date) then
      F2 := DateTimePicker2.Date
    else
      F2 := EncodeDate(Year, 12, 31);
    Memo1.Lines.Add(Format('%s - %s: %d meses', [
        FormatDateTime('mmmm ''de'' yyyy', F1)
      , FormatDateTime('mmmm ''de'' yyyy', F2)
      , MesesTranscurridos(F1, F2)
      ]));
  end;
end;

El resultado es este:



Un saludo.

pd. Me pregunto donde está Tonatiuh? <---- favor no responder es una pregunta interna.


La franja horaria es GMT +2. Ahora son las 19:23:57.

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