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