在项目报价屏幕上启用自定义字段

Enable Custom Field on Project Quote Screen

我正在使用 Acumatica 2020 R1。我在 PMQuote DAC 上有一个自定义文本字段。该字段位于项目报价屏幕上的自定义选项卡中。我希望该字段始终可编辑。我将以下内容放入我的 RowSelected 事件中:

    protected virtual void PMQuote_RowSelected(PXCache cache, PXRowSelectedEventArgs e, PXRowSelected del)
    {
        del?.Invoke(cache, e);
        PMQuote quote = e.Row as PMQuote;

        cache.AllowUpdate = true;
        PXUIFieldAttribute.SetEnabled(cache, e.Row, true);
        PXUIFieldAttribute.SetEnabled<PMQuoteExt.usrMyCustomField>(cache, e.Row, true);
    }

这没有用,所以我也查看了自动化步骤。我没有看到任何可修改的自动化步骤。

然后我查看了Workflow。我也没有看到任何要编辑的工作流程。我尝试根据状态字段创建一个新的。我为每个状态添加了用户字段,并确保未选中禁用。这也没有用。

关于如何在不考虑文档状态的情况下启用该字段的任何想法?

感谢您的帮助!

A​​llowUpdate 仅在缓存对象上调用,为数据视图添加它,示例:

Base.Quote.AllowUpdate = true

此外,尝试扩展 PXQuoteMaintExt 图形扩展:

public class PMQuoteMaintExtExtension : PXGraphExtension<PMQuoteMaintExt, PMQuoteMaint>
{
    protected virtual void PMQuote_RowSelected(PXCache sender, PXRowSelectedEventArgs e, PXRowSelected sel)
    {
        sel?.Invoke(sender, e);
    }
}

它通过 RowSelected 事件管理可见性:

namespace PX.Objects.PM
{
    public class PMQuoteMaintExt : PXGraphExtension<PMDiscount, PMQuoteMaint>
    {
        protected virtual void PMQuote_RowSelected(PXCache sender, PXRowSelectedEventArgs e, PXRowSelected sel)
        {
            sel?.Invoke(sender, e);

            var row = e.Row as PMQuote;
            if (row == null) return;

            VisibilityHandler(sender, row);
        }

        private void VisibilityHandler(PXCache sender, PMQuote row)
        {
            CR.Standalone.CROpportunityRevision revisionInDb = PXSelectReadonly<CR.Standalone.CROpportunityRevision,
                Where<CR.Standalone.CROpportunityRevision.noteID, Equal<Required<CR.Standalone.CROpportunityRevision.noteID>>>>.Select(Base, row.QuoteID).FirstOrDefault();
            CR.Standalone.CROpportunity opportunityInDb = (revisionInDb == null) ? null : PXSelectReadonly<CR.Standalone.CROpportunity,
                Where<CR.Standalone.CROpportunity.opportunityID, Equal<Required<CR.Standalone.CROpportunity.opportunityID>>>>.Select(Base, revisionInDb.OpportunityID).FirstOrDefault();

            CR.Standalone.CROpportunity opportunity = PXSelect<CR.Standalone.CROpportunity,
                Where<CR.Standalone.CROpportunity.opportunityID, Equal<Required<CR.Standalone.CROpportunity.opportunityID>>>>.Select(Base, row.OpportunityID).FirstOrDefault();

            var opportunityIsClosed = opportunity?.IsActive == false;

            bool allowUpdate = row.IsDisabled != true && !opportunityIsClosed && row.Status != PMQuoteStatusAttribute.Closed;

            if (opportunityInDb?.OpportunityID == opportunity?.OpportunityID)
                Base.Caches[typeof(PMQuote)].AllowUpdate = allowUpdate;
            else
            {
                var quoteCache = Base.Caches[typeof(PMQuote)];
                foreach (var field in quoteCache.Fields)
                {
                    if (!quoteCache.Keys.Contains(field) && 
                        field != quoteCache.GetField(typeof(PMQuote.opportunityID)) &&
                        field != quoteCache.GetField(typeof(PMQuote.isPrimary)))
                        PXUIFieldAttribute.SetEnabled(sender, row, field, allowUpdate);
                }
            }

            PXUIFieldAttribute.SetEnabled<PMQuote.bAccountID>(sender, row, row.OpportunityID == null);

            Base.Caches[typeof(PMQuote)].AllowDelete = !opportunityIsClosed;
            foreach (var type in new[]
            {
                    typeof(CR.CROpportunityDiscountDetail),
                    typeof(CR.CROpportunityProducts),
                    typeof(CR.CRTaxTran),
                    typeof(CR.CRAddress),
                    typeof(CR.CRContact),
                    typeof(CR.CRPMTimeActivity),
                    typeof(PM.PMQuoteTask)
                })
            {
                Base.Caches[type].AllowInsert = Base.Caches[type].AllowUpdate = Base.Caches[type].AllowDelete = allowUpdate;
            }

            Base.Caches[typeof(CopyQuoteFilter)].AllowUpdate = true;

            Base.Caches[typeof(RecalcDiscountsParamFilter)].AllowUpdate = true;

            Base.Actions[nameof(Base.Approval.Submit)]
                .SetVisible(row.Status == PMQuoteStatusAttribute.Draft);

            Base.actionsFolder
                .SetVisible(nameof(Base.Approval.Approve), Base.Actions[nameof(Base.Approval.Approve)].GetVisible());

            Base.actionsFolder
                .SetVisible(nameof(Base.Approval.Reject), Base.Actions[nameof(Base.Approval.Reject)].GetVisible());

            Base.Actions[nameof(EditQuote)]
                .SetVisible(row.Status != PMQuoteStatusAttribute.Draft);

            Base.Actions[nameof(Base.Approval.Submit)]
                .SetEnabled(row.Status == PMQuoteStatusAttribute.Draft && !opportunityIsClosed);

            Base.Actions[nameof(Base.Approval.Approve)]
                .SetEnabled(row.Status == PMQuoteStatusAttribute.PendingApproval);

            Base.Actions[nameof(Base.Approval.Reject)]
                .SetEnabled(row.Status == PMQuoteStatusAttribute.PendingApproval);

            Base.Actions[nameof(EditQuote)]
                .SetEnabled(row.Status != PMQuoteStatusAttribute.Draft && row.Status != PMQuoteStatusAttribute.Closed);

            Base.Actions[nameof(Base.CopyQuote)]
                .SetEnabled(Base.Caches[typeof(PMQuote)].AllowInsert);

            Base.Actions[nameof(PMDiscount.GraphRecalculateDiscountsAction)]
                .SetEnabled((row.Status == PMQuoteStatusAttribute.Draft));

            Base.Actions[nameof(Base.PrimaryQuote)].SetEnabled(!String.IsNullOrEmpty(row.OpportunityID) && row.IsPrimary == false && row.Status != PMQuoteStatusAttribute.Closed);
            Base.Actions[nameof(Base.SendQuote)].SetEnabled(row.Status.IsIn<string>(PMQuoteStatusAttribute.Approved, PMQuoteStatusAttribute.Sent, PMQuoteStatusAttribute.Closed));
            Base.Actions[nameof(Base.PrintQuote)].SetEnabled(true);
            Base.convertToProject.SetEnabled( (row.OpportunityID == null || row.IsPrimary == true) && row.QuoteProjectID == null && row.Status.IsIn<string>(PMQuoteStatusAttribute.Approved, PMQuoteStatusAttribute.Sent));

            PXUIFieldAttribute.SetEnabled<PMQuote.subject>(sender, row, true);
            PXUIFieldAttribute.SetEnabled<PMQuote.status>(sender, row, false);
        }
    }
}