SuiteScript 根据发货位置对重量求和

Posted

技术标签:

【中文标题】SuiteScript 根据发货位置对重量求和【英文标题】:SuiteScript to sum the weight based on ship-out location 【发布时间】:2018-07-20 08:33:15 【问题描述】:

我希望能够根据发货位置计算销售订单上商品的总重量,并将值存储在自定义字段中。我在提交脚本之前创建了一个。自定义字段设置为十进制数字类型并选中存储值框,但在销售订单页面的字段下没有显示任何内容。

function calculateWeight(type)

  var lines = nlapiGetLineItemCount('item');

  var totalWeight2 = 0 ;
  var totalWeight1 = 0 ;

  if (lines >0)
      for(var i = 1; i<= lines ; i++)
          var location = nlapiGetLineItemValue('item','location', i);
          var quantitycommitted = nlapiGetLineItemValue('item','quantitycommitted', i);
          var weight = nlapiGetLineItemValue('item','custcol_individual_weight', i);
          //var com_wgt = nlapiGetLineItemValue('item','custcol1',i);

          if (location === '2')
              var total2 = weight * quantitycommitted;

              totalWeight2 += total2 ;
          

          if (location === '1')
              var total1 = weight * quantitycommitted;

              totalWeight1 += total1 ;
          

      

      nlapiSetFieldValue('custbody5', totalWeight1);
      nlapiSetFieldValue('custbody4', totalWeight2);

  


我仍在学习 SuiteScript,但我不确定哪里出了问题...有人可以帮忙吗?


更新代码,仅对部分订单有效...

function calculateWeight(type)

  var lines = nlapiGetLineItemCount('item');
  //nlapiLogExecution('DEBUG', 'Number of lines', lines);

  var totalWeight2 = 0 ;
  var totalWeight1 = 0 ;

  if (lines >0)
      for(var i = 1; i<= lines ; i++)
      var location = nlapiGetLineItemValue('item','location', i);
    //nlapiLogExecution('DEBUG', 'Locations', location);
      var quantitycommitted = parseInt(nlapiGetLineItemValue('item','quantitycommitted', i),10) || 0;
    //nlapiLogExecution('DEBUG', 'QtyCom', quantitycommitted);
      var weight = parseFloat(nlapiGetLineItemValue('item','custcol_individual_weight', i)) ||0;
     //nlapiLogExecution('DEBUG', 'Wgt', weight);

    //var com_wgt = nlapiGetLineItemValue('item','custcol1',i);

      if (location == '2')
          var total2 = weight * quantitycommitted;

          totalWeight2 += total2 ;
        nlapiLogExecution('DEBUG', 'Total2', totalWeight2);

      

      if (location == '1')
          var total1 = weight * quantitycommitted;

          totalWeight1 += total1 ;
        nlapiLogExecution('DEBUG', 'Total1', totalWeight1);
      

  

  nlapiSetFieldValue('custbody_ms_weight_ppt_page', totalWeight1);
  nlapiSetFieldValue('custbody_wi_weight_ppt_page', totalWeight2);

 


【问题讨论】:

我对 SuiteScript 1.0 有点生疏,但您可能需要加载上下文才能使用 nlapiGetContext() 访问记录。我建议记录一些变量以确保它们返回您期望的值 - 例如 var lines = nlapiGetLineItemCount('item'); 之后的 nlapiLogExecution('DEBUG', 'Number of lines', lines); - 如果返回 -1 这意味着它没有查看实际记录。跨度> 你好@Krypton! :D 我记录了所有变量,它们都有正确的值,我没有使用 nlapiGetContext()。我根据下面的答案对我的代码进行了更改并且它有效;但是,该脚本似乎仅适用于在脚本运行后创建/修改的销售订单,而不适用于所有已经存在的销售订单...您知道发生了什么...? beforeSubmit 用户事件仅在SuiteAnswer 10635 中列出的写入操作类型上触发。因此,需要触发其中一个事件才能运行脚本。如果您想将这些更改应用到所有现有的销售订单,您可能需要编写一个计划的或 map/reduce 脚本。您可以将其设置为 scheduled script triggers the user event 如果适用 - 这将节省重写逻辑。 我明白了...我会检查 schedule/map/reduce 脚本!非常感谢你的想法!!! 【参考方案1】:

你需要解析行值:

var quantitycommitted = parseInt(nlapiGetLineItemValue('item','quantitycommitted', i),10) || 0;
var weight = parseFloat(nlapiGetLineItemValue('item','custcol_individual_weight', i)) ||0;

在某些情况下,您的位置 ID 也不是字符串,因此这也可能是问题所在。依靠== 而不是=== 有效。

【讨论】:

感谢您的解决方案,我认为它有效!但是,该脚本似乎并未填充所有现有订单的字段。它仅在我创建新订单或编辑+保存现有订单时有效。这是因为我正在使用之前提交事件...?有没有办法让脚本也为所有现有订单填充字段? 您必须在批量更新脚本中使用代码或将您的销售订单导出到电子表格;进行计算并重新导入; IMO 大规模更新脚本更容易。 您也可以在值为空白的情况下进行导出,然后导入更改任何值(我历来为此在备注字段的末尾设置了一个句点)。如果您在导入期间打开“运行服务器套件脚本”,那么您的脚本将在这些命令上触发。这可能比在 Excel 中进行计算或编写仅运行一次的单独脚本更容易。利用您构建的内容! 很好的建议。我忘记了,我也用同样的想法对大规模更新脚本做了同样的事情。 bknights 和@TMann 谢谢你的建议,我会试试的!我在运行脚本几天后发现了另一个问题。即使所有变量都大于零,它仍然显示总权重(totalWeight1 和 totalWeight2)为 0。我们使用的是自动位置分配,是不是因为在分配位置之前脚本正在运行?

以上是关于SuiteScript 根据发货位置对重量求和的主要内容,如果未能解决你的问题,请参考以下文章

如何对特定列中具有相同值的行求和

Python TypeError:sort()不带位置参数

python 数组根据内容查找某个值的位置

Magento 2.3 发货

CDQ分治学习

背包问题变体 - 将重量和价值最大化到极限