Boas festas!

Boa tarde pessoal, tudo bom?

Passo aqui para deixar uma feliz natal a todos e um prospero ano novo. Que Deus abençoe e derrame graça sobre suas vidas e de seus familiares! Aproveitem as datas para ficarem com suas famílias, pois isso é o mais importante que temos.

Um grande abraço!

Vamos que vamos!

Vídeo Tutoriais de desenvolvimento – Qlik

Pessoal, agora no fim do ano a Qlik disponibilizou diversos materiais em vídeos sobre dicas avançadas e truques para o desenvolvimento de aplicações profissionais. O novo QlikView 11 tutorial para desenvolvedores inclui 20 vídeos mostrando passo-a-passo para concluir tarefas avançadas. Aprender novos métodos para a construção de aplicações mais complexas, completos e com aparência profissional. Construa aplicativos com mais facilidade, aprendendo a resolver rapidamente os problemas que podem ocorrer durante o desenvolvimento.

Data from websites Data from spreadsheets Displaying data
Clean data

Loading partial data

Cleansing dirty data

Spreadsheets from websites

Simple data

Rearranging data with crosstables

Population pyramid

Displaying key parameters

Extension Objects

Drop-down menus

Data from databases Data models Conclusions
Getting and preparing databases

Adding ODBC connections in Windows

Adding ODBC data in QlikView

Field names that change

Making new fields

Linking different tables – keys

Removing circular references

TRACE

Putting it all together

Segue o link com o post original e com todo o material: QlikView 11 Developer Tutorial

Bons estudos!

Mudança de abas automaticamente (ideal para LCDs)

Algo que sempre gera dúvidas: Existe a possibilidade de montar um dashboard e este dashboard ficar trocando de abas, ou objetos, automaticamente no LCD da sala de minha empresa?

R: Sim, existe!

A forma em que irei demonstrar é fazer através do I.E. Plugin (Internet Explorer). Ahhh, mas quero fazer funcionar no AJAX, tem como?

R: Sim, mas deixarei para um próximo post (podem me cobrar), pois para funcionar no ajax teremos que alterar algumas dlls.

Sem mais enrolação, vamos ao código:

1) Crie uma nova aplicação.

2) Crie três variáveis:

  • vAba = Definirá a quantidade de abas que sua aplicação possui para fazer a rotação automática.
  • vDelay = Definirá o tempo, em segundos, em que cada aba deverá permanecer.
  • vMostra = Definirá qual a atual aba estará sendo visualizada.

Em nosso exemplo: teremos 4 abas e quero que cada aba fique visível por 15 segundos.

SET vAba = 4;
SET vDelay = 15;
SET vMostra = =ceil((frac(now())*86400/(vAba*vDelay)-floor(frac(now())*86400/(vAba*vDelay)))*(vAba));

3) Altere o modo de atualização da aplicação para “O servidor executa a atualização automaticamente sem a ação do cliente.”

Localização desta opção: Configuração -> Propriedades do Documento -> Aba “Servidor”.

Mudança automática de abas.

Mudança automática de abas.

OBS: Para que serve isso? Isso é essencial para que sua atualização atualize os dados automaticamente, caso esta opção não esteja marcada e a carga desta aplicação tenha acabado de executar, os dados da aplicação não serão atualizados até que o usuário vá e faça alguma ação nesta aplicação.

4) Nas propriedades de cada uma das abas, habilite a condicional para Mostrar a pasta e coloque a seguinte regra:

vMostra = 1 //para a aba 1

vMostra = 2 //para a aba 2

vMostra = 3 //para a aba 3

vMostra = 4 //para a aba 4

Condicional de pasta

5) Esconda as abas para ficar mais bonitinho 😀

Configuração -> Propriedades do Documento -> Aba Geral -> Habilite Ocultar Pasta

Prontinho, agora a cada 15 segundos sua aplicação vai trocar de aba.

Em anexo estou disponibilizando um exemplo de aplicação. Faça o download aqui.

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