Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Hermann
Contributor
Contributor

Primeiro dia útil do Mês

Olá pessoal, bom dia!

Estou atrás de uma função ou de uma luz, para retornar o primeiro dia útil do mês.

Por exemplo o mês de Junho o primeiro dia útil é 03/06/2019, o do mês de Julho é 01/07/2019. Gostaria de trazer esse valor.

Alguém poderia me auxiliar? Desde já meu muito obrigado!

1 Solution

Accepted Solutions
Hermann
Contributor
Contributor
Author

Pessoal, acredito que consegui resolver meu problema... pelo menos está retornando o que eu quero... rsrsrs

Criei uma função dentro do Dash, pois não queria criar a mesma no Load Editor... segue o código da função:

 

if(weekday(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01')<> 'sáb' AND weekday(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01') <>'dom',
Date(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01'),
if(weekday(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01') = 'sáb',
Date(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01'+2),Date(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01'+1)
)
)

Obs.: o campo vCompAtual, é uma outra função que tenho, que me retorna o ano_mes selecionado pelo usuário no Dash, então a partir disso quero saber qual o primeiro dia útil do mês selecionado pelo usuário, para realizar os devidos cálculos de contagem de dias de vencimento até o primeiro dia do mês.

ainda não fiz o link com uma tabela de feriados, mas se não levar em consideração, ele está trazendo o primeiro dia útil do mês.

 

Abraço!

View solution in original post

3 Replies
Hermann
Contributor
Contributor
Author

Pessoal, acredito que consegui resolver meu problema... pelo menos está retornando o que eu quero... rsrsrs

Criei uma função dentro do Dash, pois não queria criar a mesma no Load Editor... segue o código da função:

 

if(weekday(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01')<> 'sáb' AND weekday(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01') <>'dom',
Date(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01'),
if(weekday(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01') = 'sáb',
Date(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01'+2),Date(mid(vCompAtual,1,4)&'-'&mid(vCompAtual,5,2)&'-01'+1)
)
)

Obs.: o campo vCompAtual, é uma outra função que tenho, que me retorna o ano_mes selecionado pelo usuário no Dash, então a partir disso quero saber qual o primeiro dia útil do mês selecionado pelo usuário, para realizar os devidos cálculos de contagem de dias de vencimento até o primeiro dia do mês.

ainda não fiz o link com uma tabela de feriados, mas se não levar em consideração, ele está trazendo o primeiro dia útil do mês.

 

Abraço!

diogoduarte
Partner - Contributor III
Partner - Contributor III

Hermann, uma sugestão pra minimizar o seu custo de cálculo na aplicação.

Eu coloquei um flag no calendário informando se é dia útil ou não. 
Primeiro carrego uma suposta tabela de feriado e depois o calendário. No calendário faço a coluna WorkDay onde verifico se é final de semana ou feriado e marco como zero, senão, marco como 1.

Na aplicação faço a seguinte medida:
Date(Min({<WorkDay={1}>} Data))

Feriados:
Load
*
Inline [
Feriado
01/07/2019
20/07/2019
];

Load
Data,
If(WildMatch(Num(WeekDay(Data)),0,6) > 0 , 0 , If(Exists(Feriado,Data) , 0 , 1)) as WorkDay
Inline [
Data
01/07/2019
02/07/2019
03/07/2019
04/07/2019
05/07/2019
06/07/2019
07/07/2019
08/07/2019
09/07/2019
10/07/2019
11/07/2019
12/07/2019
13/07/2019
14/07/2019
15/07/2019
16/07/2019
17/07/2019
18/07/2019
19/07/2019
20/07/2019
21/07/2019
22/07/2019
23/07/2019
24/07/2019
25/07/2019
26/07/2019
27/07/2019
28/07/2019
29/07/2019
30/07/2019
31/07/2019
];


Drop Table Feriados;

 

Capturar.PNG

Hermann
Contributor
Contributor
Author

Diogo, obrigado pelo seu retorno, também é uma forma sim...

Mas acabei criando o seguinte script de calendário, para gerar minhas informações, esse código gera um calendário automático de acordo com a data Inicial e Final... e o cria também um calendário de Feriados automático, onde depois eu utilizo para fazer a flag de dias úteis ou flag de Feriados tbm...

Mas de qualquer forma, muito obrigado pelo seu retorno. Segue abaixo o script...

 

LET vDataFinal = num(MakeDate(Year(today()),12,31));
LET vDataInicial = num(MakeDate(2015,01,01))-1;

LET @Anna-Nilsson = Year($(vDataInicial));
LET @AnoFinal = Year($(vDataFinal))+1;

Do While @Anna-Nilsson <= @AnoFinal

LET @Mod1 = Mod($(@Ano),19);
LET @Mod2 = Mod($(@Ano),4);
LET @Mod3 = Mod($(@Ano),7);

LET @Num1 = 24;
LET @Num2 = 5;

LET @Result1 = (19*$(@Mod1)+$(@Num1));
LET @Mod4 = Mod($(@Result1),30);

LET @Result2 = (2*$(@Mod2)+4*$(@Mod3)+6*$(@Mod4)+$(@Num2));

LET @Mod5 = Mod($(@Result2),7);

LET @Pascoa = if(($(@Mod5)+$(@Mod4))>9,if(Len(($(@Mod5)+$(@Mod4))-9)=1,'0'&($(@Mod5)+$(@Mod4))-9,($(@Mod5)+$(@Mod4))-9)&'/04/'&$(@Ano),if(len(($(@Mod5)+$(@Mod4))+22)=1,'0'&($(@Mod5)+$(@Mod4))+22,($(@Mod5)+$(@Mod4))+22)&'/04/'&$(@Ano));
LET @Pascoa = Date(@Pascoa);
LET @Carnaval = Date(@Pascoa-47);
LET @CorpusChristi = Date(@Pascoa+60);

FERIADOS:
Mapping LOAD * Inline [
Data,Feriado
01/01/$(@Ano),'Confraternização Universal'
25/01/$(@Ano),'Aniversário de São Paulo'
$(@Pascoa),'Páscoa'
21/04/$(@Ano),'Tiradentes'
$(@Carnaval),'Carnaval'
$(@CorpusChristi),'Corpus Christi'
01/05/$(@Ano),'Dia do Trabalhador'
07/09/$(@Ano),'Dia da Independência'
12/10/$(@Ano),'N. S. Aparecida'
02/11/$(@Ano),'Todos os santos'
15/11/$(@Ano),'Proclamação da republica'
25/12/$(@Ano),'Natal'
]
;

LET @Anna-Nilsson = $(@Ano)+1;
Loop;

LET @Anna-Nilsson = NULL();
LET @AnoFinal = NULL();
LET @Mod1 = NULL();
LET @Mod2 = NULL();
LET @Mod3 = NULL();
LET @Num1 = NULL();
LET @Num2 = NULL();
LET @Result1 = NULL();
LET @Mod4 = NULL();
LET @Result2 = NULL();
LET @Mod5 = NULL();
LET @Pascoa = NULL();
LET @Carnaval = NULL();
LET @CorpusChrist = NULL();

 

Tabela_de_Datas:
LOAD date($(vDataInicial) + IterNo(),'DD/MM/YYYY') as Data
AUTOGENERATE 1
WHILE $(vDataInicial) + IterNo() <= $(vDataFinal);


Calendar:
Load
text(Date(Data,'DD/MM/YYYY')) as Data
,if(weekday(Data)=1,'SEGUNDA-FEIRA',
if(weekday(Data)=2,'TERÇA-FEIRA',
if(weekday(Data)=3,'QUARTA-FEIRA',
if(weekday(Data)=4,'QUINTA-FEIRA',
if(weekday(Data)=5,'SEXTA-FEIRA',
if(weekday(Data)=6,'SÁBADO',
if(weekday(Data)=0,'DOMINGO'))))))) as DiaSemana
,if(ApplyMap('FERIADOS',Data,'0')<>'0',1,0) as FlagFeriado
,if(weekday(Data)=6 or Weekday(Data)=0 or if(ApplyMap('FERIADOS',Data,'0')<>'0',1,0), 0, 1 ) as FlagDiaUtil
,text(Date(Data,'DD')) as Dia
,text(Date(Data,'MM')) as Mes
,text(Date(Data,'YYYY')) as Ano

,if(text(Date(Data,'MM')) = '01','JANEIRO'
,if(text(Date(Data,'MM')) = '02','FEVEREIRO'
,if(text(Date(Data,'MM')) = '03','MARÇO'
,if(text(Date(Data,'MM')) = '04','ABRIL'
,if(text(Date(Data,'MM')) = '05','MAIO'
,if(text(Date(Data,'MM')) = '06','JUNHO'
,if(text(Date(Data,'MM')) = '07','JULHO'
,if(text(Date(Data,'MM')) = '08','AGOSTO'
,if(text(Date(Data,'MM')) = '09','SETEMBRO'
,if(text(Date(Data,'MM')) = '10','OUTUBRO'
,if(text(Date(Data,'MM')) = '11','NOVEMBRO'
,if(text(Date(Data,'MM')) = '12','DEZEMBRO')))))))))))) as NomeMes

,if(text(Date(Data,'MM')) = '01','JANEIRO'
,if(text(Date(Data,'MM')) = '02','FEVEREIRO'
,if(text(Date(Data,'MM')) = '03','MARÇO'
,if(text(Date(Data,'MM')) = '04','ABRIL'
,if(text(Date(Data,'MM')) = '05','MAIO'
,if(text(Date(Data,'MM')) = '06','JUNHO'
,if(text(Date(Data,'MM')) = '07','JULHO'
,if(text(Date(Data,'MM')) = '08','AGOSTO'
,if(text(Date(Data,'MM')) = '09','SETEMBRO'
,if(text(Date(Data,'MM')) = '10','OUTUBRO'
,if(text(Date(Data,'MM')) = '11','NOVEMBRO'
,if(text(Date(Data,'MM')) = '12','DEZEMBRO'))))))))))))&'/'&Date(Data,'YYYY') as NomeMesAno

,if(text(Date(Data,'MM')) >= '01' and text(Date(Data,'MM')) <= '03','Q1'
,if(text(Date(Data,'MM')) >= '04' and text(Date(Data,'MM')) <= '06','Q2'
,if(text(Date(Data,'MM')) >= '07' and text(Date(Data,'MM')) <= '09','Q3'
,if(text(Date(Data,'MM')) >= '10' and text(Date(Data,'MM')) <= '12','Q4')))) as Quarter

,if(text(Date(Data,'MM')) >= '01' and text(Date(Data,'MM')) <= '06','1º SEM','2° SEM') as Semestre


Resident Tabela_de_Datas;

LET vDataFinal = NULL();
LET vDataInicial = NULL();

Drop Table Tabela_de_Datas;
//Drop Table FERIADOS;

Exit Script;