Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Looping through Table Rows

I want to Loop through each row in a table, set variables to the values of each row in order to do some repetitive processing.  Seems like a simple construct that would be used often.  Here is what I thought would work, but for some reason the data coming back doesn't seem to match across the column for each row returned, and as I work through index by third iteration I'm getting nulls on the second column.

BOX:

LOAD * INLINE [BOXName, VOLCnt
"MRC", 49152
"TTN", 49152
"PLT", 12288
"GLD", 12288
"SVR", 12288
"IRN", 12288
]
;

LET NumRows=NoOfRows('BOX');
FOR i=1 to $(NumRows)
 
LET vBox=FieldValue('BOXName',$(i));
 
LET vVolCnt=FieldValue('VOLCnt',FieldIndex('BOXName','$(vBox)'));
//do some stuff....
NEXT;

Result set for variables after run:

vBoxvVolCnt
MRC49152
TTN

12288

PLT<NULL>
GLD

<NULL>

SVR<NULL>
IRN<NULL>

Seems I'm missing something very elementary here

1 Solution

Accepted Solutions
danielrozental
Master II
Master II

You should be using Peek instead,

  LET vBox=Peek('BOXName',$(i));

  LET vVolCnt=Peek('VOLCnt',$(i));

View solution in original post

13 Replies
danielrozental
Master II
Master II

You should be using Peek instead,

  LET vBox=Peek('BOXName',$(i));

  LET vVolCnt=Peek('VOLCnt',$(i));

Oleg_Troyansky
Partner Ambassador/MVP
Partner Ambassador/MVP

.. and specify the table name in your peak function, as a third parameter

Not applicable
Author

Daniel,

Thanks for the quick reply.  It seems I totally overthought this one

Peek with the index works!

Cheers,

Lew

Not applicable
Author

Oleg,

It works perfect without a third parameter of table name, but for grins I tried adding this third parameter...it didn't break anything, but the result was the creation of a new variable of the same name as table that would get set to NULL on each peek.

Daniel's suggestion worked as is, although seem tables have origin 0 not 1 in QV, so had to change my FOR:

LET

NumRows=NoOfRows('BOX');
FOR i=0 to $(NumRows)-1
 
LET vBox=Peek('BOXName',$(i));
 
LET vVolCnt=peek('VOLCnt',$(i));
  //do some repetitive stuff....
NEXT;

Oleg_Troyansky
Partner Ambassador/MVP
Partner Ambassador/MVP

I might be over thinking it, but it might be important when you have the same value repeating multiple times in different tables rows, and possibly the same field present in multiple tables. then, when you specify

peek ('field', index)

it becomes unclear what the index should represent - the value index in a field list, or a row in a table? ...what table?

the two formats might work identically in simple cases when the field only exists in the same table, and when values are fairly unique.

Not applicable
Author

Well Oleg, thought you might be onto something here. Once I put an SQL Select into the loop, the "Peeks" returned NULL on the second iteration as though somehow the SQL statement cleared the values from the Inline Table.  Started thinking your qualification with the third parameter might be the ticket, but didn't make a difference

Any thoughts on why peek is acting differently now that there is an SQL statment in the mix?

LET NumRows=NoOfRows('BOX');
FOR i=0 to $(NumRows)-1
LET vBox=Peek('BOXName',$(i));
LET vVolCnt=peek('VOLCnt',$(i));
LET my_include= '..\..\Include\BDS-IT\odbc-' & '$(vBox)' & '.qvs';
$(include=$(my_include));

DISC_USAGE:
SQL SELECT
     '$(vBox)' AS SRC_SYS_CD,
     DISC_DATE,
     VOL_TYPE,
     MIN_FREE_TB,
     MAX_FREE_TB,
      ...
     FROM   NEO.DISK_USAGE_VIEW           

     WHERE
              VOLUME_NAME LIKE '$FC%'
               ...

      HAVING

             VOL_CNT = $(vVolCnt)
       FOR READ UNCOMMITTED ACCESS IN SHARE MODE;
NEXT;

Oleg_Troyansky
Partner Ambassador/MVP
Partner Ambassador/MVP

Your SQL statement appears after the peek()... you don't show the part of the script tha loads the previous table...

The SQL statement by itself shouldn't change much. If your previous statement is also a new SQL, - check if your fields have the same upper-lower case as you spelled them in the peek(). It looks like your SQL only returns upper case fields...

Not applicable
Author

The only previous statement is the INLINE LOAD....so very puzzled   Doesn't seem like the SQL SELECT should have any effect on these "Peeks", but it does.

BOX:

LOAD * INLINE [BOXName, VOLCnt
"MRC", 49152
"TTN", 49152
"PLT", 12288
"GLD", 12288
"SVR", 12288
"IRN", 12288
]
;

LET NumRows=NoOfRows('BOX');
FOR i=0 to $(NumRows)-1
LET vBox=Peek('BOXName',$(i),BOX);
LET vVolCnt=peek('VOLCnt',$(i),BOX);
LET my_include= '..\..\Include\BDS-IT\odbc-' & '$(vBox)' & '.qvs';
$(include=$(my_include));

DISC_USAGE:
SQL SELECT
     '$(vBox)' AS SRC_SYS_CD,
     DISC_DATE,
     VOL_TYPE,
     MIN_FREE_TB,
     MAX_FREE_TB,
      ...
     FROM   NEO.DISK_USAGE_VIEW           

     WHERE
              VOLUME_NAME LIKE '$FC%'
               ...

      HAVING

             VOL_CNT = $(vVolCnt)
       FOR READ UNCOMMITTED ACCESS IN SHARE MODE;
NEXT;

torstein
Partner - Contributor
Partner - Contributor

Peek is way to slow. How do I loop trough the data in a faster way?