Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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 Criada | Matricula | Funcao | Setor | Salario | Ativo |
---|---|---|---|---|---|
31/01/2016 | 0001 | Analista de Teste | TI | 2000 | Sim |
29/02/2016 | 0001 | Analista de Teste | TI | 2000 | Sim |
30/03/2016 | 0001 | Analista de Teste | TI | 2000 | Sim |
31/01/2016 | 0002 | Programador | TI | 3000 | Sim |
29/02/2016 | 0002 | Programador | TI | 3000 | Sim |
31/01/2016 | 0003 | Motorista | Logistica | 1000 | Sim |
29/02/2016 | 0003 | Motorista | Logistica | 1000 | Sim |
30/03/2016 | 0003 | Motorista | Logistica | 1000 | Sim |
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.
Matricula | Data Mudanca | Funcao |
---|---|---|
0001 | 10/02/2016 | Desenvolvedor |
0001 | 20/02/2016 | Coordenador |
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.
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().....
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;
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().....
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.....
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?
Obrigado pela ajuda Clever,
Assim como respondi pro colega Alessandro, o problema é o tempo para criação deste QVD.
Tem alguma sugestão?
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....
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......
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).
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):
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:
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.
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....