我已在SOOrder摘要中创建自定义联系人字段,以便用户可以根据所选客户选择客户联系人。
以下是SOOrder扩展程序中的自定义联系人字段定义 -
[PXDBInt]
[PXUIField(DisplayName = "Contact", Visibility = PXUIVisibility.Visible)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXSelector(typeof(Search2<Contact.contactID,
LeftJoin<BAccount2, On<BAccount2.bAccountID, Equal<Contact.bAccountID>>>,
Where<Contact.contactType, Equal<ContactTypesAttribute.person>,
Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>>),
DescriptionField = typeof(Contact.displayName), Filterable = true)]
[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(Where2<Where2<
Where<Contact.contactType, Equal<ContactTypesAttribute.person>,
Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>,
And<
Where<BAccount2.type, IsNull,
Or<BAccount2.type, Equal<BAccountType.customerType>,
Or<BAccount2.type, Equal<BAccountType.prospectType>,
Or<BAccount2.type, Equal<BAccountType.combinedType>>>>>>>,
And<WhereEqualNotNull<BAccount2.bAccountID, SOOrder.customerID>>>), "Contact '{0}' ({1}) has sales order for another business account.", typeof(Contact.displayName), typeof(Contact.contactID))]
[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), PX.Objects.CR.Messages.ContactInactive, typeof(Contact.displayName))]
[PXDBChildIdentity(typeof(Contact.contactID))]
public virtual int? UsrCustContactID { get; set; }
public abstract class usrCustContactID : IBqlField { }
&#13;
现在,每当用户选择任何联系人时,我都会使用SOOrder屏幕的“货件设置”选项卡上的自定义联系人字段覆盖所选联系人的电子邮件。我已经为它写了下面的代码,但似乎它没有用。
protected virtual void SOOrder_UsrCustContactID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
SOOrderEntry graph = PXGraph.CreateInstance<SOOrderEntry>();
SOOrderExtension ext = PXCache<SOOrder>.GetExtension<SOOrderExtension>(Base.Document.Current);
Contact custContact = PXSelect<Contact,
Where<Contact.contactID, Equal<Required<Contact.contactID>>>>.Select(graph, ext.UsrCustContactID);
if (custContact != null && !string.IsNullOrEmpty(custContact.EMail))
{
graph.Document.Current = Base.Document.Current;
Base.Shipping_Contact.Current.OverrideContact = true;
Base.Shipping_Contact.Current.Email = custContact.EMail;
graph.Shipping_Contact.Current = Base.Shipping_Contact.Current;
graph.Shipping_Contact.Current.OverrideContact = true;
graph.Shipping_Contact.Current.Email = custContact.EMail;
Base.Shipping_Contact.Update(graph.Shipping_Contact.Current);
graph.Actions.PressSave();
}
}
&#13;
这有两个问题。
它会显示我选择联系人时填充的电子邮件,但是当我保存时,它会覆盖客户的默认邮件。
如果我要创建新的销售订单并选择联系人。保存时如果我错过任何必填字段或任何其他错误,例如Avalara错误,那么它会再次覆盖客户的默认字段。
请建议。
答案 0 :(得分:3)
要将客户联系电子邮件复制到送货地址电子邮件字段,您的 SOOrder_UsrCustContactID_FieldUpdated 处理程序应按以下方式实施:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
protected void SOOrder_UsrCustContactID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
var contact = PXSelectorAttribute.Select<SOOrderExtension.usrCustContactID>(
sender, e.Row) as Contact;
if (contact != null)
{
var shippingContact = (SOShippingContact)Base.Shipping_Contact.Select();
shippingContact.OverrideContact = true;
shippingContact = Base.Shipping_Contact.Update(shippingContact);
shippingContact = (SOShippingContact)Base.Shipping_Contact.Select();
shippingContact.Email = contact.EMail;
}
}
}
注意,在我们将 OverrideContact 设置为 true Shipping_Contact 数据视图中调用更新方法> ,然后从 Shipping_Contact 视图中进行额外选择。绝对必须第二次调用选择方法,因为当 OverrideContact 设置为true时,系统会创建 SOShippingContact 的新实例DAC并将其插入缓存中。从缓存中获取新 SOShippingContact 实例的最简单方法是通过 Shipping_Contact 数据视图中的选择方法。