Skip to main content
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