Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

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

1 Solution

Accepted Solutions
Clever_Anjos
Employee
Employee

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;

View solution in original post

5 Replies
Clever_Anjos
Employee
Employee

Daria pra detalhar qual o seu requisito?

Acredito que devamos simplificar sua lógica

Not applicable
Author

é 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

Clever_Anjos
Employee
Employee

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;

Not applicable
Author

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

Not applicable
Author

Clever...só de add o AutoGenerate resolveu todos os problemas, inclusive do banco!

Não sabia que tinha que usar o AutoGenerate no LOAD desta maneira!

Agora faz sentido!

Obrigado, man, mais uma vez salvando o dia!