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: 
Not applicable

Scripting - use a variable in field names

Good afternoon,

I have a table MyTable like

Company

CostCenter

Year

Amount001 (where the '001' stands for Jan

Amount002

...

Amount016

and would like to convert it to

Company

CostCenter

Year

Month

Amount

I would like to use a variable and loop over the table, but Qlik apparently does not recognize the row highlighted below

Set counter= 1;
Do while counter < 17;
  Postings:
load

Company

CostCenter

Year

Amount($counter) as Amount         // this row is my problem

($counter) as Month

Any suggestions?

L.

1 Solution

Accepted Solutions
Gysbert_Wassenaar

You start with the Crosstable function:

TempPostings:

Crosstable(TempMonth,Value,3)

LOAD

     Company,

     CostCenter,

     Year,

     Amount001,

     Amount002,

     ...

     Amount016

FROM ...

Then you need to replace the 'AmountXXX' values in the TempMonth field with Jan, Feb etc. You could use a mapping table for this:

MapMonth:

Mapping LOAD * INLINE [

Name, NewName

Amount001, Jan

Amount002, Feb

...etc

];

You can then use the mapping table in the applymap function:

Postings:

LOAD *, ApplyMap('MapMonth',TempMonth) as Month

Resident TempPostings;

Drop Table TempPostings;

Drop Field TempMonth;


talk is cheap, supply exceeds demand

View solution in original post

6 Replies
swuehl
MVP
MVP

Use CROSSTABLE LOAD

The Crosstable Load

, something like

CROSSTABLE (Month, Amount, 3)

LOAD Company, CostCenter, Year, Amount001, Amount002

FROM ...;

Then map your fieldnames:

MAP:

MAPPING LOAD F1, F2 INLINE [

F1, F2

Amount001, Jan

Amount002, Feb

];

RESULT:

NOCONCATENATE

LOAD Company,

          CostCenter,

          Year,

          applymap('MAP', Month) as Month,

          Amount

RESIDENT CROSS;

DROP TABLE CROSS;

Gysbert_Wassenaar

You start with the Crosstable function:

TempPostings:

Crosstable(TempMonth,Value,3)

LOAD

     Company,

     CostCenter,

     Year,

     Amount001,

     Amount002,

     ...

     Amount016

FROM ...

Then you need to replace the 'AmountXXX' values in the TempMonth field with Jan, Feb etc. You could use a mapping table for this:

MapMonth:

Mapping LOAD * INLINE [

Name, NewName

Amount001, Jan

Amount002, Feb

...etc

];

You can then use the mapping table in the applymap function:

Postings:

LOAD *, ApplyMap('MapMonth',TempMonth) as Month

Resident TempPostings;

Drop Table TempPostings;

Drop Field TempMonth;


talk is cheap, supply exceeds demand
MarcoWedel

besides CrossTable being the function you're looking for, your script would work using this syntax:

Set counter= 1;

Do while counter <= 3;

  Postings:

load

ID,

Amount$(counter) as Amount,

$(counter) as Month

Resident table1;

counter=counter+1;

LOOP;

hope this helps

regards

Marco

Not applicable
Author

Thanks! Works well!

Not applicable
Author

Thanks Marco. Cross-table works perfectly (well, in my case, since I have values and quantities, I need to do it in two steps, which is a little bit cumbersome, but it works).

However I´m curious why below code fails (my values are stored in fields [Val/COArea Crcy 001] where 001 stands for the month and goes from 001 to 016)

// >>>>>>>>>this is what the debugger shows me as interpreted values of the variables

Val/COArea Crcy 001 <NULL>
counter 01

// <<<<<<<<<<<<<

// >>>>>>>>>this is the script code

Set counter=01;
Do while counter < 17;

Postings:
load
[Object number],
[Fiscal Year],
[Value Type],
Version,
[Cost Element],
[CO subkey],
Bus.Transaction,
// [Trading Partner],
// [Trdg part.BA],
   [Dr/Cr indicator],
[Trans. Currency],
[Period block],
[Unit of Measure],
[Debit type],
if ($(counter)  > 9, '0' & $(counter), '00' & $(counter)) as [Month (Long)],
$(Val/COArea Crcy 0$(counter)) as Value
resident PostingsTemp2;

Let counter = counter +1;
Loop;

drop tables PostingsTemp2;

swuehl
MVP
MVP

This variable is not set correctly:

Val/COArea Crcy 001 <NULL>

You need to check the code before the while loop, where you define the variable.