Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Set Analysis - Quantidade baseada em um campo

Ola pessoal.

Tenho uma situação em que, clicando em um botão,  preciso mostrar na tabela a quantidade de estoque baseado somente na data de ultima entrada de cada produto:

Criei um set Analysis com a instrução :

IF(GetFieldSelections(OPCAO)='Qtd.Ult.Entrada', num(round(Sum({$<DT_ULT_ENTRADA>}QT_ESTOQUE))

Isto está correto? Como faria para or exemplo, ter o max(DT_ULT_ENTRADA) para a qtde de estoque?

1 Solution

Accepted Solutions
Anonymous
Not applicable
Author

Agora que eu eu vi que você esta usando mais de uma dimensão, se for usar o if seria assim então:

sum(if(DT_ULT_ENTRADA = aggr(NODISTINCT Max(TOTAL <produto, filiais> DT_ULT_ENTRADA ), produto,filiais,DT_ULT_ENTRADA )  ,QT_ESTOQUE))

Se tiver outra dimensão no seu objeto, deve ser incluída na expressão também

View solution in original post

12 Replies
mauroponte
Creator II
Creator II

Rodrigo,

Pelo que estou vendo voce está utilizando botoes, e quando clicar no botao Qtde.Ult.Entrada mostrar somente o que voce deseja.

Se for isso o que voce deve fazer é criar uma variavel, e utilizar o disparador do botao para passar um valor para essa variavel, e na condição da expressão voce comparar o valor da variavel. o getfieldselections voce utiliza quando seleciona um valor em uma lista com um campo.

Com relação o set analisys, do jeito que você colocou nao está comparando a data com nada. Para comparar com a maior data utilize:

{<DT_ULT_ENTRADA={"$(=max(DT_ULT_ENTRADA))"}>}

Espero ter ajudado.

Se voce puder disponibilizar o QVW talvez possa ajudar mais.

Not applicable
Author

Oi MAuro.

Sim, sua lógica esta correta. Estou utilizando botões e quando carrego este App, passo como parametro os nomes, assim, criei uma métrica que utiliza que me retorna os valores de acordo com o botão escolhido. Todos os outras opções estão ok, com a exceção do que apontei.

Ex:

IF(GetFieldSelections(OPCAO)='Quantidade',num(round(Sum(QT_ESTOQUE)- sum(QT_PEND_VENDA))),

IF(GetFieldSelections(OPCAO)='Valor', money((QT_ESTOQUE - QT_PEND_VENDA)*VL_CUSTO_ULT_ENT), //,'R$ #.##0,00;-R$ #.##0,00'),

IF(GetFieldSelections(OPCAO)='Pedidos',num(round(SUM(QT_PEDIDO))),

IF(GetFieldSelections(OPCAO)='Dias Estoque',num(round(Sum(QT_ESTOQUE/QT_SAIDA_MEDIA))),

IF(GetFieldSelections(OPCAO)='Estoque Padrao', num(round(Sum(QT_ESTOQUE_PADRAO))),

IF(GetFieldSelections(OPCAO)='Estoque >= 60 dias',if(num(round(Sum(QT_ESTOQUE/QT_SAIDA_MEDIA)))>=60,num(round(Sum(QT_ESTOQUE/QT_SAIDA_MEDIA))),0),

IF(GetFieldSelections(OPCAO)='Saida Media',num(Sum(QT_SAIDA_MEDIA)),

IF(GetFieldSelections(OPCAO)='Dt.Ult.Entrada',Date(DT_ULT_ENTRADA_F),

//------

IF(GetFieldSelections(OPCAO)='Qtd.Ult.Entrada', num(round(Sum({<DT_ULT_ENTRADA={"$(=max(DT_ULT_ENTRADA))"}>}QT_ESTOQUE)))

//-----

Segui sua instrução, porém os valores ficaram todos zerados, e sei isto esta incorreto por que todos os produtos possuem data de ultima entrada. Pode me dizer se montei corretamente a sintaxe?

mauroponte
Creator II
Creator II

Rodrigo,

Voce tem como Disponibilizar o QVW para eu tentar te ajudar mais?

Anonymous
Not applicable
Author

Existe uma última data diferente pra cada produto do estoque?

O que acontece quando vc usa o max(data) dentro do set analysis , é esse valor ser calculado sem considerar a dimensão do seu objeto, seria a mesma coisa que você jogar esse max(data) dentro de um objeto de texto, pegar o valor e atribuir para todos os produtos no seu set analysis.

Existe 2 formas que eu conheço de trazer esse valor, uma é um pouco mais complicada usando if e agregação e a outra forma mais simples é usando a função firstsortedvalue(), ficaria assim:

firstsortedvalue(QT_ESTOQUE , -DT_ULT_ENTRADA )

* Detalhe, se existir mais de um valor nesse campo QT_ESTOQUE  para a última data, a função retornará null() , precisa ser um valor único. Teste com essa função, se não der certo, tente com if, acho que ficaria assim:

sum(if(DT_ULT_ENTRADA = aggr(NODISTINCT Max(TOTAL <produto> DT_ULT_ENTRADA ), produto,DT_ULT_ENTRADA )  ,QT_ESTOQUE))

Not applicable
Author

Oi Mauro.

Estou utilizando o QlikSense e infelizmente, pela política da empresa, não posso disponibilizar qualquer tipo de arquivo sem um processo longo e burocrático de autorização.

Por isso vou tentar ser um pouco mais claro para ver se consegue me ajudar:

Preciso obter em uma metrica, a quantidade total de produtos em estoque (QT_ESTOQUE) somente recebidos na ultima data de entrada(DT_ULT_ENTRADA).

Se fizer simplesmente o Sum(QT_ESTOQUE), terei o resultado de todo meu volume de estoque, ao invés apenas das ultimas entradas, baseada na data que mencionei.

Imaginei em fazer o set analysis, mas conforme me orientou, criando desta forma:

num(round(Sum({<DT_ULT_ENTRADA={"$(=max(DT_ULT_ENTRADA))"}>}QT_ESTOQUE))), não funcionou. Existe algum outro modo?

Espero que eu tenha explicado melhor.

Obrigado pela ajuda.

Not applicable
Author

Sim, pode existir uma data diferente para cada produto. Estou utilizando a dimnsão de produtos, como pode ver na imagem que passei anteriormente.

Vou tentar utilizar as instruções que citou .

Anonymous
Not applicable
Author

Agora que eu eu vi que você esta usando mais de uma dimensão, se for usar o if seria assim então:

sum(if(DT_ULT_ENTRADA = aggr(NODISTINCT Max(TOTAL <produto, filiais> DT_ULT_ENTRADA ), produto,filiais,DT_ULT_ENTRADA )  ,QT_ESTOQUE))

Se tiver outra dimensão no seu objeto, deve ser incluída na expressão também

thiago_mlg
Creator II
Creator II

Rodrigo, bom dia!

Acredito que o melhor jeito seja criando uma tabela auxiliar no script pegando sempre a ultima data de estoque por produto e depois aplicando essa tabela no gráfico em questão utilizando a variavel..

Digo isso, por que mesmo que você use uma expressão para pegar a data máxima de cada produto e passar essas datas para a expressão, pode ser que tenha outros produtos que também tenham estoque em alguma dessas datas , e então seu gráfico vai realizar ma soma errada, abaixo um exemplo..

imagine a tabela

produto --      data --           estoque        

AAA        10/12/2015          4

AAA        01/01/2016          2

BBB        01/01/2016          2

BBB        05/01/2016          5

CCC       07/01/2016          3

CCC       08/01/2016          4

agora, criando uma expressão que pegue a data máxima de cada produto, ele passaria os seguintes parâmetros.

sum( DATA = { expressão que gera a data máxima de cada produto.. sendo eles  01/01/2016 - 05/01/2016 -  08/01/2016 }  QUANTIDADE...

pelo fato do seu produto BBB ter estoque tambem no dia 01/01/2016... o gráfico vai somar os valores e vai ficar assim..

PRODUTO - QTDE

AAA     2

BBB 7

CCC 4

......

Então como dito acima o melhor seria criar uma tabela auxiliar, pegando o ultimo saldo de cada produto.. Sendo mais ou menos assim

AUXILIAR_TEMP

LOAD

PRODUTO,

MAX(DATA) AS DATA

Resident TABELAESTOQUE

GROUP BY PRODUTO;

ESSA PRIMEIRA TABELA VAI GERAR TODOS OS PRODUTOS E SUAS RESPECTIVAS DATAS MAXIMAS

DEPOIS É SÓ VC FAZER UM LEFT JOIN COM A QUANTIDADE

LEFT JOIN (AUXILIAR TEMP)

PRODUTO,

SUM(QUANTIDADE) AS QUANTIDADE,

DATA

GROUP BY PRODUTO,DATA;

ELE IRA ADICIONAR NA TABELA AUXILIAR_TEMP APENAS AS QUANTIDADES PARA OS PRODUTOS/DATAS QUE TENHAM NA TABELA AUXILIAR..

TENDO A TABELA MONTADA, VOCÊ PODE NAQUELE QUE QUANDO VC CLICAR NO BOTÃO, A EXPRESSÃO DO GRÁFICO SEJA FEITA PELOS CAMPOS DA TABELA AUXILIAR.

QUALQUER DÚVIDA À DISPOSIÇÃO.

THIAGO GONÇALO

Not applicable
Author

Opa Rodrigo.

Deu certo! É justamente este retorno que estava buscando.

Muito obrigado pelas dicas pessoal.