Ir al contenido


Foto

[RESUELTO] Insertar todas las fechas dentro de un Rango de fechas


  • Por favor identifícate para responder
32 respuestas en este tema

#21 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 marzo 2010 - 11:08

¿Guapo? ¿Alguien me llamó? (h)

Se que soy bello, sexy y las mujeres me consideran un sex symbol :D... vaya... ahora resulta que hasta a los hombres atraigo :s

No se... no se... algo me dice que me merezco al menos medio punto ;). No se... yo siempre me digo que el tiempo me dará la razón :p.
No creo que mi planteo inicial de un Store Procedure para éste y el otro hilo sea una mala idea... Algo me dice que si seguimos indagando las funcionalidades y requisitos las mejores técnicas vendrán de combinaciones más cercanas a los SP/Triggers y el mundillo de base de datos.

Saludos,
  • 0

#22 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 marzo 2010 - 11:12

¿Guapo? ¿Alguien me llamó? (h)

Se que soy bello, sexy y las mujeres me consideran un sex symbol :D... vaya... ahora resulta que hasta a los hombres atraigo :s


Pues mientras a ti no te atraigan los hombres :p :D :D :D

No se... no se... algo me dice que me merezco al menos medio punto ;). No se... yo siempre me digo que el tiempo me dará la razón :p.
No creo que mi planteo inicial de un Store Procedure para éste y el otro hilo sea una mala idea... Algo me dice que si seguimos indagando las funcionalidades y requisitos las mejores técnicas vendrán de combinaciones más cercanas a los SP/Triggers y el mundillo de base de datos.

Saludos,


Bueno, yo no digo que mi solución sea la mejor, mas bien creo que es la mas barata :D

Salud OS
  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 marzo 2010 - 11:27

Pues mientras a ti no te atraigan los hombres :p :D :D :D

Con seguridad digo que ¡NOOOOO!
Sino ya me hubieran metido en la encuesta :D :D :D
Jajaja

Bueno, yo no digo que mi solución sea la mejor, mas bien creo que es la mas barata :D

Salud OS

Escusas, escusas...
Jaja
No es broma. Reconozco que tu solución es muy del estilo KISS y ese principio debería ser la regla.

Pues yo me digo que si hilamos muy fino sobre todo lo que necesita (y podría necesitar Fernando) seguramente habrá que poner las cartas en la mesa y discutir las alternativas.
Si éstas pueden pasar hacia el lado del motor de la base de datos, mejor. Y para algunas cosas en la que éste no ofrece las mejores herramientas, optar por algo más cercano a nivel aplicativo.

A me gustaría tener una descripción más precisa y profunda del diseño de las tablas y sus funciones (sabrán que suelo insistir en ocasiones sobre este punto). Creo que soy capaz de darle un nuevo giro a la estructuras de las tablas (tengo esa extraña sensación de que por allí se puede mejorar y rediseñar algo)

Saludos,
  • 0

#24 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 marzo 2010 - 11:35

Pues yo me digo que si hilamos muy fino sobre todo lo que necesita (y podría necesitar Fernando) seguramente habrá que poner las cartas en la mesa y discutir las alternativas.
Si éstas pueden pasar hacia el lado del motor de la base de datos, mejor. Y para algunas cosas en la que éste no ofrece las mejores herramientas, optar por algo más cercano a nivel aplicativo.

A me gustaría tener una descripción más precisa y profunda del diseño de las tablas y sus funciones (sabrán que suelo insistir en ocasiones sobre este punto). Creo que soy capaz de darle un nuevo giro a la estructuras de las tablas (tengo esa extraña sensación de que por allí se puede mejorar y rediseñar algo)

Saludos,


En eso estoy totalmente de acuerdo, toda solución es sensible a mejorarse y la idea de que se haga en el motor de la base de datos a través de un SP me parece excelente, la cuestión es que era importante aterrizar la necesidad de nuestro amigo Fernando.

Ahora que ya sabemos exactamente que es lo que se requiere, bien se puede hacer desde otro punto de vista.

Hasta me está gustando como reto :)

Salud OS
  • 0

#25 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2010 - 12:03

Bueno

Lo que hice en delphi lo he transportado a un SP.

A ver si podemos hacer un solo SP con todo lo que nuestro amigo Fernando requiere.



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE NEW_PROCEDURE (
  4.     id_emp INTEGER,
  5.     fechaini DATE,
  6.     fechafin DATE)
  7. AS
  8. DECLARE variable fecha DATE;
  9.  
  10. BEGIN
  11.   /* Procedure Text */
  12.   fecha = fechaini;
  13.  
  14.   while (fecha <= fechafin) do
  15.   BEGIN
  16.     INSERT INTO asistencia (emp_id,ast_fecha) VALUES (:id_emp,:fecha);
  17.     fecha = fecha + 1;
  18.   END
  19.  
  20.   suspend;
  21. END^
  22.  
  23. SET TERM ; ^
  24.  
  25. GRANT INSERT ON ASISTENCIA TO PROCEDURE NEW_PROCEDURE;
  26.  
  27. GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;



Salud OS
  • 0

#26 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2010 - 08:44

Segunda Parte y creo que con eso tenemos la idea de lo que vamos a diseñar, en este caso solo estoy agregando las fechas de un empleado dado dentro de un rango de fechas.



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE NEW_PROCEDURE (
  4.     id_emp INTEGER,
  5.     fechaini DATE,
  6.     fechafin DATE)
  7. AS
  8. DECLARE variable fecha DATE;
  9. BEGIN
  10.   /* Procedure Text */
  11.   fecha = fechaini;
  12.   while (fecha <= fechafin) do
  13.   BEGIN
  14.     INSERT INTO asistencia (emp_id,,ast_fecha,ast_ent,ast_sal) VALUES (:id_emp, :fecha,
  15.       (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1),
  16.       (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1));
  17.     fecha = fecha + 1;
  18.   END
  19.   suspend;
  20. END^
  21.  
  22. SET TERM ; ^
  23.  
  24. GRANT SELECT,INSERT ON ASISTENCIA TO PROCEDURE NEW_PROCEDURE;
  25.  
  26. GRANT SELECT ON LOG_ASISTENCIA TO PROCEDURE NEW_PROCEDURE;
  27.  
  28. GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;



Salud OS
  • 0

#27 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 marzo 2010 - 08:59

Ah vaya, vaya sorpresa me he encontrado, me gusta la idea de que sea a través de un SP, el caso es que no lo domino mucho y estoy corto de tiempo, Eliseo, ¿ese último SP rellena todas las fechas y también las entradas y salidas existentes?.
  • 0

#28 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2010 - 09:02

Ah vaya, vaya sorpresa me he encontrado, me gusta la idea de que sea a través de un SP, el caso es que no lo domino mucho y estoy corto de tiempo, Eliseo, ¿ese último SP rellena todas las fechas y también las entradas y salidas existentes?.


Asi es, solo estoy viendo como hacer el barrido por empleado, en mi ejemplo te pide el ID del empleado, pero habrá que optimizarlo.

Salud OS
  • 0

#29 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 14 marzo 2010 - 09:17

Saludos.

Reitero es mejor realizar el calendario completo y simplemente "marcar" cuando el empleado asistió.

Claro entiendo que esto quizás podría implicar un cambio de estructura pero creo que es lo más optimo así solo se pasa el IdEmpleado para indicar cuando asistió.
  • 0

#30 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2010 - 11:38

Saludos.

Reitero es mejor realizar el calendario completo y simplemente "marcar" cuando el empleado asistió.

Claro entiendo que esto quizás podría implicar un cambio de estructura pero creo que es lo más optimo así solo se pasa el IdEmpleado para indicar cuando asistió.


Eso es lo que estamos haciendo en el último SP amigo Rolphy, llenar el calendario y al mismo tiempo asignar las asistencias.

Salud OS
  • 0

#31 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2010 - 07:15

Hola

La Tercera Parte de este SP ya incluye la asignación de la causa por la que el empleado no fué a trabajar.



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE NEW_PROCEDURE (
  4.     id_emp INTEGER,
  5.     fechaini DATE,
  6.     fechafin DATE)
  7. AS
  8. DECLARE variable fecha DATE;
  9. DECLARE variable horaent TIME;
  10. DECLARE variable horasal TIME;
  11. BEGIN
  12.   /* Procedure Text */
  13.   fecha = fechaini;
  14.  
  15.   while (fecha <= fechafin) do
  16.   BEGIN
  17.     INSERT INTO asistencia (emp_id,ast_fecha,ast_ent,ast_sal,ca_id) VALUES (:id_emp,:fecha,
  18.     (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1),
  19.     (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1),
  20.  
  21.     CASE
  22.       WHEN ( (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1) IS NULL ) AND
  23.             ( (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1) IS NULL) THEN
  24.  
  25.               CASE
  26.                 WHEN ( (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 5
  27.                 ELSE (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta)
  28.               END
  29.  
  30.       WHEN ( NOT (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1) IS NULL ) AND
  31.             ( (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1) IS NULL) THEN
  32.  
  33.               CASE
  34.                 WHEN ( (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 6
  35.                 ELSE (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta)
  36.               END
  37.  
  38.       WHEN ( NOT (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1) IS NULL ) AND
  39.             ( NOT (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1) IS NULL) THEN NULL
  40.     END
  41.     );
  42.  
  43.     fecha = fecha + 1;
  44.   END
  45.   suspend;
  46. END^
  47.  
  48. SET TERM ; ^
  49.  
  50. GRANT INSERT ON ASISTENCIA TO PROCEDURE NEW_PROCEDURE;
  51.  
  52. GRANT SELECT ON LOG_ASISTENCIA TO PROCEDURE NEW_PROCEDURE;
  53.  
  54. GRANT SELECT ON LOG_CAUSAS TO PROCEDURE NEW_PROCEDURE;
  55.  
  56. GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;



Salud OS
  • 0

#32 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2010 - 07:45

Y lo mandas llamar desde delphi de esta manera



delphi
  1. begin
  2.   IBQuery1.Open;
  3.   while not IBQuery1.Eof do
  4.   begin
  5.     IBStoredProc1.ParamByName('ID_EMP').AsInteger :=  IBQuery1.FieldByName('EMP_ID').Value;
  6.     IBStoredProc1.ParamByName('FECHAINI').AsDate  :=  DateTimePicker1.Date;
  7.     IBStoredProc1.ParamByName('FECHAFIN').AsDate  :=  DateTimePicker2.Date;
  8.     IBStoredProc1.ExecProc;
  9.     IBQuery1.Next;
  10.   end;
  11.   IBTransaction1.Commit;
  12. end;



Yo uso IBX, no se si Zeos tenga eso.

Salud OS
  • 0

#33 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 marzo 2010 - 08:35

Gracias bro, eso sí que ha funconado de perlas (y)
  • 0




IP.Board spam blocked by CleanTalk.