You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在账单释放后启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:03:16