Hola Chicos hace un año coloqué este pos en la que mi intensión era extraer en una tabla llamada TMARCACIONES el total de horas laboradas en un día por colaborador en el que al final nunca terminé dicho procedimiento. Bueno como soy persona de no dejar las cosas a medio palo creo que insistiré en tratar de dejar este procedimiento para seguir el proyecto que tenia en mente para un programa de asistencia tomando referencias de multiples hilos en este mismo foro.
Al final espero poder lograr con su ayuda chicos el resultado esperado.
muestro a continuación lo que he estado haciendo hace un par de horas:
Código SQL
[-]
BEGIN
FOR
SELECT
TMARCACIONES.ID_EMPLEADOS
FROM
TMARCACIONES
WHERE
CAST(TMARCACIONES.HORA AS DATE) BETWEEN :INICIO AND :FINAL AND TMARCACIONES.ID_EMPLEADOS = :CODIGO
GROUP BY
TMARCACIONES.ID_EMPLEADOS
ORDER BY
TMARCACIONES.ID_EMPLEADOS
INTO
:ID_EMPLEADOS
DO
BEGIN
Fila=1;
FECHA = INICIO;
WHILE (Fila<>16) DO
BEGIN
NUM_DIA=FILA;
COLUMNA=0;
ENTRADA0=NULL;
SALIDA0=NULL;
ENTRADA1=NULL;
SALIDA1=NULL;
ENTRADA2=NULL;
SALIDA2=NULL;
ENTRADA0ENTERO=NULL;
SALIDA0ENTERO=NULL;
HORASORDINARIAS=0;
-->> HORASEXTRAS=NULL;
ALMUERZO0=NULL;
ALMUERZO0ENTRADA=NULL;
ALMUERZO0SALIDA=NULL;
ENTRADA1ENTERO=NULL;
SALIDA1ENTERO=NULL;
MINUTOENTRADA0 = NULL;
MINUTOSALIDA0 = NULL;
MINUTOENTRADA1 = NULL;
MINUTOSALIDA1 = NULL;
TOTALMINUTOSMANIANA = NULL;
TOTALMINUTOSTARDE = NULL;
TOTALMINUTOS =NULL;
TOTALHORASMINUTOS =NULL;
TOTALMINUTOSENTEROS = NULL;
RESULTADOTOTALMINUTOS =NULL;
TOTALHORASMINUTOS = NULL;
TOTALMINUTOS = NULL;
TOTALHORAS = NULL;
TOTALMINUTOSORDINARIO = NULL;
FOR
SELECT
M.HORA
FROM
TMARCACIONES M
WHERE
M.ID_EMPLEADOS = :ID_EMPLEADOS AND CAST(M.HORA AS DATE) = :FECHA
ORDER BY
m.HORA
INTO
:XFECHAHORA
DO
BEGIN
IF (COLUMNA = 0) THEN
begin
ENTRADA0 = XFECHAHORA;
ENTRADA0ENTERO = EXTRACT(HOUR from ENTRADA0);
MINUTOENTRADA0 = EXTRACT(MINUTE FROM ENTRADA0);
end
IF (COLUMNA = 1) THEN
begin
SALIDA0 = XFECHAHORA;
SALIDA0ENTERO = EXTRACT(HOUR from SALIDA0);
MINUTOSALIDA0 =EXTRACT(MINUTE FROM SALIDA0);
ALMUERZO0SALIDA = SALIDA0ENTERO;
end
IF (COLUMNA = 2) THEN
begin
ENTRADA1= XFECHAHORA;
ENTRADA1ENTERO = EXTRACT(HOUR FROM ENTRADA1);
ALMUERZO0ENTRADA = ENTRADA1ENTERO;
MINUTOENTRADA1 = EXTRACT(MINUTE FROM ENTRADA1);
end
IF (COLUMNA = 3) THEN
begin
SALIDA1 = XFECHAHORA;
SALIDA1ENTERO = EXTRACT(HOUR FROM SALIDA1);
MINUTOSALIDA1 = EXTRACT(MINUTE FROM SALIDA1);
end
IF (COLUMNA = 4) THEN
ENTRADA2 = XFECHAHORA;
IF (COLUMNA = 5) THEN
SALIDA2 = XFECHAHORA;
COLUMNA = COLUMNA + 1;
END
IF (ENTRADA0 IS NULL) THEN FALTA = 'X'; ELSE FALTA='';
HORASMANIANA = SALIDA0ENTERO - ENTRADA0ENTERO;
ALMUERZO0 = ALMUERZO0ENTRADA - ALMUERZO0SALIDA;
HORASTARDE = SALIDA1ENTERO - ENTRADA1ENTERO;
HORASORDINARIAS = HORASMANIANA + HORASTARDE;
TOTALMINUTOSMANIANA = MINUTOENTRADA0 + MINUTOSALIDA0;
TOTALMINUTOSTARDE = MINUTOSALIDA1 + MINUTOSALIDA1;
TOTALMINUTOSORDINARIO = TOTALMINUTOSMANIANA + TOTALMINUTOSTARDE;
TOTALMINUTOS = CAST(TOTALMINUTOSORDINARIO AS DECIMAL(12,2)) /60.00;
TOTALMINUTOSENTEROS = TRUNC(TOTALMINUTOS, 0);
RESULTADOTOTALMINUTOS = CAST(TOTALMINUTOS AS INTEGER) - TOTALMINUTOS;
RESULTADOTOTALMINUTOS = RESULTADOTOTALMINUTOS * 60.00 /100;
TOTALHORASMINUTOS = TOTALMINUTOSENTEROS + RESULTADOTOTALMINUTOS;
TOTALHORAS = TOTALHORASMINUTOS + HORASORDINARIAS;
SUSPEND;
FECHA = INICIO + FILA;
Fila = Fila + 1;
END
END
END
al principio del post está la tabla que es utilizada con sus campos y las variables que he estado aumentando para realizar este prosedimiento.
en fin como me comentó nuestro amigo y gran colaborador casimiro:
Cita:
Creo que estaría más claro que nos dijeras los campos de la tabla, lo que tienen cada uno y lo que quieres hacer.
|
como en esta parte se me ocurrío fue utilizar la funcion EXTRACT(HOUR), EXTRACT(MINUTE), para tener valores en la cual al final podia utilizar dentro de las variables y realizar sumas y restas pertinente.
en fin creí que lo había logrado sin embargo me apareció esto:
Código SQL
[-]
TOTALMINUTOS = CAST(TOTALMINUTOSORDINARIO AS DECIMAL(12,2)) /60.00;
TOTALMINUTOSENTEROS = TRUNC(TOTALMINUTOS, 0);
RESULTADOTOTALMINUTOS = CAST(TOTALMINUTOS AS INTEGER) - TOTALMINUTOS;
"más por más = más"
"menos por menos = más"
"más por menos = menos"
"menos por más = menos"
en si eso me ocurre cuando mi TOTALMINUTOSORDINARIOS tiene menos de 99 pero si es más de 100 no ocurre el resultado es correcto/
Creo que dí a explicar...
Saludos