7 Replies Latest reply: Oct 13, 2016 7:38 PM by Jeferson Vargas RSS

    Load incremental

    Marcos Ferreira

      Bom dia.

      Pessoal, tenho alguns painéis que buscam informações do ERP da empresa, principalmente um painel financeiro...

       

      Já ouvi dizer, que na versão do qlikview (server) que tenho, não tenho como fazer carga incremental (automática), e como minha base de dados (oracle 11) é gigantesca, cada dia a carga demora mais, devido ao crescimento...

       

      A pergunta é, existe alguma outra forma, via código, de eu pegar informações somente de 5 dias atrás até a atual, sem zerar o que tenho?

      Não quero ler a base toda todas as vezes, são anos de informação... Creio que D -5, seria suficiente, para caso tenha sido feita alguma alteração nos dados.

       

      A carga de dados é feita diariamente, na madrugada, via server, sendo que sempre da forma que relatei.

       

      Estou desenvolvendo novos qvw's (primeiro gero QVDs), e em todos é esta luta, queria saber se tenho como fazer da forma que cito, só que não posso pegar dados de apenas 5 dias, mas atualizar com o que já havia no qvd...

       

      Das formas que tentei (sou iniciante), quando puxo apenas 5 dias, tudo que havia antes vai para o espaço, o arquivo zera e pega somente os 5 dias.

       

      Obrigado mais uma vez.

       

      Marcos André.

        • Re: Load incremental
          Fernando Tonial

          Olá, é possível sim.

           

          Inserir e Atualizar (Sem Excluir)

          O caso seguinte se aplica quando os dados nos registros carregados anteriormente são alterados entre as execuções de script. As seguintes condições se aplicam:

          • A fonte de dados pode ser qualquer base de dados. 
          • O QlikView carrega os registros inseridos ou atualizados na base de dados após a execução do último script
          • É necessário um campo de Data da Modificação (ou semelhante) para que o QlikView reconheça os registros novos. 
          • É necessário um campo chave primário para que o QlikView classifique os registros atualizados do arquivo QVD.
          • Esta solução forçará a leitura do arquivo QVD no modo padrão (em vez do otimizado), que ainda será consideravelmente mais rápido do que carregar a base de dados inteira.

           

          Exemplo de Script:

          Tabela_QV:

          SQL SELECT ChavePrimária, X, Y FROM DB_TABLE

          WHERE HoraModificação >= #$(HoraÚltExec)#;

           

          Concatenate LOAD ChavePrimária, X, Y FROM Arquivo.QVD

          WHERE NOT Exists(ChavePrimária);

           

          STORE Tabela_QV INTO Arquivo.QVD;

           

          Esta informação foi retirada do Help do QlikView.

           

          Abraços.

          Tonial

            • Re: Load incremental
              Jeferson Vargas

              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: Load incremental
                  Fernando Tonial

                  Olá, você pode fazer assim:

                  // Início - Está buscando no QVD a última data e hora que vc possui informação no arquivo

                   

                  [TMP_DATAHORA]:

                  LOAD HIS_COD,

                        Max(HIS_DATAHORA) AS MAXDATAHORA

                  FROM

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

                  (qvd);

                   

                  SET vMaxDataHora = Peek('MAXDATAHORA');

                  DROP TABLE [TMP_DATAHORA];

                   

                  // Fim - Está buscando no QVD a última data e hora que vc possui informação no arquivo

                   

                  [HISTORICO_CCF]:

                  SELECT * FROM HISTORICO H

                  WHERE

                  h.his_pro_cod ='CCF'

                  and h.his_datahora >= $(vMaxDataHora)

                   

                   

                  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: Load incremental
                      Jeferson Vargas

                      Obrigado Fernando por responder,

                       

                      Tchê funcionou quase tudo...estudei isso final de semana e até agora ainda estou apanhando...quando não é uma coisa é outro kkk...mas não vou desistir assim no mais... assim esta meu scrip agora, a diferença é que a variavel criei com LET, tem problema?Qual a diferença do SET? O que esta acontecendo é:Consigo ler a MAX data, a variavel é carregada e tudo ocorre bem até chegar no SELECT dai diz que falhou mas no oracle roda de boa...ja tirei JOIN coloquei JOIN coloquei TO_char na data, tirei, mas sempre da erro na consulta...o qlikview tem restrições para query?

                      Já estou com dor de cabeça com essa query...help

                       

                      bom segue o scrip:

                       

                      tmp:

                      load

                      date(max(DATA),'dd/mm/yyyy') as DATA

                      FROM

                      [E:\BaseHistoricoDLP.qvd]

                      (qvd)

                      where

                      DATA > now()-10;

                       

                       

                      let vData = date(peek('DATA',0,tmp),'dd/mm/yyyy hh:mm:ss');

                       

                      drop table tmp;

                      //

                      //------------------------------------------------------

                      //conexão com o oracle

                      OLEDB CONNECT TO [Provider=OraOLEDB.Oracle.1];

                       

                       

                      //------------------------------------------------------

                      //

                      ATUALIZAR:

                      SELECT H.HIS_NROTELEFONE AS TELHSITORICO,T.TEL_DDD AS DDD, T.TEL_NUMERO AS TELEFONE, H.HIS_DEV_COD, H.HIS_THT_COD, H.HIS_DATAHORA,

                      E.END_UF, DV.DIV_TOP, H.HIS_USU_COD, U.USU_NOME, D.DEV_ORIGEM, DV.DIV_VALORTOTAL, DV.DIV_REDE, DV.DIV_ATRASO, DV.DIV_CODLOJA, H.HIS_DEV_COD, D.DEV_CPF

                       

                      FROM HISTORICO H, DEVEDOR D, ENDERECO E, DIVIDA DV, USUARIO U, TELEFONE T

                       

                      WHERE

                      D.DEV_COD = H.HIS_DEV_COD

                      AND E.END_DEV_COD = D.DEV_COD

                      AND DV.DIV_DEV_COD = D.DEV_COD

                      AND U.USU_COD = H.HIS_USU_COD

                      AND T.TEL_COD = H.HIS_TEL_COD

                      AND H.HIS_UNI_COD = 'POA'

                      AND DV.DIV_VALIDO = 1

                      AND H.HIS_PRO_COD = 'DLP'

                      AND H.HIS_DATAHORA > $(vData)

                       

                      GROUP BY(H.HIS_NROTELEFONE,T.TEL_DDD, T.TEL_NUMERO,H.HIS_DEV_COD, H.HIS_THT_COD, H.HIS_DATAHORA, E.END_UF, DV.DIV_TOP, H.HIS_USU_COD, U.USU_NOME, D.DEV_ORIGEM, DV.DIV_VALORTOTAL, DV.DIV_REDE, DV.DIV_ATRASO, DV.DIV_CODLOJA, H.HIS_DEV_COD, D.DEV_CPF)

                       

                      HAVING h.HIS_THT_COD IN ('ACIONAMENTOS','BOLCONF','BOLNCONF','COMPREV','SPREV','ALTENDE','NALTEND','INCTELOP','NINCTEL','RTERC','RELIG','DEALER','NSCONF','V-TERC','V-CLI','COMPREV','SPREV','RELIGCPC');

                       

                      STORE ATUALIZAR INTO E:\ATUALIZAR.QVD (qvd);

                      DROP TABLE ATUALIZAR;

                        • Re: Load incremental
                          Fernando Tonial

                          Olá, me enganei, realmente era o LET no lugar do SET.
                          A diferença em LET e SET.
                          SET o  valor atribuído na variável é a informação de esta depois do igual, no caso Peek('MAXDATAHORA');
                          LET o valor atribuído é o resultado do comando que está depois do igual.

                           

                          Coloque a variável que está no SQL entre aspas simples.

                           

                          AND H.HIS_DATAHORA > '$(vData)'

                           

                          e veja se funciona.

                           

                          Don't worry, be Qlik.

                          Tonial.

                            • Re: Load incremental
                              Jeferson Vargas

                              Nossa depois uma semana ou duas de muita peleia e muita leitura, muitos videos, e principalmente com a ajuda de vocês aqui do forum achei o erro ou melhor achei varios erros e varios acertos e principalmente aprendi mais do que imaginava aprender MUITO OBRIGADO MESMO A TODOS QUE TIVERAM PACIENCIA COM MINHAS DUVIDAS e generosamente ajudaram!

                               

                              Bom galera primeiro:

                              Quando vou buscar a data(max date) dentro do qvd, preciso formatar para timestamp porque no QVD assim como no meu oracle o formato é DD/MM/YYYY HH24:MM:SS e isso vai ser jogado dentro da variavel vDATA, esse foi o primeiro erro...

                               

                              Segundo quando declaro a variavel não preciso passar o formato novamente pois ja passei no load quando busco  no QVD e isso estava gerando o erro de literal blablabla...ufa

                               

                              Terceiro depois de passar a variavel para a query buscar no oracle as informações repeitando a variavel, tambem precisa formatar o tipo de data, vocês me ajudaram certo quanto ao usar o TO_DATE mas uma unica letra estava ferrando com a minha vida aqui e por isso não funcionava direito trazendo valores de datas erradas...resumindo no Oracle é diferente do Qlik...DD/MM/YYYY HH24:MI:SS  esse "I" passou batido por mim e por isso não funcionava...

                               

                              Então fica a dica, no Oracle DD/MM/YYYY HH24:MI:SS no Qlik DD/MM/YYYY HH:MM:SS

                               

                              Obrigado a todos vou ficar fera nesse Qlik com a ajuda de vocês!