27 Replies Latest reply: Jan 4, 2018 11:21 AM by Victória Gonçalves RSS

    Socorro!

    Victória Gonçalves

      Bom dia,

       

      Sou usuária nova no Qlik Sense, e preciso de uma ajuda urgente.

      Preciso gerar um tabela, através de outra tabela já carregada.

       

      Tenho os campos:

       

      Nome ( indica o nome da pessoa), dia, dias de produção (onde 0 indica que a pessoa não trabalhou e 1 que trabalhou), e o grupo.

       

      Na tabela que tenho que gerar, precisava fazer um loop para que todo vez que mudasse o nome ou o grupo ou  quando a pessoa não trabalhasse ( que é indicado pelo número 0) ela pegasse a data de inicio e fim desse período.

       

      Vou tentar exemplificar genericamente, pois são muitos os meus dados

       

      Tenho uma tabela parecida com esta carregada:

       

        

      NomeDiaDias de ProduçãoGrupo
      João12/12/20171Grupo 1
      João12/12/20170-
      João13/12/20171Grupo 1
      João13/12/20171Grupo 1
      João14/12/20171Grupo 2
      Maria12/12/20170-
      Maria12/12/20171Grupo 1
      Maria14/12/20171Grupo 1
      Maria14/12/20171Grupo 2
      Maria14/12/20170-
      Maria15/12/20171Grupo 1
      Ana15/12/20171Grupo 1
      Ana16/12/20171Grupo 1
      Ana17/12/20170-
      Ana18/12/20171Grupo 2

       

       

      E através dela precisava gerar uma igual esta:

       

         

      NomeData InícioData FimGrupo
      João12/12/201712/12/2017Grupo 1
      João13/12/204713/12/2017Grupo 1
      João14/12/201714/12/2017Grupo 2
      Maria12/12/201714/12/2017Grupo 1
      Maria14/12/201714/12/2017Grupo 2
      Maria15/12/201715/12/2017Grupo 1
      Ana15/12/201716/12/2017Grupo 1
      Ana18/12/201718/12/2017Grupo 2

       

      Já pesquisei, mas ainda não achei nada por completo que me ajudasse.

       

      E estou precisando urgentemente, se alguém pudesse me ajudar ficaria muito grata.

        • Re: Socorro!
          Thiago Justen Teixeira

          Boa tarde Victória,

           

          Veja se é assim que você precisa:

           

          ORIGEM:

          LOAD * Inline [

           

              NOME,DATA,DIAS_PRODUCAO,GRUPO

             

              João, 12/12/2017, 1, Grupo 1,

               João, 12/12/2017, 0, ,

               João, 13/12/2017, 1, Grupo 1,

              João, 13/12/2017, 1, Grupo 1,

              João, 14/12/2017, 1, Grupo 2,

              Maria, 12/12/2017, 0, ,

              Maria, 12/12/2017, 1, Grupo 1,

              Maria, 14/12/2017, 1, Grupo 1,

              Maria, 14/12/2017, 1, Grupo 2,

              Maria, 14/12/2017, 0, ,

              Maria, 15/12/2017, 1, Grupo 1,

              Ana, 15/12/2017, 1, Grupo 1,

              Ana, 16/12/2017, 1, Grupo 1,

              Ana, 17/12/2017, 0, ,

              Ana, 18/12/2017, 1, Grupo 2

             

          ];

           

          FINAL:

          LOAD

          IF(DIAS_PRODUCAO=0,Previous(GRUPO),GRUPO) AS GRUPO

          RESIDENT ORIGEM;

           

          LEFT JOIN(FINAL)

          LOAD

          DATE(MAX(DATA))  AS DATA_FIM,

              DATE(MIN(DATA)) AS DATA_INICIO,

              NOME,

              GRUPO

          RESIDENT ORIGEM GROUP BY NOME,GRUPO;

          DROP TABLE ORIGEM;

           

           

          Tabela Final.PNG

            • Re: Socorro!
              Victória Gonçalves

              Thiago,

               

              Testei o Scrip aqui e ele quase deu certo.

               

              Poderia me explicar exatamente o que faz esse seu scrip. Estou começando a usar o Qlik agora, então estou bem no início.

               

              Ele está retornando a data de início e fim literalmente de todos os grupos.

               

              Por exemplo, se alguém não trabalhou em algum dia em um determinado grupo, mas no dia seguinte voltou a trabalhar no mesmo grupo, teria que haver uma pausa ai. Como se cada vez que aparecesse um 0, também fosse um determinante para anotar a data de Início e Fim para aquele nome e aquele grupo.

               

               

              Além disso, existe outra variável que também deve ser considerada d mesmo jeito, que é o porte (P,M,G) e caso mude o porte também, deve ser anotado a Data de Início e Fim, esse porte deve ser adicionado a minha nova tabela.

               

              Saberia me ajudar novamente?

               

               

              Muito obrigada pela ajuda!

                • Re: Socorro!
                  Thiago das Chagas cunha

                  Ola...Eu ja ajudei alguem com caso semelhante entao que voce consegue ajustar e usar

                   

                  Modelagem no cálculo do tempo de indisponibilidade.

                    • Re: Socorro!
                      Victória Gonçalves

                      Ola Thiago,

                       

                      Não consegui abrir seu scrip nesse post.

                       

                      Será que poderia me enviar?

                      Estou precisando resolver esse problema urgentemente.

                       

                      Obrigada pela ajuda!

                        • Re: Socorro!
                          Thiago das Chagas cunha
                          
                          
                          
                          
                          
                          

                           

                           

                           

                          Segue :

                           

                          acho que isso deve te ajudar se voce precisa colocar mias parametros para definir voce so precisa adicionar no Load do MIn e do max e no order by o trque esta no Order By

                           

                          se quiser as folgas junto, eu aconselho 2 coisas:

                           

                          repetir esse codigo com Dias producao = 0

                           

                          Ou que acho melhor , colocar o dias de producao no Load e no Order by e claro no load da tabela modelada

                           

                           

                           

                           

                           

                          
                          
                          /************************************************************************/
                          //
                          
                          
                          
                          
                          /************************************************************************/
                          // 1 - Faco a leitura da Base Nao modelada
                          /************************************************************************/
                          Base_Modelada:
                          LOAD * INLINE [
                          Nome, Dia, Dias de Produção, Grupo
                          João, 12/12/2017, 1, Grupo 1
                          João, 12/12/2017, 0, -
                          João, 13/12/2017, 1, Grupo 1
                          João, 13/12/2017, 1, Grupo 1
                          João, 14/12/2017, 1, Grupo 2
                          Maria, 12/12/2017, 0, -
                          Maria, 12/12/2017, 1, Grupo 1
                          Maria, 14/12/2017, 1, Grupo 1
                          Maria, 14/12/2017, 1, Grupo 2
                          Maria, 14/12/2017, 0, -
                          Maria, 15/12/2017, 1, Grupo 1
                          Ana, 15/12/2017, 1, Grupo 1
                          Ana, 16/12/2017, 1, Grupo 1
                          Ana, 17/12/2017, 0, -
                          Ana, 18/12/2017, 1, Grupo 2
                          ];
                          
                          
                          /************************************************************************/
                          // 2 - Descobrir qual e o menor Data por grupo por pessoa 
                          //  
                          /************************************************************************/
                          Min_Data_Por_status:
                          LOAD
                          Min(Dia)  as  MinDtSituacaoPerDay,
                          Grupo,
                          Nome
                          Resident Base_Modelada
                          Where [Dias de Produção] = 1
                          Group By 
                          Grupo,
                          Nome
                          ;
                          
                          
                          
                          
                          
                          
                          /************************************************************************/
                          // 3 - Descobrir qual e o maior horario por Equipamento 
                          //    e e por Status
                          /************************************************************************/
                          
                          
                          
                          
                          Max_Data_Por_status:
                          LOAD
                          Max(Dia)   as  MaxDtSituacaoPerDay,
                          Grupo,
                          Nome
                          Resident Base_Modelada
                          Where   [Dias de Produção] = 1
                          Group By 
                          Grupo,
                          Nome
                          ;
                          
                          
                          
                          
                          
                          /************************************************************************/
                          // 4 -  Crio uma tabela somente com Status e ATM para fazer
                          //      a modelagem final
                          /************************************************************************/
                          
                          
                          
                          
                          BaseModeladaFinal:
                          NoConcatenate
                          LOAD Distinct
                          Nome,
                          Grupo
                          Resident Base_Modelada
                          ;
                          
                          
                          
                          DROP Table Base_Modelada;
                          
                          
                          
                          
                          
                          
                          /************************************************************************/
                          // 5 -  Faco o Join  para tabela somente na tabela com status
                          //      assim trago o menor para a tabela final
                          /************************************************************************/
                          
                          
                          Left Join (BaseModeladaFinal)
                          LOAD 
                          Nome,
                          Grupo,
                          MinDtSituacaoPerDay as DtInicialStatus
                          Resident Min_Data_Por_status;
                          
                          
                          
                          
                          DROP Table  Min_Data_Por_status;
                          
                          
                          
                          
                          
                          
                          /************************************************************************/
                          // 6 -  Faco o Join  para tabela somente na tabela com status
                          //      assim trago o maior para a tabela final
                          /************************************************************************/
                          
                          
                          Left Join(BaseModeladaFinal)
                          LOAD
                          Nome,
                          Grupo,
                          MaxDtSituacaoPerDay as DtFinalStatus
                          Resident Max_Data_Por_status
                          ;
                          
                          
                          
                          
                          
                          DROP Table  Max_Data_Por_status;
                          
                          1 - Faco a leitura da Base Nao modelada
                          
                          
                          
                            • Re: Socorro!
                              Thiago das Chagas cunha

                              Com as folgas ficaria assim

                               

                               

                               

                              
                              
                              
                              
                              /************************************************************************/
                              // 1 - Faco a leitura da Base Nao modelada
                              /************************************************************************/
                              Base_Modelada:
                              LOAD * INLINE [
                              Nome, Dia, Dias de Produção, Grupo
                              João, 12/12/2017, 1, Grupo 1
                              João, 12/12/2017, 0, -
                              João, 13/12/2017, 1, Grupo 1
                              João, 13/12/2017, 1, Grupo 1
                              João, 14/12/2017, 1, Grupo 2
                              Maria, 12/12/2017, 0, -
                              Maria, 12/12/2017, 1, Grupo 1
                              Maria, 14/12/2017, 1, Grupo 1
                              Maria, 14/12/2017, 1, Grupo 2
                              Maria, 14/12/2017, 0, -
                              Maria, 15/12/2017, 1, Grupo 1
                              Ana, 15/12/2017, 1, Grupo 1
                              Ana, 16/12/2017, 1, Grupo 1
                              Ana, 17/12/2017, 0, -
                              Ana, 18/12/2017, 1, Grupo 2
                              ];
                              
                              
                              /************************************************************************/
                              // 2 - Descobrir qual e o menor Data por grupo por pessoa 
                              //  
                              /************************************************************************/
                              Min_Data_Por_status:
                              LOAD
                              Min(Dia)  as  MinDtSituacaoPerDay,
                              Grupo,
                              Nome,
                                [Dias de Produção]
                              Resident Base_Modelada
                              Group By 
                              Grupo,
                              Nome,
                              [Dias de Produção]
                              ;
                              
                              
                              
                              
                              
                              
                              /************************************************************************/
                              // 3 - Descobrir qual e o maior horario por Equipamento 
                              //    e e por Status
                              /************************************************************************/
                              
                              
                              
                              
                              Max_Data_Por_status:
                              LOAD
                              Max(Dia)   as  MaxDtSituacaoPerDay,
                              Grupo,
                              Nome,
                              [Dias de Produção]
                              Resident Base_Modelada
                              Group By 
                              Grupo,
                              Nome,
                              [Dias de Produção]
                              ;
                              
                              
                              
                              
                              
                              /************************************************************************/
                              // 4 -  Crio uma tabela somente com Status e ATM para fazer
                              //      a modelagem final
                              /************************************************************************/
                              
                              
                              
                              
                              BaseModeladaFinal:
                              NoConcatenate
                              LOAD Distinct
                              Nome,
                              Grupo
                              Resident Base_Modelada
                              ;
                              
                              
                              
                              DROP Table Base_Modelada;
                              
                              
                              
                              
                              
                              
                              /************************************************************************/
                              // 5 -  Faco o Join  para tabela somente na tabela com status
                              //      assim trago o menor para a tabela final
                              /************************************************************************/
                              
                              
                              Left Join (BaseModeladaFinal)
                              LOAD 
                              Nome,
                              Grupo,
                                 [Dias de Produção],
                              MinDtSituacaoPerDay as DtInicialStatus
                              Resident Min_Data_Por_status;
                              
                              
                              
                              
                              DROP Table  Min_Data_Por_status;
                              
                              
                              
                              
                              
                              
                              /************************************************************************/
                              // 6 -  Faco o Join  para tabela somente na tabela com status
                              //      assim trago o maior para a tabela final
                              /************************************************************************/
                              
                              
                              Left Join(BaseModeladaFinal)
                              LOAD
                              Nome,
                              Grupo,
                                 [Dias de Produção],
                              MaxDtSituacaoPerDay as DtFinalStatus
                              Resident Max_Data_Por_status
                              ;
                              
                              
                              
                              
                              
                              DROP Table  Max_Data_Por_status;
                              
                              
                              Ajustado:
                              LOAD
                              *,
                              if( len(Grupo) <  2 , 'Folga','Trabalhado') as Status
                              Resident BaseModeladaFinal;
                              
                              
                              DROP Table BaseModeladaFinal;
                              
                              
                                • Re: Socorro!
                                  Victória Gonçalves

                                  Thiago,

                                   

                                  Eu não entendi, onde no scrip ele vai estar diferenciando todas as vezes que mudar de grupo.

                                   

                                  Meu scrip verdadeiro é esse:

                                   

                                  [Geral]:

                                  LOAD

                                      %MagistradoID,

                                      Dia,

                                      date(Dia,'DD/MM/YYYY') AS DT,

                                       "Dias Afastdo/Designado",

                                      "Dias Produtividade (Acumulado)",

                                      "Dias Produtividade";

                                  FROM [Geral.qvd];

                                  left Join

                                  [Magistrados]:

                                  LOAD

                                      %MagistradoID,

                                      "Matrícula (Magistrado)",

                                      "Sexo (Magistrado)",

                                      Magistrado

                                  FROM [Magistrados.qvd]

                                  (qvd);

                                  left Join

                                  [Magistrado-Orgao]:

                                  LOAD

                                      %MagistradoID,

                                      Dia,

                                      "%Órgão JulgadorID",

                                      %FunçãoID

                                  FROM Magistrado-Orgao.qvd]

                                  (qvd);

                                  left Join

                                  [Orgao-Julgadores]:

                                  LOAD

                                      "%Órgão JulgadorID",

                                      Instância,

                                      Entrância,

                                      "Região da Corregedoria",

                                      Comarca,

                                      "Órgão Julgador",

                                      "Tipo de Justiça",

                                      "Especialidade (Órgão Julgador)",

                                      "Natureza (Órgão Julgador)",

                                      Cluster,

                                      Porte,

                                      "Data de Início da Vigência",

                                      "Data de Fim da Vigência"

                                  FROM [Orgaos-Julgadores.qvd]

                                  (qvd);

                                   

                                   

                                  E eu Preciso no Final uma tabela que me fale o Magistrado, Data de ínico e dia de Fim de trabalho, no Cluster e por Porte. Isso para todos os dias de trabalho, que são os dias de produtividade igual a 1. E caso haja uma folga no período, tem que ser interrompido. Como se começasse a contar de novo.

                                  Ou seja, toda vez que mudar o Magistrado, ou o Cluster ou o Porte, ou fosse um dia de folga, teria que ser a data fim. Mesmo que fosse o mesmo Magistrado.

                                   

                                  Conseguiu entender mais ou menos.

                                   

                                  Como sou nova no qlik sense, ainda é um bastante complexo para mim.

                                   

                                  Vou tentar ajustar seu scip.

                                   

                                  Muito Obrigada!

                                    • Re: Socorro!
                                      Thiago das Chagas cunha

                                      entao eu uso na verdade o Meu Max e min por dia, ele agrupado por Grupo vai pegar sempre

                                       

                                      Menor data  + Grupo

                                      se a pessoa muda de grupo vou pegar sisso, voce noa consegue me passa uma amostra de dados mais real ? com tudo, para que eu possa  monta pra ti melhor o codigo, pq teoricamente depois de fazer toda essa uniao ai  aplicaria meu script e calcularia , noa precisa ser muito registro so umas 10 a 15 linhas eu consigo fazer aqui rapidim

                                        • Re: Socorro!
                                          Victória Gonçalves

                                          Os meus registros seriam basicamente esses, peguei genericamente, porque são milhares:

                                           

                                              

                                          NomeDiaDias ProdutividadeGrupoPorte
                                          Maria29/08/20161Grupo 1M
                                          Maria30/08/20161Grupo 1M
                                          Maria31/01/20171Grupo 1M
                                          Maria31/01/20171Grupo 2M
                                          Maria02/02/20171Grupo 3P
                                          Maria03/03/20171Grupo 3P
                                          Maria04/03/20170Grupo 3P
                                          Maria05/03/20171Grupo 3P
                                          Maria05/03/20171Grupo 3G
                                          Maria06/03/20171Grupo 3G
                                          João07/03/20171Grupo 3G
                                          João08/03/20170Grupo 4G
                                          João09/03/20171Grupo 3G
                                          João09/03/20171Grupo 3M

                                           

                                           

                                          No fim a tabela teria que vim assim, observa-se que quando a pessoa tem folga, é como se parasse e contasse novamente uma data de início e fim.

                                           

                                             

                                          NomeDia InicioDia FimGrupoPorte
                                          Maria29/08/201631/01/2017Grupo 1M
                                          Maria31/01/201731/01/2017Grupo 2M
                                          Maria02/02/201703/03/2017Grupo 3P
                                          Maria05/03/201705/03/2017Grupo 3P
                                          Maria05/03/201706/03/2017Grupo 3G
                                          João07/03/201707/03/2017Grupo 3G
                                          João09/03/201709/03/2017Grupo 3G
                                          João09/03/201709/03/2017Grupo 3

                                          M

                                           

                                          Conseguiu entender?

                                          Você não sabe o quanto está me ajudando.

                                           

                                          Muito obrigada. Todas desta comunidade são muito solícitos!

                                            • Re: Socorro!
                                              Thiago Justen Teixeira

                                              A resposta do Thiago das Chagas me parece o que você. Testei o script e funcionou conforme a descrição da sua necessidade.

                                              • Re: Socorro!
                                                Thiago das Chagas cunha

                                                Bom Dia

                                                 

                                                 

                                                e que como estou em outro pais fuso e diferente, mas vamos la o codigo que tu precisa

                                                a unica diferenca que voce vai ver e do dia 04/04 que deixei como folga , se tu quiser quando a pessoa nao trabalhou, caso contrario voce filtra somente os trabalhados

                                                /************************************************************************/
                                                // 1 - Faco a leitura da Base Nao modelada
                                                /************************************************************************/
                                                Base_Modelada:
                                                LOAD * INLINE [
                                                Nome , Dia , Dias Produtividade , Grupo , Porte
                                                Maria , 29/08/2016 , 1 , Grupo 1 , M
                                                Maria , 30/08/2016 , 1 , Grupo 1 , M
                                                Maria , 31/01/2017 , 1 , Grupo 1 , M
                                                Maria , 31/01/2017 , 1 , Grupo 2 , M
                                                Maria , 02/02/2017 , 1 , Grupo 3 , P
                                                Maria , 03/03/2017 , 1 , Grupo 3 , P
                                                Maria , 04/03/2017 , 0 , Grupo 3 , P
                                                Maria , 05/03/2017 , 1 , Grupo 3 , P
                                                Maria , 05/03/2017 , 1 , Grupo 3 , G
                                                Maria , 06/03/2017 , 1 , Grupo 3 , G
                                                João , 07/03/2017 , 1 , Grupo 3 , G
                                                João , 08/03/2017 , 0 , Grupo 4 , G
                                                João , 09/03/2017 , 1 , Grupo 3 , G
                                                João , 09/03/2017 , 1 , Grupo 3 , M
                                                
                                                
                                                ];
                                                
                                                
                                                /************************************************************************/
                                                // 2 - Descobrir qual e o menor Data por grupo por pessoa
                                                // 
                                                /************************************************************************/
                                                Min_Data_Por_status:
                                                LOAD
                                                Min(Dia)  as  MinDtSituacaoPerDay,
                                                Grupo,
                                                Nome,
                                                [Dias Produtividade],
                                                Porte
                                                Resident Base_Modelada
                                                Group By
                                                Grupo,
                                                Nome,
                                                [Dias Produtividade],
                                                Porte
                                                ;
                                                
                                                
                                                
                                                
                                                
                                                
                                                /************************************************************************/
                                                // 3 - Descobrir qual e o maior horario por Equipamento
                                                //    e e por Status
                                                /************************************************************************/
                                                
                                                
                                                
                                                
                                                Max_Data_Por_status:
                                                LOAD
                                                Max(Dia)   as  MaxDtSituacaoPerDay,
                                                Grupo,
                                                Nome,
                                                [Dias Produtividade],
                                                Porte
                                                Resident Base_Modelada
                                                Group By
                                                Grupo,
                                                Nome,
                                                [Dias Produtividade],
                                                Porte
                                                ;
                                                
                                                
                                                
                                                
                                                
                                                /************************************************************************/
                                                // 4 -  Crio uma tabela somente com Status e ATM para fazer
                                                //      a modelagem final
                                                /************************************************************************/
                                                
                                                
                                                
                                                
                                                BaseModeladaFinal:
                                                NoConcatenate
                                                LOAD Distinct
                                                Nome,
                                                Grupo,
                                                Porte
                                                Resident Base_Modelada
                                                ;
                                                
                                                
                                                
                                                DROP Table Base_Modelada;
                                                
                                                
                                                
                                                
                                                
                                                
                                                /************************************************************************/
                                                // 5 -  Faco o Join  para tabela somente na tabela com status
                                                //      assim trago o menor para a tabela final
                                                /************************************************************************/
                                                
                                                
                                                Left Join (BaseModeladaFinal)
                                                LOAD
                                                  Grupo,
                                                Nome,
                                                [Dias Produtividade],
                                                Porte,
                                                MinDtSituacaoPerDay as DtInicialStatus
                                                Resident Min_Data_Por_status;
                                                
                                                
                                                
                                                
                                                DROP Table  Min_Data_Por_status;
                                                
                                                
                                                
                                                
                                                
                                                
                                                /************************************************************************/
                                                // 6 -  Faco o Join  para tabela somente na tabela com status
                                                //      assim trago o maior para a tabela final
                                                /************************************************************************/
                                                
                                                
                                                Left Join(BaseModeladaFinal)
                                                LOAD
                                                  Grupo,
                                                Nome,
                                                [Dias Produtividade],
                                                Porte,
                                                MaxDtSituacaoPerDay as DtFinalStatus
                                                Resident Max_Data_Por_status
                                                ;
                                                
                                                
                                                
                                                
                                                
                                                DROP Table  Max_Data_Por_status;
                                                
                                                
                                                Ajustado:
                                                LOAD
                                                *,
                                                if( [Dias Produtividade]  = 0 , 'Folga','Trabalhado') as Status
                                                Resident BaseModeladaFinal;
                                                
                                                
                                                DROP Table BaseModeladaFinal;
                                                
                                                
                                                

                                                 

                                                 

                                                 

                                                Resultado :

                                                 

                                                Nome Grupo DtInicialStatus DtFinalStatus Status Porte
                                                MariaGrupo 129/08/201631/01/2017TrabalhadoM
                                                MariaGrupo 231/01/201731/01/2017TrabalhadoM
                                                MariaGrupo 304/03/201704/03/2017FolgaP
                                                MariaGrupo 302/02/201705/03/2017TrabalhadoP
                                                MariaGrupo 305/03/201706/03/2017TrabalhadoG
                                                JoãoGrupo 307/03/201709/03/2017TrabalhadoG
                                                JoãoGrupo 309/03/201709/03/2017TrabalhadoM
                                                JoãoGrupo 408/03/201708/03/2017FolgaG
                                                  • Re: Socorro!
                                                    Victória Gonçalves

                                                    Oi Thiago,

                                                    Bom dia!

                                                     

                                                    é que nesse Scrip ainda encontro o problema que não está descontando o dia da folga.

                                                    Por exemplo. A maria folgou fia 04/03/2017 no grupo 3, porte P.

                                                     

                                                    Então eu precisava que esse dia não fosse contato período de tempo nessa tabela. Porque depois eu vou precisar desses dias para fazer contas. Ai por exemplo, pra Maria, no grupo 3 no porte 3 ela trabalhou 3 dias.

                                                    De acordo com essa tabela olhando DtInicialStatus e DtFinalStatus ele trabalhou 4 dias.

                                                     

                                                    Por isso, a tabela dos dias trabalhados tinha que ficar assim:

                                                     

                                                    NomeDia InicioDia FimGrupoPorte
                                                    Maria29/08/201631/01/2017Grupo 1M
                                                    Maria31/01/201731/01/2017Grupo 2M
                                                    Maria02/02/201703/03/2017Grupo 3P
                                                    Maria05/03/201705/03/2017Grupo 3P
                                                    Maria05/03/201706/03/2017Grupo 3G
                                                    João07/03/201707/03/2017Grupo 3G
                                                    João09/03/201709/03/2017Grupo 3G
                                                    João09/03/201709/03/2017Grupo 3

                                                    M

                                                     

                                                     

                                                    Consigo fazer isso?

                                                     

                                                     

                                                    Muito obrigada!

                                                    • Re: Socorro!
                                                      Victória Gonçalves

                                                      Oi srchagas, boa tarde!

                                                       

                                                      Desculpa o incomodo, seu scrip foi bastante útil.

                                                      Mas ainda não consegui resolver um detalhe, como descrevi abaixo.

                                                      E não faço ideia de como fazer isso. Será que conseguiria me ajudar?

                                                       

                                                      Desde já, fico completamente agradecida pela atenção!

                                  • Re: Socorro!
                                    Thiago Justen Teixeira

                                    Victória,

                                     

                                    Não deixe de marcar como resposta correta se isso te ajudou.

                                     

                                    Abraços e sucesso!!

                                    Thiago

                                    • Re: Socorro!
                                      Victória Gonçalves

                                      Não sei se descrevi bem o meu problema, mas é como se precisasse fazer um loop e cada vez que mudasse ou o nome, ou data, ou o grupo ou o porte ou mudasse de 0 para 1 e vice versa (o que ainda não consegui encaixar nesses scrips acima).

                                      Precisaria parar e registrar aquele nome, aquele data de fim, aquele grupo e aquele porte. E assim Sucessivamente. Começaria anotando o próximo nome, o próximo grupo, a data, o próximo porte, até que alguma dessas variáveis mudasse novamente. E assim sucessivamente, até o fim dos meus dados. Formando uma tabela que exemplifiquei acima.

                                       

                                      Alguém conseguiria me ajudar?

                                        • Re: Socorro!
                                          Thiago das Chagas cunha

                                          Meu script faz isso , ele marca todas as mudanças de grupo pq ele simplesmente verifica as maiores e menores entrada da pessoa por dia e por grupo

                                          Então a se a pessoa muda de grupo funciona o que não entendi é o que está faltando aí sinceridade

                                            • Re: Socorro!
                                              Victória Gonçalves

                                              Oi Thiago,

                                               

                                              Rodei o seu scrip e ele me deu exatamente essa tabela:

                                               

                                               

                                              NomeDtInicialStatusDtFinalStatusGrupoPorteStatus
                                              João07/03/201709/03/2017Grupo 3GTrabalhado
                                              João09/03/201709/03/2017Grupo 3MTrabalhado
                                              João08/03/201708/03/2017Grupo 4GFolga
                                              Maria29/08/201631/01/2017Grupo 1MTrabalhado
                                              Maria31/01/201731/01/2017Grupo 2MTrabalhado
                                              Maria04/03/201704/03/2017Grupo 3PFolga
                                              Maria02/02/201705/03/2017Grupo 3PTrabalhado
                                              Maria05/03/201706/03/2017Grupo 3GTrabalhado

                                               

                                               

                                              Vamos pegar o exemplo da MARIA No grupo 3 P. Ela trabalho no dia 2,3. Folgou dia 4 e voltou trabalhar dia 5.

                                              Eu sei que nesta tabela eu tenho que ela folgou dia 4. Mas pelo data de Iniíco e de Fim do Grupo 3 P, é como se ela tivesse iniciado dia 2 e terminado dia 5.

                                              Filtrando somente o status trabalhado é Como se ela tivesse trabalhado  4 dias, quando na verdade trabalhou apenas 3.

                                              Eu precisaria que esse grupo 3 P fosse dividido em 2. Eu nem preciso saber o dia que ela folgou. Mas precisaria para esse exemplo que a Maria no grupo 3 P tivesse dois registro para os dias trabalhados:

                                               

                                              Maria02/02/201703/03/2017Grupo 3P
                                              Maria05/03/201705/03/2017Grupo 3P

                                               

                                               

                                              Entendeu?

                                               

                                              Como se cada dia de folga também fosse um pausa. Ou seja, um  mesmo grupo, de uma mesa pessoa, de um mesmo porte, teria mais de um registro na tabela caso tivesse uma folga no período.

                                               

                                              Para esses dados eu precisaria uma tabela de dias trabalhados final assim (essa tabela so tem os dias trabalhados):

                                               

                                              NomeDia InicioDia FimGrupoPorte
                                              Maria29/08/201631/01/2017Grupo 1M
                                              Maria31/01/201731/01/2017Grupo 2M
                                              Maria02/02/201703/03/2017Grupo 3P
                                              Maria05/03/201705/03/2017Grupo 3P
                                              Maria05/03/201706/03/2017Grupo 3G
                                              João07/03/201707/03/2017Grupo 3G
                                              João09/03/201709/03/2017Grupo 3G
                                              João09/03/201709/03/2017Grupo 3

                                              M

                                               

                                              Não sei se conseguir transmitir bem a minha idéia. rsrs

                                              Mas Será que é possível fazer isso no qlik?

                                               

                                              Muito Obrigada por tentar me ajudar srchagas!

                                                • Re: Socorro!
                                                  Thiago das Chagas cunha

                                                  Bom tardei

                                                   

                                                  mas acho que agora foi....

                                                   

                                                  Basicamente e o mesmo script com algumas melhoras no final

                                                  Minha logica:

                                                  O problema esta que  ele pelo flag de dias trabalhados esta fazendo o que deveria o que eu precisa fazer a descobrir qual e o registro que esta errado ( porque tem o dia trabalho, depois vem a folga, logo se eu descobrir qual e o registro da folga, eu consigo acha o registro que a data deve ser alterar , que seria no caso o antecessor ao registro da folga), sempre que for o mesmo grupo, mesmo porte e a data final do registro a cima for maior que atual (porque noa faz sentindo, porque eu ordei por data) significa que esse registro a cima precisa ser alterado.

                                                   

                                                  Obs Importante: Meu calendario daqui e de Segunda a Sexta (estou fora do brasil, por isso e calendario diferente no brasil e domingo a sexta), entao no if troca para 7 e 1

                                                   

                                                   

                                                   

                                                  
                                                  
                                                  
                                                  
                                                  /************************************************************************/
                                                  // 1 - Faco a leitura da Base Nao modelada
                                                  /************************************************************************/
                                                  Base_Modelada:
                                                  LOAD * INLINE [
                                                  Nome , Dia , Dias Produtividade , Grupo , Porte
                                                  Maria , 29/08/2016 , 1 , Grupo 1 , M
                                                  Maria , 30/08/2016 , 1 , Grupo 1 , M
                                                  Maria , 31/01/2017 , 1 , Grupo 1 , M
                                                  Maria , 31/01/2017 , 1 , Grupo 2 , M
                                                  Maria , 02/02/2017 , 1 , Grupo 3 , P
                                                  Maria , 03/03/2017 , 1 , Grupo 3 , P
                                                  Maria , 04/03/2017 , 0 , Grupo 3 , P
                                                  Maria , 05/03/2017 , 1 , Grupo 3 , P
                                                  Maria , 05/03/2017 , 1 , Grupo 3 , G
                                                  Maria , 06/03/2017 , 1 , Grupo 3 , G
                                                  João , 07/03/2017 , 1 , Grupo 3 , G
                                                  João , 08/03/2017 , 0 , Grupo 4 , G
                                                  João , 09/03/2017 , 1 , Grupo 3 , G
                                                  João , 09/03/2017 , 1 , Grupo 3 , M
                                                  
                                                  
                                                  ];
                                                  
                                                  
                                                  /************************************************************************/
                                                  // 2 - Descobrir qual e o menor Data por grupo por pessoa
                                                  // 
                                                  /************************************************************************/
                                                  Min_Data_Por_status:
                                                  LOAD
                                                  Min(Dia)  as  MinDtSituacaoPerDay,
                                                  Grupo,
                                                  Nome,
                                                  Porte,
                                                    [Dias Produtividade]
                                                  Resident Base_Modelada
                                                  Group By
                                                  Grupo,
                                                  Nome,
                                                  Porte,
                                                  [Dias Produtividade]
                                                  ;
                                                  
                                                  
                                                  /************************************************************************/
                                                  // 3 - Descobrir qual e o maior horario por Equipamento
                                                  //    e e por Status
                                                  /************************************************************************/
                                                  
                                                  
                                                  Max_Data_Por_status:
                                                  LOAD
                                                  Max(Dia)   as  MaxDtSituacaoPerDay,
                                                  Grupo,
                                                  Nome,
                                                  Porte,
                                                    [Dias Produtividade]
                                                  Resident Base_Modelada
                                                  Group By
                                                  Grupo,
                                                  Nome,
                                                  Porte,
                                                  [Dias Produtividade]
                                                  ;
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  /************************************************************************/
                                                  // 4 -  Crio uma tabela somente com Status e ATM para fazer
                                                  //      a modelagem final
                                                  /************************************************************************/
                                                  
                                                  
                                                  
                                                  
                                                  BaseModeladaFinal:
                                                  NoConcatenate
                                                  LOAD Distinct
                                                  Nome,
                                                  Grupo,
                                                  Porte
                                                  Resident Base_Modelada
                                                  ;
                                                  
                                                  
                                                  
                                                  DROP Table Base_Modelada;
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  /************************************************************************/
                                                  // 5 -  Faco o Join  para tabela somente na tabela com status
                                                  //      assim trago o menor para a tabela final
                                                  /************************************************************************/
                                                  
                                                  
                                                  Left Join (BaseModeladaFinal)
                                                  LOAD
                                                    Grupo,
                                                  Nome,
                                                  Porte,
                                                  MinDtSituacaoPerDay as DtInicialStatus,
                                                  [Dias Produtividade]
                                                  Resident Min_Data_Por_status;
                                                  
                                                  
                                                  
                                                  
                                                  DROP Table  Min_Data_Por_status;
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  /************************************************************************/
                                                  // 6 -  Faco o Join  para tabela somente na tabela com status
                                                  //      assim trago o maior para a tabela final
                                                  /************************************************************************/
                                                  
                                                  
                                                  Left Join(BaseModeladaFinal)
                                                  LOAD
                                                    Grupo,
                                                  Nome,
                                                  Porte,
                                                  MaxDtSituacaoPerDay as DtFinalStatus,
                                                  [Dias Produtividade]
                                                  Resident Max_Data_Por_status
                                                  ;
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  DROP Table  Max_Data_Por_status;
                                                  /**************************************************************/
                                                  //Descobrindo o registro que esta com problema e arruma
                                                  /**************************************************************/
                                                  Ajustado:
                                                  NoConcatenate
                                                  LOAD Distinct
                                                  RowNo() as Seq,
                                                  *,
                                                  if(Previous(Grupo) = Grupo  and
                                                  Previous(Porte) = Porte     and
                                                  Previous(DtFinalStatus) >  DtFinalStatus , 1 ,0) as [Flag Divergencia Data],
                                                  if(Previous(Grupo) = Grupo  and
                                                     Previous(Porte) = Porte   and
                                                  Previous(DtFinalStatus) >  DtFinalStatus , Num(DtFinalStatus)-1, Null())   as [Data Final Corrigida],
                                                  if( [Dias Produtividade]  = 0 , 'Folga','Trabalhado') as Status
                                                  Resident BaseModeladaFinal
                                                  order by DtInicialStatus , Nome, Grupo , Porte;
                                                  
                                                  
                                                  DROP Table BaseModeladaFinal;
                                                  
                                                  
                                                  
                                                  
                                                  /**********************************************************************/
                                                  //Mapping Cara corrigidr a data
                                                  /**********************************************************************/
                                                  
                                                  
                                                  
                                                  
                                                  //Obs: o If aqui e para garantir que sempre vai jogar para sexta feira, tire se achar necessario.
                                                  MappingCorrecao:
                                                  mapping
                                                  LOAD
                                                  Previous(Seq) as SeqCorrigido,
                                                  if(Num(WeekDay([Data Final Corrigida])) = 7  , [Data Final Corrigida] -1,
                                                  if(Num(WeekDay([Data Final Corrigida])) = 1  ,[Data Final Corrigida]-2, [Data Final Corrigida] )
                                                  ) as  [Data Final Corrigida]
                                                  Resident Ajustado
                                                  Where [Flag Divergencia Data] = 1
                                                  ;
                                                  
                                                  
                                                  
                                                  
                                                  DROP Field [Flag Divergencia Data],  [Data Final Corrigida] from Ajustado;
                                                  
                                                  
                                                  
                                                  
                                                  /***********************************************/
                                                  //Base Final
                                                  /***********************************************/
                                                  BaseConsolidada:
                                                  NoConcatenate
                                                  LOAD
                                                  Grupo,
                                                  Nome,
                                                  Porte,
                                                  DtInicialStatus,
                                                  [Dias Produtividade],
                                                  Status,
                                                  ApplyMap('MappingCorrecao',Seq,DtFinalStatus) as DtFinalStatus
                                                  Resident Ajustado 
                                                  ;
                                                  
                                                  
                                                  
                                                  
                                                  DROP Table Ajustado;
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  

                                                   

                                                   

                                                   

                                                  fica assim:

                                                   

                                                  Nome Dias Produtividade Grupo Porte DtInicialStatus DtFinalStatus Status
                                                  Maria1Grupo 1M29/08/201631/01/2017Trabalhado
                                                  Maria1Grupo 2M31/01/201731/01/2017Trabalhado
                                                  Maria1Grupo 3P02/02/201703/03/2017Trabalhado
                                                  Maria0Grupo 3P04/03/201704/03/2017Folga
                                                  Maria1Grupo 3G05/03/201706/03/2017Trabalhado
                                                    • Re: Socorro!
                                                      Victória Gonçalves

                                                      Thiago,

                                                       

                                                      Entendi o que você fez, ainda não rodei o meu scrip mas pela sua tabela final, ainda sim, falta o dia 05/03/2017 trabalhado da Maria no grupo 3 no Porte P.

                                                      Pelo que estou visualizando pulou para o Grupo 3 Porte G, Que a Maria também trabalhou no dia 05/03/2017.

                                                      Certo?

                                                       

                                                      Tem como ajustar o script?

                                                       

                                                      Eu não entendi essa parte de mudar para 7 e 1 o IF, já não esta com 7 e 1?

                                                      Talvez não seria 0 e 6?

                                                      Não entendi essa parte!

                                                        • Re: Socorro!
                                                          Thiago das Chagas cunha

                                                          Entendi.

                                                           

                                                          Sim seria 0 e 6 ...desculpe, voce vai ver que tem um IF para verificar se final de semana para jogar na sexta no Mapping. Nesse cara altera para 0 e 6

                                                          Ela trabalhou nos dois Portes?Nao tinha percebido isso, desculpe.

                                                          Porque na verdade onde estava Dia 05/03 foi transformado em 3.

                                                          Vai ficar  para P sera 05/03 a 05/03 e G 05/03 ate 06/03 , mas e isso mesmo ?
                                                          Se for faz o seguinte:

                                                           

                                                          remove isso do codigo:


                                                          DROP Field [Flag Divergencia Data],  [Data Final Corrigida] from Ajustado;

                                                           

                                                          E adiciona isso depois da Tabela "BaseConsolidada"

                                                           

                                                          /***********************************************/
                                                          // Ajuste: Quando a pessoa trabalha em dois Porte no mesmo dia Ajustaremos os dados
                                                          //Obs: Colocarei que a pessoa entrou e saiu no mesmo dia, porque ela pode ter finalizado em outro porte.
                                                          /***********************************************/
                                                          
                                                          
                                                          Concatenate
                                                          LOAD
                                                               Previous(Grupo)                          as Grupo,
                                                               Previous(Nome)                           as Nome,
                                                               Previous(Porte)                          as Porte,
                                                               Previous(DtFinalStatus)                  as DtFinalStatus,
                                                               Previous(DtFinalStatus)                  as DtInicialStatus,
                                                               Previous([Dias Produtividade])           as [Dias Produtividade] ,
                                                               Previous(Status)                         as Status
                                                          Resident Ajustado
                                                          Where
                                                          [Flag Divergencia Data] = 1;
                                                          
                                                          
                                                          
                                                          
                                                          DROP Table Ajustado;
                                                          
                                                          
                                                          
                                                          
                                                          
                                                          
                                                          

                                                           

                                                           

                                                           

                                                           

                                                          Teoricamente fica assim

                                                           

                                                          Nome Dias Produtividade Grupo Porte DtInicialStatus DtFinalStatus Status
                                                          Maria1Grupo 1M29/08/201631/01/2017Trabalhado
                                                          Maria1Grupo 2M31/01/201731/01/2017Trabalhado
                                                          Maria1Grupo 3P02/02/201703/03/2017Trabalhado
                                                          Maria0Grupo 3P04/03/201704/03/2017Folga
                                                          Maria1Grupo 3P05/03/201705/03/2017Trabalhado
                                                          Maria1Grupo 3G05/03/201706/03/2017Trabalhado
                                                            • Re: Socorro!
                                                              Victória Gonçalves

                                                              Oi Thiago,

                                                               

                                                              Rodei o esse script, que é um "genérico". Pois a minha base de dados é enorme e deu certinho o resultado da Maria.

                                                              Mas quando vou analisar o João, ainda encontro erro.

                                                              A tabela carregada é essa:

                                                              1. Nome , Dia , Dias Produtividade , Grupo , Porte 
                                                              2. Maria , 29/08/2016 , 1 , Grupo 1 , M 
                                                              3. Maria , 30/08/2016 , 1 , Grupo 1 , M 
                                                              4. Maria , 31/01/2017 , 1 , Grupo 1 , M 
                                                              5. Maria , 31/01/2017 , 1 , Grupo 2 , M 
                                                              6. Maria , 02/02/2017 , 1 , Grupo 3 , P 
                                                              7. Maria , 03/03/2017 , 1 , Grupo 3 , P 
                                                              8. Maria , 04/03/2017 , 0 , Grupo 3 , P 
                                                              9. Maria , 05/03/2017 , 1 , Grupo 3 , P 
                                                              10. Maria , 05/03/2017 , 1 , Grupo 3 , G 
                                                              11. Maria , 06/03/2017 , 1 , Grupo 3 , G 
                                                              12. João , 07/03/2017 , 1 , Grupo 3 , G 
                                                              13. João , 08/03/2017 , 0 , Grupo 4 , G 
                                                              14. João , 09/03/2017 , 1 , Grupo 3 , G 
                                                              15. João , 09/03/2017 , 1 , Grupo 3 , M   


                                                              Encontrei o seguinte resultado:


                                                               

                                                              NomeDtInicialStatusDtFinalStatusGrupoPorteStatus
                                                              Maria29/08/201631/01/2017Grupo 1MTrabalhado
                                                              Maria31/01/201731/01/2017Grupo 2MTrabalhado
                                                              Maria02/02/201703/03/2017Grupo 3PTrabalhado
                                                              Maria04/03/201704/03/2017Grupo 3PFolga
                                                              Maria05/03/201705/03/2017Grupo 3PTrabalhado
                                                              Maria05/03/201706/03/2017Grupo 3GTrabalhado
                                                              João07/03/201709/03/2017Grupo 3GTrabalhado
                                                              João09/03/201709/03/2017Grupo 3MTrabalhado
                                                              João08/03/201708/03/2017Grupo 4GFolga

                                                               

                                                               

                                                              O resultado do João continua errado. Como se ele estivesse desconsiderando a folga apesar de está registrando ela como sendo no dia 08/03 no Grupo 4 G. Mas em dias trabalhados ele ainda continua considerando do dia 07/03/2017 a 09/07/2017, quando tinha que ser considerado trabalhado no grupo 3 G na verdade:

                                                               

                                                              07/03/2017 a 07/03/2017 e depois 09/03/2017 a 09/03/2017..

                                                               

                                                              Acho que entendi a lógico que o Qlik fez. Como a folga está no grupo 4 G, é como se nada tivesse acontecido no grupo  3 G e ele tivesse trabalhando.

                                                              Mas acontece que como ele teve a folga e não tem dia trabalhado no dia 08/03/2017 no Grupo 3 G, provavelmente ele não veio trabalhar. Ou seja, sempre que houver uma folga independente do grupo que estiver alocada esta folga, caso não haja registro de dia trabalhado em outro grupo para esse dia de folga, é como se tivesse tido folga para todos os grupos, entende ?

                                                               

                                                              Como no caso do João descrito acima. Ou seja, filtrando somente os dias trabalhados teriam que ficar assim:

                                                               

                                                              NomeDia InicioDia FimGrupoPorte
                                                              Maria29/08/201631/01/2017Grupo 1M
                                                              Maria31/01/201731/01/2017Grupo 2M
                                                              Maria02/02/201703/03/2017Grupo 3P
                                                              Maria05/03/201705/03/2017Grupo 3P
                                                              Maria05/03/201706/03/2017Grupo 3G
                                                              João07/03/201707/03/2017Grupo 3G
                                                              João09/03/201709/03/2017Grupo 3G
                                                              João09/03/201709/03/2017Grupo 3

                                                              M

                                                               

                                                               

                                                              Teria como acrescentar isso no código?

                                                                • Re: Socorro!
                                                                  Thiago das Chagas cunha

                                                                  Ola

                                                                  Isso ta ficando interessante, rs

                                                                   

                                                                   

                                                                  Entendi

                                                                   

                                                                  So altera esse trecho do codigo :

                                                                   

                                                                  para atender essa regra mudei a forma de verificar o registro, entao so irei se o Nome do registro Atual for  = o Registro anterior

                                                                  e a Data Final Status for > que Data Final Status

                                                                   

                                                                  Ficou mais simples ate porque, nao faz sentindo se eu ordei pela data inicial que existe alguma data Final na como registro anterior superior a atual.

                                                                   

                                                                  Achava que a Gupo e Porte eram chaves forte, mas entendi que nao sao, entao ta beleza so pelo Nome e Data.

                                                                   

                                                                   

                                                                  Ajustado:
                                                                  NoConcatenate
                                                                  LOAD Distinct
                                                                  RowNo() as Seq,
                                                                  *,
                                                                  if( Previous(Nome) = Nome and
                                                                  Previous(DtFinalStatus) >  DtFinalStatus , 1 ,
                                                                  0) as [Flag Divergencia Data],
                                                                  if( Previous(Nome) = Nome and
                                                                  Previous(DtFinalStatus) >  DtFinalStatus , Num(DtFinalStatus)-1, Null())  as [Data Final Corrigida],
                                                                  if( [Dias Produtividade]  = 0 , 'Folga','Trabalhado') as Status
                                                                  Resident BaseModeladaFinal
                                                                  order by DtInicialStatus , Nome, Grupo , Porte;
                                                                  
                                                                  
                                                                  DROP Table BaseModeladaFinal;
                                                                  
                                                                  

                                                                   

                                                                   

                                                                   

                                                                  Resultado

                                                                  Nome Dias Produtividade Grupo Porte DtInicialStatus DtFinalStatus Status
                                                                  Maria1Grupo 1M29/08/201631/01/2017Trabalhado
                                                                  Maria1Grupo 2M31/01/201731/01/2017Trabalhado
                                                                  Maria1Grupo 3P02/02/201703/03/2017Trabalhado
                                                                  Maria0Grupo 3P04/03/201704/03/2017Folga
                                                                  Maria1Grupo 3P05/03/201705/03/2017Trabalhado
                                                                  Maria1Grupo 3G05/03/201706/03/2017Trabalhado
                                                                  João1Grupo 3G07/03/201707/03/2017Trabalhado
                                                                  João0Grupo 4G08/03/201708/03/2017Folga
                                                                  João1Grupo 3G09/03/201709/03/2017Trabalhado
                                                                  João1Grupo 3M09/03/201709/03/2017Trabalhado
                                                                    • Re: Socorro!
                                                                      Victória Gonçalves

                                                                      Oi Thiago,

                                                                       

                                                                      Isso é muito complexo. Se não fosse você já tinha desistido. rsrs

                                                                      Consegui rodar. Deu direitinho. Muito Obrigada! Obrigada mesmo!

                                                                       

                                                                      Mas quando fui Aplicar nos meus dados reais. O resultado não deu certo, parece que ainda sim está pulando o dia de folga e indo direto pro final.

                                                                      Vou te passar meu script de verdade, assim você pode vê se tem algum erro. E eu vou te explicar o que na verdade eu tenho que fazer.

                                                                       

                                                                      [Geral]:

                                                                      LOAD

                                                                      %MagistradoID,

                                                                      Dia,

                                                                      date(Dia,'DD/MM/YYYY') AS DT,

                                                                      "Dias Afastdo/Designado",

                                                                      "Dias Produtividade (Acumulado)",

                                                                      "Dias Produtividade"

                                                                      FROM [lib://DataFile - C]

                                                                      (qvd);

                                                                      Left Join

                                                                       

                                                                      [Magistrados]:

                                                                      LOAD

                                                                          %MagistradoID,

                                                                          "Matrícula (Magistrado)",

                                                                      "Sexo (Magistrado)",

                                                                      Magistrado

                                                                      FROM [lib://DataFile - C]

                                                                      (qvd);

                                                                      Left Join

                                                                       

                                                                      [Magistrado_Orgao]:

                                                                      LOAD

                                                                      %MagistradoID,

                                                                      Dia,

                                                                      "%Órgão JulgadorID",

                                                                      %FunçãoID

                                                                      FROM [lib://DataFile - C]

                                                                      (qvd);

                                                                      left Join

                                                                       

                                                                      [Orgaos Julgadores]:

                                                                      LOAD

                                                                      "%Órgão JulgadorID",

                                                                      Instância,

                                                                      Entrância,

                                                                      "Região da Corregedoria",

                                                                      Comarca,

                                                                      "Órgão Julgador",

                                                                      "Tipo de Justiça",

                                                                      "Especialidade (Órgão Julgador)",

                                                                      "Natureza (Órgão Julgador)",

                                                                      Cluster,

                                                                      Porte,

                                                                      "Data de Início da Vigência",

                                                                      "Data de Fim da Vigência"

                                                                      FROM [lib://DataFile- C]

                                                                      (qvd);

                                                                       

                                                                       

                                                                      /************************************************************************/

                                                                      // 2 - Descobrir qual e o menor Data por grupo por pessoa  

                                                                      //   

                                                                      /************************************************************************/

                                                                      [Min_Data]: 

                                                                      LOAD 

                                                                      Min(DT)  as  MinDtSituacaoPerDay, 

                                                                      Cluster,

                                                                      Magistrado,

                                                                      [Dias Produtividade],

                                                                      Porte

                                                                       

                                                                      Resident Geral

                                                                       

                                                                      Group By  

                                                                      Cluster,

                                                                      Magistrado,

                                                                      [Dias Produtividade],

                                                                      Porte

                                                                      ;

                                                                         

                                                                      /************************************************************************/

                                                                      // 3 - Descobrir qual e o maior horario por Equipamento  

                                                                      // e e por Status 

                                                                      /************************************************************************/

                                                                           

                                                                      [Max_Data]:

                                                                      LOAD

                                                                      Max(DT) as  MaxDtSituacaoPerDay, 

                                                                      Cluster,

                                                                      Magistrado,

                                                                      [Dias Produtividade],

                                                                      Porte

                                                                       

                                                                      Resident Geral 

                                                                       

                                                                      Group By  

                                                                      Cluster,

                                                                      Magistrado,

                                                                      [Dias Produtividade],

                                                                      Porte

                                                                      ;

                                                                       

                                                                      /************************************************************************/

                                                                      // 4 - Crio uma tabela somente com Status e ATM para fazer 

                                                                      // a modelagem final 

                                                                      /************************************************************************/

                                                                       

                                                                      BaseModeladaFinal:

                                                                      NoConcatenate

                                                                      LOAD Distinct 

                                                                      Magistrado,

                                                                      Cluster,

                                                                      Porte

                                                                      Resident Geral

                                                                      ;

                                                                         

                                                                      DROP Table  Geral;   

                                                                       

                                                                      /************************************************************************/

                                                                      // 5 - Faco o Join  para tabela somente na tabela com status 

                                                                      // assim trago o menor para a tabela final 

                                                                      /************************************************************************/

                                                                         

                                                                      Left Join (BaseModeladaFinal) 

                                                                      LOAD

                                                                      Cluster,

                                                                      Magistrado,

                                                                      [Dias Produtividade],

                                                                      Porte,

                                                                      date(MinDtSituacaoPerDay,'DD/MM/YYYY') as DtInicialStatus 

                                                                      Resident Min_Data; 

                                                                             

                                                                      DROP Table  Min_Data; 

                                                                        

                                                                      /************************************************************************/

                                                                      // 6 - Faco o Join  para tabela somente na tabela com status 

                                                                      // assim trago o maior para a tabela final 

                                                                      /************************************************************************/

                                                                         

                                                                      Left Join(BaseModeladaFinal) 

                                                                      LOAD

                                                                      Cluster,

                                                                      Magistrado,

                                                                      [Dias Produtividade],

                                                                      Porte,

                                                                      date(MaxDtSituacaoPerDay,'DD/MM/YYYY') as DtFinalStatus 

                                                                       

                                                                      Resident Max_Data 

                                                                      ;

                                                                         

                                                                      DROP Table  Max_Data;

                                                                       

                                                                      [Ajustado]:

                                                                      NoConcatenate

                                                                      LOAD Distinct 

                                                                      RowNo() as Seq, 

                                                                      *,

                                                                      if( Previous(Magistrado) = Magistrado and 

                                                                      Previous(DtFinalStatus) >  DtFinalStatus , 1 , 

                                                                      0) as [Flag Divergencia Data], 

                                                                      if( Previous(Magistrado) = Magistrado and 

                                                                      Previous(DtFinalStatus) >  DtFinalStatus , Num(DtFinalStatus)-1, Null())  as [Data Final Corrigida], 

                                                                      if( [Dias Produtividade]  = 0 , 'Folga','Trabalhado') as Status 

                                                                      Resident BaseModeladaFinal 

                                                                      order by DtInicialStatus , Magistrado, Cluster , Porte; 

                                                                       

                                                                       

                                                                      DROP Table BaseModeladaFinal; 

                                                                          

                                                                      /**********************************************************************/

                                                                      //Mapping Cara corrigidr a data 

                                                                      /**********************************************************************/

                                                                       

                                                                      //Obs: o If aqui e para garantir que sempre vai jogar para sexta feira, tire se achar necessario. 

                                                                      MappingCorrecao:

                                                                      mapping

                                                                      LOAD

                                                                      Previous(Seq) as SeqCorrigido, 

                                                                      if(Num(WeekDay([Data Final Corrigida])) = 0  , [Data Final Corrigida] -1, 

                                                                      if(Num(WeekDay([Data Final Corrigida])) = 6  ,[Data Final Corrigida]-2, [Data Final Corrigida] ) 

                                                                      ) as [Data Final Corrigida] 

                                                                      Resident Ajustado 

                                                                      Where [Flag Divergencia Data] = 1 

                                                                      ;

                                                                           

                                                                      /***********************************************/

                                                                      //Base Final 

                                                                      /***********************************************/

                                                                      BaseConsolidada:

                                                                      NoConcatenate

                                                                      LOAD

                                                                      Cluster,

                                                                      Magistrado,

                                                                      Porte,

                                                                      DtInicialStatus,

                                                                      [Dias Produtividade], 

                                                                      Status,

                                                                      ApplyMap('MappingCorrecao',Seq,DtFinalStatus) as DtFinalStatus 

                                                                      Resident Ajustado  

                                                                      ;

                                                                       

                                                                      //

                                                                       

                                                                      /***********************************************/

                                                                      // Ajuste: Quando a pessoa trabalha em dois Porte no mesmo dia Ajustaremos os dados 

                                                                      //Obs: Colocarei que a pessoa entrou e saiu no mesmo dia, porque ela pode ter finalizado em outro porte. 

                                                                      /***********************************************/

                                                                         

                                                                      Concatenate

                                                                      LOAD

                                                                      Previous(Cluster) as Cluster, 

                                                                      Previous(Magistrado) as Magistrado, 

                                                                      Previous(Porte) as Porte, 

                                                                      Previous(DtFinalStatus) as DtFinalStatus, 

                                                                      Previous(DtFinalStatus) as DtInicialStatus, 

                                                                      Previous([Dias Produtividade]) as [Dias Produtividade] , 

                                                                      Previous(Status) as Status 

                                                                      Resident Ajustado 

                                                                      Where

                                                                      [Flag Divergencia Data] = 1; 

                                                                            

                                                                      DROP Table Ajustado; 

                                                                       

                                                                       

                                                                      Comparando com o exemplo do João e Maria é como se a variável nome correspondesse a varável magistrado e a variável grupo a variável cluster nos meus dados reais.

                                                                       

                                                                      Então eu preciso montar a tabela com Nome do Magistrado, data início, data fim, cluster e porte, sendo que a cada vez que muda o porte ou o grupo, ou o magistrado ou se trabalha ou não ( que é o dias de produtividade igual a 0 quando não trabalha e igual a 1 quando trabalha), como eu expliquei antes.

                                                                      É igualzinho eu expliquei antes, so que com essas variáveis. A mesma lógica.

                                                                       

                                                                      Com essa tabela construída eu vou saber o período trabalhado de cada pessoa em cada grupo. Depois de saber isso eu tenho uma outra tabela que tem uma produtividade por dia de cada pessoa. Com essa tabela e esses dados vou pegar a média da pessoa naquele período naquele grupo e comparar com a média daquele grupo no mesmo período.

                                                                      É bem complexo. Nem sei se consegui explicar direito.

                                                                       

                                                                      Mas o primeiro passo é montar essa tabela.

                                                                       

                                                                      Sera que olhando o meu script consegue vê algum erro?

                                                                       

                                                                      Muito Obrigada!

                                                                        • Re: Socorro!
                                                                          Thiago das Chagas cunha

                                                                          Nao consegue me da uma amostra dos dado reais?

                                                                           

                                                                          porque eu acho que pode ser a ordenacao dos dados na hora de verificar o previus.


                                                                          O Script em si ta igual o que posso te sugerir e fazer isso :


                                                                          GeralOrdenada:

                                                                          NoConcatenate

                                                                          Load

                                                                          *

                                                                          Residente Geral

                                                                          Order by

                                                                          DT,

                                                                          Magistrado,

                                                                          Cluster,

                                                                          Porte;

                                                                           

                                                                          drop table  Geral;

                                                                           

                                                                          ve se isso nao resolve.

                                                                           

                                                                          e fazer os Min e Max baseados nesse GeralOrdenada.

                                                                           

                                                                          e nos Order bys no Min e max fazer assim :

                                                                           

                                                                          Magistrado,

                                                                          Cluster,

                                                                          Porte;

                                                                           

                                                                           

                                                                           

                                                                          Nota: Voce tem o Id do magestrado, e Numerico? e Unico ? Se for faz pelo ID do cara que chance de acronimo e menor ( Jose da Silva existir 2x na tua base e etc)

                                                                           

                                                                          ao inves do nome em tudo.


                                                                            • Re: Socorro!
                                                                              Victória Gonçalves

                                                                              Oie Thiago,

                                                                               

                                                                              Ainda sim não deu certo.

                                                                              Parece que ele está poegando o início e o fim. A primeira e a última data daquele grupo. Como se ele desconsiderasse memso a folga. E tivesse registrando como folga somente a primeira folga do cluster. existem várias folgas entre o périodo que ele não registra como folga. As vezes por isso ele não esteja conseguindo identificar a data fim e esteja indo logo para a última data.

                                                                               

                                                                              Digamos que a base é ordenada pela nome e pelas datas, ou seja vem uma pessoa seguindo a ordem cronologica, sendo que não tem uma lógica e nem ordem para o cluster e nem para o porte. Logo depois vem o nome da outra pessoa, seguindo a mesma lógica( ordenado por data) e assim sucessivamente. Geralmente uma mesma pessoa fica nos mesmos grupo, mas isso não é uma regra.

                                                                               

                                                                              Vou te dar outro exemplo:

                                                                                  

                                                                              MagistradoDiaDias ProdutividadeClusterPorte
                                                                              José10/01/20151Grupo AM
                                                                              José10/01/20151Grupo BGG
                                                                              José11/01/20151Grupo AM
                                                                              José11/01/20151Grupo BGG
                                                                              José12/01/20151Grupo AM
                                                                              José12/01/20151Grupo BGG
                                                                              José13/01/20151Grupo AM
                                                                              José13/01/20151Grupo BGG
                                                                              José14/01/20151Grupo AM
                                                                              José14/01/20151Grupo BGG
                                                                              José15/01/20151Grupo AM
                                                                              José15/01/20151Grupo BGG
                                                                              José16/01/20150Grupo AM
                                                                              José16/01/20150Grupo BGG
                                                                              José17/01/20151Grupo AM
                                                                              José17/01/20151Grupo BGG
                                                                              José18/01/20151Grupo AM
                                                                              José18/01/20151Grupo BGG
                                                                              José19/01/20151Grupo AM
                                                                              José19/01/20151Grupo BGG
                                                                              José20/01/20151Grupo AM
                                                                              José20/01/20151Grupo BGG
                                                                              José21/01/20151Grupo AM
                                                                              José21/01/20151Grupo BGG
                                                                              José22/01/20151Grupo AM
                                                                              José22/01/20151Grupo BGG
                                                                              José23/01/20151Grupo AM
                                                                              José23/01/20151Grupo BGG
                                                                              José24/01/20151Grupo AM
                                                                              José24/01/20151Grupo BGG
                                                                              José25/01/20151Grupo AM
                                                                              José25/01/20151Grupo BGG
                                                                              José26/01/20151Grupo AM
                                                                              José26/01/20151Grupo BGG
                                                                              José27/01/20151Grupo AM
                                                                              José27/01/20151Grupo BGG
                                                                              José28/01/20151Grupo AM
                                                                              José28/01/20151Grupo BGG
                                                                              José29/01/20151Grupo AM
                                                                              José29/01/20151Grupo BGG
                                                                              José30/01/20151Grupo AM
                                                                              José30/01/20151Grupo BGG
                                                                              José31/01/20151Grupo AM
                                                                              José31/01/20151Grupo BGG
                                                                              José01/02/20151Grupo AM
                                                                              José01/02/20151Grupo BGG
                                                                              José02/02/20151Grupo AM
                                                                              José02/02/20151Grupo BGG
                                                                              José03/02/20151Grupo AM
                                                                              José03/02/20151Grupo BGG
                                                                              José04/02/20151Grupo AM
                                                                              José04/02/20151Grupo BGG
                                                                              José05/02/20151Grupo AM
                                                                              José05/02/20151Grupo BGG
                                                                              José06/02/20151Grupo AM
                                                                              José06/02/20151Grupo BGG
                                                                              José07/02/20151Grupo AM
                                                                              José07/02/20151Grupo BGG
                                                                              José08/02/20151Grupo AM
                                                                              José08/02/20151Grupo BGG
                                                                              José09/02/20151Grupo AM
                                                                              José09/02/20151Grupo BGG
                                                                              José10/02/20151Grupo AM
                                                                              José10/02/20151Grupo BGG
                                                                              José11/02/20151Grupo AM
                                                                              José11/02/20151Grupo BGG
                                                                              José12/02/20151Grupo AM
                                                                              José12/02/20151Grupo BGG
                                                                              José13/02/20150Grupo AM
                                                                              José13/02/20150Grupo BGG
                                                                              José14/02/20150Grupo AM
                                                                              José14/02/20150Grupo BGG
                                                                              José15/02/20150Grupo AM
                                                                              José15/02/20150Grupo BGG
                                                                              José16/02/20150Grupo AM
                                                                              José16/02/20150Grupo BGG
                                                                              José17/02/20150Grupo AM
                                                                              José17/02/20150Grupo BGG
                                                                              José18/02/20150Grupo AM
                                                                              José18/02/20150Grupo BGG
                                                                              José19/02/20150Grupo AM
                                                                              José19/02/20150Grupo BGG
                                                                              José20/02/20150Grupo AM
                                                                              José20/02/20150Grupo BGG
                                                                              José21/02/20151Grupo AM
                                                                              José21/02/20151Grupo BGG
                                                                              José22/02/20151Grupo AM
                                                                              José22/02/20151Grupo BGG
                                                                              José23/02/20151Grupo AM
                                                                              José23/02/20151Grupo BGG
                                                                              José23/02/20151Grupo CP

                                                                               

                                                                              Nesse exemplo acima, ele teria que para no dia 16/01/2015, para ambos os grupos, e recomeçar a contar a data 17/01/2015 e novamente parar no dia 13/02/2015 e depois só voltar no dia 21/02/2015.

                                                                              Isso levando em conta que se muda o nome, ou o cluster ou o porte, também passsa a contar como outra data. O que aparentemente o script está realizando perfeitamente.

                                                                               

                                                                               

                                                                              Acho que o problema está no dia trabalhado. Ele está pegando somente a primeira e a última data.

                                                                              E na hora de anotar a folga está acontecendo a mesma coisa, está registrando o primeiro dia de folga e o último dia de folga. Desconsiderando todas as folgas que existem entre a primeira e a última.

                                                                               

                                                                               

                                                                              Tem alguma ideia do que fazer para tentar rodar corretamente?