#javascript #netsuite #suitescript #suitescript2.0
#javascript #netsuite #suitescript #suitescript2.0
Вопрос:
Извините, во-первых, мой английский совсем не хорош,
я хочу создать Suitescript 2.0 для проверки кредитного лимита клиента, когда пользователь хочет сохранить выполнение элемента.
если общий баланс клиента и количество товара, подлежащего выполнению, превышают кредитный лимит клиента, появится диалоговое окно подтверждения, в котором пользователь должен спросить, хочет ли он отправить на утверждение выполнения или нет.
если пользователь нажимает «Да», сценарий обновляет причину утверждения, статус утверждения, количество для утверждения и устанавливает флажок «Требуется утверждение для выполнения» в записи заказа на продажу, а затем перенаправляет пользователя на запись заказа на продажу.
и когда скрипт сохраняет запись заказа на продажу, я получаю сообщение об ошибке «JS_EXCEPTION — ошибка типа: не удается прочитать свойство ‘name’ неопределенного».
кто-нибудь может сказать мне, какая строка вызывает ошибку или как решить мою проблему,
спасибо.
Вот мой скрипт :
*@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:
Я не вижу какой-либо проблемы конкретно в предоставленном вами коде, которая могла бы непосредственно вызвать проблему. Вероятно, это ошибка, которая выдается скриптом / рабочим процессом, который запускается этим клиентским скриптом.
Вариант 1: проверьте записи развертывания скрипта, есть вкладка контекстной фильтрации, которая позволит вам установить, в каком контексте будет выполняться скрипт.
Вариант 2: Модуль N / runtime имеет runtime.ExecutionContext и runtime.ContextType. В зависимости от назначения других имеющихся у вас сценариев, вы можете использовать это в начале сценариев, чтобы ограничить время их запуска.
Вариант 3: при использовании метода record.submitFields(параметры) попробуйте установить необязательный параметр «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
}
});
В старой документации был параметр с именем «fireSlavingSync», который был доступен в клиентских скриптах при использовании таких методов, как record.setValue(параметры) или record.setSublistValue(параметры). Я успешно использовал его в прошлом, чтобы не запускать другие запрограммированные действия.