Buscar K
Aparência
Aparência
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.
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.
Com uma fato e uma data, não precisa de Calendário. Defina o filtro de abertura:
DATA_EMISSAO, com valor (por exemplo, o mês atual) ou vazio.Com mais de uma fato, o filtro precisa de uma dimensão comum: a tabela Calendário, com uma linha por dia.
Calendário.DATA (Lado 1) a Faturamento.DATA_EMISSAO (Lado N). Ligue também as outras fatos pelo Calendário.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).
Para um Widget mostrar por emissão e outro por entrega, use o mesmo Calendário com uma chave secundária.
Na aba Tabelas, selecione a ligação entre Calendário e Faturamento.
Clique em Adicionar Chave e escolha DATA e DATA_ENTREGA. A primeira chave (DATA_EMISSAO) continua Padrão; a nova fica Secundário (use).
Clique em Salvar.
Na aba Expressões, crie a medida da entrega:
use([Calendário], [Faturamento].DATA_ENTREGA) SUM([Faturamento]."VALOR")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.
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 ${...}:
${
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 sempre | Filtro 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.
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:
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.
| O que acontece | Causa | Conserto |
|---|---|---|
| Um Widget não muda com o filtro de data | Ele tem filtro de data próprio no mesmo campo | Tire o filtro ou marque Combinar com filtros do dashboard |
| Metas some quando filtro pela data de venda | O filtro está na coluna da fato | Filtre por Calendário.DATA |
A expressão com use() dá erro de coluna | A chave secundária não foi cadastrada | Adicione a chave na ligação |
| Nenhuma linha casa com o Calendário | A data da fato tem hora | Marque Ignorar Horário na comparação na chave |