javascript - Suitescript ClientScript 错误 JS_EXCEPTION - TypeError:无法读取未定义的属性“名称”
问题描述
首先抱歉,我的英语一点都不好,
我想创建一个 Suitescript 2.0 来在用户想要保存项目履行时验证客户信用额度。
如果客户总余额和要履行的项目金额超过客户信用额度,将有一个确认对话框询问用户是否要提交履行批准。
如果用户单击“是”,则脚本会更新批准原因、批准状态、要批准的数量,并选中销售订单记录上的需要批准到履行复选框字段,然后将用户重定向到销售订单记录。
当脚本保存销售订单记录时,我收到错误“JS_EXCEPTION - TypeError:无法读取未定义的属性'名称'。”
谁能告诉我是哪一行导致错误或如何解决我的问题,
谢谢。
这是我的脚本:
*@NApiVersion 2.x
*@NScriptType ClientScript
*/
define(['N/record', 'N/currentRecord', 'N/search'], function (record, currentRecord, search) {
function saveRecord(context) {
var currentRecord = context.currentRecord;
var isDynamic = currentRecord.isDynamic;
log.debug({
title: 'isDynamic',
details: isDynamic
});
var soId = currentRecord.getValue({
fieldId: 'createdfrom'
});
var fromRecord = search.lookupFields({ // Get Record Type from Createfrom field
type: search.Type.TRANSACTION,
id: soId,
columns: 'recordtype',
});
log.debug("createdfrom Type", fromRecord);
if (fromRecord.recordtype != 'salesorder')
return;
else if (fromRecord.recordtype == 'salesorder') {
var soRecord = record.load({
type: record.Type.SALES_ORDER,
id: soId,
isDynamic: true
});
var pymtMethod = soRecord.getValue({
fieldId: 'custbody_bmpt_metode_pembayaran'
});
log.debug('Payment Method', pymtMethod);
if (pymtMethod == 3 || pymtMethod == 4) {
var creditLimit = soRecord.getValue({
fieldId: 'credlim'
});
log.debug('creditLimit', creditLimit);
var balance = soRecord.getValue({
fieldId: 'balance'
});
log.debug('balance', balance);
var remainingBalance = (creditLimit * 1.15) - balance;
log.debug({
title: "Customer Remaining Balance",
details: remainingBalance
});
var itemCount = currentRecord.getLineCount({
sublistId: 'item'
});
log.debug({
title: "itemCount",
details: itemCount
});
var soItemCount = soRecord.getLineCount({
sublistId: 'item'
});
log.debug({
title: "soItemCount",
details: soItemCount
});
var totalAmount = 0;
var amount = 0;
//get item Detail per Line
for (var i = 0; i < itemCount; i++) {
var fulfillCheck = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'itemreceive',
line: i
});
log.debug({
title: "fulfillCheck" + [i],
details: fulfillCheck
});
// validate if fulfill field is checked
if (fulfillCheck == true) {
var ifItem = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
log.debug({
title: "ifItem",
details: ifItem
});
var itemQty = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i
});
log.debug({
title: "itemQty",
details: itemQty
});
var ifItemRate = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'itemunitprice',
line: i
});
log.debug({
title: "ifItemRate",
details: ifItemRate
});
amount = itemQty * ifItemRate;
log.debug({
title: "amount",
details: amount
});
}
totalAmount += amount;
log.debug({
title: 'Amount Total',
details: totalAmount
});
}
var currencySymbol = {
style: "currency",
currency: "IDR"
};
var totalBalance = balance + totalAmount;
log.debug({
title: 'totalBalance',
details: totalBalance
});
var reason = soRecord.getValue({
fieldId: 'custbody_approval_reason'
});
if (totalAmount > remainingBalance) {
// confirmation dialog
var confirmation = confirm('Total Customer Balance ' + totalBalance.toLocaleString("id-ID", currencySymbol) +
'\nhas Exceeded Customer Credit Limit of ' + creditLimit.toLocaleString("id-ID", currencySymbol) +
'\nDo You Want Submit Approval ?');
log.debug({
title: "confirmation",
details: confirmation
});
if (confirmation) {
if (reason == "" || reason == null) {
var input_reason = prompt('Please enter approval reason');
// set Sales Order Record 'approval reason' field Value .
var soUpdate = record.submitFields({
type: record.Type.SALES_ORDER,
id: soId,
values: {
'custbody_approval_reason': input_reason,
'custbody_approval_status_so': 1
}
});
log.debug({
title: 'soUpdate',
details: soUpdate
});
}
//set approval status to 1 - pending approval
var approvalSO = record.submitFields({
type: record.Type.SALES_ORDER,
id: soId,
values: {
'custbody_approval_status_so': 1
}
});
for (var u = 0; u < itemCount; u++) {
var fulfill = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'itemreceive',
line: u
});
log.debug({
title: "fulfill" + [u],
details: fulfill
});
// validate if fulfill field is checked
if (fulfill == true) {
var currentItem = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: u
});
log.debug({
title: "currentItem",
details: currentItem
});
var currentQty = currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: u
});
log.debug({
title: "currentQty",
details: currentQty
});
// get SO item information.
for (var so = 0; so < soItemCount; so++) {
var soLine = soRecord.selectLine({
sublistId: 'item',
line: so
});
var SOItem = soRecord.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'item'
});
log.debug({
title: 'SOItem ' + [so],
details: SOItem
});
if (currentItem == SOItem) {
soRecord.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'custcol_need_approval',
value: true
});
soRecord.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'custcol_fulfill_qty',
value: currentQty
});
}
soRecord.commitLine({
sublistId: 'item'
});
}
}
}
soRecord.save();
//open Sales Order Record at current Windows.
window.open('https://xxxx.app.netsuite.com/app/accounting/transactions/salesord.nl?id=' + soId, +'_self');
} else {
alert('Silahkan Perbaiki dan Submit Kembali !!');
}
return false;
}
}
}
return true;
}
return {
saveRecord: saveRecord
};
}); ```
解决方案
我在您提供的代码中没有看到任何会直接导致问题的问题。这可能是由该客户端脚本触发的脚本/工作流引发的错误。
选项 1:检查脚本部署记录,有一个上下文过滤选项卡,可让您设置脚本将在什么上下文中执行。
选项 2:N/runtime 模块有 runtime.executionContext 和 runtime.ContextType。根据您拥有的其他脚本的用途,您可以在脚本的开头使用它来限制触发它们的时间。
选项 3:当您使用 record.submitFields(options) 方法时,尝试设置可选参数“enablesourcing”。还要决定是否要使用“ignoreMandatoryFields”参数。
所以而不是:
var soUpdate = record.submitFields({
type: record.Type.SALES_ORDER,
id: soId,
values: {
'custbody_approval_reason': input_reason,
'custbody_approval_status_so': 1
}
});
尝试:
var id = record.submitFields({
type: record.Type.SALES_ORDER,
id: 1,
values: {
memo: 'ABC'
},
options: {
enableSourcing: false //default is true
}
});
在使用诸如 record.setValue(options) 或 record.setSublistValue(options) 之类的方法时,旧文档中有一个名为“fireSlavingSync”的参数在客户端脚本中可用。我过去曾成功使用它来不触发其他编程动作的发生。
推荐阅读
- validation - 在整个数据集上测试模型性能是否正确?
- prestashop - 前端 PS1.7 用户删除其帐户中的邮政地址时是否触发了钩子?
- javascript - 将变量值从块带到全局范围(在 FIRESTORE 中)
- c# - 为什么它会这样工作?(IndexOf 和 LastIndexOf 方法)
- visual-studio-code - 自动格式化后 VS Code 如何在 Elixir 文件中保留多个空行?
- bash - 无法验证 SSH 的结果
- javascript - w.fn.init[0] 是什么?
- javascript - 当它们具有禁用属性时,我可以在选择标签上触发事件吗?
- matplotlib - Matplotlib - 滑块动画冻结
- r - 如何根据数据的方式提取列名列表?