首页 > 解决方案 > 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
    };
}); ```

标签: javascriptnetsuitesuitescriptsuitescript2.0

解决方案


我在您提供的代码中没有看到任何会直接导致问题的问题。这可能是由该客户端脚本触发的脚本/工作流引发的错误。

选项 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”的参数在客户端脚本中可用。我过去曾成功使用它来不触发其他编程动作的发生。


推荐阅读