Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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?
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
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.
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?
Rodrigo,
Voce tem como Disponibilizar o QVW para eu tentar te ajudar mais?
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))
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.
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 .
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
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
Opa Rodrigo.
Deu certo! É justamente este retorno que estava buscando.
Muito obrigado pelas dicas pessoal.