10 Replies Latest reply: Apr 6, 2016 3:48 PM by Kleiton Moraes RSS

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

    Kleiton Moraes

      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!

        • Re: Uso da função Peek() dentro de um FOR NoOfRows()
          Yuri Nicolett

          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()

            • Re: Uso da função Peek() dentro de um FOR NoOfRows()
              Kleiton Moraes

              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