Olá!
Feliz 2020!
Recentemente precisei desenvolver um script que realizaria cargas incrementais em um QVD. Neste post vamos ver como criar armazenar registros em QVD’s no QlikSense, e como atualizar ou inserir estes dados tornando assim uma carga incremental.
A carga incremental consiste em trazer somente dados que foram atualizados ou inseridos após determinada data. Para isto, o registro que você for trabalhar deverá possuir informação sobre data de alteração / inclusão.
Vamos trabalhar aqui com o modelo “inline”, onde os dados serão criados diretamente no script do QlikSense.
Vamos lá!
Primeiro, vamos criar uma tabela inline de tarefas, com os campos id, descricao, data_criacao, data_alteracao:
Script:
Tarefas:
Load * Inline [
"id","descricao","data_criacao","data_alteracao"
1, "Carregar dados da fonte","08/01/2020","08/01/2020"
2, "Tratar Dados","08/01/2020","08/01/2020"
];
exit Script;
Agora nós vamos criar uma nova conexão de pasta, para que possamos salvar nosso QVD.
Escolha um local e o nome da sua conexão e vamos então salvar nossa tabela em nosso QVD.
Script:
Tarefas:
Load * Inline [
"id","descricao","data_criacao","data_alteracao"
1, "Carregar dados da fonte","08/01/2020","08/01/2020"
2, "Tratar Dados","08/01/2020","08/01/2020"
];
// Armazena as tarefas no QVD
STORE Tarefas INTO '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]';
exit Script;
Certo, neste momento temos um QVD criado, que a todo momento em que rodarmos a carga, vai ser limpo e salvo novamente os dados. Este é o carregamento padrão do Qlik, o Insert.
Para que possamos realizar tanto o Insert quanto o Update dos dados, vamos fazer o seguinte ajuste:
Script:
Tarefas:
Load * Inline [
"id","descricao","data_criacao","data_alteracao"
1, "Carregar dados da fonte","08/01/2020","08/01/2020"
2, "Tratar Dados","08/01/2020","08/01/2020"
3, "Salvar Dados em um QVD","08/01/2020","08/01/2020"
];
// Vamos verificar se existe o QVD Tarefas
if not isnull(QvdCreateTime('[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]')) then
// caso o QVD exista, vamos então concatenar os dados que ja existem mas ignorando
// os registros que estão em nosso load da tabela, ou seja, somente os ids que
// não existirem em nosso QVD que serão carregados.
Concatenate LOAD * FROM '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]'(qvd) WHERE NOT EXISTS(id);
End If;
// Armazena as tarefas da tabela concatenados com o QVD no QVD novamente
STORE Tarefas INTO '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]';
exit Script;
Vamos no modo de visualização do modelo de dados para ver como está nossa tabela
Podemos ver que a nossa informação criada em nossa tabela inline está carregando corretamnete.
Vamos confirmar que o que estamos carregando é o que está salvo em nosso QVD, para isso faça o seguinte:
Script:
Tarefas:
Load * Inline [
"id","descricao","data_criacao","data_alteracao"
1, "Carregar dados da fonte","08/01/2020","08/01/2020"
2, "Tratar Dados","08/01/2020","08/01/2020"
3, "Salvar Dados em um QVD","08/01/2020","08/01/2020"
];
// Vamos verificar se existe o QVD Tarefas
if not isnull(QvdCreateTime('[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]')) then
// caso o QVD exista, vamos então concatenar os dados que ja existem mas ignorando
// os registros que estão em nosso load da tabela, ou seja, somente os ids que
// não existirem em nosso QVD que serão carregados.
Concatenate LOAD * FROM '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]'(qvd) WHERE NOT EXISTS(id);
End If;
// Armazena as tarefas da tabela concatenados com o QVD no QVD novamente
STORE Tarefas INTO '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]';
DROP TABLE Tarefas;
TarefasSalvas:
LOAD * FROM '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]'(qvd);
exit Script;
Neste script nos deletamos a tabela Tarefas para garantir que vamos carregar a do QVD, e vamos carregar agora o QVD e colocar o nome de TarefasSalvas.
Inserindo e atualizando dados
O que vamos fazer é adicionar novos dados e atualizar um registro existente. Para isto, vamos criar o seguinte script, que vai obedecer agora o campo data_alteracao:
Script:
Let vLastUpdatedDate = Text(Date(Reloadtime(),'DD/MM/YYYY'));
trace Data da Última atualização: $(vLastUpdatedDate);
Tarefas:
Load * Inline [
"id","descricao","data_criacao","data_alteracao"
1, "Carregar dados da fonte","08/01/2020","08/01/2020"
2, "Tratar Dados","08/01/2020","08/01/2020"
3, "Salvar Dados em um QVD e carregar em outra tabela","08/01/2020","09/01/2020"
4, "Inserir um novo dado no QVD","09/01/2020","09/01/2020"
] WHERE data_alteracao = '$(vLastUpdatedDate)';
// Vamos verificar se existe o QVD Tarefas
if not isnull(QvdCreateTime('[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]')) then
// caso o QVD exista, vamos então concatenar os dados que ja existem mas ignorando
// os registros que estão em nosso load da tabela, ou seja, somente os ids que
// não existirem em nosso QVD que serão carregados.
Concatenate LOAD * FROM '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]'(qvd) WHERE NOT EXISTS(id);
End If;
// Armazena as tarefas da tabela concatenados com o QVD no QVD novamente
STORE Tarefas INTO '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]';
DROP TABLE Tarefas;
TarefasSalvas:
LOAD * FROM '[lib://PathQVDTeste (qlikserver_luiz)/tarefas.qvd]'(qvd);
exit Script;
Veja que adicionamos a tarefa com id 4 e atualizamos a descricão do id 3 para “Salvar Dados em um QVD e carregar em outra tabela”. Adicionamos no início uma variável para armazenar a data da última carga, e também chamamos o “trace” para exibir uma mensagem em nossa carga.
Após executar o script, teremos os seguinte resultado:
Espero que tenha ajudado. Qualquer dúvida, sugestão, entre em contato comigo!
https://github.com/luizhfraraujo
Script final: https://github.com/luizhfraraujo/carga-incremental-qliksense
Grande Abraço!
Luiz Henrique Araújo.