Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
lucasjsantos
Contributor II
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.

Labels (2)
1 Solution

Accepted Solutions
lucasjsantos
Contributor II
Contributor II
Author

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;
 

View solution in original post

9 Replies
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

//

// Dias uteis trabalhados

//

Variavel:

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

Expressao:

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

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

furtado@farolbi.com.br
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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 

furtado@farolbi.com.br
lucasjsantos
Contributor II
Contributor II
Author

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
Contributor III
Contributor III

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

luizbezerra
Partner - Creator
Partner - Creator

Lucas, Boa Tarde !

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

Ou pode me dizer como acrescentar as datas ?

Obrigado

Luiz Fernando Bezerra
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br
luizbezerra
Partner - Creator
Partner - Creator

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;

Luiz Fernando Bezerra
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br