Jump to content
Sign in to follow this  
Jair - Fórmula

Script de função último dia útil mês

Jair - Fórmula

Veja que foi usado em uma parte no texto do script o VARCHAAAAR e não o nome correto, pois, há um bloqueio de segurança para evitar códigos maliciosos que façam ataques no fórum. Então, apenas enviando em arquivo, ou trocando essa palavra desta forma que fiz. Ao copiar e passar para seu ambiente, sempre deverá corrigir para o termo correto!!

Message added by Jair - Fórmula

Recommended Posts

Script com função para montagem de data com último dia útil do mês, considerando a tabela de feriados do RM, ou seja, se o último dia do mês cair em algum feriado cadastrado no RM, retorna o dia útil anterior.Para o caso de usar versão do SQL mais antiga, onde não existe a função EOMONTH(). É só comentar a linha em questão que usa essa função do SQL Server deixando a outra. Mantenha a que preferir usar... 
 

If OBJECT_ID (N'dbo.fnc_UltDiaUtilRM' ) is not null 
    Drop Function dbo.fnc_UltDiaUtilRM;  
Go
Create Function dbo.fnc_UltDiaUtilRM (@DataBase DateTime)
Returns Date 
as
Begin
    
    Declare @UltDia Date 
    Declare @CalendOficial Varchaaaar(10) 

    Set @CalendOficial = '0000001' -- Código do Calendário Oficial a ser usado do RM
    
    -- Usando a Função EOMONTH que funciona para o SQL 2012 em diante...
    Set @UltDia = EOMONTH(@DataBase) 
     
    -- Usando a Função DateAdd apenas para montar o último dia do mês, que funciona para o SQL 2008 e mais atuais...
    Set @UltDia = DATEADD(dd, -DAY(DATEADD(M, 1, @DataBase)), DATEADD(M, 1, @DataBase))
      
inicio:

    If  (    Select DiaFeriado 
            From GFeriado (nolock)
            Where DiaFeriado = @UltDia
                and CodCalendario = @CalendOficial ) is not null
    Begin
        
    Set @UltDia = DateAdd(d, -1, @UltDia)
        
    End
        
    if   
        (Select DatePart(dw, @UltDia)) in (1, 7) 
        or    
        (    Select DiaFeriado 
                From GFeriado (nolock)
                Where DiaFeriado = @UltDia
                    and CodCalendario = @CalendOficial ) is not null
    Begin
        Set @UltDia = DateAdd(d, -1, @UltDia)
        goto inicio
    End
    
    Return(@UltDia)
    
End
Go

-- Exemplo de utilização
Select dbo.fnc_UltDiaUtilRM (Getdate())


Exemplo de utilização
Select dbo.fnc_UltDiaUtilRM (Getdate())

 

**** Veja que foi usado em uma parte no texto acima o VARCHAAAAR e não o nome correto, pois, há um bloqueio de segurança para evitar códigos maliciosos que façam ataques no fórum. Então, apenas enviando em arquivo, ou trocando essa palavra desta forma que fiz. Ao copiar e passar para seu ambiente, sempre deverá corrigir para o termo correto!! 😀

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.

Sign in to follow this  

  • Similar Content

    • By Thiago Queiroz
      Boa tarde,
      Gostaria de uma ajuda com um relatório que estou montando,
      no relatório deve ter todos os fornecedores que a empresa DEVE porem não pode ter "puxa" os já pagos, cancelados e com cheque.
      montei um que a condição é flan.statuslan = '0' que vai puxar os resultados que não foram pagos, porem puxa os vencidos e com cheque, e nao acho nada nas tabelas que eu posssa por outra condição para diferenciar.
       
      SELECT FLAN.CODCOLIGADA,
             FLAN.CODCFO,
             FCFO.NOME,
             SUM(FLAN.VALORORIGINAL) AS [VALOR TOTAL]
      FROM FLAN
      INNER JOIN FCFO ON ( FLAN.CODCOLCFO = FCFO.CODCOLIGADA AND FLAN.CODCFO = FCFO.CODCFO )
      WHERE FLAN.PAGREC = '2' AND FLAN.STATUSLAN = '0'
      GROUP BY FLAN.CODCOLIGADA,FLAN.CODCFO,  FCFO.NOME
      ORDER BY FLAN.CODCOLIGADA, FCFO.NOME
    • By Fórum RM
      Quando solicita pra rodar relatórios no Gerador em versões a partir da 12.1.21 e não está instalado o client 11, basta instalar esse arquivo, de acordo com a versão do seu Windows.
      https://www.forumrm.com.br/files/file/387-client-sql-server-2012
       
    • By Jair - Fórmula
      Uma função que pode ser bem útil na hora de montar alguns relatórios, no MSSQL, é esta para tratar as datas e trazer sempre o último dia do mês. Ela recebe como parametro apenas o MES e o ANO.
      Por exemplo, pra montar a data com o início do mes, da PFFINANC, pode-se montar com o MESCOMP e ANOCOMP, adicionando '01' no início sempre... mas o final, o último dia, é variável.
      Estava falando com o Júnior ( grande colaborador aqui do Fórum ) e montei essa função, que você pode utilizar em qualquer sentença.
      -=-=-=-=-=-=-=-=-=-=-=-
      Create Function ZFimdoMes (@mes int, @ano int)
      Returns Datetime
      Begin
      ----------------------------------------------------------------------------------
      -- Função para gerar uma data com o último dia do mes,
      -- recebendo como parametros apenas o mes e ano.
      --
      -- Criada por Jair G. Silva - Fórmula Desenvolvimento (17/08/06)
      ----------------------------------------------------------------------------------
      Declare @FimdoMes Datetime
      Select @FimdoMes = DateAdd(Month,1,(cast((Cast(@Ano as varchar)
      + '/' + cast(@Mes as varchar) + '/' + '01' ) as Datetime)))-1
      Return (@FimdoMes)
      ---------------------------------------------------------------------------------
      -- Para usar a função, deve sempre chamar como no exemplo abaixo:
      -- Select dbo.ZFimdoMes(8,2006) ou Select dbo.ZFimdoMes( mescomp , anocomp )
      ---------------------------------------------------------------------------------
      End
      -=-=-=-=-=-=-=-=-=-=-=-
      Espero que possa lhe ajudar em suas próximas sentenças e montagens de relatórios.
      Abraços.
    • By Edivan
      Pessoal, preciso de um relatório (planilha) que gere o histórico de alterações (por data), de salário e função e quem fez a alteração.
      Tenho uma sentença que gera somente o histórico do salário atual e anterior. Precisaria incluir também a função (nome) anterior e a atual. Alguém poderia dar um help na sentença abaixo:
      SELECT 
      IDLOG, DTHORA, USUARIO, VALORANTIGO AS "VALOR ANTINGO",
      VALOR AS "VALOR ATUAL", TIPOSQL AS "TIPO ALTERACAO", 
      RIGHT(CHAVE,6), NOME,PROCESSO 
      FROM ZLOG,PFUNC 
      WHERE COLUNA = 'SALARIO'
      AND RIGHT(CHAVE,6)=CHAPA
      AND DATEPART(YEAR,DTHORA)=:PLN_$B$3_N
      AND DATEPART(MONTH,DTHORA)=:PLN_$B$4_N
      ORDER BY CHAVE, DTHORA, IDLOG
      Segue exemplo
      ALTERAÇÕES SALARIAIS                                    
      Ano    2018                                
      Mês    1                                
      IDLOG    DATA    USUARIO    SAL.ANTIGO    SAL.NOVO    T    MATRÍCULA    NOME    FUNÇÃO ANTERIOR   FUNÇÃO ATUAL
       
      Agradeço.
       
    • By Edivan
      Olá pessoal!
      Tenho a consulta baixo, porém, queria que ela retornasse as Seções (Setor) das respectivas funções. Alguém pode dar uma ajuda ?
      SELECT DISTINCT PFUNCAO.CODIGO,PFUNCAO.NOME,
                (SELECT MIN(SALARIO) 
               FROM PFUNC PFUNC1 
               WHERE PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO 
               GROUP BY CODFUNCAO)MENOR,
           (SELECT MAX(SALARIO) FROM PFUNC PFUNC1 
              WHERE PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO 
              GROUP BY CODFUNCAO)MAIOR,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='A' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)A,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='P' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)P,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='T' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)T,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='M' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)M,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='E' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)E,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='F' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)F,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               CODSITUACAO='V' AND CODCOLIGADA=1
               GROUP BY CODSITUACAO),0.00)V,
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               DATEDIFF(DAY,PFUNC1.DATAADMISSAO,GETDATE()) < 365 AND CODCOLIGADA=1 
               GROUP BY CODFUNCAO),0.00)'-1A',
           ISNULL((SELECT COUNT(*)FROM PFUNC PFUNC1 WHERE
               PFUNC1.CODFUNCAO=PFUNC.CODFUNCAO AND
               DATEDIFF(DAY,PFUNC1.DATAADMISSAO,GETDATE()) > 365 AND CODCOLIGADA=1 
               GROUP BY CODFUNCAO),0.00)'+1A'
           
      FROM PFUNC,PFUNCAO
      WHERE PFUNC.CODCOLIGADA=1 AND 
      PFUNC.CODSITUACAO<>'D' AND
      PFUNC.CODCOLIGADA=PFUNCAO.CODCOLIGADA AND 
      PFUNCAO.CODIGO=PFUNC.CODFUNCAO
      GROUP BY CODFUNCAO,CODSITUACAO,PFUNCAO.NOME,PFUNCAO.CODIGO,DATAADMISSAO
    • By Luis F Rodrigues
      Prezados,
      O dia 07/09/2016 está cadastrado no meu calendário como feriado.
      Porém foi feito um acordo com os empregados para que eles trabalhem no dia 07/09/2016 (feriado) para folgar no dia 09/09/2016 (dia normal).
      Fiz a utilização de Dia ponte informando o dia 09/09/2016 como dia ponte e o dia 07/09/2016 como a data que será trabalhada para pagar o dia ponte.
      O sistema fez o abono do dia 09/09/2016 por ser dia ponte mas não está entendendo que o dia 07/09/2016 foi para pagar o dia 09 e por ser feriado continua calculando horas extras para todos os empregados.
      Como tratar esta situação em que um empregado trabalha no feriado para folgar em um dia normal???
    • By gabrielcsga
      Bom dia.
      Preciso de ajuda para montar um relatório que mostre o histórico de alteração de funções de funcionários.
      Consultei um post semelhante mas não consegui aproveitar muito as dicas.
      Algum membro já criou algum relatório parecido ou pode mostrar uma consulta que mostre isso?
      Desde já agradeço.
    • By Jean Marcel Orlandini
      Prezados,
      Preciso pagar 4 horas extras quando o sábado for feriado para os horários administrativos (08h00 as 18h00).
      Alguem já teve essa situação e como resolveu?
    • By Alexandre G. Querino
      Boa tarde a Todos
      Como faço para considerar o evento feriado ser do tipo dia?
      Situação: Ao enviar a movimentação do funcionário do RM Chronus para o RM Labore, quando é lançado o grupo de evento com todos os eventos do chronus, ao verificar o envelope o evento Feriado Trabalhado esta sem nenhum valor.
      Tipo do Evento: Provento / Dia
      Fórmula:
      (( RC + FOR('B.0005') + FOR('B.0001')+ FOR('B.0002') + FOR('B.0003') + FOR('B.0004') + FOR('B.0011')) / 30) * N ('0119')
      OBS: ('B.0005'); ('B.0001') ; ('B.0003'); ('B.0004'); ('B.0011') = Fórmulas de Base de Insalubridade
      ('0119') = Evento Feriado Trabalhado
      Na folha é preciso que saia no envelope o valor (R$ 36,87) com referencia '1' e não as horas que trouxe do chronus pois o valor fica incorreto
    • By MARCO RIDOLPHI
      Boa tarde,
      Criei uma procedure mas não consigo que ela seja executada pelo relatório.
      Ela tem 3 campos que uso como filtro. Ja estão no relatório como parametros.
      E UM DELETE E UM INSERT.
      Somente isso, alguem pode me ajudar?
      CREATE OR REPLACE PROCEDURE SP_DPCPLOGCALCULO
      AS
      ESPELHO#1     NUMBER(5);
      ESPELHO#2     VARCHAR(4);
      ESPELHO#3     NUMBER(2);
      ESPELHO#4     NUMBER(2);
      P_CODCOLIGADA NUMBER(5);
      P_ANOCOMP     VARCHAR(4);
      P_MESCOMP     NUMBER(2);
      P_NROPERIODO NUMBER(2);
      BEGIN
      --         P_CODCOLIGADA :=ESPELHO#1;
      --         P_ANOCOMP     :=ESPELHO#2;
      --         P_MESCOMP     :=ESPELHO#3;
      --         P_NROPERIODO :=ESPELHO#4;
      /*Inicio da limpeza do Conteudo da Tabela */
      DELETE FROM ZDPCPLOGFUNCIONARIO
      WHERE ZDPCPLOGFUNCIONARIO.EXECID IN (SELECT PFPERFF.EXECID FROM PFPERFF
                                           WHERE PFPERFF.CODCOLIGADA =P_CODCOLIGADA AND
                                           PFPERFF.ANOCOMP     =P_ANOCOMP     AND
                                           PFPERFF.MESCOMP     =P_MESCOMP     AND
                                           PFPERFF.NROPERIODO =P_NROPERIODO );
                                           COMMIT;
      /*Fim da limpeza do Conteudo da Tabela */
      /*Inicio do INSERT da tabela produção para a tabela customizada */
      INSERT INTO ZDPCPLOGFUNCIONARIO
      SELECT
      PLOGFUNCIONARIO.EXECID,
      PLOGFUNCIONARIO.CHAPA,
      PLOGFUNCIONARIO.STATUS,
      TO_LOB(PLOGFUNCIONARIO.MENSAGEMERRO),
      PLOGFUNCIONARIO.RECCREATEDBY,
      PLOGFUNCIONARIO.RECCREATEDON,
      PLOGFUNCIONARIO.RECMODIFIEDBY,
      PLOGFUNCIONARIO.RECMODIFIEDON
      FROM PLOGFUNCIONARIO
      INNER JOIN PFPERFF ON PFPERFF.EXECID = PLOGFUNCIONARIO.EXECID
      WHERE PFPERFF.CODCOLIGADA=P_CODCOLIGADA
      AND PFPERFF.ANOCOMP=P_ANOCOMP AND
      PFPERFF.MESCOMP=P_MESCOMP AND
      PFPERFF.NROPERIODO=P_NROPERIODO;
      COMMIT;
      END;
  • Recent

×
×
  • Create New...

Important Information

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