Jump to content
igoroliveira

Script - saldo de férias

Recommended Posts

Em 12/02/2019 at 12:52, Rafaeltluiz disse:

Boa tarde!

Meu  sistema RM Labore tem um relatório pronto..

Bom dia complementando o comentário do Jair. Se foi relatório desenvolvido, poderia disponibilizar para nós? (claro, removendo o cabeçalho e outros detalhes)

Share this post


Link to post
Share on other sites

Boa tarde!

Em relação ao saldo de férias...

Segue view...

 

USE CORPORERM

GO

 

CREATE VIEW VW_FOP_SALDO_FERIAS

AS

WITH TAB_1

AS

(

        SELECT

                ROW_NUMBER() OVER (PARTITION BY F.CODCOLIGADA, F.CHAPA  ORDER BY F.CODCOLIGADA, F.CHAPA  ) AS SEQ

            ,F.CODCOLIGADA

               ,F.CHAPA

               ,F.NOME

               ,FF.INICIOPERAQUIS

               ,FF.FIMPERAQUIS

               ,((DATEDIFF(DD, INICIOPERAQUIS, CASE WHEN FIMPERAQUIS >= GETDATE() THEN GETDATE() ELSE FIMPERAQUIS END )/30 )* 2.5) - ISNULL( FFF.DD, 0) AS 'DD'

               ,DATEADD(YY,1, DATEADD(YY, DATEDIFF(YY, 0, GETDATE()) + 1, -1)) AS FIM

               ,F.CODSITUACAO

               ,F.CODTIPO

               ,F.CODSECAO

               ,F.CODFUNCAO 

        FROM DBO.PFUNC F (NOLOCK)

        JOIN DBO.PFUFERIAS FF (NOLOCK) ON (F.CODCOLIGADA=FF.CODCOLIGADA AND F.CHAPA=FF.CHAPA AND PERIODOABERTO = 1 )

        CROSS APPLY

        (

               SELECT SUM(ISNULL(NRODIASABONO,0)) + SUM(ISNULL(NRODIASFERIAS,0)) AS DD

                FROM PFUFERIASPER  (NOLOCK)

               WHERE CODCOLIGADA = F.CODCOLIGADA

                 AND CHAPA = F.CHAPA

                 AND FIMPERAQUIS = FF.FIMPERAQUIS

       

        ) FFF

        WHERE F.CODSITUACAO <> 'D'

          AND F.CODTIPO <>'D'

)

, TAB_2

AS

(

        SELECT

                SEQ

               ,CODCOLIGADA

               ,CHAPA

               ,NOME

               ,INICIOPERAQUIS

               ,FIMPERAQUIS

               ,FIM

        FROM TAB_1 T

       

        UNION ALL

       

        SELECT

                SEQ + 1

               ,CODCOLIGADA

               ,CHAPA

               ,NOME

               ,DATEADD(YY , 1 , INICIOPERAQUIS) AS 'INICIOPERAQUIS'

               ,DATEADD(YY , 1 , FIMPERAQUIS) AS 'FIMPERAQUIS'

               ,FIM

        FROM TAB_2

        WHERE DATEPART(YY,FIMPERAQUIS) < DATEPART(YY,FIM)

)

, TAB_3

AS

(

        SELECT

                SEQ

               ,CODCOLIGADA

               ,CHAPA

               ,NOME

               ,INICIOPERAQUIS

               ,FIMPERAQUIS

               ,FIM

               ,DD

            ,(DATEDIFF(DD, INICIOPERAQUIS, CASE WHEN FIMPERAQUIS >= GETDATE() THEN GETDATE() ELSE FIMPERAQUIS END )/ 30 ) * 2.5 AS 'DDD'

               ,CASE WHEN FIMPERAQUIS <= GETDATE() THEN 1 ELSE 0 END AS 'VENCIDO'

        FROM TAB_2 T

        OUTER APPLY

        (

               SELECT DD

              FROM TAB_1

                WHERE CODCOLIGADA=T.CODCOLIGADA

                  AND SEQ=T.SEQ

                  AND CHAPA=T.CHAPA

    ) D

)

, DADOS_FINAL

AS

(

SELECT

         T.SEQ

        ,T.CODCOLIGADA

        ,T.CHAPA

        ,T.NOME

        ,T.INICIOPERAQUIS

        ,T.FIMPERAQUIS

        ,CASE WHEN T.SEQ = 1 THEN T.DD ELSE T.DDD END AS 'DD'

        ,T.VENCIDO

        ,F.CODSECAO

        ,F.CODFUNCAO

        ,CASE WHEN T.SEQ = 1 THEN 1 ELSE 0 END AS 'NRO'

FROM TAB_3 T

CROSS APPLY

(

  SELECT CODSECAO, CODFUNCAO

   FROM TAB_1

  WHERE CODCOLIGADA = T.CODCOLIGADA

        AND CHAPA = T.CHAPA

) F

WHERE CASE WHEN T.SEQ = 1 THEN T.DD ELSE T.DDD END > 0

)

SELECT

         D.SEQ

        ,D.CODCOLIGADA

        ,D.CHAPA

        ,D.NOME

        ,D.INICIOPERAQUIS

        ,D.FIMPERAQUIS

        ,D.DD

        ,D.VENCIDO

        ,D.CODSECAO

        ,D.CODFUNCAO

        ,D.NRO

FROM DADOS_FINAL D

 

Para utilizar execute esse seguinte code...

USE CORPORERM

GO

 

SELECT *

FROM DBO.VW_FOP_SALDO_FERIAS (NOLOCK)

WHERE CODCOLIGADA = 1

AND CHAPA = 'CHAPA PARA TESTE'

Resultado...

Boa tarde!

Em relação ao saldo de férias...

Segue view...

 

USE CORPORERM

GO

 

CREATE VIEW VW_FOP_SALDO_FERIAS

AS

WITH TAB_1

AS

(

        SELECT

                ROW_NUMBER() OVER (PARTITION BY F.CODCOLIGADA, F.CHAPA  ORDER BY F.CODCOLIGADA, F.CHAPA  ) AS SEQ

            ,F.CODCOLIGADA

               ,F.CHAPA

               ,F.NOME

               ,FF.INICIOPERAQUIS

               ,FF.FIMPERAQUIS

               ,((DATEDIFF(DD, INICIOPERAQUIS, CASE WHEN FIMPERAQUIS >= GETDATE() THEN GETDATE() ELSE FIMPERAQUIS END )/30 )* 2.5) - ISNULL( FFF.DD, 0) AS 'DD'

               ,DATEADD(YY,1, DATEADD(YY, DATEDIFF(YY, 0, GETDATE()) + 1, -1)) AS FIM

               ,F.CODSITUACAO

               ,F.CODTIPO

               ,F.CODSECAO

               ,F.CODFUNCAO 

        FROM DBO.PFUNC F (NOLOCK)

        JOIN DBO.PFUFERIAS FF (NOLOCK) ON (F.CODCOLIGADA=FF.CODCOLIGADA AND F.CHAPA=FF.CHAPA AND PERIODOABERTO = 1 )

        CROSS APPLY

        (

               SELECT SUM(ISNULL(NRODIASABONO,0)) + SUM(ISNULL(NRODIASFERIAS,0)) AS DD

                FROM PFUFERIASPER  (NOLOCK)

               WHERE CODCOLIGADA = F.CODCOLIGADA

                 AND CHAPA = F.CHAPA

                 AND FIMPERAQUIS = FF.FIMPERAQUIS

       

        ) FFF

        WHERE F.CODSITUACAO <> 'D'

          AND F.CODTIPO <>'D'

)

, TAB_2

AS

(

        SELECT

                SEQ

               ,CODCOLIGADA

               ,CHAPA

               ,NOME

               ,INICIOPERAQUIS

               ,FIMPERAQUIS

               ,FIM

        FROM TAB_1 T

       

        UNION ALL

       

        SELECT

                SEQ + 1

               ,CODCOLIGADA

               ,CHAPA

               ,NOME

               ,DATEADD(YY , 1 , INICIOPERAQUIS) AS 'INICIOPERAQUIS'

               ,DATEADD(YY , 1 , FIMPERAQUIS) AS 'FIMPERAQUIS'

               ,FIM

        FROM TAB_2

        WHERE DATEPART(YY,FIMPERAQUIS) < DATEPART(YY,FIM)

)

, TAB_3

AS

(

        SELECT

                SEQ

               ,CODCOLIGADA

               ,CHAPA

               ,NOME

               ,INICIOPERAQUIS

               ,FIMPERAQUIS

               ,FIM

               ,DD

            ,(DATEDIFF(DD, INICIOPERAQUIS, CASE WHEN FIMPERAQUIS >= GETDATE() THEN GETDATE() ELSE FIMPERAQUIS END )/ 30 ) * 2.5 AS 'DDD'

               ,CASE WHEN FIMPERAQUIS <= GETDATE() THEN 1 ELSE 0 END AS 'VENCIDO'

        FROM TAB_2 T

        OUTER APPLY

        (

               SELECT DD

              FROM TAB_1

                WHERE CODCOLIGADA=T.CODCOLIGADA

                  AND SEQ=T.SEQ

                  AND CHAPA=T.CHAPA

    ) D

)

, DADOS_FINAL

AS

(

SELECT

         T.SEQ

        ,T.CODCOLIGADA

        ,T.CHAPA

        ,T.NOME

        ,T.INICIOPERAQUIS

        ,T.FIMPERAQUIS

        ,CASE WHEN T.SEQ = 1 THEN T.DD ELSE T.DDD END AS 'DD'

        ,T.VENCIDO

        ,F.CODSECAO

        ,F.CODFUNCAO

        ,CASE WHEN T.SEQ = 1 THEN 1 ELSE 0 END AS 'NRO'

FROM TAB_3 T

CROSS APPLY

(

  SELECT CODSECAO, CODFUNCAO

   FROM TAB_1

  WHERE CODCOLIGADA = T.CODCOLIGADA

        AND CHAPA = T.CHAPA

) F

WHERE CASE WHEN T.SEQ = 1 THEN T.DD ELSE T.DDD END > 0

)

SELECT

         D.SEQ

        ,D.CODCOLIGADA

        ,D.CHAPA

        ,D.NOME

        ,D.INICIOPERAQUIS

        ,D.FIMPERAQUIS

        ,D.DD

        ,D.VENCIDO

        ,D.CODSECAO

        ,D.CODFUNCAO

        ,D.NRO

FROM DADOS_FINAL D

 

Para utilizar execute esse seguinte code...

USE CORPORERM

GO

 

SELECT *

FROM DBO.VW_FOP_SALDO_FERIAS (NOLOCK)

WHERE CODCOLIGADA = 1

AND CHAPA = 'CHAPA PARA TESTE'

Resultado...

 

A coluna [DD] apresenta a quantidade de dias, conforme vide avos de férias que não estão computadas na DBO.PFUFERIAS...

Agora em relação as faltas, terias como me explicar a regra ? 

 

Obs.: Caso não queiras criar a view, podes utilizar diretamente a query, porém terás que incluir o ";" no inicio da instrução WITH... essa query é uma CTE e tem uma recursividade... pode der um problema no volume de laços de iterações, se tiver esse erro é só avisar!

 

Espero lhe ajudar nessa questão.

 

Abraços.

 

 

A coluna [DD] apresenta a quantidade de dias, conforme vide avos de férias que não estão computadas na DBO.PFUFERIAS...

Agora em relação as faltas, terias como me explicar a regra ? 

 

Obs.: Caso não queiras criar a view, podes utilizar diretamente a query, porém terás que incluir o ";" no inicio da instrução WITH... essa query é uma CTE e tem uma recursividade... pode der um problema no volume de laços de iterações, se tiver esse erro é só avisar!

 

Espero lhe ajudar nessa questão.

 

Abraços.

 

  • Like 1

Share this post


Link to post
Share on other sites

@guiesmeril, boa tarde!

 

Um amigo, leu o post e me encaminhou uma tabela que mostra a relação de dias faltas que deduzem das férias... pois bem, verifiquei como a rotina do código de calculo 38 efetua a conversão de Horas para dias... e sendo assim é possível efetuar esse cálculo via T-SQL de forma correta para resgatar essa conversão dentro desse período, mas é importante salientar que a query terá um alto custo para processa-la... basicamente, teremos que selecionar o período entre Inicio e fim, verificar os eventos, verificar histórico de jornadas e efetuar o cálculo... 

Diante desses questões relatadas acima, ainda queres saber dessa informação...

Fico no seu aguardo, abraços.

Share this post


Link to post
Share on other sites

Luis, View eu não consigo criar por conta que não tenho permissão de criação de view, acredito que a query seria a melhor opção para atender minha necessidade.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.