Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
kkmoraes
Contributor III
Contributor III

Uso da função Peek() dentro de um FOR NoOfRows()

Pessoal,

Preciso da ajuda de vocês para tentar resolver o seguinte problema:

Possuo uma tabela de Contratos que possui diversas informações a respeito de cada contrato, uma das minhas necessidades foi construir uma tabela de datas que irá conter as informações a respeito dos dias de liberação de crédito, saldo etc..

A estrutura da tabela é basicamente dessa forma:*

GDP_CONTRATO:

LOAD

     GDPCONTR_NU & '|' & GDPCONTR_SQ AS ChaveContrato,

     PRDO_CD_AMORTIZACAO                                                AS [Periodicidade do Indexador Financeiro da Amortização],

     DATE(GDPCONTR_DT_INIC_AMORTIZACAO)                  AS [Data Inicio Amortização],

     GDPCONTR_QT_PARCELA_AMORT                                 AS [Quantidade de Parcelas Amortização],

     AddMonths(GDPCONTR_DT_INIC_AMORTIZACAO, IF(PRDO_CD_AMORTIZACAO = 8, GDPCONTR_QT_PARCELA_AMORT * 6, GDPCONTR_QT_PARCELA_AMORT))

                                                                                                   AS [Data Fim Amortização]

     GDPCONTR_VL_CONTRATO

FROM

[$(Caminho)\GDP_CONTRATO.QVD]

(qvd);

* A tabela tem outros campos porém ocultei para facilitar a leitura.

em um determinado momento do Script eu leio esses dados para construir outra tabela de datas dessa forma:

FOR a = 0 to NoOfRows('GDP_CONTRATO')-1

     Let vPeriodo = IF(Peek('PRDO_CD_AMORTIZACAO', $(a),'GDP_CONTRATO')=4, 1, 6);

     Let vChave = Peek('ChaveContrato', $(a),'GDP_CONTRATO');

     LET vDataFinal = num(Peek('[Data Fim Amortização]', $(a),'GDP_CONTRATO'));

     LET vDataInicial = num(Peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(a),'GDP_CONTRATO'));

   

     AUX:

     LOAD

          $(vChave) as Chave,

          IterNo() as n,

          Date(addmonths(addmonths($(vDataInicial) , (IterNo()*$(vPeriodo))),-1)) as Data

     AUTOGENERATE $(vPeriodo)

     WHILE addmonths ($(vDataInicial), IterNo()*$(vPeriodo)) <= $(vDataFinal);

NEXT

Tabela_de_Datas:

LOAD

     Chave & Date(Data)    as ChaveTblDt,

     Chave as ChaveContrato,

     n,

     Date(Data)     as Data,

     IF(n<>1,Date(Previous(Data))) as Data_Ant,

     Year(Data)&Right('00'&Month(Data),2)    as AnoMes_Parcela

Resident AUX;

DROP Table AUX;

O problema é que os campos nessa seção:

     Let vPeriodo = IF(Peek('PRDO_CD_AMORTIZACAO', $(a),'GDP_CONTRATO')=4, 1, 6);

     Let vChave = Peek('ChaveContrato', $(a),'GDP_CONTRATO');

     LET vDataFinal = num(Peek('[Data Fim Amortização]', $(a),'GDP_CONTRATO'));

     LET vDataInicial = num(Peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(a),'GDP_CONTRATO'));

estão vindo vazios, resultando no erro abaixo:

  Syntax error, missing/misplaced FROM:

AUX:

     LOAD

          2842|1 as Chave,

          IterNo() as n,

     Date(addmonths(addmonths( , (IterNo()*6)),-1)) as Data

     AUTOGENERATE 6

   

     WHILE addmonths (, IterNo()*6) <=

AUX:

     LOAD

          2842|1 as Chave,

          IterNo() as n,

        

          Date(addmonths(addmonths( , (IterNo()*6)),-1)) as Data

     AUTOGENERATE 6

   

     WHILE addmonths (, IterNo()*6) <=

Debugando o script verifiquei que as variáveis vDataFinal, vDataInicial estão vindo vazias, como esses campos são partes do critério de execução na segunda parte do script (tabela AUX:) o Qlik está me retornando o erro acima.

Penso que o problema poderia estar no uso da função NoOfRows() nessa parte aqui:

FOR a = 0 to NoOfRows('GDP_CONTRATO')-1

ou no uso da função Peek() nas atribuições posteriores

     Let vPeriodo = IF(Peek('PRDO_CD_AMORTIZACAO', $(a),'GDP_CONTRATO')=4, 1, 6);

     Let vChave = Peek('ChaveContrato', $(a),'GDP_CONTRATO');

     LET vDataFinal = num(Peek('[Data Fim Amortização]', $(a),'GDP_CONTRATO'));

     LET vDataInicial = num(Peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(a),'GDP_CONTRATO'));

Vocês podem verificar por favor se identificam algum erro no script?

Anexo dois prints, um contendo o código no Qlik e outro da tela de erro

Esse é o log do debug:

vDataFinal<NULL>
vPeriodo6
vDataInicial<NULL>
vChave"2700|1"
a0
Caminho"C:\Users\Kleiton\Documents\GDP\QVD"
DayNames"seg;ter;qua;qui;sex;sáb;dom"
MonthNames"01;02;03;04;05;06;07;08;09;10;11;12"
TimestampFormat"DD/MM/YYYY hh:mm:ss[.fff]"
DateFormat"DD/MM/YYYY"
TimeFormat"hh:mm:ss"
MoneyFormat"R$ #.##0,00;-R$ #.##0,00"
MoneyDecimalSep","
MoneyThousandSep"."
DecimalSep","
ThousandSep"."
ScriptError
ScriptErrorList""
ScriptErrorCount0
OpenUrlTimeout86400
StripComments1
ErrorMode1
WinRoot"C:"
WinPath"C:\Windows"
ScriptErrorDetails<NULL>
QvWorkRoot"C:"
QvWorkPath"C:\Users\Kleiton\Documents\GDP\QVW"
QvRoot"C:"
QvPath"C:\Program Files\QlikView"
CD"C:"

Obrigado!

Labels (2)
1 Solution

Accepted Solutions
nicolett_yuri

Faltou apóstrofe nas variáveis:

AUX:
LOAD
'$(vChave)'as Chave,
IterNo() as n,
Date(addmonths(addmonths('$(vDataInicial)' , (IterNo()*'$(vPeriodo)')),-1)) as Data
AUTOGENERATE $(vPeriodo)
WHILE addmonths ('$(vDataInicial)', IterNo()*'$(vPeriodo)') <= '$(vDataFinal)';

View solution in original post

10 Replies
nicolett_yuri

Kleiton, provavelmente a sua data esta sendo interpretada como um texto no qlikview. Repare que na variável você utiliza a função Num():

LET vDataFinal = num(Peek('[Data Fim Amortização]', $(a),'GDP_CONTRATO'));

LET vDataInicial = num(Peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(a),'GDP_CONTRATO'));

Verifique realmente se estes campos [GDPCONTR_DT_INIC_AMORTIZACAO] e [Data Fim Amortização] realmente são datas, caso sejam texto, então deve-se utilizar a função Date#() para trata-lo e não o Num()

kkmoraes
Contributor III
Contributor III
Author

Yuri,

Bom dia!

Os dois campos estão sendo tratados como Data sim,

DATE(GDPCONTR_DT_INIC_AMORTIZACAO)                AS [Data Inicio Amortização],

DATE(AddMonths(GDPCONTR_DT_INIC_AMORTIZACAO, IF(PRDO_CD_AMORTIZACAO = 8, GDPCONTR_QT_PARCELA_AMORT * 6, GDPCONTR_QT_PARCELA_AMORT)))

                                                                                               AS [Data Fim Amortização],

PRDO_CD_AMORTIZACAO                                              AS [Periodicidade do Indexador Financeiro da Amortização]

Um detalhe que observei é que o campo vPeriodo também está vindo incorreto, seguindo essa validação aqui:

Let vPeriodo= IF(Peek('PRDO_CD_AMORTIZACAO', $(a),'GDP_CONTRATO')=4, 1, 6);

Let vChave= Peek('ChaveContrato', $(a),'GDP_CONTRATO');

LET vDataFinal = Peek('GDPCONTR_DT_FIM_AMORTIZACAO', $(a),'GDP_CONTRATO');

LET vDataInicial = Peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(a),'GDP_CONTRATO');

o campo PRDO_CD_AMORTIZACAO para o contrato que estou filtrando possui o valor 4, consequentemente nessa validação a variável vPeriodo deveria assumir o valor 1 mas está assumindo o valor 6 da clausula ELSE (o mesmo ocorre em qualquer contrato).

Estou anexando alguns prints para facilitar o entendimento, você acredita que poderia ser problema no uso da função  anterior (NoOfRows)?

GDP1.png

GDP2.png

GDP3.png

nicolett_yuri

Vamos por partes

A função NoOfRows vai retornar apenas a quantidade de linhas que existe na sua tabela, no seu FOR você vai percorrer linha a linha, da tabela, até a última linha (NoOfRows). Acredito que este não é o seu problema.

Alguns passos para você validar:

  1. Veja se realmente existe informação nas colunas de data que esta buscando.
  2. Remova o Num() da variável.
kkmoraes
Contributor III
Contributor III
Author

Yuri,

Já havia tentado sem a função Num() hoje cedo porém persistiu o mesmo erro

Estou filtrando apenas por um único contrato para facilitar a identificação do problema, o valor bruto desses campos está preenchido

GDP_CamposBrutos.png

Durante o debug pude perceber que o campo vChave está vindo preenchido corretamente

nessa atribuição Let vChave= Peek('ChaveContrato', $(a),'GDP_CONTRATO');

então a atribuição está correta.


Estou começando a pensar em usar outra alternativa para resolver esse problema, realmente não consigo entender o que pode está ocorrendo nesse caso.

nicolett_yuri

Consegue me enviar um QVW de exemplo? Assim fica mais fácil te ajudar.

Exemplo simples do Peek:

TABELA:

LOAD * INLINE [

CHAVE, DATA1, DATA2

ABCA, 01/01/2015, 01/01/2016

ADDD, 02/02/2015, 02/02/2016

];

FOR x=0 TO NoOfRows('TABELA')-1

  LET vChave = Peek('CHAVE', $(x), 'TABELA');

  LET vData1 = Peek('DATA1', $(x), 'TABELA');

  LET vData2 = Peek('DATA2', $(x), 'TABELA');

  TRACE vChave = $(vChave);

  TRACE vData1 = $(vData1);

  TRACE vData2 = $(vData2);

NEXT x;

kkmoraes
Contributor III
Contributor III
Author

Yuri,

Criei um projeto novo com a carga simples da tabela que está dando problema, já deixei comentado também uma carga INLINE com os mesmos valores que vem do QVD na leitura original, dessa forma você pode realizar uma recarga localmente caso ache necessário.

GDP_Exemplo1.pngGDP_Exemplo2.pngGDP_Exemplo3.png

Obrigado pela ajuda!

nicolett_yuri

Já identifiquei o erro!

O problema esta na utilização do [ ] no nome do campo dentro do Peek()! Não pode usar, pois ele vai procurar um campo que não existe na sua tabela. A coluna [Data Fim Amortização] não existe, o que existe é Data Fim Amortização.

O colchete é necessário na sintaxe para que o QlikView compreenda o nome da coluna com espaços.

Let vPeriodo = IF(Peek('Periodicidade do Indexador Financeiro da Amortização', $(a),'GDP_CONTRATO')=4, 1, 6);
Let vChave = Peek('ChaveContrato', $(a),'GDP_CONTRATO');
Let vDataFinal = Peek('Data Fim Amortização', $(a),'GDP_CONTRATO');
Let vDataInicial = Peek('Data Inicio Amortização', $(a),'GDP_CONTRATO');
kkmoraes
Contributor III
Contributor III
Author

Yuri,

Testei aqui e realmente depois da alteração que você sugeriu os valores estão vindo preenchidos!

Porém, ainda obtive o erro inicial referente a syntax, você conseguiu executar sem erros?

Segue mais um print do debug

GDP_Erro.png

nicolett_yuri

Faltou apóstrofe nas variáveis:

AUX:
LOAD
'$(vChave)'as Chave,
IterNo() as n,
Date(addmonths(addmonths('$(vDataInicial)' , (IterNo()*'$(vPeriodo)')),-1)) as Data
AUTOGENERATE $(vPeriodo)
WHILE addmonths ('$(vDataInicial)', IterNo()*'$(vPeriodo)') <= '$(vDataFinal)';