A quick article on how to count within a map. I didn't have too much difficulty getting this to work and I'm not sure if there are better ways of counting so I'm documenting it to see if I can refine the code or find a some short codes that will do the same.
Why?
I'm aiming to automate a process which counts the number of products allocated to an account or in total for a purchase order. Let us assume we have the following in a form/report called "Stock_Upload":
RowID Name SKU Account Email
0001 Test Product 1 TEST001 test1@joellipman.com
0002 Test Product 1 TEST001 test1@joellipman.com
0003 Test Product 1 TEST001 test1@joellipman.com
0004 Test Product 1 TEST001 test1@joellipman.com
0005 Test Product 2 TEST002 test1@joellipman.com
0006 Test Product 1 TEST001 test2@joellipman.com
0007 Test Product 1 TEST001 test2@joellipman.com
The code is a for loop which iterates through each row, assigning an entry for a new product or account, and specifying the quantity for each.How?
So depending on the number of levels, the count will be with a series if then else statements. See the results/yield section to determine which best fits your scenario:
Counting total products:
//
// count total products for availability
m_ProductCount = Map();
for each r_StockRecord in Stock_Upload[ID != 0]
{
if(m_ProductCount.get(v_SKU) == null)
{
m_ProductCount.put(v_SKU,1);
}
else
{
v_PreviousValue = m_ProductCount.get(v_SKU);
m_ProductCount.put(v_SKU,v_PreviousValue + 1);
}
}
info m_ProductCount Yields:
{
"TEST001": 6,
"TEST002": 1
}
Counting total products per account:
//
// count total products per account
m_Accounts = Map();
m_Products = Map();
//
// loop through each row
for each r_StockRecord in Stock_Upload[ID != 0]
{
//
// create map entry for account
if(m_Accounts.get(v_Email) == null)
{
m_Products.put(v_SKU,0);
m_Accounts.put(v_Email,m_Products);
}
//
// set product count for account
if(m_Accounts.get(v_Email).get(v_SKU) == null)
{
m_Products = m_Accounts.get(v_Email);
m_Products.put(v_SKU,1);
m_Accounts.put(v_Email,m_Products);
}
else
{
v_PreviousValue = m_Accounts.get(v_Email).get(v_SKU);
m_Products = m_Accounts.get(v_Email);
m_Products.put(v_SKU,v_PreviousValue + 1);
m_Accounts.put(v_Email,m_Products);
}
}
info m_Accounts Yields:
{
"test1@joellipman.com": {
"TEST001": 4,
"TEST002": 1
},
"test2@joellipman.com": {
"TEST001": 2
}
}
Discussion
Comments
Questions, corrections and useful additions are reviewed before appearing here.
No comments yet. Start the discussion.