我在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。 感谢
答案 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控制默认值,而无需在图表中添加任何额外的行。