Expressões considerando datas diferentes

É um caso aparentemente simples (que sempre é solicitado rsrs) em que um gráfico com dimensão temporal (dia ou mês ou ano) referencia duas expressões que se baseiam em datas diferentes, por exemplo: Quantidade de notas emitidas e quantidade de notas canceladas em que a quantidade de notas emitidas se baseia na coluna temporal DATA_EMISSAO e a quantidade de notas canceladas se baseia na coluna temporal DATA_CANCELAMENTO.

Pergunta: Qual a coluna de data que se deve utilizar na dimensão do gráfico? Se usarmos a data de emissão, a coluna de notas canceladas ficará incorreta, pois nem todas as notas canceladas foram canceladas na data (ou mês ou ano) da emissão.  Se usarmos a data de cancelamento, a coluna de notas emitidas ficará incorreta devido ao mesmo caso.

Com o problema em mãos, começamos a pensar sobre possíveis soluções, por exemplo:

  1. Criar uma tabela de calendário isolada da modelagem (sem nenhuma ligação) “a famosa ILHA” e fazer a referência dentro da expressão. Problema: A performance de sua aplicação vai despencar.
  2. Isolar os fatos em tabelas separadas: tabela de notas emitidas e tabela de notas canceladas. Problema: A performance é boa, porém iremos duplicar o volume de dados de nossa aplicação.

Confesso que estava partindo para a solução 2, porém me veio um “insight” na cabeça: Porque não criar uma linktable das datas? Isso me aumentaria um “IF” dentro do gráfico, porém continuaria com uma boa performance e não aumentaria, em muito, minha volumetria de dados.

Vamos a prática:

1) Criamos a nossa tabela Fato:

Fato:
LOAD * INLINE [
NUM_NOTA, VALOR, DATA_EMISSAO, DATA_CANCELAMENTO
00001, 10, 01/01/2014, 10/02/2014
00002, 2, 05/01/2014,
00003, 1, 05/01/2014
00004, 5, 05/01/2014, 10/01/2014
00005, 11, 06/01/2014, 10/01/2014
00006, 8, 06/01/2014,
00007, 12, 06/01/2014,
00008, 4, 01/02/2014, 05/02/2014
00009, 8, 01/02/2014, 10/02/2014
00010, 4, 01/02/2014, 18/02/2014
00011, 3, 05/02/2014,
00012, 5, 05/02/2014,
00013, 10, 10/02/2014, 01/03/2014
00014, 2, 01/03/2014, 10/03/2014
];

2) Criamos uma tabela de Link entre o fato e o nosso calendário oficial, para criar esse link devemos dividir a tabela fato em duas: a primeira com as datas de emissão e a segunda com as datas de cancelamento. Após a divisão devemos concatena-las utilizando o mesmo nome do campo de data, mas lembre-se de criar uma coluna com o identificador da origem da data.

IMPORTANTE: Alem do campo de data e identificador, também devemos decidir qual será o campo chave entre a tabela de Link e a tabela Fato.

LinkData:
LOAD
NUM_NOTA,
DATA_EMISSAO as Data,
‘DataEmissao’ as Tipo
RESIDENT Fato;

LOAD
NUM_NOTA,
DATA_CANCELAMENTO as Data,
‘DataCancelamento’ as Tipo
RESIDENT Fato
WHERE
LEN(TRIM(DATA_CANCELAMENTO))>0; //Garantia para concatenar somente datas de cancelamento válidas.

3) Criar a tabela de calendário e fazer a ligação entre a tabela calendário com a tabela de Link.

Realizado os passos, no gráfico, utilize a dimensão de Mês e Ano da tabela de calendário e nas expressões faça a referência com a coluna de identificação da origem da data, conforme exemplo abaixo:

Expressão para quantidade de notas fiscais emitidas

COUNT( {$<Tipo={“DataEmissao”}>} NUM_NOTA)

Expressão para quantidade de notas fiscais canceladas

COUNT( {$<Tipo={“DataCancelamento”}>} NUM_NOTA)

Pronto, agora podemos referenciar as datas no mesmo gráfico, garantir uma alta performance e não aumentar muito a volumetria de dados em nossa aplicação.

PS: Isso vale para datas em tabelas diferentes, o processo será o mesmo.

Estou anexando uma aplicação de exemplo para vocês. Faça o download aqui.

É isso! Abraço a todos!!

Exportando para PDF (Macro)

Fala galera!

Tempos atrás me perguntaram como posso automatizar a exportação de relatórios para PDF através de Macros. Confesso que há muito tempo venho fugindo desse assunto, porém estou trabalhando em um projeto e uma das atividades é essa! Acabou a fuga rsrs.

Vamos lá.

Em primeiro lugar, a fonte de informação deverá ser um Report (Relatório) do QlikView, tendo este relatório pronto podemos prosseguir com a macro.

A biblioteca que estou utilizando para exportação é PDFCreator 1.7.3, pois esta é uma ferramenta gratuita e na exportação não houver perda na qualidade de imagem (pelo menos no meu caso). Clique aqui para para fazer download do PDFCreator.

Bom, vamos ao código em VBScript. Cada linha de execução possui um comentário/explicação em verde e negrito.

‘Criando instância do PDFCreator
Set pdfjob = CreateObject(“PDFCreator.clsPDFCreator”)

‘Variáveis de configuração da biblioteca PDFCreator
With pdfjob

‘Verificações da fila da impressora
If .cStart(“/NoProcessingAtStartup”) = False Then
If .cStart(“/NoProcessingAtStartup”, True) = False Then
‘Caso não tenha nenhum objeto na fila de impressão, termina a macro.
Exit Sub
End if

‘Caso tenha objeto na fila de impressão, torne a impressão visível
.cVisible = True
End If

.cOption(“UseAutosave”) = 1 ‘Permitir o Autosave
.cOption(“UseAutosaveDirectory”) = 1 ‘Permitir que grave no diretório
.cOption(“AutosaveDirectory”) = Path ‘Caminho que será gravado o relatório
.cOption(“AutosaveFilename”) = ReportName ‘Nome que será gravado o relatório
.cOption(“AutosaveFormat”) = 0 ‘Formato PDF
.cClearCache

‘Finalizando as configurações da biblioteca PDFCreator
End With

‘Imprime o relatório
ActiveDocument.PrintReport ReportID, “PDFCreator”

‘Aguarde até que o processo entre na fila de impressão
Do Until pdfjob.cCountOfPrintjobs = 1
ActiveDocument.GetApplication.Sleep 20
Loop
pdfjob.cPrinterStop = False

‘Aguarda até que a fila de impressão esteja vazia
Do Until pdfjob.cCountOfPrintjobs = 0
ActiveDocument.GetApplication.Sleep 20
Loop

‘Termina o processo
pdfjob.cClose

‘Zerando a variável
Set pdfjob = Nothing

Praticamente essa é a forma de chamar a biblioteca do PDFCreator. Agora basta criar uma sub para chamar essa macro e então utiliza-la.

Para facilitar o entendimento, estou anexando uma aplicação de exemplo.

Observação: Fiz o teste de execução através do QlikView Client e também acesso web (IE.Plugin) e ambos funcionaram conforme o determinado.

Download da aplicação de exemplo.

Qualquer dúvida por favor comentem!

Abraços

Livro: QlikView 11 to developers

Inaugurando o blog, estou postando um livro muito útil, QlikView 11 for Developers dos autores Miguel Garcia e Barry Harmsen.

Este livro é de grande importância para quem esta iniciando no mundo do QlikView. Contém informações relevantes para o seu dia a dia e também para as certificações.

Sempre busco adquirir novos conhecimentos e mesmo que pareça algo repetitivo ou massante, vale a pena ler por estes autores possuem grande experiencia com BI e principalmente com QlikView.

Abaixo esta o link para download do livro e também um pouco sobre os autores:

Miguel García is a Business Intelligence Consultant and QlikView Solutions Architect from Monterrey, Mexico. Having worked throughout many successful QlikView implementations, from inception through implementation, and performed across a wide variety of roles on each project, his experience and skills range from applications development and design, to pre-sales, technical architecture, system administration, as well as functional analysis and overall project execution.
He currently holds the QlikView Designer and QlikView Developer Certifications, backed by QlikTech, for versions 9, 10, and 11.

Barry Harmsen is an independent Business Intelligence Consultant based in the Netherlands. Originally from a background of traditional Business Intelligence, Data Warehousing, and Performance Management, in 2008 he made the shift to QlikView
and a more user-centric form of Business Intelligence. Since then he has completed many successful QlikView implementations in many different industries, from Financial Services to Telecoms, and from Manufacturing to Healthcare. He writes a QlikView blog at QlikFix.com.