5 Replies Latest reply: Nov 29, 2013 9:00 AM by Pedro Barabanov de Assis RSS

    LOAD com Peek

      Galera, alguém manja de problemas em tentar criar uma tabela dentro de um FOR?

       

      Segue o código e o print de uma depuração.

       

      O que está acontecendo é que eu dou um DROP na tabela FatoTemp e depois a crio novamente. Na primeira iteração ele funciona corretamente, porém, na segunda, os registros que retornam da consulta SQL vão para a tabela FatoDuplo, que continha 10 registros, passando a conter 12. Alguém tem alguma ideia do motivo de ocorrer isso? Na terceira iteração, ele volta a funcionar e na quarta volta a ocorrer o erro...

       

      Uma luz?

       

      FatoDuplo:

      LOAD PK AS CHAVE,

           QT_REG_GRUPO

      FROM

      QVD_FATO_DUPLICADO.QVD

      (qvd);

       

      FOR Contador = 0 TO NoOfRows('FatoDuplo')-1

       

       

        LET NumChave = "'" & Peek('CHAVE', $(Contador), 'FatoDuplo') & "'";

       

       

        FatoTemp:

        SQL SELECT

              DT_FATO AS DT_FATO_TMP,

              DT_REGISTRO AS DT_REGISTRO_TMP,

              CONCAT(TRIM(NR_CONTRATO), ID_FATO) AS PK_TMP,

              SQ_REGISTRO AS SQ_REGISTRO_TMP,

              TRIM(TP_REGISTRO) AS TP_REGISTRO_TMP,

              1 AS CONTROLE_TMP

        FROM QLIKVIEW.TB_QVD_FATO

        WHERE DT_REGISTRO >= TO_DATE($(DataExecSQL))

        AND CONCAT(TRIM(NR_CONTRATO), ID_FATO) = $(NumChave)

        ORDER BY SQ_REGISTRO;

       

        FOR Contador2 = 0 TO NoOfRows('FatoTemp')-1

       

       

        LET TipoRegistro = Peek('TP_REGISTRO_TMP', $(Contador2), 'FatoTemp');

       

        SWITCH '$(TipoRegistro)'

        CASE 'I'

       

        LET SQ_REGISTRO_Line = Peek('SQ_REGISTRO_TMP', $(Contador2), 'FatoTemp');

       

        LET var_DT_FATO = Peek('DT_FATO_TMP', $(Contador2), 'FatoTemp');

        LET var_DT_REGISTRO = Peek('DT_REGISTRO_TMP', $(Contador2), 'FatoTemp');

        LET var_PK = Peek('PK_TMP', $(Contador2), 'FatoTemp');

        LET var_SQ_REGISTRO = Peek('SQ_REGISTRO_TMP', $(Contador2), 'FatoTemp');

        LET var_TP_REGISTRO = Peek('TP_REGISTRO_TMP', $(Contador2), 'FatoTemp');

        LET var_CONTROLE = Peek('CONTROLE_TMP', $(Contador2), 'FatoTemp');

       

        FatoInsertDup:

        LOAD

        DT_FATO,

           DT_REGISTRO,

           PK,

           SQ_REGISTRO,

           TP_REGISTRO,

           CONTROLE

        FROM C:\Users\passis\Desktop\Barabanov\Qlikview\Projeto_DISAL\QVD_FATO.QVD (qvd)

        WHERE SQ_REGISTRO <> $(SQ_REGISTRO_Line);

       

        CONCATENATE (FatoInsertDup)

        LOAD

        '$(var_DT_FATO)' AS DT_FATO,

           '$(var_DT_REGISTRO)' AS DT_REGISTRO,

           '$(var_PK)' AS PK,

           '$(var_SQ_REGISTRO)' AS SQ_REGISTRO,

           '$(var_TP_REGISTRO)' AS TP_REGISTRO,

           '$(var_CONTROLE)' AS CONTROLE;

       

        LET NL = NoOfRows('FatoInsertDup');

        TRACE $(NL);

       

        STORE FatoInsertDup INTO C:\Users\passis\Desktop\Barabanov\Qlikview\Projeto_DISAL\QVD_FATO.QVD;

        DROP TABLE FatoInsertDup;

       

        DEFAULT

        TRACE Tipo não encontrado;

        END SWITCH;

       

        NEXT

       

        DROP TABLE FatoTemp;

       

      NEXT

        • Re: LOAD com Peek
          Clever Anjos

          Daria pra detalhar qual o seu requisito?

          Acredito que devamos simplificar sua lógica

            • Re: LOAD com Peek

              é bem complexo, hahaha...mas vamos lá:

               

              Nesse fato duplo, tenho algumas linhas com o mesmo PK, geralmente duas, mas poderiam ser 3. O que eu preciso fazer é, pra cada PK, ler as linhas do banco de dados pela ordem do campo SQ_REGISTRO e, pra cada linha, tratar de acordo com o TP_REGISTRO ("I", "D" ou "U" - só tratei a I, por enquanto).

               

              No caso de I (insert), apenas carrego o QVD de fato e quero adicionar esta linha (tomando o cuidado de, caso já ter sido adicionada (SQ_REGISTRO já existente) não duplicar). Porém, não consigo adicionar essa linha com os Peek's e após a primeira iteração, a consulta ao SQL dá o problema que falei, aparece erro na consulta ao banco.

               

              Porém, fazendo a mesma consulta direto no banco retorna valores.

               

              Não sei se ficou muito claro

                • Re: LOAD com Peek
                  Clever Anjos

                  Vamos por partes:

                  Essa parte abaixo você gostaria que retornasse uma linha certo?

                    LOAD

                    '$(var_DT_FATO)' AS DT_FATO,

                       '$(var_DT_REGISTRO)' AS DT_REGISTRO,

                       '$(var_PK)' AS PK,

                       '$(var_SQ_REGISTRO)' AS SQ_REGISTRO,

                       '$(var_TP_REGISTRO)' AS TP_REGISTRO,

                       '$(var_CONTROLE)' AS CONTROLE;

                   

                  deveria ser

                    LOAD

                    '$(var_DT_FATO)' AS DT_FATO,

                       '$(var_DT_REGISTRO)' AS DT_REGISTRO,

                       '$(var_PK)' AS PK,

                       '$(var_SQ_REGISTRO)' AS SQ_REGISTRO,

                       '$(var_TP_REGISTRO)' AS TP_REGISTRO,

                       '$(var_CONTROLE)' AS CONTROLE

                  autogenerate 1;

              • Re: LOAD com Peek

                entendi! testarei esse ponto amanhã, hj já fui expulso da empresa, hahaha...se pudemros continuar amanhã, agradeço!