Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
adrianavila
Contributor II
Contributor II

Criar Varios QVDs a partir do campo AnoMes

Olá, 

 

Estou tentando criar Qvds separados a partir do campo AnoMes.

Estou fazendo isso devido ao tamanho das informações para utilizar no qliksense posteriormente.


OLEDB CONNECT TO xxxxx

SET DiretórioQVD = '$(caminhoQVD.txt)';

TabelaOriginal:
SQL SELECT *
FROM tabela1 WHERE CAST(data) >= '2023-05-01'; // 

**este campo "data" é configurado para trazer ano-mes-dia e hora**


// Crie uma nova tabela calculada para agrupar por mês
TabelaAgrupada:
LOAD
*,
Month(Timestamp(data)) AS Mes,
Year(Timestamp(data)) AS Ano
RESIDENT TabelaOriginal;

// Salve os QVDs agrupados por mês
FOR Each AnoMes IN FieldValueList('Ano' & Mes)
LET tabelax  = 'tabelax_' & AnoMes & '.qvd';
STORE TabelaAgrupada
INTO '$(DiretorioQVD)$(tabelax)';

NEXT

DISCONNECT;

//DROP TABLE TabelaOriginal;
//DROP TABLE TabelaAgrupada;

 

 

ao gerar o qvd, ela traz apenas o acumulado do ano. Eu preciso que traga o acumulado AnoMes acumulado.

Alguem pode ajudar?

Labels (2)
3 Replies
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Adriana, como me parece que esta sendo lido de forma incremental, voce precisa concatenar com os dados lidos anteriormente para ter o historico completo.

 Segue link com exemplos insert,update e delete

 

https://help.qlik.com/en-US/sense/May2023/Subsystems/Hub/Content/Sense_Hub/LoadData/use-QVD-files-in...

Interessante tambem é ter uma rotina que detecta se existe um QVD com ano/mes para concatenar, caso contrario dará erro se for o primeiro qvd do ano/mes em questão. Segue exemplo


// Função para pegar a data e verificar se tem QVD para incremental
sub Incremental_Inicio (vNomeTabela)
LET v_Tem_QVD = if(QvdNoOfRecords('lib://Stage/$(vNomeTabela).QVD')>0,1,0);
LET v_Data = Date(AddYears(YearStart(Today()),-4));
Let vDataAte = Date(AddYears(YearStart(Today()),-4));
LET v_Registros_QVD = 0;
LET v_Registros_RAM = 0;
//
if $(v_Tem_QVD) = 1 then
     LET v_Registros_QVD = QvdNoOfRecords('lib://Stage/$(vNomeTabela).QVD');
     LET v_Data = date((floor(QvdCreateTime('lib://Stage/$(vNomeTabela).QVD')) - 60 ),'DD/MM/YYYY');
     LET vDataAte = date((floor(QvdCreateTime('lib://Stage/$(vNomeTabela).QVD')) - 60 ),'DD/MM/YYYY');
ELSE
     TRACE *********************** Nao Achou o QVD do $(vNomeTabela) lendo a partir de $(v_Data) **********************************;
ENDIF
End Sub
// Função para finalizar o incremental
sub Incremental_Final (vNomeTabela,vNomeCampo,vCampoData)
if $(v_Tem_QVD) = 1 then
     TRACE ****************************** Unindo os dados do QVD com a tabela $(vNomeTabela) ****************************************;
     Concatenate ([$(vNomeTabela)])
     LOAD * FROM [lib://Stage/$(vNomeTabela).QVD] (qvd) Where [$(vCampoData)] < '$(vDataAte)' ;
ENDIF
//
Let v_Registros_RAM = NoOfRows('$(vNomeTabela)');
if $(v_Tem_QVD) = 0 then
     TRACE ****************** Salvando o QVD com $(v_Registros_RAM) registros lidos e não tem QVD anterior **************************;
      STORE [$(vNomeTabela)] Into [lib://Stage/$(vNomeTabela).QVD] (qvd);
ENDIF

if $(v_Tem_QVD) = 1 and $(v_Registros_RAM) > $(v_Registros_QVD) then
     TRACE ****************** Salvando o QVD da v_Registros_QVD...em RAM $(v_Registros_RAM)...em QVD $(v_Registros_QVD) **************************;
     STORE [$(vNomeTabela)] Into [lib://Stage/$(vNomeTabela).QVD] (qvd);
ELSE
     TRACE ************************* Nao Salvou o QVD pois os registros em RAM $(v_Registros_RAM) sao menores que os em QVD $(v_Registros_QVD) *********************************;
ENDIF
Drop Table [$(vNomeTabela)];

End Sub

 

 

furtado@farolbi.com.br
adrianavila
Contributor II
Contributor II
Author

Primeiramente obrigado por responder.

 

Na verdade eu preciso de um script para fazer um looping para gerar qvds por mes/ano.

Usei algo parecido abaixo, mas esta gerando apenas um mês.

Grouped_Table:
LOAD
*,
Month(Timestamp(dataFont)) AS Month,
Year(timestamp(dataFont)) AS Year,
(Year(timestamp(dataFont))*100) + (Month(Timestamp(dataFont))*1) as YearMonth RESIDENT OriginalTable; FOR Each YearMonth IN FieldValueList('YearMonth') _tmp:
noconcatenate
Load
*
resident Grouped_Table
where
YearMonth=$(YearMonth)
;
STORE _tmp INTO '$(QVD Directory)table_$(YearMonth).qvd';
drop table _tmp; NEXT YearMonth
adrianavila
Contributor II
Contributor II
Author

Consegui através do script abaixo:

TabelaAgrupada2:
LOAD
*,
Month(Timestamp(DT_INI)) AS Month,
Year(timestamp(DT_INI)) AS Year,

(Year(timestamp(DT_INI))*100) + (Month(Timestamp(TS_INI_SOL_SERVICO))*1) as YearMonth
RESIDENT TabelaOriginal;

FOR Each YearMonth IN FieldValueList('YearMonth')

_tmp:
noconcatenate
Load
*
Resident TabelaAgrupada2
//resident TabelaAgrupada2
where
YearMonth=$(YearMonth);

STORE _tmp INTO '$(INCLUDE=caminhoQVD.txt)teste_$(YearMonth).qvd';
drop table _tmp;


next YearMonth;

DROP TABLE TabelaOriginal;
DROP TABLE TabelaAgrupada2;

 

Agora, precisaria usar ela como filtro de data para outras tabelas. Ou seja, ao fazer load de uma nova tabela, preciso filtrar essa nova tabela conforme a data da tabela do script acima. é possivel?