简体   繁体   English

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

[英]NetSuite SuiteScript 2.0 Cannot programmatically enter Inventory Details sublist subrecord for partially created current record

I am trying to create the Inventory Details fields programmatically (automatically) via SuiteScript 2.0 in a Client Script using the code below.我正在尝试使用以下代码通过客户端脚本中的 SuiteScript 2.0 以编程方式(自动)创建库存详细信息字段。 The item line on the Inventory Adjustment form would be partially entered (up to the Adjust Qty By field) at which point I would then like to add the Inventory Details automatically.库存调整表单上的项目行将被部分输入(直到调整数量字段),此时我想自动添加库存详细信息。

However the code errors on the line不过代码错误就行

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

with the error message SSS_INVALID_FIELD_ON_SUBRECORD_OPERATION .带有错误消息SSS_INVALID_FIELD_ON_SUBRECORD_OPERATION I have no idea why it would raise this error, since the fieldId definitely seems valid.我不知道为什么会引发此错误,因为fieldId看起来确实有效。 There are almost no information available about this error.几乎没有关于此错误的信息。 Does anyone know where I'm going wrong?有谁知道我要去哪里错了?

/**
 * @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

Subrecords cannot be created with a client script.不能使用客户端脚本创建子记录。 You'll need to use a user event script, or, maybe post to a Suitelet from your client script.您需要使用用户事件脚本,或者从您的客户端脚本发布到 Suitelet。

The error is caused because NetSuite attempts to create the record if it doesn't exist when using getSubrecord .该错误是因为 NetSuite 在使用getSubrecord时尝试创建不存在的记录。

From the documentation:从文档中:

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.客户端脚本可以从当前记录中删除子记录。

Because inventory detail subrecord can't be created through client script.因为无法通过客户端脚本创建库存明细子记录。 The only way to create inventory detail programmatically is to create the whole parent record with server scripts.以编程方式创建库存详细信息的唯一方法是使用服务器脚本创建整个父记录。

Can you try this code as an alternative?您可以尝试使用此代码作为替代方案吗?

inventoryDetailSubrecord = currentRecord.getSublistSubrecord({
    sublistId: 'item',
    fieldId: 'inventorydetail',
    line: line#
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 NetSuite SuiteScript 2.0 无法以编程方式从用户事件脚本中检索库存详细信息子列表子记录 - NetSuite SuiteScript 2.0 Cannot programmatically retrieve Inventory Details sublist subrecord from user event script 当前子记录(销售订单记录)中不允许使用SuiteScript 2.0 setValue - SuiteScript 2.0 setValue not allowed in the current subrecord (Sales Order Record) NetSuite SuiteScript 2.0如何在N / search create API中指定字段,子列表字段或子记录字段 - NetSuite SuiteScript 2.0 How to specify field, sublist field or subrecord field in N/search create API 有没有办法找出当前的 Netsuite 记录是否是suitescript 中另一条记录的子记录? - Is there a way to find out if current Netsuite record is a subrecord of another record inside suitescript? 当前子记录中不允许使用SuiteScript 2.0 setValue - SuiteScript 2.0 setValue not allowed in the current subrecord 替换 NetSuite SuiteScript 2.0 中现有的子列表子记录 - Replace existing sublist subrecords in NetSuite SuiteScript 2.0 如何使用suitescript 2.0动态加载/提供netsuite子列表中类型列表/记录的记录? - How to dynamically load/source a record for type list/record in netsuite sublist using suitescript 2.0? 根据套件条件,NetSuite库存明细子记录应具有bin(库存分配) - NetSuite Inventory detail subrecord should have bin(inventoryassignment) according to suitescript condition NetSuite 客户端脚本 2.0 禁用库存明细记录中的到期日期子列表字段 - NetSuite Client Script 2.0 to Disable Expiry Date Sublist Field on Inventory Detail record 如何在子列表子记录中设置值? (SuiteScript 1.0) - how to set values in sublist subrecord? (SuiteScript 1.0)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM