在字段更新事件中更新时自定义字段不显示更新值,为什么?

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 的引用。如果您希望根据复选框的值禁用 SiteLocation,我建议您在 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 时,值被正确分配: