【问题标题】:Populate custom field while creating sale order from opportunity从商机创建销售订单时填充自定义字段
【发布时间】:2017-05-31 00:57:11
【问题描述】:

我在 SO 屏幕 (SO301000) 上创建了一个自定义字段联系人。现在,当用户从商机屏幕 (CR304000) 创建销售订单时,我需要填充这些字段。新的自定义字段联系人基于在商机中选择的客户。我可以看到,当我按照设计从商机创建销售订单时,会自动填充客户。但是,我怎样才能为自定义字段做同样的事情。

我尝试扩展现有的 CreateSalesOrder 方法,但似乎没有帮助。

联系人查找(它会根据 SO 中的客户选择刷新,但当我从 Opportunity 创建 SO 时不会刷新)

[PXDBInt()]

[PXUIField(DisplayName = "Contact", Visibility = PXUIVisibility.Visible)]
[PXSelector(typeof(Search2<Contact.contactID,
	LeftJoin<BAccount2, On<BAccount2.bAccountID, Equal<Contact.bAccountID>>>>),
	DescriptionField = typeof(Contact.displayName), Filterable = true, DirtyRead = true)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXFormula(typeof(Default<SOOrder.customerID>))]
[PXRestrictor(typeof(Where<Contact.contactType, NotEqual<ContactTypesAttribute.bAccountProperty>,
		And<Where<BAccount2.bAccountID, Equal<Current<SOOrder.customerID>>,
				Or<Current<SOOrder.customerID>, IsNull>>>>), PX.Objects.CR.Messages.ContactBAccountDiff)]
[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), PX.Objects.CR.Messages.ContactInactive,
			  typeof(Contact.displayName))]

public virtual int? UsrCustContactID { get; set; }
public abstract class usrCustContactID : IBqlField { }

联系人查找(当我从商机创建 SO 时它按要求工作,但不会根据客户选择刷新)

[PXDBInt()]

[PXDBChildIdentity(typeof(Contact.contactID))]
[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), "Contact '{0}' is inactive or closed.", new[] { typeof(Contact.displayName) })]
[PXSelector(typeof(Search2<Contact.contactID, LeftJoin<BAccount, On<BAccount.bAccountID, Equal<Contact.bAccountID>>>, Where<Contact.contactType, Equal<ContactTypesAttribute.person>, Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>>), DescriptionField = typeof(Contact.displayName), Filterable = true)]
[PXUIField(DisplayName = "Contact")]


public virtual int? UsrCustContactID { get; set; }
public abstract class usrCustContactID : IBqlField { }

【问题讨论】:

  • 您应该能够执行与此处类似的操作:stackoverflow.com/questions/42352177/…
  • 我应该将该代码写入 OpportunityMaintExtension 的哪个事件处理程序。我尝试使用 CROpportunity_RowPersisting 和 DoCreateSalesOrder 方法。但是当我点击 Actions > Create Sales Order 时,这些都没有触发代码
  • 根据回复的长度,我将添加为答案

标签: acumatica


【解决方案1】:

在这里找到类似的答案:How to pass line item custom field value to sales order from opportunity?

可以从 CROpportunity 翻译成这样的东西到 SOOrder...

public class CROpportunityMaintExtension : PXGraphExtension<OpportunityMaint>
{
    [PXOverride]
    public virtual void DoCreateSalesOrder(Action del)
    {
        PXGraph.InstanceCreated.AddHandler<SOOrderEntry>(graph =>
        {
            graph.RowInserting.AddHandler<SOOrder>((cache, args) =>
            {
                var soOrder = (SOOrder)args.Row;
                CROpportunity opportunity = PXResult<CROpportunity>.Current;

                // Copy logic here...

            });
        });

        del();
    }
}

【讨论】:

  • DoCreateSalesOrder 我们无法覆盖。我将代码保留在 CROpportunity_RowSelected 事件处理程序中,但似乎它不起作用。还有其他想法吗?
  • 为什么不能覆盖?答案显示您已覆盖,我在自定义项目中使用相同的逻辑将数据从机会添加到今天的销售订单。您在使用包含的答案时遇到什么问题?
  • 我可以按照你的建议覆盖它并且它正在工作。但是,正如我所提到的,联系人字段是 SO 中的自定义字段,它是根据以下链接 link 中的解决方案根据客户选择刷新的查找。我在原始帖子中包含了查找代码。让我知道你的建议。
  • 这听起来像是一个不同的问题,但如果我理解正确,您不希望在从商机创建订单时根据客户更改值?
  • 我希望在我从商机创建 SO 时正确填充联系人,但同时如果我的联系人查找应仅显示基于客户的相关联系人。因此,如果用户直接创建 SO 并选择客户时,联系人查找应相应刷新并仅显示与所选客户相关的联系人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多