在SOLine网格中设置字段的默认值

时间:2017-02-01 18:55:30

标签: acumatica

我在Stock Item页面InventoryItem.UsrLeadTime上创建了一个自定义字段作为组合框,如下所示:

[PXDBString(10)]
[PXUIField(DisplayName="Lead Time")]
[PXStringList(new string[] { "4", "7", "10" },

  new string[] { "4", "7", "10" },

  MultiSelect = false, ExclusiveValues = false)]

我还在SO Order Entry SOLine网格上创建了​​一个自定义字段作为combox,SOLine.UsrLeadTimeSOLine,如下所示:

[PXDBString(10)]
[PXUIField(DisplayName="Lead Time")]
[PXStringList(new string[] { "4", "7", "10" },

  new string[] { "4", "7", "10" },

  MultiSelect = false, ExclusiveValues = false)]

我尝试将SOLI网格上的UsrLeadTimeSoline的默认值设置为UsrLeadTime根据在销售订单上输入新行时选择的库存ID从库存项目指定的值。我在SOOrderEntry图扩展上的代码如下:

    protected virtual void SOLine_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
   {
       SOLine row = (SOLine)e.Row;

        using (new PXConnectionScope())
            {
            InventoryItem invleadTime = PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>
            .Select(Base, row.InventoryID);


            if (invleadTime != null)
                  {
                    PX.Objects.IN.InventoryItemExt ext = PXCache<InventoryItem>.GetExtension<InventoryItemExt>(invleadTime);
                    sender.SetValue<SOLineExt.usrLeadTimeSOLine>             (row,ext.UsrLeadTime);
                   Base.Transactions.Update(row);
                    //SOLineExt rowExt = sender.GetExtension<SOLineExt>(row);
                    //rowExt.UsrLeadTimeSOLine = ext.UsrLeadTime;
                    //Base.Transactions.Update(row);
                   }
            else
             {
                 throw new PXException("invleadTime is null");
               }

              }

      }

我抛出了else throw异常作为后来考虑确保我的查询返回结果。如果没有else,代码将正确编译并且Sales Order页面正确运行,但是当您添加新行并选择inventoryID时,SOLINE网格中的提前期值SOLine.UsrLeadTimeSOLine仍为空白,即使InventoryID具有Lead的值时间,InventoryItem.UsrLeadTime,在Stock Items页面上。

添加了else throw异常后,当您添加新的Sales Order Line时,会立即显示异常并声明invleadTime为null,如预期的那样。选择InventoryID会导致SOLINE网格的提前期值SOLine.UsrLeadTimeSOLine设置为等于Stock Items页面InventoryItem.UsrLeadTime的提前期值。换句话说,它按预期工作。

此外,在“保存”期间,它会创建一个新的空白行,并引发有关必填字段为空的错误。删除空白行并保存正常。 我对包含throw异常的页面的行为不太感兴趣,除了代码似乎工作的事实,因为当我包含throw异常时设置我的值。

任何人都可以建议修改我的代码而不使用else会导致它正确地将SOLine.UsrLeadTimeSOLine的值设置为等于InventoryItem.UsrLeadTime。 感谢

3 个答案:

答案 0 :(得分:2)

如果您没有提前期的默认值和/或不希望该字段是必需的,我会使用inventoryID的“FieldUpdated”事件来执行此操作。

下面的内容也会起作用:

    protected void SOLine_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {

      var row = (SOLine)e.Row;
      if (row != null && row.InventoryID !=null)
      {
           InventoryItem item = PXSelect<InventoryItem,Where<InventoryItem.inventoryID,Equal<Required<InventoryItem.inventoryID>>>>.Select(Base,row.InventoryID);
           InventoryItemExt itemext = item.GetExtension<InventoryItemExt>();
           if (itemext != null && itemext.UsrLeadTime != null)
           {
                cache.SetValueExt<SOLineExt.usrLeadTimeSOLine>(e.Row, itemext.UsrLeadTime);
           }
      }
    }

如果更改库存ID

,这也将允许重置提前期值(原样)

答案 1 :(得分:1)

我建议使用FieldDefaulting事件来设置默认值。 试图在其他事件中这样做会导致意想不到的副作用。

protected virtual void SOLine_UsrLeadTimeSOLine_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
{
    e.NewValue = yourDefaultValue;
    e.Cancel = true;
}

答案 2 :(得分:1)

您只需要将这些属性添加到您的soline usr字段......

[PXDefault(typeof(Search<InventoryExt.UsrLeadTime , 
            Where<InventoryItem.inventoryID, Equal<Current<SOLine.inventoryID>>>>), 
            PersistingCheck = PXPersistingCheck.Nothing)]
[PXFormula(typeof(Default<SOLine.inventoryID>))]

通过使用默认...添加PXFormula更改销售线库存ID,它将重新启动您的默认值。这样可以更轻松地从DAC控制默认值,而无需在图表中添加任何额外的行。