【问题标题】:Suitescript ClientScript Error JS_EXCEPTION - TypeError: Cannot read property 'name' of undefinedSuitescript ClientScript 错误 JS_EXCEPTION - TypeError:无法读取未定义的属性“名称”
【发布时间】:2020-11-11 08:34:51
【问题描述】:


首先抱歉,我的英语一点都不好,
当用户想要保存项目履行时,我想创建一个 Suitescript 2.0 来验证客户信用额度。
如果客户总余额和要履行的项目金额超过客户信用额度,将有一个确认对话框询问用户是否要提交履行批准。
如果用户单击“是”,则脚本会更新批准原因、批准状态、要批准的数量,并选中销售订单记录上的需要批准到履行复选框字段,然后将用户重定向到销售订单记录。
当脚本保存销售订单记录时,我收到错误 "JS_EXCEPTION - TypeError: Cannot read property 'name' of undefined."
谁能告诉我哪一行导致错误或如何解决我的问题,
谢谢你。
这是我的脚本:

 *@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
    };
}); ```

【问题讨论】:

    标签: javascript netsuite suitescript suitescript2.0


    【解决方案1】:

    您能否检查错误是否来自销售订单上部署的任何其他脚本,因为当您尝试使用客户端脚本保存记录时,所有其他部署的脚本都将执行。

    尝试取消部署其他脚本并测试一次以排除错误

    【讨论】:

      【解决方案2】:

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

      选项 1: 检查脚本部署记录,有一个上下文过滤选项卡,可让您设置脚本将在什么上下文中执行。

      选项 2: N/runtime 模块有 runtime.executionContext 和 runtime.ContextType。根据您拥有的其他脚本的用途,您可以在脚本开头使用它来限制触发它们的时间。

      选项 3: 当您使用record.submitFields(options) 方法时,尝试设置optional parameter“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
       }
      });
      

      older documentation 中有一个名为“fireSlavingSync”的参数,当使用诸如 record.setValue(options) 或 record.setSublistValue(options) 等方法时,该参数在客户端脚本中可用。我过去曾成功使用它来不触发其他编程动作发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-17
        • 2020-12-26
        • 2019-12-22
        • 2021-11-13
        • 2022-01-14
        • 2022-06-22
        • 2015-10-16
        • 2020-04-08
        相关资源
        最近更新 更多