Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Pessoal, boa tarde!
Qual a melhor maneira para otimizar o tempo da carga de dados?
Estava lendo um pouco sobre os comandos "STORE", "BUFFER LOAD" e por ai vai..
Mas não consegui chegar a nenhum caso em que o qvd realize as seguintes operações:
1. Carregar todos os dados
2. Carregar os dados incrementais
3. Armazenar no qvd
4. Load qvd
Não sei se essa seria a melhor maneira de fazer isso, na verdade, não sei como fazer.
Alguém poderia me dar uma dica?
Grato!
Ótimo Gui...
Então vamos ao trabalho:
Partindo do princípio que você já tem um QVD extraído vamos preparar a carga incremental de atualização.
Inicialmente você coleta a data da última alteração armazenada no qvd e guarda numa variável:
DIRECTORY;
DATA_BASE:
LOAD Max(DATATU ) AS DATA_INI From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd) Group By; //Esse Load irá pegar a última data de alteração no QVD. Esse endereço indica que o QVD está numa subpasta chamada "QVDs"
LET V_DATA_INI = Date(Peek('DATA_INI', 0), 'DD/MM/YYYY hh:mm:ss[.fff]'); //Pode parecer redundância formatar um campo de data como data mas assim nos dá mais segurança na cópia dos dados para a variável
DROP Table DATA_BASE; //Depois apagamos a tabela que foi criada unicamente para coletar a data mais atual registrada no qvd
Logo depois você pega o SQL que gerou o qvd original e adiciona uma clausula Where para filtrar pela data:
QVD_PARA_O_PAINEL:
SQL
SELECT CHAVE_PRIMARIA,
DATATU,
DEMAIS_CAMPOS
FROM TABELAS_DO_BANCO TBB
WHERE TBB.DATATU >= TO_DATE('$(V_DATA_INI)','DD/MM/RRRR HH24:MI:SS'); // O comando TO_DATE é usado num banco Oracle.
Se seu banco for diferente do Oracle recomendo que você utilize o camando de formatação de data para o seu banco. Assim você terá a certeza de que a cláusula Where receberá o valor correto.
Como você fez uma consulta apenas com os dados que mudaram, ou foram adicionados, desde a última carga podemos carregar o qvd adicionando uma condição para carregar apenas os dados que permaneceram inalterados:
LOAD CHAVE_PRIMARIA,
DATATU,
DEMAIS_CAMPOS
From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd)
Where Not Exists (CHAVE_PRIMARIA); // Com essa cláusula você carrega apenas os dados que não soferam alteração desde a última atualização. Ignorando os dados que já existiam no qvd mas foram atualizados no banco
STORE QVD_PARA_O_PAINEL into .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd); // Salva o QVD
DROP Table QVD_PARA_O_PAINEL; //Apaga a tabela da memória para manter o arquivo QVW só com o código de carga
Agora seu QVD está pronto para ser utilizado no painel.
Espero que essa rotina lhe seja útil.
Felicidades...
Gui,
o incremental funciona em arquivo txt.
Segue um exemplo.
Para usar, primeiro leia o TXT1 com e sem buffer para ver o tempo.
Depois leia com incremental o TXT1 e renomeia o TXT2 para TXT1 e leia novamente e vais ver que sera lido as linhas que estao a mais no TXT2
O buffer funciona em banco tambem. O que faz seria ler o banco e salvar um QVD que sera lido enquanto a "validade" nao vencer. Se venceu, le da fonte novamente.
Incremental com banco e QVD tem outras formas......
Segue um exemplo
LET v_Tem_VBUK = if(QvdNoOfRecords('$(vStagePath)VBUK.QVD')>0,1,0);
LET v_VBUK_Data = '20140101';
LET v_VBUK_QVD = 0;
LET v_VBUK_RAM = 0;
//
if $(v_Tem_VBUK) = 1 then
LET v_VBUK_QVD = QvdNoOfRecords('$(vStagePath)VBUK.QVD');
LET v_VBUK_Data = date((floor(QvdCreateTime('$(vStagePath)VBUK.QVD')) - $(vDiasAMenos) ),'YYYYMMDD');
ELSE
TRACE *********************** Nao Achou o QVD do VBUK **********************************;
ENDIF
//
//
[VBUK]:
SQL Select VBELN GBSTK from VBUK
Where VBELN in (Select VBELN from VBAK Where ERDAT >= '$(v_VBUK_Data)' or AEDAT >= '$(v_VBUK_Data)');
//
if $(v_Tem_VBUK) = 1 then
TRACE ** Unindo os dados do QVD com a tabela VBUK **;
Concatenate (VBUK)
LOAD * FROM [$(vStagePath)VBUK.QVD] (qvd) Where not Exists(VBELN);
ENDIF
//
STORE VBUK Into $(vStagePath)VBUK.QVD (qvd);
Alessandro,
Ainda estou utilizando a versão gratuita do QLik, não consegui abrir o seu .qvw..
Ler o script assim está meio complicado para mim.. não estou conseguindo entender.
Por exemplo, em meu banco de dados (SQL), eu trabalho muito com Views (VW)..
Supondo que a minha base de dados chame VW_TESTE, como ficaria esse script?
Desculpe pela dificuldade, ainda não entendo muito bem.
Bom dia Gui,
Existem várias formas de se realizar uma carga incremental num qvd:
Para todas essas opções é necessário um campo que pode ser utilizado para verificar o que mudou ou foi excluído como um campo de data/hora e/ou chave primária.
Qual é a sua?
Bom dia Wellington,
No meu caso, seria a opção 4.
Eu preciso adicionar dados novos e atualizar os dados modificados.
Quero trazer muitas informações para o qvd sem remover nada, apenas incluir novas informações.
Gui,
Bom dia...
Na minha opinião , essas cargas são das que exigem mais cuidado no desenvolvimento. Guarde cópia do Script e QVDs originais, antes de iniciar a programação.
Você vai precisar de um campo para identificar o que mudou, geralmente campo tipo timestamp, com a gravação da data e hora das alterações no registro. Você tem um campo como esse nas tabelas do seu Banco de Dados? Caso negativo que campo você tem disponível para usar nesse controle?
Me desculpe por todas essas perguntas mas elas são necessárias para não ficarmos escrevendo códigos desnecessários.
Observação: Muitos Bancos de Dados possuem um campo tipo "timestamp" em cada tabela mas nem todas as aplicações o atualizam. Caso este exista em suas tabelas se certifique de que eles são atualizados a cada alteração no registro.
Felicidades...
Boa tarde Wellington!
Isso mesmo.. por se tratar de utilização direto ao banco de dados, devemos ter mais cuidado com isso..
Na maioria de nossas tabelas / VW, temos o campo DATATU (Data atualização), conforme ocorre uma alteração no registro, o campo é alterado também.
Acredito que podemos nos basear nessa informação.
Ótimo Gui...
Então vamos ao trabalho:
Partindo do princípio que você já tem um QVD extraído vamos preparar a carga incremental de atualização.
Inicialmente você coleta a data da última alteração armazenada no qvd e guarda numa variável:
DIRECTORY;
DATA_BASE:
LOAD Max(DATATU ) AS DATA_INI From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd) Group By; //Esse Load irá pegar a última data de alteração no QVD. Esse endereço indica que o QVD está numa subpasta chamada "QVDs"
LET V_DATA_INI = Date(Peek('DATA_INI', 0), 'DD/MM/YYYY hh:mm:ss[.fff]'); //Pode parecer redundância formatar um campo de data como data mas assim nos dá mais segurança na cópia dos dados para a variável
DROP Table DATA_BASE; //Depois apagamos a tabela que foi criada unicamente para coletar a data mais atual registrada no qvd
Logo depois você pega o SQL que gerou o qvd original e adiciona uma clausula Where para filtrar pela data:
QVD_PARA_O_PAINEL:
SQL
SELECT CHAVE_PRIMARIA,
DATATU,
DEMAIS_CAMPOS
FROM TABELAS_DO_BANCO TBB
WHERE TBB.DATATU >= TO_DATE('$(V_DATA_INI)','DD/MM/RRRR HH24:MI:SS'); // O comando TO_DATE é usado num banco Oracle.
Se seu banco for diferente do Oracle recomendo que você utilize o camando de formatação de data para o seu banco. Assim você terá a certeza de que a cláusula Where receberá o valor correto.
Como você fez uma consulta apenas com os dados que mudaram, ou foram adicionados, desde a última carga podemos carregar o qvd adicionando uma condição para carregar apenas os dados que permaneceram inalterados:
LOAD CHAVE_PRIMARIA,
DATATU,
DEMAIS_CAMPOS
From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd)
Where Not Exists (CHAVE_PRIMARIA); // Com essa cláusula você carrega apenas os dados que não soferam alteração desde a última atualização. Ignorando os dados que já existiam no qvd mas foram atualizados no banco
STORE QVD_PARA_O_PAINEL into .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd); // Salva o QVD
DROP Table QVD_PARA_O_PAINEL; //Apaga a tabela da memória para manter o arquivo QVW só com o código de carga
Agora seu QVD está pronto para ser utilizado no painel.
Espero que essa rotina lhe seja útil.
Felicidades...
Wellington, muito obrigado pelo suporte!
Felicidades para você também!
Abraço
Excelente documentação.
Fiz exatamente como no exemplo, porém ficou salvo apenas os dados a partir da ultima data que estava no qvd. Sabe informar o motivo?