Discover how to set up Units of Measure by referring to SuiteAnswers Article 28138 Setting Up Units of Measure, which provides detailed instructions on configuring this feature. In addition, NetSuite offers robust support for Multiple Units of Measure, allowing you to establish distinct units for effectively managing stock, procurement, sales of inventory items, and monitoring non-monetary accounts.
For businesses operating in industries like manufacturing and retail, where different units of measure are used during purchasing and selling processes, the conversion can sometimes be perplexing or time-consuming. However, with the following sample script, you can streamline the conversion process by automatically updating the quantity value based on the unit of measure’s conversion rate before and after the change.
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
define([‘N/record’,’N/search’,’N/currentRecord’],
function(record,search,currentRecord) {
/**
* Function to be executed after page is initialized.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord – Current form record
* @param {string} scriptContext.mode – The mode in which the record is being accessed (create, copy, or edit)
*
* @since 2015.2
*/
function pageInit(scriptContext) {
var curr = currentRecord.get();
for(var i = 0;i < curr.getLineCount({sublistId: ‘item’});i++){
var lineSelect = curr.selectLine({
sublistId: ‘item’,
line: i
});
curr.setCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘custcol_prev_uom’,
value: curr.getCurrentSublistValue({
fieldId: ‘units_display’,
sublistId: ‘item’
})
});
}
}
/**
* Function to be executed when field is changed.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord – Current form record
* @param {string} scriptContext.sublistId – Sublist name
* @param {string} scriptContext.fieldId – Field name
* @param {number} scriptContext.lineNum – Line number. Will be undefined if not a sublist or matrix field
* @param {number} scriptContext.columnNum – Line number. Will be undefined if not a matrix field
*
* @since 2015.2
*/
function fieldChanged(scriptContext) {
if(scriptContext.fieldId === ‘units’){
var curr = currentRecord.get();
var qtySO = curr.getCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: scriptContext.line
});
var itemSO = curr.getCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘item’,
line: scriptContext.line
});
var prevUOM = curr.getCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘custcol_prev_uom’,
line: scriptContext.line
});
var newUOM = curr.getCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘units_display’,
line: scriptContext.line
});
var newQty = searchUnitsType(itemSO,prevUOM, newUOM, qtySO);
curr.setCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: scriptContext.line,
value: newQty
});
curr.setCurrentSublistValue({
sublistId: ‘item’,
fieldId: ‘custcol_prev_uom’,
value: curr.getCurrentSublistValue({
fieldId: ‘units_display’,
sublistId: ‘item’
})
});
}
}
function searchUnitsType(item,prevUOM,newUOM, qty){
var itemUnitsType = search.lookupFields({
type: search.Type.ITEM,
id: item,
columns: [‘unitstype’]
}).unitstype[0].value;
var prevRate = runSearch(itemUnitsType,prevUOM);
var newRate = runSearch(itemUnitsType,newUOM);
return (prevRate/newRate) * qty;
}
function runSearch(unitType, unit){
var convRate = ”;
var unitstypeSearchObj = search.create({
type: “unitstype”,
filters:
[
[“internalid”,”anyof”,unitType],
“AND”,
[[“abbreviation”,”is”,unit],”OR”,[“pluralabbreviation”,”is”,unit]]
],
columns:
[
search.createColumn({name: “conversionrate”, label: “Rate”})
]
});
unitstypeSearchObj.run().each(function(result){
convRate = result.getValue({
name: ‘conversionrate’
});
return true;
});
return convRate;
}
return {
pageInit: pageInit,
fieldChanged: fieldChanged
};
});