Skip to content

Calendário e filtros por data ​

Tipo
Como fazer
Para
Analista
Na tela
DataViz › Aplicação › Editar

Três pedidos costumam chegar juntos: o filtro de data do Dashboard alcançar todos os Widgets, um Widget usar a data de emissão e outro a de entrega, e um Widget mostrar o mês inteiro do dia que o leitor escolheu. O exemplo usa uma tabela fato Faturamento com DATA_EMISSAO, DATA_ENTREGA e VALOR.

Antes de começar ​

Você precisa de uma Aplicação na Minha Mesa com Faturamento adicionada. Os conceitos por trás estão em Modelo de dados e Filtros.

Uma fato e uma data só ​

Com uma fato e uma data, não precisa de Calendário. Defina o filtro de abertura:

  1. No editor da Aplicação, abra a aba Geral e a sub-aba Dashboards.
  2. Com Modo de filtros em Um conjunto para toda a aplicação, em Filtros Padrões, adicione um filtro em DATA_EMISSAO, com valor (por exemplo, o mês atual) ou vazio.
  3. Clique em Salvar. A Aplicação abre filtrada, e o leitor pode trocar o período.

O filtro de data em todos os Widgets ​

Com mais de uma fato, o filtro precisa de uma dimensão comum: a tabela Calendário, com uma linha por dia.

  1. Crie a tabela Calendário no HorusETL (veja Gerar a tabela Calendário) e publique-a.
  2. Na aba Tabelas, adicione o Calendário e ligue Calendário.DATA (Lado 1) a Faturamento.DATA_EMISSAO (Lado N). Ligue também as outras fatos pelo Calendário.
  3. Nos Widgets e nos filtros de abertura, use Calendário.DATA, nunca a coluna de data da fato.

Um único filtro em Calendário.DATA passa a valer para todos os Widgets. Se um Widget continua parado, ele tem um filtro de data próprio, que vence o da barra: tire o filtro do Widget ou marque Combinar com filtros do dashboard nele (veja Filtro do Widget).

Datas diferentes em Widgets diferentes ​

Para um Widget mostrar por emissão e outro por entrega, use o mesmo Calendário com uma chave secundária.

  1. Na aba Tabelas, selecione a ligação entre Calendário e Faturamento.

  2. Clique em Adicionar Chave e escolha DATA e DATA_ENTREGA. A primeira chave (DATA_EMISSAO) continua Padrão; a nova fica Secundário (use).

  3. Clique em Salvar.

  4. Na aba Expressões, crie a medida da entrega:

    sql
    use([Calendário], [Faturamento].DATA_ENTREGA) SUM([Faturamento]."VALOR")
  5. Use essa expressão no Widget de entrega e a soma de VALOR comum no de emissão.

O filtro em Calendário.DATA agora alimenta os dois Widgets, cada um pela sua data.

Cada Widget na sua granularidade ​

O leitor escolhe um dia, e um Widget deve mostrar o mês inteiro daquele dia. Um filtro é um valor só: filtrar Calendário.DATA num dia restringe tudo àquele dia. Para o Widget reinterpretar a escolha, crie uma expressão que lê o filtro com <...> e reescreve o período com ${...}:

sql
${
  SUM([Faturamento]."VALOR"),
  [Calendário]."DATA" BETWEEN
    MONTHSTART(<[Calendário]."DATA":START, CURRENT_DATE>)
    AND MONTHEND(<[Calendário]."DATA":START, CURRENT_DATE>)
}

Sem filtro na tela, <[Calendário]."DATA":START, CURRENT_DATE> devolve a data de hoje. Trocando as funções, o mesmo molde cobre outras granularidades. Abreviando <[Calendário]."DATA":START, CURRENT_DATE> como <sel>:

O Widget mostra sempreFiltro dentro do ${...}
O mês da data escolhida[Calendário]."DATA" BETWEEN MONTHSTART(<sel>) AND MONTHEND(<sel>)
O ano da data escolhida[Calendário]."DATA" BETWEEN YEARSTART(<sel>) AND YEAREND(<sel>)
A semana da data escolhida[Calendário]."DATA" BETWEEN WEEKSTART(<sel>) AND WEEKEND(<sel>)
Os 3 meses até a data escolhida[Calendário]."DATA" BETWEEN SUBMONTHS(<sel>, 3) AND <sel>
Os 12 meses até a data escolhida[Calendário]."DATA" BETWEEN SUBMONTHS(<sel>, 12) AND <sel>

Para granularidade própria com a data de entrega, combine as duas técnicas: use() no começo e ${...} em volta da medida. Todas as funções estão em Linguagem de expressões.

Gerar a tabela Calendário ​

Gere o Calendário uma vez, num Dataflow do HorusETL com um nó Python (Pandas), e publique a tabela no HorusDW. O script abaixo cria os últimos 5 anos até hoje:

python
import pandas as pd
from datetime import datetime, timedelta

fim = datetime.now().date()
inicio = fim - timedelta(days=5 * 365)

df = pd.DataFrame({'DATA': pd.date_range(start=inicio, end=fim, freq='D')})
df['ANO'] = df['DATA'].dt.year
df['MES'] = df['DATA'].dt.month
df['DIA'] = df['DATA'].dt.day
df['DIA_SEMANA_NUM'] = df['DATA'].dt.dayofweek + 1  # 1 = segunda, 7 = domingo
df['DIA_SEMANA'] = df['DIA_SEMANA_NUM'].map({1: 'Segunda-feira', 2: 'Terça-feira', 3: 'Quarta-feira',
                                             4: 'Quinta-feira', 5: 'Sexta-feira', 6: 'Sábado', 7: 'Domingo'})
df['SEMANA_ANO'] = df['DATA'].dt.isocalendar().week.astype(int)
df['TRIMESTRE'] = df['DATA'].dt.quarter
df['SEMESTRE'] = (df['DATA'].dt.month - 1) // 6 + 1
df['ANO_MES'] = df['DATA'].dt.to_period('M').astype(str)
df['FIM_SEMANA'] = df['DIA_SEMANA_NUM'].isin([6, 7])
df['DATA'] = df['DATA'].dt.strftime('%Y-%m-%d')

Acrescente feriados ou ano fiscal no mesmo script, se o negócio usar. Agende o Dataflow para o Calendário avançar com o tempo; veja HorusETL.

Se der errado ​

O que aconteceCausaConserto
Um Widget não muda com o filtro de dataEle tem filtro de data próprio no mesmo campoTire o filtro ou marque Combinar com filtros do dashboard
Metas some quando filtro pela data de vendaO filtro está na coluna da fatoFiltre por Calendário.DATA
A expressão com use() dá erro de colunaA chave secundária não foi cadastradaAdicione a chave na ligação
Nenhuma linha casa com o CalendárioA data da fato tem horaMarque Ignorar Horário na comparação na chave

Relacionado ​