Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
lucasjsantos
New Contributor II

Feriados Nacionais

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.

Tags (1)
1 Solution

Accepted Solutions
lucasjsantos
New Contributor II

Re: Feriados Nacionais

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;
 
9 Replies
MVP
MVP

Re: Feriados Nacionais

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

//

// Dias uteis trabalhados

//

Variavel:

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

Expressao:

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

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

MVP
MVP

Re: Feriados Nacionais

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).

MVP
MVP

Re: Feriados Nacionais

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 

lucasjsantos
New Contributor II

Re: Feriados Nacionais

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;
 
kkmoraes
New Contributor III

Re: Feriados Nacionais

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

luizbezerra
Contributor

Re: Feriados Nacionais

Lucas, Boa Tarde !

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

Ou pode me dizer como acrescentar as datas ?

Obrigado

MVP
MVP

Re: Feriados Nacionais

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

luizbezerra
Contributor

Re: Feriados Nacionais

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;

MVP
MVP

Re: Feriados Nacionais

//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;