Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Want to see what's currently in public preview? We've pulled it all together in one place. Check it out here
cancel
Showing results for 
Search instead for 
Did you mean: 
AkbarShaikh
Contributor III
Contributor III

Unexpected Token

Hello guys,

I have purchased this book Qlikview: Advanced Data Visualization and as an example, it is creating a random set of data. 

I am scripting as per the book, but still getting an Unexpected token error. I have tried every option to resolve this, but not able to get past this error. 

I have attached the script and the error message for reference. 

Any help would be highly appreciated. 

Thanks,

Akbar

// ***************This is the script as mentioned in the book ********************** //

 

//Calculate random number of lines
LET vPCount = Floor(Rand () * $(vDateFactor)) + 1;

FOR L = 1 to $(vPCount)
//Calculate random values
LET vQty = Floor (Rand() * (50+ $(vDateFactor))) +1;
LET vRnd = Floor (Rand() * $(vProdCount));
LET vPID = Peek ('ProductID', $(vRnd), 'Product');
LET vCost = ApplyMap('Product_Cost_Map', $(vPID), 1);  // *****This is where the error hits in *****//
LET vPrice = ApplyMap('Product_Price_Map' ,$(vPID), 1);

Labels (2)
1 Solution

Accepted Solutions
AkbarShaikh
Contributor III
Contributor III
Author

Hi Fong, 

I found the error: Table name in Peek function was incorrect:

FOR L = 1 to $(vPCount)
//Calculate random values
LET vQty = Floor (Rand() * (50+ $(vDateFactor))) +1;
LET vRnd = Floor (Rand() * '$(vProdCount)');
LET vPID = Peek ('ProductID', '$(vRnd)', 'Product'); // The table name is Products
LET vCost = ApplyMap('Product_Cost_Map', '$(vPID)', 1);
LET vPrice = ApplyMap('Product_Price_Map' ,'$(vPID)', 1);

 

The script did run without given any 'token' error but has created a Syn key on Product Id and Sales Price. 

If I rename these two fields, the Product table does not connect to the fact table (Order Header).

I have attached the table view for your reference.

View solution in original post

7 Replies
Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Try this:

LET vCost = ApplyMap('Product_Cost_Map', '$(vPID)', 1); 
LET vPrice = ApplyMap('Product_Price_Map' ,'$(vPID)', 1);

AkbarShaikh
Contributor III
Contributor III
Author

Thank you for the reply, I had tried using ' ' on the variable, but it still gives an error. 

Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Applymap always go along with a mapping table.

Do you have a mapping table above your script?

Eg:

Product_Cost_Map:

Mapping load

Key,MapField

inline [

Key,MapField

Key1,A

Key2,B

];

 

AkbarShaikh
Contributor III
Contributor III
Author

Hi Fong, I have a preceding Mapping Load of the with both the table names separately with two fields. //************This is the preceding load script*****// Product_Cost_Map: Mapping Load ProductID, NUM(CostPrice) Resident Products; //This table is already loaded with ProductID, CostPrice, SalesPrice Product_Price_Map: Mapping Load ProductID, NUM(SalesPrice) Resident Products;
Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Can you post the full script?

AkbarShaikh
Contributor III
Contributor III
Author

Sure Fong, 

Here it is...

//***** Script ***** //

//**** Generating some data ranges to be used in calculation ***** //
LET vStartYear = 2009;
LET vEndYear = Year(Now());
LET vStartDate = Floor(MakeDate($(vStartYear)), 4, 1);
LET vEndDate = Floor(MakeDate($(vEndYear)), 3, 31);
LET vNumDays = vEndDate - vStartDate +1;

Products:
LOAD ProductID,
Product,
CategoryID,
SupplierID,
Money# (CostPrice, '$#,##0.00', '.', ',') as CostPrice,
Money# (SalesPrice, '$#,##0.00', '.', ',') as SalesPrice
FROM
Products.txt
(txt, codepage is 1252, embedded labels, delimiter is '\t', msq);

Product_Cost_Map:
MAPPING LOAD
ProductID,
NUM(CostPrice)
RESIDENT Products;

Product_Price_Map:
MAPPING LOAD
ProductID,
NUM(SalesPrice)
RESIDENT Products;

Customer:
LOAD CustomerID,
Customer,
City,
Country,
Region,
Longitude,
Latitude,
Geocoordinates
FROM
Customers.txt
(txt, codepage is 1252, embedded labels, delimiter is '\t', msq);

Employee:
LOAD EmployeeID,
Employee,
Grade,
SalesUnit
FROM
Employees.txt
(txt, codepage is 1252, embedded labels, delimiter is '\t', msq)
WHERE MATCH (Grade, 0, 1, 2, 3); //SALES PEOPLE


//***** COUNT ID records in each table *****//
LET vCustCount = FieldValueCount('CustomerID');
LET vProdCount = FieldValueCount('ProductID');
LET vEmpCount = FieldValueCount('EmployeeID');

// Create a loop of 10,000 iterations

FOR i = 1 to 10000

// 'A' type of records are for any date /time

// Grab a random employee and customer
LET vRnd = Floor (Rand () * $(vEmpCount));
LET vEID = Peek ('EmployeeID', '$(vRnd)', 'Employee');

LET vRnd = Floor (Rand () * $(vCustCount));
LET vCID = Peek ('CustomerID', '$(vRnd)', 'Customer');


//Create a date for any time of day between 9 - 5
LET vOrderDate = $(vStartDate) + Floor (Rand () * $(vNumDays)) + ((9/ 24) + (Rand () / 3));

//Calculate a random freight amount
LET vFreight = ROUND(RAND () * 100, 0.01);

//Create the header record
OrderHeader:
LOAD
'A' & $(i) as OrderID,
$(vOrderDate) as OrderDate,
$(vCID) as CustomerID,
$(vEID) as EmployeeID,
$(vFreight) as Freight
AutoGenerate (1);

//Genereate Order Lines
//This factor allows us to generate adiiferent number of lines depending on the day of the week

LET vWeekDay = NUM (WeekDay ($(vOrderDate)));
LET vDateFactor = Pow(2, $(vWeekDay))*(1-(Year(Now())-Year($(vOrderDate)))*0.05) ;

//Calculate random number of lines
LET vPCount = Floor(Rand () * $(vDateFactor)) + 1;

FOR L = 1 to $(vPCount)
//Calculate random values
LET vQty = Floor (Rand() * (50+ $(vDateFactor))) +1;
LET vRnd = Floor (Rand() * '$(vProdCount)');
LET vPID = Peek ('ProductID', '$(vRnd)', 'Product');
LET vCost = ApplyMap('Product_Cost_Map', '$(vPID)', 1);
LET vPrice = ApplyMap('Product_Price_Map' ,'$(vPID)', 1);

OrderLine:
LOAD
'A' & $(i) as OrderID,
$(L) as LineNo,
$(vPID) as ProductID,
$(vQty) as Quantity,
$(vPrice) as SalesPrice,
$(vCost) as SalesCost,
$(vQty)* $(vPrice) as LineValue,
$(vQty)* $(vCost) as LineCost
AutoGenerate (1);

NEXT
//"B" type records are for summer peak
// Summer Peak - Generate additional records for summer months to stimulate a peak trading period

LET vY = Year($(vOrderDate));
LET vM = Floor (Rand()*2)+7;
LET vD = Day ($(vOrderDate));
LET vOrderDate = Floor (MakeDate ($(vY), $(vM), $(vD))) + (9/24) + (Rand() /3);

IF Rand() > 0.8 THEN
// Grab a random employee and customer
LET vRnd = FLoor (Rand ()* $(vEmpCount));
LET vEID = Peek ('EmployeeID', $(vRnd), 'Employee');
LET vRnd = Floor (Rand() *$(vCustCount));
LET vCID = Peek ('CustomerID', $(vRnd), 'Customer')

 

//***** END OF SCRIPT *****//

P.S.

This script is from the book Qlikview Advance Data Visualization.

I am running the script with a debugger now - will let you know if I get a solution

Cheers,

a

AkbarShaikh
Contributor III
Contributor III
Author

Hi Fong, 

I found the error: Table name in Peek function was incorrect:

FOR L = 1 to $(vPCount)
//Calculate random values
LET vQty = Floor (Rand() * (50+ $(vDateFactor))) +1;
LET vRnd = Floor (Rand() * '$(vProdCount)');
LET vPID = Peek ('ProductID', '$(vRnd)', 'Product'); // The table name is Products
LET vCost = ApplyMap('Product_Cost_Map', '$(vPID)', 1);
LET vPrice = ApplyMap('Product_Price_Map' ,'$(vPID)', 1);

 

The script did run without given any 'token' error but has created a Syn key on Product Id and Sales Price. 

If I rename these two fields, the Product table does not connect to the fact table (Order Header).

I have attached the table view for your reference.