Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Obtener fechas especificas (https://www.clubdelphi.com/foros/showthread.php?t=37003)

OscarRd 30-10-2006 20:43:17

Obtener fechas especificas
 
Saludos colegas,


Trabajo en un sistema de Recursos Humanos y Nominas
y se me ha pedido crear automaticamente los periodos de pagos
los culaes pueden ser mensuales, quincenales o Semanales
por tanto necesito crear una funcion que pasandole la fecha o solo
el año, me retorne las quincenas de todos los meses del año, las semanas y logico el mes. Para de esta manera insertar la informacion en una tabla.

Ej:
Año :=2006
Quncenas :=True;
Enero 01/01/2006 al 15/01/2006 y 16/01/2006 al 31/012006

Febrero 01/02/2006 al 15/02/2006 y 16/01/2006 al 28/02/2006

lo mismo seria para las semanas..
Cualquier sugerencia, recomendacion o codigo sera bien recibido

Les estare sumamente agradecido por su colaboracion

Gracias de antemano

Delphi 5.0
Windows XP

Caral 30-10-2006 20:55:37

Hola OscarRd
Esto lo haria yo con una sentencia sql en un query y con dos dateTimePicker asi:
Coloco dos dateTimePicker en el form y pongo esto, puede ser en un boton:
Código Delphi [-]
 Query1.SQL.Add('  Select * From Nominas ');
 Query1.SQL.Add(' WHERE Nominas.FechaNomina >= #'+DateToStr(dateTimePicker1.Date)+ '# AND  Nominas.FechaNomina <= # '+DateToStr(dateTimePicker2.Date)+'#');
Saludos

reina 30-10-2006 21:36:20

Mmm no lo que necesita es crear los correspondientes registros de Pagos donde estan sus vencimientos, ya sea semanal..mensual o anual no es asi??
Si usas las ultimas versiones de delphi como el 2005 las rutinas date time tienen muchas funciones que te pueden ayudar. Tengo a mano aca delphi4 y no veo mucha ayuda jeje.
Tenes IncMonth que te adiciona a tu fecha la cantidad de meses que le indiques..los format date ..los decode etc.
Podrias tener procedimientos distintos ya sea para mes ..semana o quincena, para tener el codigo bien prolijo y obtener las fechas correspondientes e ir creando los registros en la base. Tambien podes convertir las fechas desde el motor..con las funciones que trae y ponerlas desde la misma sentencia insert..(aunque seria medio imposible en algunos casos ja).

por ejemplo para quincena sabes que comienza en dia 1 y termina en el ultimo dia del mes:
01/06/2006 al 15/06/2006
16/06/2006 al //ultimo dia del mes//

ultimo dia del mes:
primerDia:=01/06/2006;
primerDiaMesSig:= incMonth(primerDia,1):
cantDiaMes:=round(primerDiaMesSig - primerDia);
ultimodiaMes:=cantDiaMes/06/2006;

claro que esto no funciona si lo pones asi nomas :D , en ultimoDiaMes deberias armar la fecha con encodeDate.

Espero te sirva..y si tengo tiempo te armo algo si no lo resolviste.
salu2222

OscarRd 30-10-2006 21:49:58

Gracias por tu pronta respuesta

lo que requiero es dividir los 12 meses del año en
quincenas

mes 2: primera quincena del 1 al 15
mes 2: segunda quincena del 16 al 31
ya probe lo que dijiste pero no me funciona

reina 30-10-2006 21:52:07

Lo que puse es una idea..asi tal cual lo escribi no funciona...
Si podes pega el codigo de lo qu hiciste y lo miro, ya me estoy yendo pero mañana o mas tarde lo miro!
salu22

OscarRd 30-10-2006 21:55:14

Gracias Reina, Agradeceria mucho
que me armaras el codigo lo mas que puedas
ya que soy Nuevo en Delphi.

Gracias de antemano

Caral 30-10-2006 22:01:18

Hola
La verdad no entiendo bien lo que quieres entonces, porque en mi empresa se cancela la nomina tanto por semana como quincena o incluso mes y puedo ver exactamente lo que se cancelo en la semana X o quincena X del mes X.
Sin nungun problema, entonces no entiendo.!=??
Bueno lamento no haber podido ayudarte.
Saludos

OscarRd 30-10-2006 22:13:18

Gracias Caral....si que me ayudaste

En otras palabras lo que quiero es tener una tabla con la siguiente estructura

Periodo mes fecha1 fecha2
001 Enero 01/01/2006 15/01/2006
002 Enero 16/01/2006 31/02/206

003 Febrero 01/02/2006 01/15/06
004 Febrero 16/02/2006 28/02/2006

Esto es en el caso de los pagos quincenales

Caral 30-10-2006 22:31:27

Hola
La verdad sigo sin entender.:confused:
La nomina quincenal se paga solo las quincenas
La nomina Semanal se paga solo las semanas
Entonces donde esta el problema, si le indico a mi programa que me de las nominas me las dara en su fecha exacta.
Ahora si quieres que el programa defina que ha sido pagado por semana o por quincena o por mes, es tan facil como poner un campo en la tabla que lo defina, S, Q, M.
En la consulta pones un edit en el que se verifica que cumpla la condicion osea que el campo FechaDePago que as de incluir en la tabla, sea S, o Q, o M.
La verdad siempre con el mismo sistema que te indique, lo veo realmente simple, creo que buscar las nominas exactas como las planteas te va a dar problemas ya que en algunas ocasiones la fecha de pago se puede variar si hay dias feriados u otros, esto es normal en las empresas, para mi te estas complicado la vida, sinceramente el codigo que necesitas es simple.
Saludos

vtdeleon 31-10-2006 02:07:39

Saludos

No he leido todo el hilo, pero creo que el incoveniente es por las quicenas.

Los meses son irregulares, es decir, terminan tanto en dias 30 como en 31, hasta en 28 y 29 en el caso de febrero.

Conseguir la primera quicena es facil pues todo mes tiene dia 15's, pero ¿como conseguimos el ultimo dia de cada mes?, Hmm facil, yendonos al dia 1 de cada mes y restarle un dia. Voila :D (Se escribira asi?:rolleyes: )

Creo que desarrollar un procedimiento o funcion no se te seria dificil, verdad?, sino aqui estamos.

Suerte.

jachguate 31-10-2006 03:26:37

He hecho esto, aunque no lo he probado, estoy seguro que te ayudará.

Con respecto de las semanas, hará falta saber cómo se delimitan las semanas para hacer algo que te sirva, pero con lo que te he dado, seguro lo sacas en un abrir y cerrar de ojos.

Código Delphi [-]
procedure TForm1.QuincenasDelAnio(Anio: integer);
var
  FechaIni, FechaFin: TDateTime;
begin
  FechaIni := EncodeDate(Anio, 1, 1);
  FechaFin := EncodeDate(Anio, 1, 15);
  while YearOf(FechaIni) = Anio do
  begin
    Memo1.Lines.Add(DateToStr(FechaIni) + ' - ' + DateToStr(FechaFin));
    FechaIni := FechaFin + 1;
    if DayOf(FechaIni) = 1 then
      FechaFin := FechaIni + 14
    else
      FechaFin := EncodeDate(YearOf(FechaIni), MonthOf(FechaFin), DaysInAMonth(YearOf(FechaIni), MonthOf(FechaIni)));
  end;
end;

procedure TForm1.MesesDelAnio(Anio: Integer);
var
  FechaIni, FechaFin: TDateTime;
begin
  FechaIni := EncodeDate(Anio, 1, 1);
  FechaFin := IncMonth(FechaIni, 1) - 1;
  while YearOf(FechaIni) = Anio do
  begin
    Memo1.Lines.Add(DateToStr(FechaIni) + ' - ' + DateToStr(FechaFin));
    FechaIni := FechaFin + 1;
    FechaFin := IncMonth(FechaIni, 1) - 1;
  end;
end;

Hasta luego.

OscarRd 31-10-2006 15:20:05

Gracias, pero te recuerdo que uso Delphi 5
hay funciones dentro de tu codigo que no estan en esta version.

OscarRd 31-10-2006 15:23:27

Agradeceria mucho tu colaboracion...

pido disculpa por mi desconocimiento en esta valioasa herramienta
pero como dije al principio soy nuevo en Delphi




Cita:

Empezado por vtdeleon
Saludos

No he leido todo el hilo, pero creo que el incoveniente es por las quicenas.

Los meses son irregulares, es decir, terminan tanto en dias 30 como en 31, hasta en 28 y 29 en el caso de febrero.

Conseguir la primera quicena es facil pues todo mes tiene dia 15's, pero ¿como conseguimos el ultimo dia de cada mes?, Hmm facil, yendonos al dia 1 de cada mes y restarle un dia. Voila :D (Se escribira asi?:rolleyes: )

Creo que desarrollar un procedimiento o funcion no se te seria dificil, verdad?, sino aqui estamos.

Suerte.


jachguate 31-10-2006 20:03:37

Olvidé mencionar que debes incluir la función DateUtils en la clausula Uses de tu unidad. Francamente desconozco si dicha unidad está disponible en delphi 5.

Saludos.

reina 01-11-2006 21:06:31

Hola! tarde..recien copie el codigo del compañero..y le reforme unas cosas por sino tenes esas funciones en delphi5..en mi triste delphi 4 no estan :p .

Código Delphi [-]
procedure TForm1.QuincenasDelAnio(Anio: integer);
var
  FechaIni, FechaFin: TDate;  aux, i:integer;
begin
  for i:= 1 to 12 do
  begin
       FechaIni := EncodeDate(Anio, i, 1);
       FechaFin := EncodeDate(Anio, i, 15);
       Memo1.Lines.add(Datetostr(FechaIni) + '-' + DateToStr(FechaFin));
       FechaIni:= EncodeDate(Anio, i, 16);
       if i = 12 then
           aux:=Round(EncodeDate((Anio + 1), 1, 1) - EncodeDate(Anio, i, 1))
       else
           aux:=Round(EncodeDate(Anio, i + 1, 1) - EncodeDate(Anio, i, 1));
       FechaFin :=EncodeDate(Anio,i, aux);
       Memo1.Lines.add(Datetostr(FechaIni) + '-' + DateToStr(FechaFin));
  end;
end;
procedure TForm1.MesesDelAnio(Anio: Integer);
var
  FechaIni, FechaFin: TDate;  aux, i:integer;
begin
  for i:= 1 to 12 do
  begin
       FechaIni := EncodeDate(Anio, i, 1);
       if i = 12 then
           aux:=Round(EncodeDate((Anio + 1), 1, 1) - EncodeDate(Anio, i, 1))
       else
           aux:=Round(EncodeDate(Anio, i + 1, 1) - EncodeDate(Anio, i, 1));
       FechaFin :=EncodeDate(Anio,i, aux);
       Memo1.Lines.add(Datetostr(FechaIni) + '-' + DateToStr(FechaFin));
  end;
end;

Bueno fijate si te sirve...esta hecho medio asi nomas, de todas formas me parece que si sos nuevo en delphi deberias usar el help..la ayuda no muerde y esta para ayudar! la palabra misma lo dice. Si pones date..datetime o algo relacionado con lo que queres buscar te sale lo que buscas.
Tambien podrias mirar el libro La Cara Oculta de Delphi 4, es el mejor para mi gusto para aprender delphi.
salu22 y exitos

OscarRd 01-11-2006 22:21:11

Gracias a todos, por su valiosa colaboracion
con sus consejos y recomendaciones pude lograr mi objetivo.

A continuacion esta el codigo:
Una ves mas Gracias a todos.... :D
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  Present,PrimerDia,primerDiaMesSig,
   m,ndia,dFecha,dFecha2,dFecha3,dFecha4: TDateTime;
   cantDiaMes,re: word;
   Year, Month, Day, Hour, Min, Sec, MSec, Tf : Word;
    n :integer;
    date, Date2, date3, Date4,
   sYear,sDia,cFecha,cFecha2,cFecha3,cFecha4 : string;
    I,iCount, DiaTopeMes, inDias :Integer;
   quinc1, quinc2:Real;
begin
  case  rgpPeriodos.ItemIndex of
   0:begin {Semanal}
      DiaTopeMes := 30;
     quinc1:= DiaTopeMes/2;
    quinc2:= quinc1 + 1;
    with Query1 do
     begin
        Sql.Clear;
        close;
        try
         sql.add('create table #TempPeri(fecha_1 char(20),fecha_2 char(20))');
          ExecSQL;
        except

        end;
         sYear :=copy(DateEdit971.text,7,10); //Año
          sDia :=copy(DateEdit971.text,1,2); //Dia
       For i:= 1 to 12 Do
       Begin
         Month:= Month + 1;
           if Length(IntToStr(Month)) <> 2 then
           begin
             Date := sDia+'/'+'0'+IntToStr(Month)+'/'+sYear;
           end
           else
           begin
               Date := sDia+'/'+IntToStr(Month)+'/'+sYear;
           end;

            dFecha :=strTodate(Date);

          //----------------------------------------------------------
           {Obtiene el Total de dias del mes}
           PrimerDia := StrToDate(Date);
         PrimerDiaMesSig := incMonth(PrimerDia,1);
         cantDiaMes := round(PrimerDiaMesSig - PrimerDia);

            for iCount := 1 to 4 do
            Begin
             inDias := 7;
              if iCount = 1 then
              begin
                dFecha4 :=  dFecha;
              dFecha  :=  dFecha+7;
              Dfecha  :=  dFecha -1;
              end
              else
              begin
                dFecha4 := dFecha;
              dFecha  := dFecha+7;
              end;

              cfecha  := DateTostr(dFecha);
              cFecha4 := DateTostr(dFecha4);

              if iCount = 1 then
              begin
               Close;
              sql.Clear ;
                Sql.Add('insert into #TempPeri');
                sql.add('Values('+QuotedStr(cFecha4)+','+QuotedStr(cFecha)+')');
                ExecSQL;
              end;

              dFecha2 := dFecha+1;
              cFecha2 := DateTostr(dFecha2);

              dFecha3 := dFecha+7;
              cFecha3 := DateTostr(dFecha3);

             sql.Clear ;
               Sql.Add('insert into #TempPeri');
             sql.add('Values('+QuotedStr(cFecha2)+','+QuotedStr(cFecha3)+')');
             ExecSQL;
            end;
       end;
     end;
     With query2 do
     begin
        sql.clear;
        close;
        sql.add('select * from #TempPeri');
        open;
     end;{=======FIN SEMANAL=======}
   end;

   1:begin {Quincenal}
      DiaTopeMes := 30;
     quinc1:= DiaTopeMes/2;
    quinc2:= quinc1 + 1;
    with Query1 do
     begin
        Sql.Clear;
        close;
        try
         sql.add('create table #TempPeri(fecha_1 char(20),fecha_2 char(20))');
          ExecSQL;
        except

        end;
         sYear :=copy(DateEdit971.text,7,10); //Año
          sDia :=copy(DateEdit971.text,1,2); //Dia
       For i:= 1 to 12 Do
       Begin
         Month:= Month + 1;
           if Length(IntToStr(Month)) <> 2 then
           begin
             Date := sDia+'/'+'0'+IntToStr(Month)+'/'+sYear;
              Date2 := FloatToStr(quinc1) +'/'+'0'+IntToStr(Month)+'/'+sYear;
           end
           else
           begin
               Date := sDia+'/'+IntToStr(Month)+'/'+sYear;
              Date2 := FloatToStr(quinc1) +'/'+IntToStr(Month)+'/'+sYear;
           end;

           //----------------------------------------------------------
           {Obtiene el Total de dias del mes}
           PrimerDia :=StrToDate(Date);
         PrimerDiaMesSig := incMonth(PrimerDia,1);
         cantDiaMes := round(PrimerDiaMesSig - PrimerDia);
           //-----------------------------------------------------------
           if Length(IntToStr(Month)) <> 2 then
           begin
          Date3 := FloatToStr(quinc2) +'/'+'0'+IntToStr(Month)+'/'+sYear;
             Date4 := IntToStr(cantDiaMes ) +'/'+'0'+IntToStr(Month)+'/'+sYear;
           end
           else
           begin
           Date3 := FloatToStr(quinc2) +'/'+IntToStr(Month)+'/'+sYear;
            Date4 := IntToStr(cantDiaMes ) +'/'+IntToStr(Month)+'/'+sYear;
           end;


           Close;
           sql.Clear ;
           Sql.Add('insert into #TempPeri');
           sql.add('Values('+QuotedStr(Date)+','+QuotedStr(Date2)+')');
           ExecSQL;

           sql.Clear ;
             Sql.Add('insert into #TempPeri');
           sql.add('Values('+QuotedStr(Date3)+','+QuotedStr(Date4)+')');
           ExecSQL;
       end;
     end;
     With query2 do
     begin
        sql.clear;
        close;
        sql.add('select * from #TempPeri');
        open;
     end;
   end; {===============Fin Quincenal===============}

   2:begin {Mensual}
      DiaTopeMes := 30;
     quinc1:= DiaTopeMes/2;
    quinc2:= quinc1 + 1;
    with Query1 do
     begin
        Sql.Clear;
        close;
        try
            Sql.add('drop table #TempPeri');
            Sql.Clear;
            close;
        sql.add('create table #TempPeri(fecha_1 char(20),fecha_2 char(20))');
          ExecSQL;
        except
        end;
         sYear :=copy(DateEdit971.text,7,10); //Año
          sDia :=copy(DateEdit971.text,1,2); //Dia
       For i:= 1 to 12 Do
       Begin
         Month:= Month + 1;
           if Length(IntToStr(Month)) <> 2 then
           begin
             Date := sDia+'/'+'0'+IntToStr(Month)+'/'+sYear;
           end
           else
           begin
               Date := sDia+'/'+IntToStr(Month)+'/'+sYear;
           end;

           //----------------------------------------------------------
           {Obtiene el Total de dias del mes}
           PrimerDia :=StrToDate(Date);
         PrimerDiaMesSig := incMonth(PrimerDia,1);
         cantDiaMes := round(PrimerDiaMesSig - PrimerDia);
           //-----------------------------------------------------------
           if Length(IntToStr(Month)) <> 2 then
           begin
             Date4 := IntToStr(cantDiaMes ) +'/'+'0'+IntToStr(Month)+'/'+sYear;
           end
           else
           begin
             Date4 := IntToStr(cantDiaMes ) +'/'+IntToStr(Month)+'/'+sYear;
           end;

           Close;
           sql.Clear ;
           Sql.Add('insert into #TempPeri');
           sql.add('Values('+QuotedStr(Date)+','+QuotedStr(Date4)+')');
           ExecSQL;
       end;
     end;
     With query2 do
     begin
        sql.clear;
        close;
        sql.add('select * from #TempPeri');
        open;
     end; {===============Fin Mensual====================}
     end;
     3:begin {Anual}
       with Query1 do
      begin
        Sql.Clear;
       close;
       try
          Sql.add('drop table #TempPeri');
           Sql.Clear;
            close;
        sql.add('create table #TempPeri(fecha_1 char(20),fecha_2 char(20))');
          ExecSQL;
         except
         end;

         sYear := copy(DateEdit971.text,7,10); //Año
          sDia  := copy(DateEdit971.text,1,2); //Dia

         if Length(IntToStr(Month)) <> 2 then
         begin
          Date := sDia+'/'+'01'+'/'+sYear;
         end
        else
        begin
          Date := sDia+'/'+IntToStr(Month)+'/'+sYear;
        end;

         dFecha := StrTodate(Date);
         cFecha := DateTostr(dFecha);

         cFecha2 := '31/12/'+sYear;


         sql.Clear;
         Close;
        Sql.Add('insert into #TempPeri');
        sql.add('Values('+QuotedStr(cFecha)+','+QuotedStr(cFecha2)+')');
         ExecSQL;
        end;
         With query2 do
        begin
          sql.clear;
          close;
          sql.add('select * from #TempPeri');
          open;
        end;
       end;{=============Anual==================}
 end;
end;

jachguate 02-11-2006 15:12:16

Hola.

Me tomé la libertad de editar tu mensaje para añadir la etiqueta [delphi]. ¡La diferencia en la presentación del código es notable!.

Para aprender su uso, podes editar tu mensaje o bien seguir en mi firma el vínculo a la etiqueta [code], cuyo uso es idéntico.

Hasta luego.

:)

Lepe 02-11-2006 16:14:02

Un consejo Oscar, elimina el try except ... end si no tienes nada puesto entre el Except y el end. Si ocurriese un error, jamás podrías detectar que se produce en ese try except.

Saludos


La franja horaria es GMT +2. Ahora son las 08:15:25.

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