13 Replies Latest reply: Jun 20, 2017 1:51 PM by Edvaldo Gutierres RSS

    Criar tabela histórica

    Douglas Schmitt

      Pessoal,

      Estou com o seguinte problema.

      Tenho uma tabela de FUNCIONARIOS ATIVOS, onde crio um registro a cada mês para cada funcionário ativo com sua FUNCAO ATUAL, SETOR ATUAL, SALARIO ATUAL (atual = hoje, guardando sempre o ultimo registro).

      Data CriadaMatriculaFuncaoSetorSalarioAtivo

      31/01/2016

      0001Analista de TesteTI2000Sim
      29/02/2016 0001Analista de TesteTI2000Sim
      30/03/20160001Analista de TesteTI2000Sim
      31/01/20160002ProgramadorTI3000Sim
      29/02/20160002ProgramadorTI3000Sim
      31/01/2016 0003MotoristaLogistica1000Sim
      29/02/20160003MotoristaLogistica1000Sim
      30/03/20160003MotoristaLogistica1000Sim

       

      O problema que como falei, nesta minha tabela tenho salvo apenas a posição atual, criando apenas um registro por mÊs informando se a pessoa está ativa ou não na empresa.

       

      Agora tenho outra tabelas que possuem o histórico de função, histórico de setor e histórico de salario.

      Preciso criar um 'tabelão' a partir desse primeiro onde mostre a função, setor e salário histórico. Porém, não sei como fazer.

       

      MatriculaData MudancaFuncao
      000110/02/2016Desenvolvedor
      000120/02/2016Coordenador

       

      Desta maneira, o tabelão deveria mostrar que a matricula 0001 era 'Analista de Testes' até 10/02/2016 e depois 'Desenvolvedor' até '20/02/'2016' e acima disso foi 'Coordenador'.

      Pensei em criar sempre o último dia do mês como o do registro de ativos, sei que se a pessoa tiver 2 mudanças de setor no mesmo mês, irá aparecer 2 registros na mesma data, porém acredito que um QVD por dia irá ficar com um tamanho grande demais.

        • Re: Criar tabela histórica
          Clever Anjos

          Esta logica cria uma tabela para cada dia com o cargo naquela data.

          Veja se atende

          LOAD
            Matricula,
              [Data Mudanca],
              Funcao
          FROM
          [https://community.qlik.com/thread/228525]
          (html, codepage is 1252, embedded labels, table is @2);
          
          t1:
          LOAD [Data Criada] ,
              Matricula,
              Funcao,
              Setor,
              Salario,
              Ativo
          FROM
          [https://community.qlik.com/thread/228525]
          (html, codepage is 1252, embedded labels, table is @1);
          
          Load
            Matricula,
            date(Min([Data Criada])) as [Data Mudanca],
            Funcao
          Resident t1
          Group by Matricula,Funcao;
          
          drop Table t1;
          
          t2:
          LOAD
            Matricula,
            [Data Mudanca],
            Funcao,
            Date(If(Peek('Matricula')=Matricula,Peek('Data Mudanca')-1,[Data Mudanca])) as Data2
          Resident t
          order by Matricula,[Data Mudanca] desc;
          
          drop Table t;
          T:   
          LOAD
            Date([Data Mudanca] + IterNo() - 1 ) as DataReferencia,
              Matricula,
              Funcao 
          Resident t2
          While ([Data Mudanca]  + IterNo() - 1)  <= Data2;
          Drop Table t2;
          
          • Re: Criar tabela histórica
            Alessandro Furtado

            Douglas,

             

            Cada caso um caso, mas eu não deixaria duas funções/cargos/CC por pessoa no mesmo mês. Imagina olhar os gastos por função?  Os 2000 apareceriam repetidos, mesmo que no total não ficasse.  Em alguns casos, poderia mesmo multiplicar o valor.

             

            Segue um exemplo que fiz usando o iterno() e o previous().....

             

            2016-08-09 19_38_55.jpg

              • Re: Criar tabela histórica
                Alessandro Furtado

                fiquei fazendo e não vi a resposta do Clever, que apareceu depois que mandei a minha....A ideia é a mesma, usando o peek ou o previous  (o peek não exige o campo criado antes....).

                 

                A questão que tem que observar é a ordem de leitura por causa das datas......para pegar o inicio e final da mesma matricula de forma que os registros a serem criados (iterno() e while.....) estejam certos.....

                • Re: Criar tabela histórica
                  Douglas Schmitt

                  Segui a tua ideia e até funcionou, o problema é o tempo para carregar os dados no QVD.

                  Tenho funcionários com DATA MUDANÇA de 1990, imagina criar um registro a cada mês para estes funcionários ?!

                  Tentei criar apenas com quem tem mudança acima de 2015, mas também ficou inviável, esperei 20 min e a carga ainda não tinha terminado.

                   

                  Alguma sugestão?

                    • Re: Criar tabela histórica
                      Alessandro Furtado

                      Douglas,

                       

                      faço isto com milhares de funcionários que tiveram mudanças a vários anos e a performance é boa.

                      Você queria gerar a cada dia......e esta achando o mês a mês lento.....

                      Depois que rodou, nao vai carregar tudo no modelo, mas sim somente os anos de analise e neste caso, não sera desde 1990.

                       

                      Segue uma imagem de uma carga com 1089 funcionários sendo que a mudança mais antiga é de 1993....

                       

                      Carga Mudanca.gif

                       

                      Roda tudo em 2 segundos......

                       

                      Segue a imagem e o modelo com o QVD se quiser testar e comparar com o que você fez....

                       

                      se me permite um palpite, se usou o iterno(), deve ter registros com ou data de inicio zerada ou final com 99999 e assim gera milhares de data.  Outra coisa, é que tem que ter o addmonths() para criar a data mês a mês, se não tiver, vai ser dia a dia......

                        • Re: Criar tabela histórica
                          Douglas Schmitt

                          Alessandro,

                          Essa tua carga que faz com milhares de funcionários você faz mês a mês ou dia a dia? Demora quanto tempo?

                           

                          Sobre levar para a aplicação, a ideia era a seguinte:

                          Tenho uma tabela de funcionários ativos com um registro a cada ultimo dia do mês se a pessoa estiver ativa.

                          Como vou ter essa data do último dia do mês, iria gerar uma tabela de funções históricas com a função de cada pessoa no último dia de cada mês.

                          Levaria estas 2 tabelas para a aplicação e quando fosse selecionado o mês X do funcionário Y, ele iria percorrer e achar a linha correspondente na tabela de funções (porque tanto a funcionários ativos quanto a funções teriam a matricula do funcionário e o último dia do mês).

                            • Re: Criar tabela histórica
                              Alessandro Furtado

                              Douglas,

                               

                              o registro é criado mês a mês.

                               

                              Resident Tab While AddMonths([Data Mudanca],IterNo()-1) < [Data Mudanca Anterior]

                               

                              Assim, se eu criar o campo mes e ano, ao seleciona-lo vai mostrar os dados do funcionário naquele mês e ano.

                               

                              A modelagem que fiz em um modelo de folha, tenho uma chave que tem o codigo da empresa,funcionario,ano e mes.

                               

                              Assim, para cada funcionario, da empresa,e no ano e mes eu sei os dados dele, quer seja valor da folha,aonde trabalha -CC , etc....

                            • Re: Criar tabela histórica
                              Douglas Schmitt

                              Outra coisa, na tua ideia, você cria um registro para cada funcionário apenas com a data inicial e a final da função, como na imagem abaixo (exemplo funcionário 3):

                              tabela_forum.jpg

                              OBS: Você não cria um registro dia a dia ou mês a mês mostrando a função.

                               

                              Mas na aplicação, como você faz? Todos os objetos da aplicação vão ter a expressão filtrando o mês selecionado e calculando se ele é maior ou menor que a data inicial e final da função e colocando a função correspondente?

                              Por exemplo:

                              funcao_bi_rm.jpg

                              Neste meu exemplo, ao selecionar uma pessoa ela possui 3 funções, mesmo selecionando fevereiro/2016. Neste caso o objeto que filtra a função deveria ter uma expressão vendo se a data da função é maior ou menor que a data selecionada?

                              Com isto, todos os objetos da aplicação terão este filtro?

                              E você faz a mesma coisa com o salário, setor, etc ?

                               

                              Obrigado.