Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
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;
Daria pra detalhar qual o seu requisito?
Acredito que devamos simplificar sua lógica
é 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
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;
entendi! testarei esse ponto amanhã, hj já fui expulso da empresa, hahaha...se pudemros continuar amanhã, agradeço!
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!