Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
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!
Bom código mas prefiro a versão em que se gera um qvd e depois se carrega o mesmo
com load com clausula where.
Legal Antonio.
A diferença desse método é a performance. Este é o método de criação de calendários com maior performance devido a utilização da função FieldValue. É muito mais rápido utilizar essa função do que fazer a leitura de um QVD ou tabela na memória para pegar os ranges.
Duvido mas vou testar isso.
Veja o seginte cenário: 200 qvw com um master calendar gerando dentro do qvw....
Pode testar que vai comprovar