10 Replies Latest reply: Apr 8, 2016 10:24 AM by Tiago Pazeto RSS

    Carga incremental com chave composta não grava todos os registros

    Tiago Pazeto

      Olá pessoal!

       

      Inicialmente agradeço a todos, pois a partir do Manual de referência e outros post aqui da comunidade, estou alterando as cargas do Qlikview para incremental, algumas já estão funcionando. No entanto, estou com um problema que ainda não achei solução. Conto com a expertise e experiência dos amigos do grupo para isto.

       

      Em resumo, as cargas funcionaram quando a chave primária é apenas um campo, e meu  problema está quando a chave é composta por quatro campos conforme script de exemplo.

       

      Processo: leitura dos registros dos último quatro dias, seguindo os campos de inclusão ou alteração na base. Na sequência, concateno com o QVD já existente que possui 20GB e por fim, aplico o INNER JOIN para retirar registros excluídos.

       

      Após todo o processo, o novo QVD ficou com apenas 350MB, o que está errado visto que mantenho os 134 milhões de registros na tabela. Em anexo incluí a imagem que mostra a leitura da tabela completa.

       

      Obrigado pela atenção.

       

      Script:
      LET UltimaExec = date(ReloadTime() -4,'YYYY-MM-DD');

      //1 -CARREGA DADOS DOS ÚLTIMOS DIAS
      BN_PROD_GUIEVE_INC:
      SQL
      SELECT ID_PROD_GUIEVE ||'-'|| TIPO ||'-'|| CHAVE_AUX ||'-'|| ID_PROD_GUI AS CHAVE,
           GEVE.*
        FROM BN_PROD_GUIEVE GEVE
      WHERE (to_char(DW_INC,'YYYY-MM-DD') >= '$(UltimaExec)'
          OR  to_char(DW_ALT,'YYYY-MM-DD') >= '$(UltimaExec)')
           ;

      Concatenate

      //2 -BASE JA CARREGADA:
      LOAD *
      FROM $(vQvds)\BN_PROD_GUIEVE_INC.QVD (qvd)
      WHERE NOT EXISTS(CHAVE, ID_PROD_GUIEVE &'-'& TIPO &'-'& CHAVE_AUX &'-'& ID_PROD_GUI)
      ;

      INNER JOIN

      //3 -RETIRA REGISTROS EXCLUIDOS DA BASE:
      SQL
      SELECT  ID_PROD_GUIEVE ||'-'|| TIPO ||'-'|| CHAVE_AUX ||'-'|| ID_PROD_GUI AS CHAVE
        FROM DWUNIMED."BN_PROD_GUIEVE"
      ;

      STORE BN_PROD_GUIEVE_INC INTO $(vQvds)\BN_PROD_GUIEVE_INC.QVD;

       

       

      Muito Obrigado.

      Tiago

        • Re: Carga incremental com chave composta não grava todos os registros
          Yuri Nicolett

          Tiago, mas o que seria "RETIRA REGISTROS EXCLUIDOS DA BASE"? Provavelmente é este o processo que esta removendo todos os seus dados. Como você esta fazendo INNER JOIN, então você esta apenas retornando os registros que estão na tabela BN_PROD_GUIEVE e que também esteja na tabela do qlikview BN_PROD_GUIEVE_INC.

           

           

           

           

          Até o passo 2 esta correto, eu apenas alterarei o Where Exists da seguinte forma:

           

          //2 -BASE JA CARREGADA:

          LOAD *

          FROM $(vQvds)\BN_PROD_GUIEVE_INC.QVD (qvd)

          WHERE NOT EXISTS(CHAVE)


          Pois a coluna CHAVE esta nas duas tabelas, então não preciso recria-la

            • Re: Carga incremental com chave composta não grava todos os registros
              Tiago Pazeto

              Yuri, Obrigado pela rápida resposta.

               

              A chave não está pronta na tabela, por isso deve ser criada.
              -----

               

              Quando ao terceiro passo: RETIRA REGISTROS EXCLUIDOS DA BASE, é aqui que retira os registros, mas não deveria visto que os registros estão na base.


              Para montar tudo, segui o Manual (pág 424) e posts da comunidade.

              Manual:
              Caso 4: Inserir, Atualizar e Excluir: O caso mais difícil de solucionar é quando os registros são excluídos da base de dados de origem entre as execuções de script.

               

              Exemplo de Script:
              Let ThisExecTime = Now();

               

              Tabela_QV:
              SQL SELECT ChavePrimária, X, Y FROM DB_TABLE
              WHERE HoraModificação >= #$(HoraÚltExec)#
              AND HoraModificação < #$(HoraDestaExec)#;

               

              Concatenate LOAD ChavePrimária, X, Y FROM Arquivo.QVD
              WHERE NOT EXISTS(ChavePrimária);

               

              Inner Join SQL SELECT ChavePrimária FROM DB_TABLE;

               

              If ScriptErrorCount = 0 then
              STORE Tabela_QV INTO Arquivo.QVD;
              Let HoraÚltExec = HoraDestaExec;
              End If

               

              Na real, entendo que o problema está em criar a chave no script ao invés de vir pronta da base de dados. Caso não tenha jeito, vou solicitar a adição deste campo.

               

              Obrigado.