Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
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

Tags (1)
1 Solution

Accepted Solutions
Employee
Employee

Re: LOAD com Peek

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;

5 Replies
Employee
Employee

Re: LOAD com Peek

Daria pra detalhar qual o seu requisito?

Acredito que devamos simplificar sua lógica

Not applicable

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

Employee
Employee

Re: LOAD com Peek

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

Re: LOAD com Peek

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

Not applicable

Re: LOAD com Peek

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!