导入/复制机会转移一行

时间:2018-06-04 20:11:08

标签: acumatica

在自定义产品网格中,自定义字段在自定义网站的一行向下移动。

背景

我们有一个自定义,它在标题中提供单位边距和%。 PXFormula用于DAC,用于任何依赖于计算。

Opportunity Products有4个附加字段:

  1. 上次成本= InventoryItem的最后成本
  2. 总费用=数量*最后费用
  3. Margin = ExtAmt - ExtCost
  4. 手动费用,允许手动覆盖上次费用的复选框
  5. 机会增加了2个字段:

    1. 保证金总额=保证金总额
    2. 保证金%=保证金总额/销售总额
    3. 问题

      自定义机会存在问题,当从现有商机复制记录或导入Excel文件时,行会移动一行。

      现有记录Existing Record

      复制/粘贴或从Excel After Copy/Paste or Import from Excel

      导入后

      代码

      我目前的代码:

      public PXSelect<INItemCost, 
          Where<INItemCost.inventoryID, 
          Equal<Current<CROpportunityProducts.inventoryID>>>> Cost;
      
      protected void CROpportunityProducts_RowInserting(PXCache cache, 
          PXRowInsertingEventArgs e, PXRowInserting InvokeBaseHandler)
      {
        if(InvokeBaseHandler != null)
          InvokeBaseHandler(cache, e);
        var row = (CROpportunityProducts)e.Row;
        if (row == null) return;
      
        var rowExt = cache.GetExtension<CROpportunityProductsExt>(row);
        if (rowExt == null) return;
      
        var cost = Cost.SelectSingle();
      
        if (cache.GetValue(row, "usrManCost") == null) return;
        if (cost != null && (bool)cache.GetValue(row, "usrManCost") == false)
        {
          cache.SetValueExt<CROpportunityProductsExt.usrLastCost>(row, cost.LastCost);  
        }       
      }
      

      可能导致这种情况的原因是什么?我想,自从PXSelect&lt;&gt;以来,RowInserting事件为第一行返回0语句返回0,因为在下一行之前,InventoryItem不在缓存中。

      我提出的一个可能的解决方案是使用RowInserted。这解决了使用复制/粘贴时的问题。但是,它会导致从Excel导入错误计算总保证金。

2 个答案:

答案 0 :(得分:1)

您视图中的Current<>可能不是您当前所需要的吗?

如果您只是将以下var cost = Cost.SelectSingle()行替换为使用Required<>作为广告资源ID中的传递,会发生什么?

INItemCost cost = PXSelect<INItemCost,
    Where<INItemCost.inventoryID, Equal<Required<CROpportunityProducts.inventoryID>>>>
        .Select(Base, row.inventoryID);

答案 1 :(得分:0)

答案是因为这种情况下的事件必须在RowSelecting事件处理程序中与PXConnectionScope()一起完成。

Brendan在正确的轨道上将PXSelect移动到处理程序中。我在问题中的代码如下。另外,请注意使用Required&lt;&gt;与当前&lt;&gt;。

    public void CROpportunityProducts_RowSelecting(PXCache cache,
        PXRowSelectingEventArgs e)
    {
        var row = (CROpportunityProducts)e.Row;
        if (row == null) return;

        using (new PXConnectionScope())
        {
            INItemCost cost = PXSelect<INItemCost, 
                Where<INItemCost.inventoryID, 
                Equal<Required<INItemCost.inventoryID>>>>.Select(Base, row.InventoryID);
            if (cost != null && (bool)cache.GetValue(row, "usrManCost") == false)
            {
                //decimal dbLastCost = (decimal)cost.LastCost;
                var lstCost = cache.GetValue(row, "usrLastCost");

                if ((decimal)cost.LastCost == (decimal)0.00)
                {
                    cache.SetValueExt<CROpportunityProductsExt.usrLastCost>(row, 
                        cost.LastCost);
                }
            }
        }
    }