Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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?
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
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
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
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?