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