Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
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;
//=======================================================================================
//
// Dias uteis trabalhados
//
Variavel:
=Concat(distinct if(Feriado='S',chr(39)& date(Data) & chr(39)),',')
Expressao:
NetWorkDays(min(Data),max(Data),$(Feriados))
//=======================================================================================
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).
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
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;
Também vou aproveitar o script, Obrigado, Lucas!
Lucas, Boa Tarde !
Você tem esse calendário juntamente com os dias completos ?
Ou pode me dizer como acrescentar as datas ?
Obrigado
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](/legacyfs/online/143924_2016-11-15 12_58_28-QlikView x64 - [C__tmp_Calendario.qvw].png)
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;
//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;