Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
nicolett_yuri

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!

Labels (1)
0 Replies