Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
richardsupri
Contributor
Contributor

Calculo de Dias Uteis

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!

Labels (5)
16 Replies
Thiago_Justen_

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;

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Anonymous
Not applicable

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:

marcelvinicius
Creator III
Creator III

Top thiago.justen

Valeu pela dica.

Quando puder, chama nós.

atenciosamente.

Ribeiro
Specialist
Specialist

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;

Neves
Thiago_Justen_

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.

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Ribeiro
Specialist
Specialist

Obrigado Thiago na hora que o amigo puder.

Talvez o amigo consiga resolver o meu problema.

Neves
Thiago_Justen_

Me adiciona no skype ou abre a thread com a descrição do seu problema meu amigo.

Skype: justen.thiago

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago