16 Replies Latest reply: Apr 11, 2018 1:17 PM by Thiago Justen Teixeira RSS

    Calculo de Dias Uteis

    Richard Alain Rosensweig

      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!

        • Re: Calculo de Dias Uteis
          Thiago Justen Teixeira

          O filtro realizado é em que campo?

           

          Considerando que o filtro seja o campo Data:

          COUNT({$<DiaUtil={'Sim'},DATA={">=$(=MonthStart(DATA))<=$(=MonthEnd(DATA))"}>}DATA)



          • Re: Calculo de Dias Uteis
            Thiago Justen Teixeira

            Outra opção:

             

            COUNT({$<DiaUtil={'Sim'},DATA={">=$(=MonthStart(DATA))<=$(=Max(DATA))"}>}DATA)


            É possível que o MonthEnd() da solução acima seja um problema para você...

            • Re: Calculo de Dias Uteis
              Francisco Rogério Almeida dos Santos

              Richard,

               

              Tem uma função no Qlik que faz isso sem precisar dessa condicional que você fez Networkdays.

               

              https://help.qlik.com/pt-BR/sense/September2017/Subsystems/Hub/Content/Scripting/DateAndTimeFunctions/networkdays.htm

               

              Olha se serve para o que esta pensando.

               

              Espero ter ajudado.

              • Re: Calculo de Dias Uteis
                Wellington Regis Silva

                     Bom dia Richard,

                 

                     Visando a dificuldade de trabalhar com datas eu modifiquei um Script que gera um calendário, adicionando o calculo dos feriados com datas móveis e oferecendo a possibilidade de cadastrar todos os feriados que afetarem sua empresa.

                     Nesse Script o campo de dias úteis é marcado com os valores 0, para sábados, domingos e feriados, e 1 para os demais dias. Isso tem facilitado bastante minha vida porque só preciso usar um "SUM(DiaUtil)" para saber a quantidade dias úteis entre as datas selecionadas.

                     Além disso ele oferece outros campos para você utilizar como, trimestre, Mês, ano e outros formatos.

                     No próprio Script tem a instrução para você formatar o campo de ligação desse calendário com sua base de dados.

                     Dá uma olhada no post: CALENDARIO.qvs (Script) e veja se lhe atende. Qualquer dúvida basta nos contactar.

                 

                Felicidades...

                  • Re: Calculo de Dias Uteis
                    Marcel Vinícius de Oliveira

                    Amigo, esse script é para Qlik View certo?

                     

                    Como consigo abrir no Sense?

                     

                    Atenciosamente.

                      • Re: Calculo de Dias Uteis
                        Thiago Justen Teixeira

                        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;

                        • Re: Calculo de Dias Uteis
                          Wellington Regis Silva

                          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:

                           

                           

                           

                      • Re: Calculo de Dias Uteis
                        Thiago Justen Teixeira

                        Richard,

                         

                        Não esqueça de fechar a thread marcando com a flag  'Correta' a resposta que lhe ajudou a resolver a questão. Se ainda não conseguiu sua resposta deixe-nos saber.

                         

                        Manual do usuário | Como criar e gerir minhas perguntas?

                        • Re: Calculo de Dias Uteis
                          Thiago Justen Teixeira

                          Richard,

                           

                          Alguma novidade sobre a questão? Ficou resolvido? Se alguma das respostas acima lhe ajudou a chegar na resolução da questão, por favor, feche a thread para mantermos a comunidade organizada e atualizada.

                           

                          Abs e Sucesso!!

                          • Re: Calculo de Dias Uteis
                            Thiago Justen Teixeira

                            Richard,

                             

                            Não esqueça de fechar a thread marcando com a flag  'Correta' a resposta que lhe ajudou a resolver a questão. Se ainda não conseguiu sua resposta deixe-nos saber.

                             

                            Manual do usuário | Como criar e gerir minhas perguntas?

                            • Re: Calculo de Dias Uteis
                              Thiago Justen Teixeira

                              Richard,

                               

                              Não esqueça de fechar a thread marcando com a flag  'Correta' a resposta que lhe ajudou a resolver a questão. Se ainda não conseguiu sua resposta deixe-nos saber.

                               

                              Manual do usuário | Como criar e gerir minhas perguntas?

                                • Re: Calculo de Dias Uteis
                                  agnaldo neves

                                  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;