在字段更新事件中更新时自定义字段不显示更新值,为什么?
Custom fields are not showing updated value when update in field updated event, Why?
我使用自定义表单在自定义表单中添加了自定义字段,我添加的步骤:
1) 转到装运表格和 select 交易网格。
2) Select 添加字段。
3) Select custome and Add 4 fields and save and publish.
4) 添加所有 4 个字段并使用 select 并保存。
5) 并再次发布,所有 4 列都可见。
6) 我添加了一个用户字段名称 Aloow (PXDBBool)、UsrPClocation(Location) 和 UsrPCwarehouse(Site),
我在仓库和位置中设置了以下属性。
7) 但是在 SOSHipLine_InventotyID_FieldUpdate 事件中,我设置了允许、位置、仓库所有 3 个值,但是这些值没有显示在网格中,这是什么原因?
#region UsrQCSiteID
[PXUIField(DisplayName = "PC Warehouse")]
[SiteAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID))]
[PXUIRequired(typeof(Where<usrAllow, Equal<True>>))]
[PXUIEnabled(typeof(Where<usrAllow, Equal<True>>))]
[PXDefault()]
public virtual int? UsrPCSiteID {
get; set;
}
public abstract class usrPCSiteID:PX.Data.BQL.BqlInt.Field<usrPCSiteID> {
}
#endregion UsrPCSiteID
#region UsrPCLocationID
[PXUIField(DisplayName = "PC Location")]
[SOLocationAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID), typeof(SOShipLineExt.usrPCSiteID), typeof(SOLine.tranType), typeof(SOShipLine.invtMult))]
[PXUIRequired(typeof(Where<usrQCRequired, Equal<True>>))]
[PXUIEnabled(typeof(Where<usrQCRequired, Equal<True>>))]
[PXDefault()]
public virtual int? UsrPCLocationID {
get; set;
}
public abstract class usrPCLocationID:PX.Data.BQL.BqlInt.Field<usrPCLocationID> {
}
#endregion UsrPCLocationID
#region 允许
[PXDBBool]
[PXUIField(DisplayName = "Allow")]
public virtual bool? UsrAllow {
get; set;
}
public abstract class usrAllow:PX.Data.BQL.BqlBool.Field<usrAllow> {
}
#endregion
SOShipLine 是否允许更新自定义值?
您描述的步骤看起来是正确的。
我在本地重新创建了这个场景:
1 - 我的 DAC 扩展如下所示:
public class SOShipLineExt : PXCacheExtension<PX.Objects.SO.SOShipLine>
{
#region UsrPCSiteID
[PXUIField(DisplayName = "PC Warehouse")]
[SiteAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID))]
public virtual int? UsrPCSiteID {
get; set;
}
public abstract class usrPCSiteID:PX.Data.BQL.BqlInt.Field<usrPCSiteID> {
}
#endregion UsrPCSiteID
#region UsrPCLocationID
[PXUIField(DisplayName = "PC Location")]
[SOLocationAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID), typeof(SOShipLineExt.usrPCSiteID), typeof(SOShipLine.tranType), typeof(SOShipLine.invtMult))]
public virtual int? UsrPCLocationID {
get; set;
}
public abstract class usrPCLocationID:PX.Data.BQL.BqlInt.Field<usrPCLocationID> {
}
#endregion UsrPCLocationID
#region Allow
[PXDBBool]
[PXUIField(DisplayName = "Allow")]
public virtual bool? UsrAllow {
get; set;
}
public abstract class usrAllow:PX.Data.BQL.BqlBool.Field<usrAllow> {
}
#endregion
}
关于 DAC 扩展的注意事项:
- 我删除了对 PXUIEnabled 和 PXUIRequired 的引用。如果您希望根据复选框的值禁用 Site 和 Location,我建议您在 RowSelected 事件中管理此逻辑。 (用你的方法可能可行,但我以前没有用过)
- PXDefault 引用也被删除,因为在大多数情况下发货是直接从销售订单页面创建的。正如您现在拥有的那样,该字段是必填字段,但没有分配默认值,这将导致错误。您有 2 个选项:1) 指示 PXDefault() 属性中的值,或 2) 设置 属性 PXPersistingCheck.Nothing.
- 请注意,您的 SOLocationAvail 属性在第 4 个参数中有错误。您应该使用 typeof(SOShipLine.tranType) 而不是 typeof(SOLine.tranType)。当从 SO 创建货件时,这会产生错误。
2 - 我的 FieldUpdated 事件如下所示:
public class SOShipmentEntry_Extension : PXGraphExtension<SOShipmentEntry>
{
protected virtual void SOShipLine_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
if (e.Row == null) return;
SOShipLine line = (SOShipLine)e.Row;
SOShipLineExt lineExt = cache.GetExtension<SOShipLineExt>(line);
if (lineExt != null)
{
lineExt.UsrAllow = true;
lineExt.UsrPCSiteID=154;
lineExt.UsrPCLocationID=155;
}
}
}
关于图形扩展的说明:
- 我对仓库和位置值进行了硬编码。我建议你在测试的时候在你这边做同样的事情,只要确保 ID 存在于你的数据库中,或者你查询 CD 值然后使用它对应的 ID 值。
结果:
当从 SO 创建 Shipment 时,值被正确分配:
我使用自定义表单在自定义表单中添加了自定义字段,我添加的步骤: 1) 转到装运表格和 select 交易网格。 2) Select 添加字段。 3) Select custome and Add 4 fields and save and publish. 4) 添加所有 4 个字段并使用 select 并保存。 5) 并再次发布,所有 4 列都可见。 6) 我添加了一个用户字段名称 Aloow (PXDBBool)、UsrPClocation(Location) 和 UsrPCwarehouse(Site), 我在仓库和位置中设置了以下属性。 7) 但是在 SOSHipLine_InventotyID_FieldUpdate 事件中,我设置了允许、位置、仓库所有 3 个值,但是这些值没有显示在网格中,这是什么原因?
#region UsrQCSiteID
[PXUIField(DisplayName = "PC Warehouse")]
[SiteAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID))]
[PXUIRequired(typeof(Where<usrAllow, Equal<True>>))]
[PXUIEnabled(typeof(Where<usrAllow, Equal<True>>))]
[PXDefault()]
public virtual int? UsrPCSiteID {
get; set;
}
public abstract class usrPCSiteID:PX.Data.BQL.BqlInt.Field<usrPCSiteID> {
}
#endregion UsrPCSiteID
#region UsrPCLocationID
[PXUIField(DisplayName = "PC Location")]
[SOLocationAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID), typeof(SOShipLineExt.usrPCSiteID), typeof(SOLine.tranType), typeof(SOShipLine.invtMult))]
[PXUIRequired(typeof(Where<usrQCRequired, Equal<True>>))]
[PXUIEnabled(typeof(Where<usrQCRequired, Equal<True>>))]
[PXDefault()]
public virtual int? UsrPCLocationID {
get; set;
}
public abstract class usrPCLocationID:PX.Data.BQL.BqlInt.Field<usrPCLocationID> {
}
#endregion UsrPCLocationID
#region 允许
[PXDBBool]
[PXUIField(DisplayName = "Allow")]
public virtual bool? UsrAllow {
get; set;
}
public abstract class usrAllow:PX.Data.BQL.BqlBool.Field<usrAllow> {
}
#endregion
SOShipLine 是否允许更新自定义值?
您描述的步骤看起来是正确的。
我在本地重新创建了这个场景:
1 - 我的 DAC 扩展如下所示:
public class SOShipLineExt : PXCacheExtension<PX.Objects.SO.SOShipLine>
{
#region UsrPCSiteID
[PXUIField(DisplayName = "PC Warehouse")]
[SiteAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID))]
public virtual int? UsrPCSiteID {
get; set;
}
public abstract class usrPCSiteID:PX.Data.BQL.BqlInt.Field<usrPCSiteID> {
}
#endregion UsrPCSiteID
#region UsrPCLocationID
[PXUIField(DisplayName = "PC Location")]
[SOLocationAvail(typeof(SOShipLine.inventoryID), typeof(SOShipLine.subItemID), typeof(SOShipLineExt.usrPCSiteID), typeof(SOShipLine.tranType), typeof(SOShipLine.invtMult))]
public virtual int? UsrPCLocationID {
get; set;
}
public abstract class usrPCLocationID:PX.Data.BQL.BqlInt.Field<usrPCLocationID> {
}
#endregion UsrPCLocationID
#region Allow
[PXDBBool]
[PXUIField(DisplayName = "Allow")]
public virtual bool? UsrAllow {
get; set;
}
public abstract class usrAllow:PX.Data.BQL.BqlBool.Field<usrAllow> {
}
#endregion
}
关于 DAC 扩展的注意事项:
- 我删除了对 PXUIEnabled 和 PXUIRequired 的引用。如果您希望根据复选框的值禁用 Site 和 Location,我建议您在 RowSelected 事件中管理此逻辑。 (用你的方法可能可行,但我以前没有用过)
- PXDefault 引用也被删除,因为在大多数情况下发货是直接从销售订单页面创建的。正如您现在拥有的那样,该字段是必填字段,但没有分配默认值,这将导致错误。您有 2 个选项:1) 指示 PXDefault() 属性中的值,或 2) 设置 属性 PXPersistingCheck.Nothing.
- 请注意,您的 SOLocationAvail 属性在第 4 个参数中有错误。您应该使用 typeof(SOShipLine.tranType) 而不是 typeof(SOLine.tranType)。当从 SO 创建货件时,这会产生错误。
2 - 我的 FieldUpdated 事件如下所示:
public class SOShipmentEntry_Extension : PXGraphExtension<SOShipmentEntry>
{
protected virtual void SOShipLine_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
if (e.Row == null) return;
SOShipLine line = (SOShipLine)e.Row;
SOShipLineExt lineExt = cache.GetExtension<SOShipLineExt>(line);
if (lineExt != null)
{
lineExt.UsrAllow = true;
lineExt.UsrPCSiteID=154;
lineExt.UsrPCLocationID=155;
}
}
}
关于图形扩展的说明:
- 我对仓库和位置值进行了硬编码。我建议你在测试的时候在你这边做同样的事情,只要确保 ID 存在于你的数据库中,或者你查询 CD 值然后使用它对应的 ID 值。
结果:
当从 SO 创建 Shipment 时,值被正确分配: