如何在账单释放后启用APTran自定义字段
问题描述
我在APTran上添加了两个自定义字段,账单释放后这两个字段会变为只读状态。需求是让这两个字段不受账单状态限制,任何时间都可编辑。参考其他界面的类似示例,我针对AP301000界面编写了代码,但账单释放后字段仍保持只读。
APTran DAC扩展代码
namespace CustomFields { public class APTranExt : PXCacheExtension<PX.Objects.AP.APTran> { #region UsrCustomField1 [PXDBString(50)] [PXUIField(DisplayName="Custom Field 1", Enabled = true)] public string UsrCustomField1 { get; set; } public abstract class usrCustomField1 : IBqlField { } #endregion #region UsrCustomField2 [PXDBString(20)] [PXUIField(DisplayName="Custom Field 2", Enabled = true)] public string UsrCustomField2 { get; set; } public abstract class usrCustomField2 : IBqlField { } #endregion } }
APInvoiceEntry图扩展代码
namespace CustomFields { public class APInvoiceEntry_Extension : PXGraphExtension<PX.Objects.AP.APInvoiceEntry> { #region Event Handlers public void APTran_RowSelected(PXCache sender, PXRowSelectedEventArgs e) { APTran row = e.Row as APTran; if (row != null) { APInvoice doc = Base.Document.Current; if (doc != null && doc.Released == true) { PXUIFieldAttribute.SetEnabled<APTranExt.usrCustomField1>(sender, row, true); PXUIFieldAttribute.SetEnabled<APTranExt.usrCustomField2>(sender, row, true); } } } #endregion } }
已尝试的修改
我还尝试同时设置SetReadOnly为False,但问题依旧:
PXUIFieldAttribute.SetEnabled<APTranExt.usrCustomField1>(sender, row, true); PXUIFieldAttribute.SetReadOnly<APTranExt.usrCustomField1>(sender, row, false); PXUIFieldAttribute.SetEnabled<APTranExt.usrCustomField2>(sender, row, true); PXUIFieldAttribute.SetReadOnly<APTranExt.usrCustomField2>(sender, row, false);
解决方案
问题核心是AP账单释放后,APTran缓存会被全局标记为只读,单独设置字段的Enabled或ReadOnly属性会被全局状态覆盖。需要从缓存权限和字段权限两方面修改:
修改后的APInvoiceEntry图扩展代码
namespace CustomFields { public class APInvoiceEntry_Extension : PXGraphExtension<PX.Objects.AP.APInvoiceEntry> { public override void Initialize() { base.Initialize(); // 强制开启APTran缓存的更新权限,不受父文档状态限制 Base.Transactions.Cache.AllowUpdate = true; } protected void APTran_RowSelected(PXCache sender, PXRowSelectedEventArgs e) { APTran row = e.Row as APTran; if (row == null) return; // 无条件开启两个自定义字段的编辑权限 PXUIFieldAttribute.SetEnabled<APTranExt.usrCustomField1>(sender, row, true); PXUIFieldAttribute.SetEnabled<APTranExt.usrCustomField2>(sender, row, true); // 确保字段处于非只读状态 PXUIFieldAttribute.SetReadOnly<APTranExt.usrCustomField1>(sender, row, false); PXUIFieldAttribute.SetReadOnly<APTranExt.usrCustomField2>(sender, row, false); } // 可选:确保自定义字段的变更能被持久化到数据库 protected void APTran_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e) { APTran newRow = e.Row as APTran; if (newRow == null) return; APInvoice doc = Base.Document.Current; if (doc?.Released == true) { // 标记字段为已修改,触发保存逻辑 sender.SetValueExt<APTranExt.usrCustomField1>(newRow, sender.GetValue<APTranExt.usrCustomField1>(newRow)); sender.SetValueExt<APTranExt.usrCustomField2>(newRow, sender.GetValue<APTranExt.usrCustomField2>(newRow)); } } } }
关键说明
Cache.AllowUpdate = true:这是解决问题的核心步骤。默认情况下,已释放的AP账单会将子记录(APTran)的缓存设为只读,单独设置字段权限无法突破这个全局限制,必须先开启缓存的更新权限。- 无条件设置字段权限:移除原代码中仅针对已释放文档的判断,确保字段在任何状态下都保持可编辑。
SetValueExt:在RowUpdated事件中强制标记字段变更,避免因文档已释放导致变更无法被保存的问题。
内容的提问来源于stack exchange,提问作者Graeme LM
相关产品推荐
相关产品推荐

