NetSuite SuiteScript 2.0无法以编程方式输入部分创建的当前记录的“库存详细信息”子列表子记录

标签 netsuite suitescript2.0

我试图使用以下代码通过SuiteScript 2.0在客户端脚本中以编程方式(自动)创建“ list 详细信息”字段。库存调整表单上的项目行将被部分输入(直到“调整数量”字段为止),然后在此我要自动添加“库存明细”。

但是,代码错误就行了

inventoryDetailSubrecord = currentRecord.getSubrecord({
                           fieldId: 'inventorydetail'
                        });

错误消息SSS_INVALID_FIELD_ON_SUBRECORD_OPERATION。我不知道为什么会引发此错误,因为fieldId绝对有效。几乎没有有关此错误的信息。有谁知道我要去哪里错了?
/**
 * @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

最佳答案

不能使用客户端脚本创建子记录。您将需要使用用户事件脚本,或者可能要从客户端脚本发布到Suitelet。

导致该错误的原因是,当使用getSubrecord时,如果NetSuite不存在该记录,它将尝试创建该记录。

从文档中:

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.

关于NetSuite SuiteScript 2.0无法以编程方式输入部分创建的当前记录的“库存详细信息”子列表子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53958616/

相关文章:

javascript - 如何使用 nlapiAddMonths 设置 trandate 后 2 个月的字段值? (在客户端脚本中)

Netsuite 在客户记录中多次插入地址

javascript - Suitescript 努力应对使用 CORS 的第三方出站 API 调用

javascript - 根据下拉菜单中的选项通过 SuiteScript 隐藏自定义列字段

javascript - 有没有办法在从同一子列表中选择下拉值时禁用子列表字段。 SuiteScript 2.0 getSublistField 方法不起作用

NetSuite 添加自定义字段到价格水平

c# - NetSuite 自定义记录搜索将结果转换为 .NET 对象列表

netsuite - 在netsuite中找到一个字符串,打印出来

javascript - 需要在 NetSuite 工作流程期间提示用户输入文本

NetSuite Advanced PDF - 无法循环遍历从 addCustomDataSource N/render 函数构建的 JSON