Поиск контактов на основе выбора клиента

Мне нужно создать поиск контактов на экране SO (SO301000). Я уже создал пользовательское настраиваемое поле, как показано ниже. Я перечисляю все контакты, но это не обновляет в зависимости от выбора клиента. Должен ли я написать какое-либо событие для CustomerID, чтобы обновить эти контакты? У кого-нибудь есть идеи?

[PXDBInt]
[PXUIField(DisplayName = "Contact")]
[PXSelector(typeof(Search2<Contact.contactID,
 LeftJoin<BAccount, On<BAccount.bAccountID, Equal<Contact.bAccountID>>>>),
 DescriptionField = typeof(Contact.displayName), Filterable = true, DirtyRead = true)]
[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 { }

2 ответа

Решение

Вы пропустили пункт Где и вам нужно использовать BAccount2 вместо BAccount, SOOrderEntry График имеет вид данных, определенный с Vendor ЦАП, который инициализируется первым / перед BAccount и рамки заменит его Vendor DAC. Чтобы предотвратить это, вам нужно использовать BAccount2 ЦАП в вашем BQL.

    using System;
    using PX.Data;
    using PX.Objects.SO;
    using PX.Objects.CR;

    namespace DemoPkg
    {
        public class SOOrderPXExt : PXCacheExtension<SOOrder>
        {
            #region UsrContactID

            public abstract class usrContactID : IBqlField { }

            [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<CRCase.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 Int32? UsrContactID { get; set; }

            #endregion
        }
    }

И убедитесь, что у вас есть AutoRefresh установлен в true в aspx для PXSelector управления этим полем.

Я вижу, что в вашем селекторе нет условия where, которое основано на данном клиенте. Попробуйте обновить селектор, чтобы он соответствовал чему-то подобному...

[PXSelector(typeof(Search2<Contact.contactID,
    LeftJoin<BAccount, On<BAccount.bAccountID, Equal<Contact.bAccountID>>>,
    Where<BAccount.bAccountID, Equal<Current<SOOrder.customerID>>>>),
DescriptionField = typeof(Contact.displayName), Filterable = true, DirtyRead = true)]

На вашей странице также убедитесь, что ваш селектор имеет AutoRefresh="true"

Пример:

<px:PXSelector ID="edWeightUOM" runat="server" 
    DataField="WeightUOM" Size="S" AutoRefresh="true" />
Другие вопросы по тегам