【问题标题】:Enable Custom Field on Project Quote Screen在项目报价屏幕上启用自定义字段
【发布时间】:2021-07-16 13:33:40
【问题描述】:

我正在使用 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);
    }

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    AllowUpdate 仅在缓存对象上调用,为数据视图添加它,例如:

    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);
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答!我错过了一个禁用字段的扩展。我也能够使用 cache.AllowUpdate = true 从 PXCache 传递到 RowSelected 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2017-05-27
    • 2018-06-09
    • 2019-01-31
    • 2016-12-02
    • 2018-03-11
    相关资源
    最近更新 更多