Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
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?