

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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> |
vPeriodo | 6 |
vDataInicial | <NULL> |
vChave | "2700|1" |
a | 0 |
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 | "" |
ScriptErrorCount | 0 |
OpenUrlTimeout | 86400 |
StripComments | 1 |
ErrorMode | 1 |
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!
- « Previous Replies
-
- 1
- 2
- Next Replies »
Accepted Solutions


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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)'; |


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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()


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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)?


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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:
- Veja se realmente existe informação nas colunas de data que esta buscando.
- Remova o Num() da variável.


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
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.


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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;


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
Obrigado pela ajuda!


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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'); |


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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)'; |

- « Previous Replies
-
- 1
- 2
- Next Replies »