SuiteScript – Read Dynamic Sublist Data

Many times, we want to get dynamic information from the user but we do not want an underlying record structure.  In this case, we need sublist data.   What we learned is that in SuiteScript 2.0, the scriptContext object supplied in a BeforeSubmit operation is carrying along the dynamic data submitted by the user; however you can’t access it with NetSuite sublist library operators.  Yet, you can parse the custom sublist information and act on the data as a standard JavaScript object.

In the case below, our sublist is called  “custpage_receipts” and represents the typical way you would bind a dynamic custom sublist into a standard NetSuite form.

/*
 * @param {object} scriptContext
 * BeforeSubmit 2.0 Script 
 */

function itemRcptEexposeItmGrpQty(scriptContext) {

	var currentRecord = scriptContext.newRecord;
	var objCurRec = JSON.parse(JSON.stringify(currentRecord));
	var objSublists = objCurRec.sublists ? objCurRec.sublists : '';
	var objCustReceipts = objSublists.custpage_receipts ? objSublists.custpage_receipts : '';
	
	if (!objCustReceipts) return true;

	var intLnItemCount = currentRecord.getLineCount('item');
	for (var lnIdx = 0; lnIdx<intLnItemCount; lnIdx++)
		currentRecord.setSublistValue('item', 'itemreceive', lnIdx, false);

	var bolNoReceiptQty = true;

	for (var objLn in objCustReceipts){
		
		var numGrpQtyReceived = objCustReceipts[objLn].custpage_receipts_received;
		var intProdPoLineId = objCustReceipts[objLn].custpage_receipts_polineid;
		
		if(!numGrpQtyReceived || !intProdPoLineId)
			continue;
		
		// JSON structure representing a map; 
		var clsProdPoLine = new CNTPMLIB.PRODPOLINE(intProdPoLineId);
		var objPOLnFlds = search.lookupFields({
			type : IDLIB.REC.CNTPRODMGMTLN.ID,
			id : intProdPoLineId,
			columns : [ IDLIB.REC.CNTPRODMGMTLN.HOLDPRICEDATA,
					IDLIB.REC.CNTPRODMGMTLN.ITEMTYPE ]
		});
		var strItemMembData = objPOLnFlds[IDLIB.REC.CNTPRODMGMTLN.HOLDPRICEDATA];
		var arrItemMembData = strItemMembData ? JSON
				.parse(strItemMembData) : null;
		var arrLockedItemStruct = clsProdPoLine.getPoLineLockedStruct(arrItemMembData);

		if (util.isArray(arrLockedItemStruct)) {
			for (var memIdx = 0; memIdx< arrLockedItemStruct.length; memIdx++){

				var intItemId = arrLockedItemStruct[memIdx].MEMBERITEM;
				var numMemQty = arrLockedItemStruct[memIdx].MEMBERQTY;
				var numReceiveQty = numMemQty * numGrpQtyReceived;
				
				for(var lnIdx = 0; lnIdx<intLnItemCount; lnIdx++){
					
					var intPOLnId_tmp = currentRecord.getSublistValue('item', IDLIB.REC.N_ITEMRCPT.COL_CNTPMPO, lnIdx);
					var intItemId_tmp = currentRecord.getSublistValue('item', 'item', lnIdx);
					if (intPOLnId_tmp != intProdPoLineId || intItemId_tmp !=intItemId)
						continue;
					
					currentRecord.setSublistValue('item', 'itemreceive', lnIdx, true);
					currentRecord.setSublistValue('item', 'quantity', lnIdx, numReceiveQty);
				}
			}
		} else { 
			var intItemId = arrLockedItemStruct.MEMBERITEM;
			var numMemQty = arrLockedItemStruct.MEMBERQTY;
			var numReceiveQty = numMemQty * numGrpQtyReceived;
			
			for(var lnIdx = 0; lnIdx<intLnItemCount; lnIdx++){
				
				var intPOLnId_tmp = currentRecord.getSublistValue('item', IDLIB.REC.N_ITEMRCPT.COL_CNTPMPO, lnIdx);
				var intItemId_tmp = currentRecord.getSublistValue('item', 'item', lnIdx);
				if (intPOLnId_tmp != intProdPoLineId || intItemId_tmp !=intItemId)
					continue;
				
				currentRecord.setSublistValue('item', 'itemreceive', lnIdx, true);
				currentRecord.setSublistValue('item', 'quantity', lnIdx, numReceiveQty);
			}
		}
	}
}

Leave a comment

Your email address will not be published. Required fields are marked *