Melhores Práticas – Hideprefix ou Hidesuffix

Fala pessoal, tudo bom?
 
Quero resgatar um pouco sobre o tópico de melhores práticas para o Qlikview e isso inclui a utilização da função Hideprefix.

Mas afinal o que é e para que server esta função?
Sua função serve essencialmente para transformar um ou diversos campos em campos de sistema, ou seja, se tornarão campos que não poderão ser utilizados pelo usuário e somente pelo desenvolvedor.
Essa é uma boa prática para evitar que nossos usuários possam obter informações incoerentes através de um campo que não possa ser utilizado no modelo.
 
 

Hideprefix

Todos os nomes de campos iniciados por um caractere de texto (ou pelo conjunto de caracteres) serão ocultos, da mesma forma que os campos de sistema.

Essa configuração funciona apenas para campos, não para variáveis.
 
 

Hidesuffix

Todos os nomes de campos terminados por um caractere de texto (ou pelo conjunto de caracteres) serão ocultos, da mesma forma que os campos de sistema.

Essa configuração funciona apenas para campos, não para variáveis.

 

Como posso utilizar essas funções?

Para ativar essas funções é necessário declará-las como variáveis. Estas variáveis são tratadas como variáveis de configurações do sistema.

 

 

Exemplos de utilização

 

Hideprefix

SET HidePrefix = ‘%’;

Neste exemplo campos iniciados com % serão tratados como campos do sistema.

 

Posso também declarar um prefixo camposto por mais de um caractere, por exemplo:

SET HidePrefix = ‘%C’;

Neste exemplo campos iniciados com %C serão tratados como campos do sistema.

 

Hidesuffix

SET Hidesuffix = ‘%’;

Neste exemplo campos terminados com % serão tratados como campos do sistema.

 

Da mesma forma que o Hideprefix, também é possível declarar um sufixo composto por mais de um caractere, por exemplo:

SET Hidesuffix = ‘ABA’;

Neste exemplo campos terminados com ABA serão tratados como campos do sistema.

 

Observação: Os campos de sistema podem ser visualizados pelo usuário desenvolvedor habilitando o checkbox “Mostrar campos do sistema” nas telas de Dimensões, expressões e lista de campos. Abaixo mostro onde encontrar essas opções em cada uma das telas:

 

Criação de objeto - Dimensões

Criação de objeto – Dimensões

Criação de objeto - Expressões

Criação de objeto – Expressões

Propriedades da Pasta - Campos

Propriedades da Pasta – Campos

 

Na prática

É sempre uma boa prática transformar os campos que são utilizados como chave de ligação entre as tabelas como um campo de sistema.

Em meu caso, sempre crio os campos chaves com o ‘%’ na frente e faço a omissão utilizando o Hideprefix.

 

Outro caso de utilização: Campos de dimensões ou expressões de relatório Ad-Hoc (Aquele tipo de relatório em que selecionamos as dimensões e expressões do gráfico através de dois campos com os valores. Colocarei um post de como faze-lo mais para frente) não devem estar disponibilizados na aplicação, devem ser tratados como campos de sistema.

 
 

Conclusão

Essa melhor prática não esta ligada a desempenho, e sim para ORGANIZAÇÃO. É importante termos o cuidado com quais campos devem ou não ser disponibilizados para o usuário, pois a tendência para o mundo Qlik (Sim, estou falando do Qlik Sense) é que os próprios usuários criem seus dashboards, relatórios e gráficos; e é uma de nossas responsabilidades disponibilizar somente o que realmente possui sentido para o usuário utilizar.

 

 

Nos vemos na próxima semana!

Abraços
 

 

 

Anúncios

Função para Criar Calendário (Utilizando Data existente no modelo)

Fala pessoal, tudo beleza?

No último post aprendemos a utilizar uma função para criação de calendário passando uma data início e data fim, hoje aprenderemos como verificar esse range através de um campo existente em nosso modelo.

Para fazer isso utilizaremos três funções: FieldValue, FieldValueCount e While.

  • FieldValue para retornar um valor do campo de data do modelo. Lembrando que sempre será retornado apenas um valor, para o nosso caso resolve, pois utilizaremos essa função junto com as funções MAX e MIN.
  • FieldValueCount utilizaremos para percorrer todos os possíveis valores do campo de data do modelo. Lembrando que a função retorna o número de valores distintos do campo escolhido.
  • While para criar todos os registro no intervalo entre a maior e menor data do modelo.

Vamos ao código:

SUB CriaCalendario(vCampoData,vNomeCalendario,vPrefixoCalendario,vCampoChave)

LET vNomeCalendario = If(Len(‘$(vNomeCalendario)’)=0,’Calendario’,’$(vNomeCalendario)’);
LET vPrefixoCalendario = If(Len(‘$(vPrefixoCalendario)’)=0,”,’$(vPrefixoCalendario)’);
LET vCampoChave = PurgeChar(vCampoChave,'”[]’);

[$(vNomeCalendario)]:
LOAD
Distinct
Data_ as [$(vCampoChave)],
Date(Data_, ‘$(DateFormat)’ ) as [$(vPrefixoCalendario)Data],
Year(Data_) as [$(vPrefixoCalendario)Ano],
Month(Data_) as [$(vPrefixoCalendario)Mes],
Day(Data_) as [$(vPrefixoCalendario)Dia],
Date(MonthStart(Data_), ‘MMM/YYYY’) as [$(vPrefixoCalendario)MesAno];
LOAD
Date(_DataInicio+(Iterno()-1),’$(DateFormat)’ ) as Data_
WHILE (_DataInicio+(Iterno()-1)<=_DataFim); //Regra para gerar todos os registro do intervalo
LOAD
Floor(Min(Fieldvalue(‘$(vCampoData)’,RecNo()))) as _DataInicio, //Função utilizada para buscar valor do campo data do modelo.
Floor(Max(Fieldvalue(‘$(vCampoData)’,RecNo()))) as _DataFim
AUTOGENERATE FieldValueCount(‘$(vCampoData)’); //Função necessária para passar por todos os registros possíveis do campo data do modelo.

ENDSUB;

 
 
OBSERVAÇÃO: É necessário utilizar o FieldValueCount no AutoGenerate, pois precisamos passar por todos os possíveis valores do campo da data. Caso você não utilize, pode ser que o Min e o Max sejam alterados.

 

Pronto, agora basta utilizar a função Call e passar os parâmetros para que o calendário seja criado, conforme exemplo abaixo:

Call CriaCalendario(‘DATA’,’Calendario’,”,’%ChaveData’);

Neste exemplo o calendário será criado com o intervalo entre o intervalo de datas do campo DATA (esse campo esta localizado na tabela Tabela_Fato do exemplo), o nome da tabela será “Calendario”, nenhum prefixo de campos será utilizado e o campo de chave com a minha modelagem é “%ChaveData”.

Para fazer o download da aplicação de exemplo, basta clicar aqui!

 

Por enquanto é isso pessoal!

Semana que vem abordaremos outro assunto!

Função para Criar Calendário (Passando datas)

Fala pessoal!

 

Na maioria dos projetos em que iremos trabalhar é preciso criar um calendário para poder trabalhar com as datas de forma organizada (ainda não vou falar sobre um calendário principal, esse assunto vai ficar para um próximo post). Na maioria dos casos sempre opto por criar uma tabela de Calendário e trabalhar as datas nessa tabela, pois sempre tento organizar todas as datas necessárias para o projeto em uma única tabela (quando possível rsrs).

 

Hoje quero repassar para vocês uma função que utilizo para criar um calendário de uma forma com alta performance. Função? Sim, eu crio uma classe de função de script e depois utilizo uma linha passando os parâmetros necessários para criar o calendário.

 

Vamos entender um pouco mais sobre essas funções de script através do manual do QlikView:

O comando de controle sub e end sub define uma sub-rotina que pode ser chamada a partir de um comando call.

A sintaxe é:
sub nome [ ( listadeparâmetros )] comandos end sub

Onde:

  • name é o nome da sub-rotina.
  • listadeparâmetros é uma lista, separada por vírgulas, de nomes de variáveis para os parâmetros formais da subrotina. Eles podem ser usados como qualquer variável dentro da sub-rotina.
  • comandos são qualquer grupo de um ou mais comandos de script do QlikView.

 

Os argumentos são copiados na sub-rotina e, se os parâmetros reais correspondentes no comando call for o nome de uma variável, serão copiados novamente após a saída da sub-rotina.
Se uma sub-rotina tiver mais parâmetros formais que os parâmetros reais transmitidos por um comando call, os parâmetros extra serão inicializados como NULL e poderão ser utilizados como variáveis locais na subrotina.
Como o comando sub é um comando de controle e, por isso, termina com um ponto-e-vírgula ou com um fim de linha, cada uma de suas duas cláusulas (sub e end sub) não deve cruzar um limite de linha.

 

Agora vamos ao exemplo prático! No final do post existe um link para download de uma aplicação de exemplo 🙂

 
———————————————————————————————————–
 
 

Em primeiro lugar, cria um aba em seu script chamada Sub CriaCalendario nesta aba criaremos a função para criar o calendário. Segue agora o script:

 

/* Nome da função é CriaCalendario e esta recebe cinco parâmetros, são eles:

vDataInicio = Data de Início do seu relatório. O formato a ser passado pode seguir o modelo da formatação de data local, por exemplo DD/MM/YYYY.

vDataFim = Data de término do seu relatório. O formato a ser passado pode seguir o modelo da formatação de data local, por exemplo DD/MM/YYYY.

vNomeCalendario = Nome que receberá a tabela do seu calendário, caso nenhum seja digitado, então o nome Calendario será utilizado.

vPrefixoCalendario = Conjunto de caracteres que precederá todos os nomes de campos da tabela de calendário. Exemplo: “Calendario.”, então todos os campos possuirão o “Calendario.” antes do nome do campo da tabela. Caso nada seja utilizado, então nenhum prefixo será utilizado.

vCampoChave = Nome do campo que será chave entre a tabela de calendário e o seu modelo. Note que esse campo deve ser uma data completa, com dia, mês e ano.

*/

SUB CriaCalendario(vDataInicio,vDataFim,vNomeCalendario,vPrefixoCalendario,vCampoChave)

/* Algumas tratativas com os valores recebidos – Lembre-se que esses valores sempre serão tratados como variáveis. */
LET vNomeCalendario = If(Len(‘$(vNomeCalendario)’)=0,’Calendario’,’$(vNomeCalendario)’);
LET vPrefixoCalendario = If(Len(‘$(vPrefixoCalendario)’)=0,”,’$(vPrefixoCalendario)’);
LET vCampoChave = PurgeChar(vCampoChave,'”[]’);
/* Criação do calendário */
[“$(vNomeCalendario)”]:
LOAD
Distinct
Data_ as [$(vCampoChave)],
Date(Data_, ‘$(DateFormat)’ ) as [$(vPrefixoCalendario)Data],
Year(Data_) as [$(vPrefixoCalendario)Ano],
Month(Data_) as [$(vPrefixoCalendario)Mes],
Day(Data_) as [$(vPrefixoCalendario)Dia],
Date(MonthStart(Data_), ‘MMM/YYYY’) as [$(vPrefixoCalendario)MesAno];

LOAD
Date(‘$(vDataInicio)’+(Iterno()-1),’$(DateFormat)’ ) as Data_
AutoGenerate 1 While (Num(‘$(vDataInicio)’)+(Iterno()-1)<= Num(‘$(vDataFim)’));

/* Finalizando a função */
ENDSUB;

 

Pronto, agora basta utilizar a função Call e passar os parâmetros para que o calendário seja criado, conforme exemplo abaixo:

Call CriaCalendario(’01/01/2015′,’08/03/2015′,’Calendario’,”,’%ChaveData’);

 

Neste exemplo o calendário será criado com o intervalo entre 01/01/2015 e 08/03/2015, o nome da tabela será “Calendario”, nenhum prefixo de campos será utilizado e o campo de chave com a minha modelagem é “%ChaveData”.

 

IMPORTANTE: É necessário passar um valor para cada argumento criado na função, por esta razão passei um vazio para o argumento de número quatro que é o prefixo dos campos, caso contrário a função não executará corretamente.

 

Fiquem a vontade para editar e modelar da forma que preferirem para encaixar em seu modelo.

Para a próxima semana vou demonstrar como criar um calendário utilizando um intervalo de datas através de um campo de uma tabela.

 

Deixo aqui uma aplicação de exemplo para download.

 

Até a próxima semana!

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.