9 Replies Latest reply: Nov 15, 2016 10:20 AM by Alessandro Furtado RSS

    Feriados Nacionais

    Lucas Santos

      Senhores,

       

      Boa tarde!

       

      Gostaria de saber como faço para pegar os dias úteis menos os feriados nacionais. Sei que a função NetWorkDays() retorna os dias de segunda a sexta.

       

      Será que existe alguma API pronta para atualização automática de uma tabela de feriados, por exemplo?

       

      Desde já muito obrigado.

        • Re: Feriados Nacionais
          Alessandro Furtado

          //=======================================================================================

          //

          // Dias uteis trabalhados

          //

          Variavel:

          =Concat(distinct if(Feriado='S',chr(39)& date(Data) & chr(39)),',')

           

           

          Expressao:

          NetWorkDays(min(Data),max(Data),$(Feriados))

          //=======================================================================================

            • Re: Feriados Nacionais
              Alessandro Furtado

              Sendo que a variável eu monto sobre uma tabela de datas que tem uma flag se é ou nao feriado. Se for uma tabela somente com feriado, tem que adaptar (mais simples).

                • Re: Feriados Nacionais
                  Alessandro Furtado

                  no help

                   

                  networkdays (data_inicial, data_final {, feriado})

                  Retorna o número de dias úteis (segunda-sexta) entre e incluindo a data_inicial e a data_final, levando em conta os feriados opcionalmente listados. Todos os parâmetros devem ser datas ou datas/horas válidas.

                  Exemplos:

                  networkdays ('2007-02-19', '2007-03-01') retorna 9 

                  networkdays ('2006-12-18', '2006-12-31', '2006-12-25', '2006-12-26') retorna 8 

                    • Re: Feriados Nacionais
                      Lucas Santos

                      Obrigado Alessandro. Consegui pegar os feriados com o seguinte script.

                       

                         SET ThousandSep='.';
                      SET DecimalSep=',';
                      SET MoneyThousandSep='.';
                      SET MoneyDecimalSep=',';
                      SET MoneyFormat='R$ #.##0,00;-R$ #.##0,00';
                      SET TimeFormat='hh:mm:ss';
                      SET DateFormat='DD/MM/YYYY';
                      SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
                      SET MonthNames='jan;fev;mar;abr;mai;jun;jul;ago;set;out;nov;dez';
                      SET DayNames='seg;ter;qua;qui;sex;sáb;dom';
                      
                      Calendar:
                      LOAD * INLINE [
                          Holiday, Desc
                          01/01/, Confraternização Universal
                          21/04/, Tiradentes
                          01/05/, Dia do Trabalho
                          07/09/, Independência do Brasil
                          12/10/, Nossa Sra. Aparecida - Padroeira do Brasil
                          02/11/, Finados
                          15/11/, Proclamação da República
                          25/12/, Natal];
                          
                      LET cont = 10;
                      FOR j=0 TO cont     
                           
                      // {Feriados Móveis}
                      Pascoa:
                      Load
                           Date((Holiday&(Year(Today())-$(j))),'DD/MM/YYYY') As Holiday,
                      //Para anos entre 1901 e 2099: X = 24 e Y = 5 para anos de 10
                      // Se (d + e) > 9 então DIA = (d + e - 9) e MES = Abril senão DIA = (d + e + 22) e MES = Março
                           Date(if(((if((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           >= 10)
                           
                           ,((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           - 9) & '/04' & '/'&(Year(Today())-$(j)))
                           
                           ,((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           + 22) & '/03' & '/'&(Year(Today())-$(j))))) = '26/04/2076'), '19/04/2049'
                           
                           ,if(((if((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           >= 10)
                           
                           ,((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           - 9) & '/04' & '/'&(Year(Today())-$(j)))
                           
                           ,((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           + 22 ) & '/03' & '/' & (Year(Today())-$(j))))) = '25/04/2049'), '18/04/2049'
                           
                           ,(if((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           >= 10 )
                           
                           ,((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           - 9) & '/04' & '/' & (Year(Today())-$(j)))
                           
                           ,((((Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30)) // d
                           +
                           (Mod((2*(Mod(Year(Today())-$(j),4))+4*(Mod(Year(Today())-$(j),7))+6*(Mod(((19)*(Mod(Year(Today())-$(j),19)))+(24),30))+5),7)))// e
                           + 22) & '/03' & '/' & (Year(Today())-$(j))))))),'DD/MM/YYYY') As Pascoa, 
                           Desc
                      Resident Calendar;
                      //FROM Calendar.qvd (qvd);
                      
                      
                      Calendario_Temporario:
                      Load
                           Date(if( Year(Today())-$(j)>1, Pascoa - 48, ''),'DD/MM/YYYY') As Vespera_de_Carnaval,
                           Date(if( Year(Today())-$(j)>1, Pascoa - 47, ''),'DD/MM/YYYY') As Carnaval,
                           //Date(if( Year(Today())-$(j)>1, Pascoa - 46, ''),'DD/MM/YYYY') As Cinzas,
                           Date(if( Year(Today())-$(j)>1, Pascoa - 2, ''),'DD/MM/YYYY') As Paixao_de_Cristo,
                           Date(if( Year(Today())-$(j)>1, Pascoa + 60, ''),'DD/MM/YYYY') As Corpus_Christi,
                           Date(Pascoa, 'DM/MM/YYYY') As Pascoa,
                           Holiday,
                           Desc
                      Resident Pascoa;
                      
                      Feriado_Variavel:
                      Load
                           Vespera_de_Carnaval,
                           Carnaval,
                           //Cinzas,
                           Paixao_de_Cristo,
                           Corpus_Christi,
                           Pascoa 
                      Resident Calendario_Temporario;
                      
                      Feriados_Fixo:
                      Load
                           Holiday as Feriado,
                           Desc
                      Resident Calendario_Temporario;
                      
                      LET qtde_fields = NoOfFields('Feriado_Variavel');
                      FOR i=1 TO qtde_fields
                      
                      LET campo = FieldName($(i) , 'Feriado_Variavel');
                      
                      Feriado:
                      Load
                           $(campo) As Feriado,
                           if(upper('$(campo)' )='VESPERA_DE_CARNAVAL', 'Véspera de Carnaval',
                           if(upper('$(campo)' )='PAIXAO_DE_CRISTO', 'Paixão de Cristo',
                           if(upper('$(campo)' )='CORPUS_CHRISTI', 'Corpus Christi',
                           if(upper('$(campo)' )='CINZAS', 'Quarta Feira de Cinzas', '$(campo)' )))) As Desc
                      Resident Feriado_Variavel;
                      
                      Next i
                      Feriado:
                      // a tabela anterior contem a mesma qtde de campos, o concatenate é realizado automaticamente.
                      Load
                           Date(Feriado, 'DD/MM/YYYY') As Feriado,
                           Desc
                      Resident Feriados_Fixo;
                      
                      
                      NEXT j
                      
                      //*** Calendário de Feriados *** //
                      CalendarioFeriado:
                      LOAD Distinct
                           Feriado,
                           Desc as FeriadoDesc,
                          Week(Feriado) as CalendarioSemanaFeriado,
                          Year(Feriado) as CalendarioAnoFeriado,
                          Capitalize(Month(Feriado)) as CalendarioMesFeriado,
                          Day(Feriado) as CalendarioDiaFeriado,
                          WeekDay(Feriado) as CalendarioDiaSemanaFeriado,
                          'T' & ceil(month(Feriado)/3) as CalendarioTrimestreFeriado,
                          Date(DayStart(Feriado),'DD.MMM') as CalendarioDiaMesFeriado,
                          Date(MonthStart(Feriado),'MMM.YYYY') as CalendarioMesAnoFeriado,                
                          Week(Feriado) & '.' & Year(Feriado) as CalendarioSemanaAnoFeriado,
                          NetWorkDays(MonthStart(Feriado) , MonthEnd(Feriado)) as CalendarioDiasUteisFeriado,
                           InYearToDate(Feriado,Today(),0) * -1 as CalendarioHojeYTDFeriado,
                          InYearToDate(Feriado,Today(),-1) * -1 as CalendarioUltimoYTDFeriado
                      Resident Feriados_Fixo
                      Order By Feriado ASC;
                      
                      STORE CalendarioFeriado into C:\Qikview\QVD\CalendarioFeriado.qvd;
                      DROP TABLE CalendarioFeriado; 
                      
                      Drop Table Feriado_Variavel;
                      Drop Table Calendario_Temporario;
                      Drop Table Pascoa;
                      Drop Table Calendar;
                      Drop Table Feriados_Fixo;
                       
                        • Re: Feriados Nacionais
                          Kleiton Moraes

                          Também vou aproveitar o script, Obrigado, Lucas!

                          • Re: Feriados Nacionais
                            Luiz Fernando Bezerra

                            Lucas, Boa Tarde !

                             

                            Você tem esse calendário juntamente com os dias completos ?

                            Ou pode me dizer como acrescentar as datas ?

                             

                            Obrigado

                              • Re: Feriados Nacionais
                                Alessandro Furtado

                                Luiz,

                                 

                                Prefiro uma rotina menor para criar o calendário e os feriados, que nacionais são poucos seriam poucas linhas a mais no código por ano.....

                                 

                                2016-11-15 12_58_28-QlikView x64 - [C__tmp_Calendario.qvw].png

                                  • Re: Feriados Nacionais
                                    Luiz Fernando Bezerra

                                    Alexandre,

                                     

                                    Eu utilizo uma a seguiunte rotina para criar o calendário, porém queria um calendário mais completo.

                                    E concordo com você que seria bem melhor, e seria poucas linhas a mais.

                                    Posso criar nessa mesma rotina abaixo, ou Concateno dois qvsd's ?

                                     

                                    //Scritp //

                                     

                                    LET vDateMin   = Num(MakeDate(year(Today())-3)); 

                                    LET vDateMax   = Num(MakeDate(year(Today()),12,31));

                                     

                                     

                                    TempCalendario:

                                     

                                    LOAD

                                       Date($(vDateMin) + RowNo() - 1)  AS TempDate

                                       AUTOGENERATE 1 

                                    WHILE $(vDateMin)+IterNo()-1<= $(vDateMax); 

                                     

                                     

                                    DimCalendario: 

                                    LOAD

                                      Date(TempDate,'DD/MM/YYYY')                 as Data,

                                      Week(TempDate)                              as NroSemana,

                                      month(TempDate)                             as Mes,

                                      year(TempDate)                              as Ano,

                                      day(TempDate)                               as Dia,

                                      WeekDay(TempDate)                           as DiaSemana,

                                      Num(Month(TempDate)) as NumMes,

                                      MonthName(TempDate) as MesAno,

                                      ceil(Month(TempDate)/3)&'º Trim' AS Trimestre,

                                      WeekName(TempDate) AS AnoSemana

                                     

                                    Resident TempCalendario;

                                     

                                     

                                    Store DimCalendario into C:\Users\luiz.bezerra\Desktop\Calendário\DimCalendario.qvd(qvd);

                                     

                                     

                                    Drop Table TempCalendario;

                                    Drop Table DimCalendario;

                                      • Re: Feriados Nacionais
                                        Alessandro Furtado

                                        //Scritp //

                                         

                                        LET vDateMin   = Num(MakeDate(year(Today())-3));

                                        LET vDateMax   = Num(MakeDate(year(Today()),12,31));

                                         

                                         

                                        TempCalendario:

                                         

                                        LOAD

                                           Date($(vDateMin) + RowNo() - 1)  AS TempDate

                                           AUTOGENERATE 1

                                        WHILE $(vDateMin)+IterNo()-1<= $(vDateMax);

                                         

                                         

                                        DimCalendario:

                                        LOAD

                                          Date(TempDate,'DD/MM/YYYY')                 as Data,

                                          Week(TempDate)                              as NroSemana,

                                          month(TempDate)                             as Mes,

                                          year(TempDate)                              as Ano,

                                          day(TempDate)                               as Dia,

                                          WeekDay(TempDate)                           as DiaSemana,

                                          Num(Month(TempDate)) as NumMes,

                                          MonthName(TempDate) as MesAno,

                                          ceil(Month(TempDate)/3)&'º Trim' AS Trimestre,

                                          WeekName(TempDate) AS AnoSemana

                                         

                                        Resident TempCalendario;

                                         

                                         

                                        join (DimCalendario)

                                        LOAD date(Date#(Data,'DD/MM/YYYY')) as Data,Feriado INLINE [

                                        Data       , Feriado

                                        01/01/2016 , Ano Novo

                                        25/12/2016 , Natal

                                        ];

                                         

                                         

                                         

                                         

                                         

                                        Store DimCalendario into C:\Users\luiz.bezerra\Desktop\Calendário\DimCalendario.qvd(qvd);

                                         

                                         

                                        Drop Table TempCalendario;

                                        Drop Table DimCalendario;