Ver Mensaje Individual
  #4  
Antiguo 09-08-2014
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Reputación: 14
novato_erick Va por buen camino
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
       /*ESTE CICLO CREA 7 REGISTROS, ES UN REGISTRO DE POR CADA DIA DE LA SEMANA*/
       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
                   /* AQUI CONSULTAS LAS MARCACIONES DE UN EMPLEADO EN UNA SOLA FECHA */     
                        
                   IF (COLUMNA = 0) THEN
                   begin
                   ENTRADA0 = XFECHAHORA;
                   ENTRADA0ENTERO = EXTRACT(HOUR from ENTRADA0);
                   MINUTOENTRADA0 = EXTRACT(MINUTE FROM ENTRADA0);
                   end
                  /*AQUI CONOCEMOS EN VALOR ENTERO LA HORA DE ENTRADA Y MINUTOS */      
                   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='';  
             /*CALCULOS DE HORAS EN EL PROSEDIMIENTO*/
             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; 
                              
             /*DESCOMPONEMOS EL RESULTADO PARA SACAR LOS MINUTOS EN VALOR ENTERO Y DECIMALES*/
             TOTALMINUTOSENTEROS = TRUNC(TOTALMINUTOS, 0);
             RESULTADOTOTALMINUTOS = CAST(TOTALMINUTOS AS INTEGER) - TOTALMINUTOS;
            
             RESULTADOTOTALMINUTOS = RESULTADOTOTALMINUTOS * 60.00 /100;
             TOTALHORASMINUTOS = TOTALMINUTOSENTEROS + RESULTADOTOTALMINUTOS;
             /*OBTENEMOS EL RESULTADO DEl TOTAL DE HORAS EN EL D;*/
             TOTALHORAS = TOTALHORASMINUTOS + HORASORDINARIAS;
              SUSPEND;
              FECHA = INICIO + FILA;
              Fila = Fila + 1;
              
       END       
       /* Procedure body */
  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; 
                              
             /*DESCOMPONEMOS EL RESULTADO PARA SACAR LOS MINUTOS EN VALOR ENTERO Y DECIMALES*/
             TOTALMINUTOSENTEROS = TRUNC(TOTALMINUTOS, 0);
             RESULTADOTOTALMINUTOS = CAST(TOTALMINUTOS AS INTEGER) - TOTALMINUTOS;

            /*Seria esto mas o menos : mi total de TOTALMINUTOSORDINARIOS = 78 /60 = 1.30
Trato de sacar el TOTALMINUTOSENTEROS EL 1 para dejar el .30 PARA RESTAR EL TOTALMINUTOS = 1.30 y multiplicar por 60.00 dividiéndolo */
/*entre 100 ara obtener este valor: 0.18 pero me manda -18 claramente aquí afecta la REGLA DE LOS SIGNOS:*/

"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

Última edición por Casimiro Notevi fecha: 10-08-2014 a las 20:13:43.
Responder Con Cita