6 Replies Latest reply on Sep 16, 2019 11:08 PM by L. Fernigrini

    manero horas x dias

    Isaias2019

      Tengo varios usuarios que trabajan horas extras y estas se acumulan por meses, por ejemplo el usuario X tiene en enero 3 horas extras, en febrero 3, marzo 3, abril 4 etc.

      por asunto de presupuesto estas horas no se pagan sino que se toman como tiempo a compensar.

       

      el usuario X quiere un día a compensar por medio de las extras serian 8 horas x día. según reglamento.

       

      Entonces seria las 3 de enero + las 3 de febrero  + 2 de marzo, como haría para rebajarlas por medio de un proceso que vaya restando por meses hasta completar las horas y me deje los totales en 0. según vaya tomando los días.

       

      Estoy haciendo un programa para controlar esto y otras cosas , pero soy nuevo en esto de apex. programando en Apex 4.2 con oracle 11.

       

      E visto literatura y googleado pero no le llego.

       

      alguna sugerencia o donde buscar.

        • 1. Re: manero horas x dias
          L. Fernigrini

          Hola, independientemente de APEX, que es la herramienta con la que diseñas tu sitio, la logica la vas a implementar en SQL o PL/SQL

           

          Sería importante que compartas que version de Oracle utilizas, el modelo de datos (la tabla donde se encuentra la información de las horas extras mes a mes) y algo de informacion de ejemplo.

           

          Con eso es posible ayudarte, pero sin saber la estructura de las tablas involucradas es imposible.

          • 2. Re: manero horas x dias
            Isaias2019

            La base datos es 11c.

             

            la tabla es la siguiente con datos:

             

                       

            ID_CONSEID_DEPACOD_EMPLEADOID_USUARIOMES_EXTRASFECHA_EXTRASCANTIDAD_EXTRASCREADO_PORFEC_CREADOMODIFICADO_PORFEC_MODIFICADO
            23103451678980ENERO12/1/20183ESA14/1/2018
            78103451678980FEBRERO12/2/20184ESA
            109103451678980MARZO12/3/20185ESA
            143103451678980ABRIL12/4/20181ESA
            178103451678980MAYO12/5/20183ESA
            210103451678980JUNIO12/6/20184ESA

             

            Solo del empleado 1678980 .

            • 3. Re: manero horas x dias
              L. Fernigrini

              Con esta consulta es posible saber los días y horas disponibles:

               

              WITH vData AS

              (

              SELECT 345 AS COD_EMPLEADO, DATE '2018-01-12' AS Fecha_Extras, 3 AS Cantidad_Extras FROM DUAL

              UNION ALL

              SELECT 345 AS COD_EMPLEADO, DATE '2018-02-12' AS Fecha_Extras, 4 AS Cantidad_Extras FROM DUAL

              UNION ALL

              SELECT 345 AS COD_EMPLEADO, DATE '2018-03-12' AS Fecha_Extras, 5 AS Cantidad_Extras FROM DUAL

              UNION ALL

              SELECT 345 AS COD_EMPLEADO, DATE '2018-04-12' AS Fecha_Extras, 1 AS Cantidad_Extras FROM DUAL

              UNION ALL

              SELECT 345 AS COD_EMPLEADO, DATE '2018-05-12' AS Fecha_Extras, 3 AS Cantidad_Extras FROM DUAL

              UNION ALL

              SELECT 345 AS COD_EMPLEADO, DATE '2018-06-12' AS Fecha_Extras, 4 AS Cantidad_Extras FROM DUAL

              )

              SELECT COD_EMPLEADO, Fecha_Extras, Cantidad_Extras,

                  SUM (Cantidad_Extras) OVER (partition by COD_EMPLEADO order by Fecha_Extras) AS Horas_Acumuladas,

                  TRUNC(SUM (Cantidad_Extras) OVER (partition by COD_EMPLEADO order by Fecha_Extras) / 8) AS Dias_Disponibles,

                  MOD(SUM (Cantidad_Extras) OVER (partition by COD_EMPLEADO order by Fecha_Extras),8) AS Horas_Sobrantes

              FROM vData

              ORDER BY COD_EMPLEADO, Fecha_Extras;

              Para consumir las horas sobrantes creo que es necesario un procedimiento, voy a necesitar algo de tiempo para hacerlo pero no es demasiado complicado. Es importante saber si el proceso tiene que descontar sólo de a un día o si puede querer hacerlo de a mas de uno (por ejemplo, si puede pedir 2 días, y que hacer en caso que no alcance para los dos días pero si para uno, etc...)

              • 4. Re: manero horas x dias
                L. Fernigrini

                Aca hay un ejemplo de como hacer lo que necesitas

                 

                La primer parte podes ignorarla, solo crea una tabla para poder probar en mi entorno con datos similares a los tuyos:

                 

                CREATE TABLE MiTabla AS

                (

                SELECT 345 AS COD_EMPLEADO, DATE '2018-01-12' AS Fecha_Extras, 3 AS Cantidad_Extras FROM DUAL

                UNION ALL

                SELECT 345 AS COD_EMPLEADO, DATE '2018-02-12' AS Fecha_Extras, 4 AS Cantidad_Extras FROM DUAL

                UNION ALL

                SELECT 345 AS COD_EMPLEADO, DATE '2018-03-12' AS Fecha_Extras, 5 AS Cantidad_Extras FROM DUAL

                UNION ALL

                SELECT 345 AS COD_EMPLEADO, DATE '2018-04-12' AS Fecha_Extras, 1 AS Cantidad_Extras FROM DUAL

                UNION ALL

                SELECT 345 AS COD_EMPLEADO, DATE '2018-05-12' AS Fecha_Extras, 3 AS Cantidad_Extras FROM DUAL

                UNION ALL

                SELECT 345 AS COD_EMPLEADO, DATE '2018-06-12' AS Fecha_Extras, 4 AS Cantidad_Extras FROM DUAL

                );

                 

                 

                Este es el procedimiento que tiene la lógica necesaria para hacer el calculo (tenes que reemplazar MiTabla por el nombre real de la tabla):

                 

                 

                CREATE OR REPLACE PROCEDURE pr_DescontarDias

                (

                    p_COD_EMPLEADO      NUMBER,

                    p_HorasADescontar   IN OUT NUMBER

                )

                AS

                    --

                    v_HorasADescontar NUMBER;

                    --

                BEGIN

                    --

                    v_HorasADescontar := p_HorasADescontar;

                    --

                    FOR cDatos IN (SELECT * FROM MiTabla

                                   WHERE COD_EMPLEADO = p_COD_EMPLEADO

                                     AND Cantidad_Extras > 0

                                   ORDER BY Fecha_Extras)

                    LOOP

                        IF cDatos.Cantidad_Extras >  p_HorasADescontar THEN

                            --

                            UPDATE MiTabla

                            SET Cantidad_Extras = (Cantidad_Extras - p_HorasADescontar)

                            WHERE COD_EMPLEADO = cDatos.COD_EMPLEADO

                              AND Fecha_Extras = cDatos.Fecha_Extras;

                            --

                            p_HorasADescontar := 0;

                            --

                        ELSE

                            --

                            UPDATE MiTabla

                            SET Cantidad_Extras = 0

                            WHERE COD_EMPLEADO = cDatos.COD_EMPLEADO

                              AND Fecha_Extras = cDatos.Fecha_Extras;

                            --

                            p_HorasADescontar := p_HorasADescontar - cDatos.Cantidad_Extras;

                            --

                        END IF;

                        --

                        IF p_HorasADescontar = 0 THEN

                            EXIT;

                        END IF;

                        --

                    END LOOP;

                    --   

                    IF p_HorasADescontar > 0 THEN

                        ROLLBACK;

                        p_HorasADescontar := v_HorasADescontar;

                    END IF;

                    --

                END pr_DescontarDias;

                 

                El procedimiento recibe el Codigo del usuario al que le queremos descontar horas, y la cantidad de horas a descontar como unidad (es decir, descuenta esas horas o no descuenta nada. Eso te permite descontar 1, 2 o N dias pasando 8, 16 o cualquier valor deseado) El procedimiento informa cuantas horas quedaron pendientes de descontar en el mismo parametro (0 si descontó todo o el valor que se pasó inicialmente si no pudo descontar).

                 

                Acá hay tres ejemplos de la ejecución. En el primero, pedimos descontar 28 Horas (el usuario tiene solo 20) por lo que no debe descontar nada:

                 

                DECLARE

                    vHoras  NUMBER := 28;

                BEGIN

                    pr_DescontarDias (345, vHoras);

                    dbms_output.put_line ('Horas Pendientes: ' || TO_CHAR(vHoras) );

                    --

                END;

                /

                SELECT * FROM MiTabla;

                 

                Como veras, devuelve que quedaron las 28 horas pendientes y los datos no fueron modificados:

                 

                 

                A continuación, probamos con 8 horas:

                 

                 

                No quedaron horas pendientes y descontó 8 horas de la tabla, en orden.

                 

                Repetimos la prueba:

                 

                 

                No quedaron horas pendientes, y desconto otras 8 horas.

                 

                Volvermos a repetir:

                 

                 

                Y esta vez dice que quedan 8 pendientes, ya que no alcanza con las 4 que tenia el usuario, y vemos que los datos no se modificaron en la tabla.

                • 5. Re: manero horas x dias
                  Isaias2019

                  Mucha gracias a todos por responder.

                  • 6. Re: manero horas x dias
                    L. Fernigrini

                    De nada, si pudiste resolver el problema recordá que podes identificar la respuesta correcta y las útiles