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





Agosto 18, 2008 às 5:03 pm
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
Agosto 18, 2008 às 5:07 pm
Peek() é uma função bastante útil, pode render novos artigos tranquilamente.
Abraço