[英]NetSuite SuiteScript 2.0 Cannot programmatically enter Inventory Details sublist subrecord for partially created current record
I am trying to create the Inventory Details fields programmatically (automatically) via SuiteScript 2.0 in a Client Script using the code below.我正在尝试使用以下代码通过客户端脚本中的 SuiteScript 2.0 以编程方式(自动)创建库存详细信息字段。 The item line on the Inventory Adjustment form would be partially entered (up to the Adjust Qty By field) at which point I would then like to add the Inventory Details automatically.库存调整表单上的项目行将被部分输入(直到调整数量字段),此时我想自动添加库存详细信息。
However the code errors on the line不过代码错误就行
inventoryDetailSubrecord = currentRecord.getSubrecord({
fieldId: 'inventorydetail'
});
with the error message SSS_INVALID_FIELD_ON_SUBRECORD_OPERATION
.带有错误消息SSS_INVALID_FIELD_ON_SUBRECORD_OPERATION
。 I have no idea why it would raise this error, since the fieldId
definitely seems valid.我不知道为什么会引发此错误,因为fieldId
看起来确实有效。 There are almost no information available about this error.几乎没有关于此错误的信息。 Does anyone know where I'm going wrong?有谁知道我要去哪里错了?
/**
* @NApiVersion 2.0
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
define(['N/search'], function (s) {
// Client Script global variables.
var allowSave = true;
var firstItemNegative = false;
var firstItemParentID = -9999;
function fieldChanged(context) {
var currentRecord = context.currentRecord; // Current opened record.
var sublistName = context.sublistId; // The internal ID of the sublist.
var sublistFieldName = context.fieldId; // The internal ID of the field that was changed.
var currentLine = context.line; // Line number (first line has value = 0) of Item User is on.
// Run when the Item field of the inventory sublist changed.
// Item for some reason does not fire a change event, so using item description instead.
// This means the description has to be required for these types of items.
if (sublistName === 'inventory' && sublistFieldName === 'description') {
// Check how many lines exist in the inventory sublist.
var lines = currentRecord.getLineCount({sublistId: 'inventory'});
// console.info("SS lines: " + lines);
// if (currentRecord.isDynamic) {
// console.info("SS isDynamic: true"); // currentRecord is Dynamic.
// } else {
// console.info("SS isDynamic: false");
// }
// Run when the Adjust Qty. By field of the inventory sublist changed.
} else if (sublistName === 'inventory' && sublistFieldName === 'adjustqtyby') {
console.info("SS fieldChanged: " + (context.sublistId || "record") + "." + context.fieldId);
console.info("SS currentLine: " + currentLine);
// Check how many lines exist in the inventory sublist.
var lines = currentRecord.getLineCount({sublistId: 'inventory'});
console.info("SS lines: " + lines);
var total; // Total used to check whether sum of quantities is zero.
var quantity; // Used to hold quantity for current line item.
var inventoryDetailSubrecord; // Used to access the Inventory Detail Icon fields.
for (var i = 0; i <= lines; i++) {
// If we are on the first item line.
if (i === 0) {
if (i === currentLine) {
// Get the first item line's Adjust Qty. By field value.
// Note that the value could be invalid in which case 0 is used.
// For partially entered lines.
total = (parseFloat(currentRecord.getCurrentSublistValue({
sublistId: "inventory",
fieldId: "adjustqtyby"
})) || 0);
} else {
// Get the first item line's Adjust Qty. By field value.
// For completed lines that have been Added.
total = (parseFloat(currentRecord.getSublistValue({
sublistId: "inventory",
fieldId: "adjustqtyby",
line: i
})) || 0);
}
console.info("SS total first line: " + total);
// If the quantity of the first line is positive then this is a real Inventory Adjustment
// and not a roll that was cut into smaller inventory.
if (total >= 0) {
firstItemNegative = false;
} else {
firstItemNegative = true;
}
} else if (i > 0) { // For non-first lines.
if (i === currentLine) {
// Get the current item line's Adjust Qty. By field value.
quantity = (parseFloat(currentRecord.getCurrentSublistValue({
sublistId: "inventory",
fieldId: "adjustqtyby"
})) || 0);
// If the first item is negative then we have to increment the lot number.
if (firstItemNegative) {
// Get the inventory detail subrecord of the current line.
inventoryDetailSubrecord = currentRecord.getCurrentSublistSubrecord({
sublistId: 'inventory',
fieldId: 'inventorydetail'
});
// If the inventory detail subrecord does not exist, then create one.
if (!inventoryDetailSubrecord) {
// Errors with SSS_INVALID_FIELD_ON_SUBRECORD_OPERATION.
inventoryDetailSubrecord = currentRecord.getSubrecord({
fieldId: 'inventorydetail'
});
// Select a new inventory detail subrecord line.
inventoryDetailSubrecord.selectNewLine({
sublistId: 'inventory'
});
// Set the lot number.
inventoryDetailSubrecord.setCurrentSublistValue({
sublistId: 'inventory',
fieldId: 'issueinventorynumber',
value: '1'
});
// Set the quantity.
inventoryDetailSubrecord.setCurrentSublistValue({
sublistId: 'inventory',
fieldId: 'quantity',
value: quantity
});
// Commit the sublist.
objRecord.commitLine({
sublistId: 'inventory'
});
} // if (!inventoryDetailSubrecord)
} // if (firstItemNegative)
} else {
// Get the current item line's Adjust Qty. By field value.
quantity = (parseFloat(currentRecord.getSublistValue({
sublistId: "inventory",
fieldId: "adjustqtyby",
line: i
})) || 0);
}
console.info("SS quantity: " + quantity);
// If the first item is negative then we have to keep a running total of the quantities.
if (firstItemNegative) {
total = total + quantity;
console.info("SS total other lines: " + total);
} else { // If the first item is positive we have to check that there are no other negative quantities.
if (quantity < 0) {
allowSave = false;
// Show modeless Netsuite banner message at top of screen that is replaced by subsequent messages.
// If you use the same id in the first parameter it will overwrite the message, if you supply a different id you will see new messages uniquely in the page.
showAlertBox(
"my_element_id", // Dummy element id of alert.
"Error:", // Message header.
'Inventory Item line number ' + (i + 1) + ' has a negative "Adjust Qty. By" field value. Negative values are only allowed for the first item.',
3, // Colour of alert: 0 - Success (green), 1 - Information (blue), 2 - Warning (yellow), 3 - Error (red)
"","","","" // Not sure what this does.
);
break;
}
}
} // if (i === 0)
} // for (var i = 0; i < lines + 1; i++)
console.info("SS total end: " + total);
// If the total of the quantities are not zero then error. Allow if only the first line exists.
if (total !== 0 && lines !== 0) {
allowSave = false;
if (total < 0) {
showAlertBox(
"my_element_id", // Dummy element id of alert.
"Error:", // Message header.
'Error: The total of the "Adjust Qty. By" fields must equal zero. You are under by ' + (-total),
3, // Colour of alert: 0 - Success (green), 1 - Information (blue), 2 - Warning (yellow), 3 - Error (red)
"","","","" // Not sure what this does.
);
} else {
showAlertBox(
"my_element_id", // Dummy element id of alert.
"Error:", // Message header.
'Error: The total of the "Adjust Qty. By" fields must equal zero. You are over by ' + total,
3, // Colour of alert: 0 - Success (green), 1 - Information (blue), 2 - Warning (yellow), 3 - Error (red)
"","","","" // Not sure what this does.
);
}
} else {
allowSave = true;
}
} // if (sublistName === 'inventory' && sublistFieldName === 'description')
// Clear any error messages to show that all fields validated.
if (allowSave) {
showAlertBox(
"my_element_id", // Dummy element id of alert.
"Success:", // Message header.
'Validation passed.',
0, // Colour of alert: 0 - Success (green), 1 - Information (blue), 2 - Warning (yellow), 3 - Error (red)
"","","","" // Not sure what this does.
);
}
} // fieldChanged
function saveRecord() {
// debugger;
console.info("SS saveRecord");
if (!allowSave) {
alert("Error: Save failed. There are error messages at the top of the page.");
}
return allowSave;
} // saveRecord
return {
fieldChanged: fieldChanged,
saveRecord: saveRecord
};
}); // Define
Subrecords cannot be created with a client script.不能使用客户端脚本创建子记录。 You'll need to use a user event script, or, maybe post to a Suitelet from your client script.您需要使用用户事件脚本,或者从您的客户端脚本发布到 Suitelet。
The error is caused because NetSuite attempts to create the record if it doesn't exist when using getSubrecord
.该错误是因为 NetSuite 在使用getSubrecord
时尝试创建不存在的记录。
From the documentation:从文档中:
A client script may not create subrecords on the current record and is limited to read-only access of existing subrecords on the current record.客户端脚本不能在当前记录上创建子记录,并且仅限于对当前记录上现有子记录的只读访问。 The client script may remove the subrecord from the current record.客户端脚本可以从当前记录中删除子记录。
Because inventory detail subrecord can't be created through client script.因为无法通过客户端脚本创建库存明细子记录。 The only way to create inventory detail programmatically is to create the whole parent record with server scripts.以编程方式创建库存详细信息的唯一方法是使用服务器脚本创建整个父记录。
Can you try this code as an alternative?您可以尝试使用此代码作为替代方案吗?
inventoryDetailSubrecord = currentRecord.getSublistSubrecord({
sublistId: 'item',
fieldId: 'inventorydetail',
line: line#
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.