Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Pessoal, boa tarde.
Estou com uma dúvida no meu aplicativo.
Tenho uma tabela como a seguir:
Como podem ver, tenho a matrícula do funcionário e o tipo de atividade, sendo que o INI define o início de cada jornada, e o FEC define o encerramento de cada jornada.
Preciso encontrar uma forma de agrupar essas jornadas por meio do script, sendo que elas tem um número de linhas (ou atividades) variado.
A solução que venho trabalhando é algo do tipo:
b_caderno1:
LOAD *,
If(Jor <> '-', Jor, If(peek(Jor) <> '-', peek(Jor), If(peek(Jor, -2) <> '-', peek(Jor, -2),If(peek(Jor, -3) <> '-', peek(Jor, -3),If(peek(Jor, -4) <> '-', peek(Jor, -4),If(peek(Jor, -5) <> '-', peek(Jor, -5),If(peek(Jor, -6) <> '-', peek(Jor, -6),))))))) as Jor_Ini
// If(peek(Jor, $(i)) <> '-', peek(Jor, $(i)),) as Jor_Ini
Resident b_caderno;
DROP Table b_caderno;
Assim, o LOAD procura continuamente um valor anterior de Jor que seja diferente de '-'. Porém tal solução não satisfaz totalmente, pois requer a inserção de vários IFs dentro de IFs, e só me permite procurar um número limitado de vezes.
Existe uma forma de inserir um Loop (FOR ou While) dentro do próprio comando LOAD, a fim de satisfazer este problema?
O meu objetivo é ficar com o resultado a seguir com a coluna "Jor_Ini":
Obrigado
Ralhael, veja se assim lhe atende.
Dados_Original:
LOAD * INLINE [
Linhas, Matricula, Tipo, Teste1, Jor
1079, 123456, INI, FAR, 1079
1080, 123456, MAN
1081, 123456, FEC
1082, 123456, INI, FAR, 1082
1083, 123456, PAS
1084, 123456, TRE
1085, 123456, MAN
1086, 123456, FEC
1087, 123456, INI, FAR, 1087
1088, 123456, MAN
1089, 123456, PAS
1090, 123456, TRE
1091, 123456, FEC
];
Dados_Final:
Load *, IF(Len(Jor)>1,Jor, Peek(Jor_Ini)) AS Jor_Ini
Resident Dados_Original
Order By Linhas, Matricula;
Drop table Dados_Original;
Don't worry, be Qlik.
Tonial.
Não consigo ver as imagens. Coloque como anexo.
Desculpem pessoal, segue em anexo
Primeira tabela:
Segunda tabela:
Você pode fazer o seguinte:
Releia o resident ordenando pelos critérios desejados e utilizando um where para tirar os '-'.
Você pega o anterior dessa leitura fazendo um left join com a base original. A única coisa diferente é um check se a matrícula é igual a matrícula da linha anterior.
Com os dados ordenados, você pode utilizar o previous ao invés do peek.
Bom dia Luciano, obrigado pela resposta.
Poderia me dar um exemplo prático? Sou iniciante em QlikView e me pareceu confuso.
Ralhael, veja se assim lhe atende.
Dados_Original:
LOAD * INLINE [
Linhas, Matricula, Tipo, Teste1, Jor
1079, 123456, INI, FAR, 1079
1080, 123456, MAN
1081, 123456, FEC
1082, 123456, INI, FAR, 1082
1083, 123456, PAS
1084, 123456, TRE
1085, 123456, MAN
1086, 123456, FEC
1087, 123456, INI, FAR, 1087
1088, 123456, MAN
1089, 123456, PAS
1090, 123456, TRE
1091, 123456, FEC
];
Dados_Final:
Load *, IF(Len(Jor)>1,Jor, Peek(Jor_Ini)) AS Jor_Ini
Resident Dados_Original
Order By Linhas, Matricula;
Drop table Dados_Original;
Don't worry, be Qlik.
Tonial.
Deu certo! Muito obrigado!