[RESUELTO] Insertar todas las fechas dentro de un Rango de fechas
#21
Escrito 13 marzo 2010 - 11:08
Se que soy bello, sexy y las mujeres me consideran un sex symbol ... vaya... ahora resulta que hasta a los hombres atraigo
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 .
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,
#22
Escrito 13 marzo 2010 - 11:12
¿Guapo? ¿Alguien me llamó?
Se que soy bello, sexy y las mujeres me consideran un sex symbol ... vaya... ahora resulta que hasta a los hombres atraigo
Pues mientras a ti no te atraigan los hombres
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 .
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
Salud OS
#23
Escrito 13 marzo 2010 - 11:27
Con seguridad digo que ¡NOOOOO!Pues mientras a ti no te atraigan los hombres
Sino ya me hubieran metido en la encuesta
Jajaja
Escusas, escusas...Bueno, yo no digo que mi solución sea la mejor, mas bien creo que es la mas barata
Salud OS
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,
#24
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
#25
Escrito 14 marzo 2010 - 12:03
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.
SET TERM ^ ; CREATE OR ALTER PROCEDURE NEW_PROCEDURE ( id_emp INTEGER, fechaini DATE, fechafin DATE) AS DECLARE variable fecha DATE; BEGIN /* Procedure Text */ fecha = fechaini; while (fecha <= fechafin) do BEGIN INSERT INTO asistencia (emp_id,ast_fecha) VALUES (:id_emp,:fecha); fecha = fecha + 1; END suspend; END^ SET TERM ; ^ GRANT INSERT ON ASISTENCIA TO PROCEDURE NEW_PROCEDURE; GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;
Salud OS
#26
Escrito 14 marzo 2010 - 08:44
SET TERM ^ ; CREATE OR ALTER PROCEDURE NEW_PROCEDURE ( id_emp INTEGER, fechaini DATE, fechafin DATE) AS DECLARE variable fecha DATE; BEGIN /* Procedure Text */ fecha = fechaini; while (fecha <= fechafin) do BEGIN INSERT INTO asistencia (emp_id,,ast_fecha,ast_ent,ast_sal) VALUES (:id_emp, :fecha, (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1), (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1)); fecha = fecha + 1; END suspend; END^ SET TERM ; ^ GRANT SELECT,INSERT ON ASISTENCIA TO PROCEDURE NEW_PROCEDURE; GRANT SELECT ON LOG_ASISTENCIA TO PROCEDURE NEW_PROCEDURE; GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;
Salud OS
#27
Escrito 14 marzo 2010 - 08:59
#28
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
#29
Escrito 14 marzo 2010 - 09:17
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ó.
#30
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
#31
Escrito 14 marzo 2010 - 07:15
La Tercera Parte de este SP ya incluye la asignación de la causa por la que el empleado no fué a trabajar.
SET TERM ^ ; CREATE OR ALTER PROCEDURE NEW_PROCEDURE ( id_emp INTEGER, fechaini DATE, fechafin DATE) AS DECLARE variable fecha DATE; DECLARE variable horaent TIME; DECLARE variable horasal TIME; BEGIN /* Procedure Text */ fecha = fechaini; while (fecha <= fechafin) do BEGIN INSERT INTO asistencia (emp_id,ast_fecha,ast_ent,ast_sal,ca_id) VALUES (:id_emp,:fecha, (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1), (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1), CASE WHEN ( (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1) IS NULL ) AND ( (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1) IS NULL) THEN CASE WHEN ( (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 5 ELSE (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) END WHEN ( NOT (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1) IS NULL ) AND ( (SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS > 1) IS NULL) THEN CASE WHEN ( (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 6 ELSE (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) END WHEN ( NOT (SELECT LOG_TIME FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA AND LOG_STATUS = 1) IS NULL ) AND ( 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 END ); fecha = fecha + 1; END suspend; END^ SET TERM ; ^ GRANT INSERT ON ASISTENCIA TO PROCEDURE NEW_PROCEDURE; GRANT SELECT ON LOG_ASISTENCIA TO PROCEDURE NEW_PROCEDURE; GRANT SELECT ON LOG_CAUSAS TO PROCEDURE NEW_PROCEDURE; GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;
Salud OS
#32
Escrito 14 marzo 2010 - 07:45
begin IBQuery1.Open; while not IBQuery1.Eof do begin IBStoredProc1.ParamByName('ID_EMP').AsInteger := IBQuery1.FieldByName('EMP_ID').Value; IBStoredProc1.ParamByName('FECHAINI').AsDate := DateTimePicker1.Date; IBStoredProc1.ParamByName('FECHAFIN').AsDate := DateTimePicker2.Date; IBStoredProc1.ExecProc; IBQuery1.Next; end; IBTransaction1.Commit; end;
Yo uso IBX, no se si Zeos tenga eso.
Salud OS
#33
Escrito 14 marzo 2010 - 08:35