2017-10-09 59 views
0

我在SOOrder摘要上創建了自定義聯繫人字段,以便用戶可以根據所選客戶選擇客戶聯繫人。在貨運設置選項卡上的SOOrder屏幕上覆蓋發貨電子郵件

這裏是SOOrder擴展 - 自定義聯繫人字段定義現在

[PXDBInt] 
 
[PXUIField(DisplayName = "Contact", Visibility = PXUIVisibility.Visible)] 
 
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)] 
 
[PXSelector(typeof(Search2<Contact.contactID, 
 
\t LeftJoin<BAccount2, On<BAccount2.bAccountID, Equal<Contact.bAccountID>>>, 
 
\t Where<Contact.contactType, Equal<ContactTypesAttribute.person>, 
 
\t \t \t \t \t \t \t Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>>), 
 
\t DescriptionField = typeof(Contact.displayName), Filterable = true)] 
 
[PXRestrictor(typeof(Where<Contact.contactType, NotEqual<ContactTypesAttribute.bAccountProperty>, 
 
\t \t And<Where<BAccount2.bAccountID, Equal<Current<SOOrder.customerID>>, 
 
\t \t \t \t Or<Current<SOOrder.customerID>, IsNull>>>>), PX.Objects.CR.Messages.ContactBAccountDiff)] 
 
[PXRestrictor(typeof(Where2<Where2< 
 
\t \t \t \t Where<Contact.contactType, Equal<ContactTypesAttribute.person>, 
 
\t \t \t \t \t \t Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>, 
 
\t \t \t \t \t And< 
 
\t \t \t \t \t \t Where<BAccount2.type, IsNull, 
 
\t \t \t \t \t \t \t Or<BAccount2.type, Equal<BAccountType.customerType>, 
 
\t \t \t \t \t \t \t \t Or<BAccount2.type, Equal<BAccountType.prospectType>, 
 
\t \t \t \t \t \t \t \t Or<BAccount2.type, Equal<BAccountType.combinedType>>>>>>>, 
 
\t \t 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) 
 
{ 
 
\t SOOrderEntry graph = PXGraph.CreateInstance<SOOrderEntry>(); 
 

 
\t SOOrderExtension ext = PXCache<SOOrder>.GetExtension<SOOrderExtension>(Base.Document.Current); 
 

 
\t Contact custContact = PXSelect<Contact, 
 
\t \t Where<Contact.contactID, Equal<Required<Contact.contactID>>>>.Select(graph, ext.UsrCustContactID); 
 

 
\t if (custContact != null && !string.IsNullOrEmpty(custContact.EMail)) 
 
\t { 
 
\t \t graph.Document.Current = Base.Document.Current; 
 

 
\t \t Base.Shipping_Contact.Current.OverrideContact = true; 
 
\t \t Base.Shipping_Contact.Current.Email = custContact.EMail; 
 

 
\t \t graph.Shipping_Contact.Current = Base.Shipping_Contact.Current; 
 

 
\t \t graph.Shipping_Contact.Current.OverrideContact = true; 
 
\t \t graph.Shipping_Contact.Current.Email = custContact.EMail; 
 

 
\t \t Base.Shipping_Contact.Update(graph.Shipping_Contact.Current); 
 
\t \t 
 
\t \t graph.Actions.PressSave(); 
 
\t } 
 
}

有這兩個問題。

  1. 它確實表明填充當我選擇聯繫人的電子郵件,但是當我保存,它有一個默認的客戶覆蓋。

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

請建議。

+0

有什麼建議嗎? – Krunal

回答

2

要複製客戶聯絡電子郵件到送貨地址電子郵件字段,你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; 
     } 
    } 
} 

通知,更新方法呼籲Shipping_Contact數據查看我們設置後替代聯繫人true,然後再從Shipping_Contact視圖中另外選擇。因爲當OverrideContact設置爲true時,系統會創建一個新的DAC實例並將其插入緩存中,因此絕對必須調用第二次選擇方法。從緩存中獲取新實例SOShippingContact實例的最簡單方法是通過選擇方法上的Shipping_Contact數據視圖。

+0

謝謝你,魯斯蘭,已經工作。 – Krunal

相關問題