11 Replies Latest reply: Oct 27, 2016 9:20 AM by Wellington Regis Silva RSS

    Processo de carga incremental, limpeza e reprocessamento

    André Cirilo

      Olá!

      Gostaria de uma ajuda para entender uma questão relacionada a carga incremental e possíveis reprocessamentos. Partindo do princípio que entendo o formato de trabalhar com datas de criação e modificação, o meu problema é que não tenho estas informações na origem. Então vamos as perguntas:

      1. Como o Qlik trata a questão de limpar o que existe e carregar as novas informações, este controle é "nosso" no script, ou é lógico dentro do processo do QV mesmo?

      2. Nesta situação, como conseguiria carregar apenas 1 dia no início do mês, por exemplo?

      A massa de dados que tenho é muito grande, e não tenho controle de criação/modificações. Então o reprocesso será por exemplo de 15 dias pra trás, ou seja todos os dias rodamos os últimos 15 dias. Podendo ocorrer também um reprocessamento de 3 dias do início do mês.

      A principio é isso, espero ter explicado de forma clara.

      Obrigado.

      André Cirilo

        • Re: Processo de carga incremental, limpeza e reprocessamento
          Paulo Vendruscolo Bermude

          André,

           

          Infelizmente o carga incremental é realizada via script.

           

          O help do QlikView aborda os requisitos para realizar as cargas incrementais e possui exemplos.

           

          No help do QlikView Desktop, procure por: Usando Arquivos QVD para Carga Incremental

           

          ou no help online:https://help.qlik.com/pt-BR/qlikview/12.0/Subsystems/Client/Content/QVD_Incremental.htm?q=incremental

          • Re: Processo de carga incremental, limpeza e reprocessamento
            Aderlan Rodrigues

            Olá André,

             

            Você também pode fazer o incremento por um campo chave.

            Qualquer forma de saber o que é novo ou velho ou o que mudou nos dados é passível de ser usado.

             

            Um outro recurso muito comum quando a origem não há campo que indique alteração ou inclusão, é o prefixo Buffer com a opção Stale After X Days ou Hours, fazendo com que os dados sejam mantidos em QVD por X tempo em quanto outras tabelas são atualizadas com mais frequência.

             

            Se puder incluir um exemplo (csv, txt, Excel) da estrutura para simular o teu cenários, a galera aqui pode fazer sugestões de como fazer a carga incremental. Anexe o QVW de exemplo com suas tentativas também.

             

            Abraço.

             

            ***  Se foi útil ou correto, marque como tal, assim ajuda outros a também encontrar a resposta. ***

              • Re: Processo de carga incremental, limpeza e reprocessamento
                Jeferson Vargas

                Aderlan tenho uma situação parecida:

                Ajudai ai brother se possivel...

                 

                Consegui montar quase tudo mas não sei como fazer o esquema das datas:

                 

                tipo, consegui fazer a consulta no banco e ele traz as informações, gravei o qvd e dropei a tabela.

                 

                Agora tenho o qvd com um campo datahora e tenho a consulta para atualizar esse qvd mas como fazer para a consulta verificar a maxdate dentro do qvd e usar como parametro na consulta para incrementar o qvd sem excluir nada e atualizar o periodo mais recente?

                 

                segue meu script

                 

                [HISTORICO_CCF]:

                SELECT * FROM HISTORICO H

                WHERE

                h.his_pro_cod ='CCF'

                and h.his_datahora >= 'O QUE DEVO COLOCAR AQUI ?? NO MEU QVD ATUALIZEI ATÉ 04/10/2016 ENTÃO O QUE COLOCAR AQUI PARA GERAR A CONSULTA OLHANDO ESSA DATA NO QVD ABAIXO E PEGAMNDO OS REGISTROS SUPERIORES A ESTA DATA'

                 

                 

                Concatenate

                 

                 

                LOAD HIS_COD,

                     HIS_DEV_COD,

                     HIS_COMPLEMENTO,

                     HIS_DATAHORA,

                     HIS_DURACAOLIGACAO,

                     HIS_AGENDA,

                     HIS_LIGACAOPAGA,

                     HIS_NROTELEFONE,

                     HIS_UNI_COD,

                     HIS_THT_COD,

                     HIS_USU_COD,

                     HIS_MOC_COD,

                     HIS_RETORNODISCADOR,

                     HIS_VALIDO,

                     HIS_REP_COD,

                     TROCA,

                     HIS_OCO_COD,

                     HIS_PRO_COD,

                     HIS_PEF_COD,

                     HIS_TEL_COD

                FROM

                [C:\Users\jeferson.vargas\Desktop\HISTORICO_CCF.QVD]

                (qvd);

                 

                STORE [HISTORICO_CCF] INTO C:\Users\jeferson.vargas\Desktop\HISTORICO_CCF.QVD (qvd);

                DROP TABLE [HISTORICO_CCF];

                  • Re: Processo de carga incremental, limpeza e reprocessamento
                    André Cirilo

                    Jeferson,

                     

                    Quando fiz o questionamento, não conseguia entender muito bem como funcionava a questão de Limpar e Gravar novamente os dados na tabela, porque tinha o conceito que tinha era de limpar a tabela e inserir os dados novos.

                     

                    Pelo que entendi da sua dúvida, que parece ser a mesma da minha, no meu caso a solução foi fazer:

                    1. A leitura dos novos registros em alguma tabela temporária (TAB_TEMP)

                    2. Concatenar a temporária com a original, excluindo ao que for igual a partir de uma data ou campo de chave

                         Por exemplo

                         CONCATENATE (TAB_TEMP)

                           LOAD *

                           FROM [NomeQVD.QVD] (qvd)

                           WHERE NOT WildMatch(DATA_ATUALIZACAO, '$(vDataCarregada)');

                     

                    Este Where NOT WildMatch, exclui somente data que colocar, caso precise excluir os campos antes da data que está carregando utilize where DATA_ATUALIZACAO < $(vDataCarregada), assim irá incluir os dados novos na tabela que está criando.

                    3. Depois de tudo carregado, basta fazer o STORE sobrepondo  QVD com a nova tabela.

                     

                    Uma coisa que percebi é que neste caso não funciona quando precisa fazer uma combinação com mais campos do tipo Where Data < $(vDataCarga) and CodFilial = $(vFilial).

                     

                    Espero ter ajudado.

                    • Re: Processo de carga incremental, limpeza e reprocessamento
                      Aderlan Rodrigues

                      Desculpe, só vi agora.

                       

                      Tenho andado afastado da Community, mas vou tentar aumentar a frequência aqui. Que bom que já resolveu.

                      Lembre de marcar o tópico como correto e quem ajudou a encontrar a resposta, é importante para manter a organização.

                       

                      Grande abraço.

                      • Re: Processo de carga incremental, limpeza e reprocessamento
                        Wellington Regis Silva

                        Bom dia Jeferson Vargas,

                        Deixe-me ver ser consigo te ajudar:

                         

                        Pelo que entendi sua carga é apenas incremental, para adicionar novos dados. Correto?

                        Eu faço da seguinte forma:

                         

                        1 - Carrego uma tabela com o qvd para saber qual é a última data gravada:

                         

                        E_R_TIMESTAMP:                       //   Carregar última data no qvd
                        LOAD Max(DT_ATUAL) AS TIMESTAMP_P01
                        FROM
                        P01_ENERGIA_RECUPERADA.qvd (
                        qvd)

                        GROUP BY;


                        2 - Depois armazeno o valor numa variável para que eu possa utilizar num comando Load ou Select:

                         

                        LET V_TIMESTAMP_P01 = Peek('TIMESTAMP_P01',0);       // Armazenar o valor numa variável

                        DROP Table E_R_TIMESTAMP;                            // Apagar a tabela da memória


                        3 - Então adiciono o valor da variável na cláusula Where da consulta ao banco:

                         

                        and h.his_datahora >= '$(V_TIMESTAMP_P01)'

                         

                        4 - Finalmente adiciono uma condição na Where para evitar duplicidade nos dados:

                         

                        Where Not Exists(“Campo de Chave primária da sua tabela”);  // Essa cláusula vai excluir os dados que foram atualizados desde a última carga

                         

                        Observação importante: O processo de carga incremental só funciona corretamente com tabelas que possuam chave primária simples (com um campo apenas). Para tabelas com chaves primárias compostas você vai precisar gerar um campo único que pode ser por concatenação mesmo, isso afetará apenas o tamanho do qvd não o desempenho do processamento do QV.

                         

                        Espero ter podido ajudar...

                         

                        Felicidades...

                    • Re: Processo de carga incremental, limpeza e reprocessamento
                      Clever Anjos

                      Já achou uma solução? Se alguma resposta foi a correta, marque como "Correta" para fechar o tópico e nos ajudar a manter o forum organizado.

                      Como obter ajuda? Leia antes de postar

                      • Re: Processo de carga incremental, limpeza e reprocessamento
                        Jeferson Vargas

                        Cara help...não imagino como fazer...

                        a minha idéia é atualizar esse extrator todos os dias via management console agendamentoen então tipo não sei se precisaria usar for mas se conseguir ajudar com algum exemplo fico muito grato