簡體   English   中英

在“貨件設置”選項卡上的SOOrder屏幕上覆蓋貨件電子郵件

[英]Overriding Shipping Email on SOOrder screen on Shipment Settings tab

我在SOOrder摘要上創建了一個自定義聯系人字段,以便用戶可以根據所選客戶選擇客戶聯系人。

這是SOOrder Extension上的自定義“聯系人”字段定義-

 [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 { } 

現在,無論何時用戶選擇任何聯系人,我都會在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(); } } 

這有兩個問題。

  1. 它確實顯示了當我選擇“聯系人”時填充的電子郵件,但是當我保存時,它將替換為“客戶”中的默認電子郵件。

  2. 如果我要創建新的銷售訂單,然后選擇聯系人。 在保存時,如果我錯過任何必填字段或任何其他錯誤(例如Avalara錯誤),則會再次覆蓋客戶的默認字段。

請提出建議。

要將客戶聯系電子郵件復制到收貨地址電子郵件字段,您的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數據視圖上調用了Update方法,然后在Shipping_Contact視圖中進行了附加選擇。 絕對必須第二次調用Select方法,因為當OverrideContact設置為true時,系統將創建SOShippingContact DAC的新實例並將其插入高速緩存。 從緩存中獲取新的SOShippingContact實例的最簡單方法是通過Shipping_Contact數據視圖上的Select方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM