QlikView: Funções de Script – Peek()

By Fábio Simões

Neste artigo vamos falar sobre uma função de script. Nem sempre podemos ou é adequado resolver os problemas do negócio diretamente nos objetos. Isso porque em muitos casos irá causar perca de desempenho, além do que, regra de negócio deve ser centralizada para permitir o máximo de reutilização, sendo assim o melhor caminho é manter a resolução de problemas relacionados à regra de negócios no script.

Para falar a respeito da função Peek() vou relatar uma situação ocorrida em um projeto em que participei.

Tratava-se de um sistema de controle de estoque onde o saldo do estoque era atualizado somente na data em que havia algum movimento (figura.1), se em uma data não houvesse movimento nada seria gravado saldo na tabela, no entanto, se e o saldo fosse consultado na data em que não houve movimentação deveria constar ali o saldo do último movimento.

figura.1

figura.1

Como eu disse em artigo anterior, o QlikView oferece muitas funções para resolver os mais variados tipos de problemas, o caso é saber qual a função adequada, e neste caso como utilizá-la. Como era um dos primeiros projetos que eu participava, e também o meu companheiro de projeto não tinha muita experiência, tivemos uma grande dor de cabeça para resolver essa situação.

Primeiros sabíamos que a função adequada ao caso era a função Peek(), o caso é que não estava funcionando da maneira como gostaríamos, e ai entrou o detalhe, não basta apenas saber qual recurso utilizar, e sim como utilizá-lo.

A função Peek() retorna o valor do nome do campo informado como primeiro parâmetro a função, este é o único parâmetro obrigatório. Como segundo parâmetro poderá ser informado o número da linha da qual se deseja obter um valor de um dado campo, onde -1 indica “último valor lido” e será assumido quando nenhum valor for informado, por último podemos também informar uma tabela onde a função deverá buscar o valor, se nenhum valor for informado a função irá considerar a tabela atual.

Na primeira situação (listagem.1), a função Peek() encontrará o valor imediatamente anterior do campo Quant, no entanto quando houver uma seqüência maior que duas linhas sem valor a segunda linha após o último valor não retornará valor algum (figura.2), isso porque a função esta lendo a estrutura demonstrada na figura.1. Na data 02/07/2008 consta a quantidade 88, quando a função esta na linha da data 03/07/2008 a função busca o valor anterior (02/07/2008), o mesmo não ocorre quando chegamos à linha da data 04/07/2008, isso porque a função irá ler o valor do campo Quant na data 03/07/2008 e como podemos observar na figura.1 nesta data não há valor algum. Além disso, para que funcione dessa forma é obrigatório que o campo buscado pela função Peek() esteja presente no Load, como podemos observar na listagem.1 apenas o campo Quant consta na lista, isso faz com que o valor anterior para o campo Val não seja retornado nunca, nem na linha imediatamente abaixo a linha com valor, esta situação também pode ser observada na figura.2.

listagem.1

listagem.1

 

 

figura.2

figura.2

O fato é que só fui compreender esse comportamento da função Peek() depois que conseguimos resolver o problema, e conseguimos com a ajuda do fórum da QlikTech (link do post). Então a solução é garantir que haja sempre um valor na linha anterior para que a função Peek() possa ler, e isso indica que o campo “físico” não é a solução, e sim o campo criado a partir do resultado da expressão, ele sim terá sempre o valor lido anteriormente, então vamos focar nele.

Com uma simples alteração no código (listagem.2) conseguimos obter a solução para o nosso problema, e o resultado pode ser observado na figura.3.

listagem.2

listagem.2


figura.3

figura.3

Agora a função Peek() irá pegar sempre o valor do campo Quantidade, e não mais do campo físico Quant, dessa forma teremos sempre acesso a um valor, ao menos é claro que a primeira data não tenha valor algum.

Nesse exemplo estou utilizando sempre um único produto, no caso de haver mais de um (e essa é a situação no mundo real) será necessário adicionar mais um cláusula a função if.

if(CodProduto = Peek(Produto) and IsNull(Quant),
Peek(Quantidade),Quant) AS Quantidade

Isso fará com que o saldo de um produto não seja lido para outro. No entanto é muito importante em situações como esta não esquecer de definir a cláusula Order By, pois se ela não estiver correta o resultado poderá não sair como esperado.

Como podemos ver, resolver essa situação diretamento no script nos traz irá facilitar e muito a construção dos objetos, além de permitir a reutilização desta tabela em outras partes do script para agilizar e facilitar o nosso trabalho.

Agradecimentos: Rogério Backes pela sugestão do artigo, e por me fornecer o material para este artigo, pois não me lembrava mais qual era exatamente a situação. E também ao Júnior Ibagy que buscou junto ao forum da QlikTech a solução do problema.

Tags:

2 Respostas para “QlikView: Funções de Script – Peek()”

  1. Junior Ibagy Disse:

    Show.. parabéns..

    Essa foi uma necessidade gigante que tivemos.. o uso de PEEK é importante..

    Vou te passar o uso do Peek para fazer SALDO de produtos.. bem interessante!

    abraços

  2. Fábio Simões Disse:

    Peek() é uma função bastante útil, pode render novos artigos tranquilamente.

    Abraço

Deixe um comentário