Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
dairan73
Contributor III
Contributor III

Criar tabela histórica

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.

Labels (1)
1 Solution

Accepted Solutions
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br

View solution in original post

13 Replies
Clever_Anjos
Employee
Employee

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;

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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.....

furtado@farolbi.com.br
dairan73
Contributor III
Contributor III
Author

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?

dairan73
Contributor III
Contributor III
Author

Obrigado pela ajuda Clever,

Assim como respondi pro colega Alessandro, o problema é o tempo para criação deste QVD.

Tem alguma sugestão?

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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......

furtado@farolbi.com.br
dairan73
Contributor III
Contributor III
Author

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).

dairan73
Contributor III
Contributor III
Author

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.

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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....

furtado@farolbi.com.br