Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Looping dentro de um LOAD

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

Labels (1)
1 Solution

Accepted Solutions
fernando_tonial
Partner - Specialist
Partner - Specialist

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.

Don't Worry, be Qlik.

View solution in original post

6 Replies
lucianosv
Specialist
Specialist

Não consigo ver as imagens. Coloque como anexo.

Not applicable
Author

Desculpem pessoal, segue em anexo

Primeira tabela:

img1.png

Segunda tabela:

img2.png

lucianosv
Specialist
Specialist

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.

Not applicable
Author

Bom dia Luciano, obrigado pela resposta.

Poderia me dar um exemplo prático? Sou iniciante em QlikView e me pareceu confuso.

fernando_tonial
Partner - Specialist
Partner - Specialist

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.

Don't Worry, be Qlik.
Not applicable
Author

Deu certo! Muito obrigado!