O recurso mais subutilizado do Qlik Sense: compare dois contextos de seleção simultaneamente no mesmo grafico, sem filtros, sem duplicar objetos.
Normalmente, um aplicativo Qlik tem um único estado de seleção: o usuario clica em "Sudeste" e todos os objetos refletem essa seleção. Estado Alternativo quebra essa limitacao, permitindo que diferentes objetos operem em contextos de seleção independentes e simultâneos.
Imagine o seguinte cenário: o analista quer comparar o desempenho de dois produtos diferentes aplicando filtros distintos para cada um, sem criar um segundo app, sem abrir duas abas, sem usar sets hardcoded. Estado Alternativo é a resposta nativa do Qlik para esse problema.
Ambos os estados coexistem no mesmo app, no mesmo momento. Um grafico pode exibir os dois valores lado a lado. O usuario pode fazer seleções em cada estado de forma completamente independente.
O Set Analysis permite referenciar qualquer estado pelo nome diretamente na expressão de medicao:
// Estado padrao - equivalente a {$}
Sum({$} Receita)
// Estado alternativo pelo nome
Sum({Cenario_B} Receita)
// Estado alternativo + modificador adicional
Sum({Cenario_B<Status={'Ativo'}>} Receita)
// Diferenca entre os dois estados
Sum({$} Receita) - Sum({Cenario_B} Receita)
{NomeDoEstado<Campo={'Valor'}>}. O nome do estado substitui o identificador padrao ($ ou 1). O modificador <> e opcional - sem ele, a expressão usa exatamente as seleções que estao ativas naquele estado no momento da execucao.
// Sempre ignora TODAS as seleções
// Não e interativo - não muda
Sum({1<Regiao={'Sul'}>} Receita)
// O valor e fixo independente
// do que o usuario selecionar
// Usa as seleções do estado Cenario_B
// O usuario pode mudar essas seleções!
Sum({Cenario_B} Receita)
// O valor muda conforme o usuario
// interage com os objetos daquele estado
Estado Alternativo não é um recurso para casos simples. Ele existe para resolver problemas de análise comparativa que, sem ele, exigiriam soluções paliativas complexas e frágeis.
O usuario seleciona Janeiro no Estado A e Fevereiro no Estado B. Um único grafico de barras exibe os dois meses lado a lado com as mesmas dimensoes, sem filtros hardcoded.
Benchmark entre duas regioes escolhidas pelo próprio usuario em tempo real. Sul vs Norte, Filial A vs Filial B - a escolha e do analista, não do desenvolvedor.
Cenario atual vs cenário simulado. O estado padrao reflete a realidade; o estado alternativo reflete uma hipotese com filtros diferentes, budget diferente, mix de produto diferente.
Clientes que compraram o Produto A (Estado A) vs clientes que compraram o Produto B (Estado B). Qual cesta tem maior ticket medio? Qual tem mais recompra?
Mesmos dados com duas taxas de cambio diferentes. O CFO quer ver o resultado em USD e em BRL simultaneamente, com os mesmos filtros de produto e regiao.
Realizado (estado padrao) vs meta ajustada (estado alternativo com modificadores). O desvio e calculado diretamente pela expressão.
Estados sao criados na interface do Qlik Sense e depois referenciados em qualquer expressão de Set Analysis pelo nome exato que voce definiu.
Clique em "Editar planilha" no canto superior direito. No painel de propriedades da planilha (não do objeto), localize a secao Estados Alternos.
Clique em "Adicionar estado". Defina um nome sem espacos e sem acentos - esse e o nome que voce usara no Set Analysis. Ex: Cenario_B, Periodo_2.
Selecione o objeto (filtro, grafico, KPI). No painel de propriedades do objeto, localize Estado e selecione o estado criado. Esse objeto agora opera no novo estado.
Cenario_A e Cenario_B sao genericos mas funcionais. Periodo_Selecionado e Benchmark_Regiao sao melhores para dashboards de producao. Nunca use espacos ou caracteres especiais - o nome deve ser valido como identificador de expressão.
O padrao mais comum e ter uma caixa de filtro (filter pane) para cada estado. O usuario faz seleções em cada caixa de forma independente:
Exibe dimensoes (Regiao, Produto, Ano). O objeto esta atribuido ao estado padrao. As seleções aqui afetam todos os objetos que usam {$}.
Exibe as mesmas dimensoes. O objeto esta atribuido ao estado Cenario_B. As seleções aqui so afetam objetos que referenciaram esse estado nas expressões.
// O objeto grafico usa estado padrao (nenhuma configuração especial)
// Basta ter as duas medicoes:
// Medicao 1 - usa as seleções do estado padrao
Sum({$} Receita)
// Label: "Receita - Selecao A"
// Medicao 2 - usa as seleções do estado Cenario_B
Sum({Cenario_B} Receita)
// Label: "Receita - Selecao B"
// Medicao 3 - diferenca absoluta entre os dois estados
Sum({$} Receita) - Sum({Cenario_B} Receita)
// Label: "Variacao A vs B"
// Medicao 4 - variacao percentual
Num(
(Sum({$} Receita) / Sum({Cenario_B} Receita)) - 1,
'+#,##0.0%;-#,##0.0%;0.0%'
)
Voce também pode trabalhar com estados diretamente no script usando o modificador DISTINCT e inspecionar qual estado esta ativo. Mas a configuração de estados e sempre feita via interface - o script não cria estados:
// Voce pode LER o estado ativo de um campo via função GetCurrentField()
// mas a criacao de estados e exclusiva da interface do Sense
// O que voce PODE fazer no script e preparar campos
// que serao usados como seleções por estado:
Dim_Regiao:
LOAD DISTINCT
Regiao,
'Regiao: ' & Regiao AS Regiao_Label
RESIDENT Fatos;
// Esse campo sera exibido nos filtros de ambos os estados
Os padroes abaixo combinam Estado Alternativo com as técnicas de Set Analysis das partes anteriores - modificadores, P(), dollar-sign expansion e períodos dinâmicos.
// Configuracao: Dois filtros de Regiao (Estado $ e Estado Regiao_B)
// O usuario escolhe qualquer regiao em cada filtro
// KPI: Receita da Regiao A (seleção do usuario no estado padrao)
Sum({$} Receita)
// KPI: Receita da Regiao B (seleção do usuario no estado Regiao_B)
Sum({Regiao_B} Receita)
// Label dinâmico mostrando qual regiao esta em cada estado
'Regiao Selecionada: ' & GetCurrentField(Regiao)
// Para o estado alternativo, use a função dentro de um objeto
// atribuido ao estado Regiao_B:
'Comparativo: ' & Concat({Regiao_B} DISTINCT Regiao, ', ')
// Porcentagem de diferenca
Num(
Sum({$} Receita) / Sum({Regiao_B} Receita) - 1,
'+#,##0.0%;-#,##0.0%;0.0%'
)
// Estado padrao: clientes que compraram Produto A
// Estado Cohort_B: clientes que compraram Produto B
// Pergunta: qual a receita cruzada entre os dois grupos?
// Clientes exclusivos do Estado padrao (compraram A mas não B)
Count(
{$<ClienteID =
P({$} ClienteID)
-
P({Cohort_B} ClienteID)
>}
DISTINCT ClienteID
)
// Clientes em AMBOS os estados (compraram A e B)
Count(
{$<ClienteID =
P({$} ClienteID)
*
P({Cohort_B} ClienteID)
>}
DISTINCT ClienteID
)
// Receita dos clientes em comum
Sum(
{$<ClienteID =
P({$} ClienteID) * P({Cohort_B} ClienteID)
>}
Receita
)
// Estado padrao: performance real (todas as seleções do usuario)
// Estado WhatIf: simulacao com canais ou categorias diferentes
// Realizado atual
Sum({$} Receita)
// Cenario simulado: estado WhatIf + desconto adicional de 10%
Sum({WhatIf} Receita) * 0.9
// Cenario simulado: estado WhatIf + apenas clientes Premium
Sum({WhatIf<Segmento={'Premium'}>} Receita)
// Impacto do cenário (diferenca absoluta)
Sum({$} Receita) - Sum({WhatIf} Receita)
// Porcentagem de impacto com formatacao de sinal
Num(
(Sum({$} Receita) - Sum({WhatIf} Receita)) /
Abs(Sum({WhatIf} Receita)),
'+#,##0.0%;-#,##0.0%;0.0%'
)
Combinando Estado Alternativo com as expressões de período da Parte 2:
// Estado padrao: Regiao Sul, período padrao do usuario
// Estado Periodo_2: Regiao Norte, período diferente
// YTD da seleção padrao
Sum({$<Ano={$(=Max({1}Ano))},
Mes={"<=$(=Month(Today()))"}>} Receita)
// YTD do estado alternativo - mesmo período, seleções diferentes
Sum({Periodo_2<Ano={$(=Max({1}Ano))},
Mes={"<=$(=Month(Today()))"}>} Receita)
// Nota: os modificadores de período sao iguais nos dois -
// o que muda sao as seleções de Regiao/Produto feitas pelo usuario
// em cada caixa de filtro independente
// % de participacao do estado padrao no total do estado alternativo
// Util para ver quanto a Regiao A representa do universo Regiao B
Sum({$} Receita) /
Sum(TOTAL {Cenario_B} Receita)
// % de participacao com guarda contra divisao por zero
If(
Sum({Cenario_B} Receita) > 0,
Num(
Sum({$} Receita) / Sum(TOTAL {Cenario_B} Receita),
'#,##0.0%'
),
'Sem dados'
)
Tabela de sintaxe completa, erros frequentes e checklist de boas praticas para uso em producao.
| Expressao | Significado | Quando usar |
|---|---|---|
Sum({$} Receita) | Estado padrao (seleções atuais) | Medicao base de referencia |
Sum({1} Receita) | Todos os registros, ignora seleções | Total absoluto fixo |
Sum({Cenario_B} Receita) | Selecoes do estado Cenario_B | Comparativo A vs B |
Sum({Cenario_B<Status={'Ativo'}>} Receita) | Estado B + modificador adicional | Estado B filtrado por condicao extra |
Count({$} DISTINCT ClienteID) - Count({Cenario_B} DISTINCT ClienteID) | Diferenca de contagem entre estados | Crescimento ou queda de base |
Sum({$} Receita) / Sum({Cenario_B} Receita) - 1 | Variacao percentual entre estados | KPI de comparativo |
P({$} ClienteID) * P({Cenario_B} ClienteID) | Intersecao de clientes entre estados | Analise de cesta / cohort |
Sum(TOTAL {Cenario_B} Receita) | Total do estado B, ignora dimensoes do grafico | % de participacao cruzada |
O nome no Set Analysis deve ser identico ao nome criado na interface, incluindo maiusculas, minusculas e underscores. {cenario_b} e diferente de {Cenario_B}.
Criar o estado não basta. Cada objeto (filtro, botao) precisa ser explicitamente atribuido ao estado correto via painel de propriedades. Um filtro no estado padrao não alimenta o estado alternativo.
O grafico de comparação deve estar no estado padrao ($) para mostrar ambas as medicoes. Se o grafico estiver atribuido a um estado especifico, ele so reflete as seleções daquele estado.
{Cenario_B<Campo={'Valor'}>} usa as seleções do estado B E adiciona o modificador. {$<Campo={'Valor'}>} usa o estado padrao com modificador. Sao contextos diferentes.
Periodo_Comparativo e melhor que Estado2ClearAll() associado ao estado)Concat({EstadoNome} DISTINCT Campo, ', ') em caixas de texto para mostrar ao usuario o que esta selecionado em cada estado