Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom dia a todos!
estou enfrentando uma dificuldade no calculo de dias uteis.
tenho uma tabela com a seguinte estrutura onde temos um flag de dia util = 'sim' e 'nao' para sabados e domingos e feriados:
como quero selecionar o total de dias uteis passados no mes e tambem os dias restantes.. criei uma variavel que captura o maior dia 'selecionado' para analise : max((DiaMes))
e COUNT({$<DiaUtil={'Sim'},MES,DiaMes,DiaSemana>}DATA) para o total de dias uteis do mes.
o que não consigo é fazer o count() de dias uteis entre o primeiro dia do mes (dia 1) e o maior dia selecionado no filtro...
por ex.
dia 22 de fevereiro
total de dias 19 uteis
15 dias passados. é aqui que não consigo evoluir
[CALENDARIO]:
LOAD DATA_CAL
, Today() as HOJE
, Day(DATA_CAL) as DIA
, MES
, ANO
, DIAUTIL;
SQL SELECT CAST(DATA AS DATE) AS DATA_CAL,
DIASEMANA,
SEMANA,
MES,
ANO,
DIAUTIL,
TRIMESTRE,
DIAMES
FROM M4UBPODatabasePRD."db_datawriter"."TBL_CALENDARIO"
WHERE MES = (select month(max(DATA)) from M4UBPODatabasePRD.dbo."TBL_VENDAS_MBS_SKU")
AND ANO = (select year(max(DATA)) from M4UBPODatabasePRD.dbo."TBL_VENDAS_MBS_SKU");
LIB CONNECT TO '172.20.1.12';
agradeço a ajuda!
Valeu!
Eis o script Marcel:
///$tab Main
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]';
///$tab CALENDARIO
SET MonthNames='JAN;FEV;MAR;ABR;MAI;JUN;JUL;AGO;SET;OUT;NOV;DEZ';
SET DayNames='SEG;TER;QUA;QUI;SEX;SAB;DOM';
// Iniciar as variáveis que determinarão o intervalo do calendário
LET V_DATA_INI = MakeDate( Year( Today())-4, 1, 1);
LET V_DATA_FIN = YearEnd( Today());
LET V_ANO = Year( V_DATA_INI);
LET V_ANO_FIN = Year( V_DATA_FIN);
DIRECTORY;
DO WHILE V_ANO <= V_ANO_FIN
LET V_C01 = Floor( V_ANO/100);
LET V_C02 = V_ANO - (19*Floor( V_ANO /19));
LET V_C03 = Floor((V_C01 - 17)/25);
LET V_C04 = V_C01 - Floor(V_C01/4) - Floor((V_C01-V_C03)/3) +(19*V_C02) + 15;
LET V_C05 = V_C04 - (30*Floor(V_C04/30));
LET V_C06 = V_C05 - (Floor(V_C05/28)*(1-Floor(V_C05/28))*Floor(29/(V_C05+1))*Floor((21-V_C02)/11));
LET V_C07 = V_ANO + Floor(V_ANO/4) + V_C06 + 2 -V_C01 + Floor(V_C01/4);
LET V_C08 = V_C07 - 7*Floor(V_C07/7);
LET V_C09 = V_C06 - V_C08;
LET V_MES = 3 + Floor((V_C09+40)/44);
LET V_DIA = V_C09 + 28 - (31*Floor(V_MES/4));
SET V_Pascoa = 'MakeDate( $(V_ANO), $(V_MES), $(V_DIA))';
FERIADOS:
// Para adicionar um novo feriado insira a linha de comando da seguinte forma: "LOAD $(V_ANO) & 'MM' & 'DD' as Id_Calendario, 'Nome_do_Feriado' as Feriado AutoGenerate(1);"
// Substituindo MM pelo número do mês e DD pelo dia; ambos com dois algarismos
LOAD $(V_ANO) & Num($(V_MES),'00') & Num($(V_DIA),'00') as Id_Calendario, 'Páscoa' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & Num( Month( $(V_Pascoa) - 47), '00') & Num( Day($(V_Pascoa) - 47), '00') as Id_Calendario, 'Carnaval' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & Num( Month( $(V_Pascoa) - 2), '00') & Num( Day( $(V_Pascoa) - 2), '00') as Id_Calendario, 'Paixão de Cristo' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & Num( Month( $(V_Pascoa) + 60), '00') & Num( Day( $(V_Pascoa) + 60), '00') as Id_Calendario, 'Corpus Cristi' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '01' & '01' as Id_Calendario, 'Confraternização Universal' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '04' & '21' as Id_Calendario, 'Tiradentes' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '05' & '01' as Id_Calendario, 'Dia do Trabalhador' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '09' & '07' as Id_Calendario, 'Independência' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '10' & '12' as Id_Calendario, 'Nossa Senhora Aparecida' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '11' & '02' as Id_Calendario, 'Finados' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '11' & '15' as Id_Calendario, 'Proclamação da República' as Feriado AutoGenerate(1);
LOAD $(V_ANO) & '12' & '25' as Id_Calendario, 'Natal' as Feriado AutoGenerate(1);
DATAS_COMEMORATIVAS:
// Para adicionar uma nova data comemorativa insira a linha de comando da seguinte forma:
//"LOAD $(V_ANO) & 'MM' & 'DD' as Id_Calendario, 'Nome_Da_Data_Comemorativa' as Dt_Comemorativa AutoGenerate(1);"
// Substituindo MM pelo número do mês e DD pelo dia; ambos com dois algarismos
LOAD $(V_ANO) & '10' & '30' as Id_Calendario, 'Emancipação Política de Arapiraca' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '09' & '16' as Id_Calendario, 'Emancipação Política de Alagoas' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '02' & '02' as Id_Calendario, 'N.S. do Bom Conselho' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '10' & '17' as Id_Calendario, 'Dia do Eletricista' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '11' & '20' as Id_Calendario, 'Consciência Negra' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '12' & '31' as Id_Calendario, 'Revellion' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '12' & '08' as Id_Calendario, 'N.S. da Conceição' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '06' & '13' as Id_Calendario, 'Santo Antônio' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '06' & '24' as Id_Calendario, 'São João' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '06' & '29' as Id_Calendario, 'São Pedro' as Dt_Comemorativa AutoGenerate(1);
LOAD $(V_ANO) & '10' & '15' as Id_Calendario, 'Dia dos Professores' as Dt_Comemorativa AutoGenerate(1);
LET V_ANO = V_ANO +1;
LOOP;
Calendario_Temp:
LOAD
// Date( Data, 'DD/MM/YYYY' ) as Data,
Data,
Num( Day( Data ), '00' ) as DIA,
Month( Data ) as MES,
Year( Data ) as ANO,
DayNumberOfQuarter( Data ) as [Dia Trimestre],
DayNumberOfYear( Data ) as [Dia Ano],
MonthName( Data ) as [Mes Ano],
QuarterName( Data ) as Quarter,
Week( Data ) as Semana,
Ceil( Month( Data ) / 3 )&'º Trim' as Trimestre,
WeekDay( Data ) as [Dia Semana],
// ApplyMap( 'MapDias', Text( WeekDay( Data ) ) ) as [N° Dia Semana],
AutoNumber( Data ) as Sequencial,
If( WeekDay( Data )= 'DOM' or WeekDay( Data )= 'SAB', 0, 1 ) as DiaUtil_Temp,
Year( Data )&Num( Month( Data ), 00 ) as [Ano Mes],
Year( Data )&Num( Month( Data ),'00')&Num( Day( Data ), '00' ) as Id_Calendario;
LOAD
// Date( MonthEnd( Today() ) - Recno(), 'DD/MM/YYYY' ) as Data
Date( YearEnd(Today())+1 - Recno()) as Data
AutoGenerate( V_DATA_FIN+1 - V_DATA_INI );
Left Join
LOAD * Resident FERIADOS;
Left Join
LOAD * Resident DATAS_COMEMORATIVAS;
Calendario:
LOAD Data,
DIA,
MES,
ANO,
[Dia Trimestre],
[Dia Ano],
[Mes Ano],
Quarter,
Semana,
Trimestre,
[Dia Semana],
Sequencial,
[Ano Mes],
Id_Calendario,
Feriado,
Dt_Comemorativa
, If( len(Feriado),0,DiaUtil_Temp) as DiaUtil;
LOAD * Resident Calendario_Temp;
STORE Calendario into Calendario.qvd (qvd);
//STORE Calendario into .\TRANSFORMACAO\Calendario.qvd (qvd);
//STORE Calendario into \\Servarquivos\Clandestinos_AT\QVDs\Calendario.qvd (qvd);
Drop Tables FERIADOS, DATAS_COMEMORATIVAS, Calendario_Temp;
Correto meu caro.
Não uso o Sense, mas acredito que esse script funciona nele corretamente.
Em ter, 10 de abr de 2018 09:25, Marcel Vinicius de Oliveira <
qcwebmaster@qlikview.com> escreveu:
Thiago Preciso do seu Help
Tenho um script que foi até você que me ajudou.
Eu precisava tratar o Dia_Aniv, Mes_Aniv.
De segunda a Sexta-feira normal, sabádo e domingo acumule no sexta-feira.
Isso vai para um call center e eles ligam para os clientes que fazem aniversário oferecendo promoção.
Então segunda a sexta-feira normal
se
Sabádo ou domingo volte para sexta-feira e acumule os dias aniversários
Acho que o script acima seu, poderá me ajudar.
Não sei como.
Final:
load
Cliente_CodigoV,
Fone1V,
Mes_Aniv,
NomeClienteV,
Dia_Aniv,
CidadeV,
BairroV,
EstadoV,
ApelidoV,
ApelidoCliente,
Numero,
If(Left(If(SubStringCount(Numero,'-')=2,SubField(Numero,'-',2)&SubField(Numero,'-',3),PurgeChar(Numero,'-')),1)<=3,'Não Celular',
If(Len(Trim(If(SubStringCount(Numero,'-')=2,SubField(Numero,'-',2)&SubField(Numero,'-',3),PurgeChar(Numero,'-'))))<=7,'279'&
If(SubStringCount(Numero,'-')=2,SubField(Numero,'-',2)&SubField(Numero,'-',3),PurgeChar(Numero,'-')),'279'&
If(SubStringCount(Numero,'-')=2,SubField(Numero,'-',2)&SubField(Numero,'-',3),PurgeChar(Numero,'-')))) as Celular
Resident Temp;
drop table Temp;
Na verdade o script acima não é meu. Apenas copiei do link postado pelo wellington1978. Me chama amanhã por aqui que te dou aquela moral.
Obrigado Thiago na hora que o amigo puder.
Talvez o amigo consiga resolver o meu problema.
Me adiciona no skype ou abre a thread com a descrição do seu problema meu amigo.
Skype: justen.thiago