Поиск клиентов на основе выбора контакта в Acumatica - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно создать поиск клиентов на экране SO (SO301000). Я уже создал определяемое пользователем настраиваемое поле, как показано ниже.

#region UsrKWBSCustomerID
        [CustomerAndProspect(Filterable = true, DirtyRead = true)]
        [PXUIField(DisplayName = "Customer")]
        //[PXRestrictor(typeof(Where<BAccountR.status, NotEqual<BAccountR.status.inactive>,// Or<BAccountR.type, Equal<BAccountType.customerType>, Or<BAccountR.type, Equal<BAccountType.combinedType>>>,
        //            And<Where<Contact.contactID, Equal<Current<SOOrderExt.usrKWContactID>>,
        //                    Or<Current<SOOrderExt.usrKWContactID>, IsNull>>>>), PX.Objects.CR.Messages.ContactBAccountDiff)]
        //[PXDefault(typeof(Where<BAccountR.status, NotEqual<BAccountR.status.inactive>,// Or<BAccountR.type, Equal<BAccountType.customerType>, Or<BAccountR.type, Equal<BAccountType.combinedType>>>,
        //            And<Where<Contact.contactID, Equal<Current<SOOrderExt.usrKWContactID>>,
        //                    Or<Current<SOOrderExt.usrKWContactID>, IsNull>>>>),PersistingCheck = PXPersistingCheck.Nothing)]
        ////[PXFormula(typeof(Default<Contact.bAccountID>))]
        ////[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), PX.Objects.CR.Messages.ContactInactive,
        ////                  typeof(Contact.displayName))]
        //[PXRestrictor(typeof(Where<BAccountR.type, Equal<BAccountType.prospectType>, Or<BAccountR.type, Equal<BAccountType.customerType>, Or<BAccountR.type, Equal<BAccountType.combinedType>>>>), "Business Account is {0}.", new[] { typeof(BAccountR.type) })]
        //[PXSelector(typeof(Search<Customer.bAccountID>), new Type[] { typeof(Customer.acctCD), typeof(Customer.acctName), typeof(Customer.status), typeof(Customer.classID) }, 
        //    SubstituteKey = typeof(Customer.acctName), DescriptionField = typeof(Customer.acctName))]
        public virtual int? UsrKWBSCustomerID { get; set; }
        public abstract class usrKWBSCustomerID : PX.Data.BQL.BqlInt.Field<usrKWBSCustomerID> { }
        #endregion

Я также пробовал ниже один, но не работал v = может кто-нибудь исправить меня, где я делаю неправильно, я ожидал, что результат будет, когда пользователь выберет контакт затем соответствующий клиент должен автоматически загружаться в мое настраиваемое поле, например, как работает экран возможностей

#region UsrKWBSCustomerID
        //[CustomerAndProspect(Filterable = true, DirtyRead = true)]
        [PXDBInt()]
        [PXUIField(DisplayName = "Customer")]
        [PXSelector(typeof(Search2<BAccount2.bAccountID,
                LeftJoin<Contact, On<Contact.bAccountID, Equal<BAccount2.bAccountID>>>, Where<BAccount2.type, Equal<BAccountType.prospectType>, Or<BAccount2.type, Equal<BAccountType.customerType>, Or<BAccount2.type, Equal<BAccountType.combinedType>>>>>),
                DescriptionField = typeof(BAccount2.acctName), Filterable = true, DirtyRead = true)]
        [PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
        [PXFormula(typeof(Default<Contact.bAccountID>))]
        [PXRestrictor(typeof(Where2<Where<BAccount2.type, Equal<BAccountType.prospectType>, Or<BAccount2.type, Equal<BAccountType.customerType>, Or<BAccount2.type, Equal<BAccountType.combinedType>>>>,
                    And<Where<Contact.contactID, Equal<Current<SOOrderExt.usrKWContactID>>,
                            Or<Current<SOOrderExt.usrKWContactID>, IsNull>>>>), PX.Objects.CR.Messages.ContactBAccountDiff)]
        [PXRestrictor(typeof(Where<BAccount2.status, Equal<BAccount2.status.inactive>>), "Customer '{0}' is inactive",
                          typeof(BAccount2.acctName))]
 public virtual int? UsrKWBSCustomerID { get; set; }
        public abstract class usrKWBSCustomerID : PX.Data.BQL.BqlInt.Field<usrKWBSCustomerID> { }
        #endregion

1 Ответ

0 голосов
/ 08 мая 2020

Заказ на продажу DA C уже имеет селектор клиентов с использованием DA C BAccountR. Создание другого селектора на том же BAccountR DA C вызовет конфликт, потому что может быть только один текущий объект DA C.

BAccountR DA C - это псевдоним, который наследуется от BAccount, чтобы предотвратить это. конфликт.

Вам также следует создать псевдоним DA C на BAccount. Вы можете скопировать класс BAccountR, переименовать его (BAccountR2 в примере ниже) и включить его в свое решение.

[System.SerializableAttribute()]
public partial class BAccountR2 : BAccount
{
    #region BAccountID
    public new abstract class bAccountID : PX.Data.BQL.BqlInt.Field<bAccountID> { }
    #endregion
    #region AcctCD
    public new abstract class acctCD : PX.Data.BQL.BqlString.Field<acctCD> { }
    [PXDimensionSelector("BIZACCT",
        typeof(Search2<BAccountR2.acctCD,
                LeftJoin<Contact, On<Contact.bAccountID, Equal<BAccountR2.bAccountID>, And<Contact.contactID, Equal<BAccountR2.defContactID>>>,
                LeftJoin<Address, On<Address.bAccountID, Equal<BAccountR2.bAccountID>, And<Address.addressID, Equal<BAccountR2.defAddressID>>>>>,
            Where2<Where<BAccountR2.type, Equal<BAccountType.customerType>,
                Or<BAccountR2.type, Equal<BAccountType.prospectType>,
                Or<BAccountR2.type, Equal<BAccountType.combinedType>,
                Or<BAccountR2.type, Equal<BAccountType.vendorType>>>>>,
                And<Match<Current<AccessInfo.userName>>>>>),
        typeof(BAccountR2.acctCD),
        typeof(BAccountR2.acctCD), typeof(BAccountR2.acctName), typeof(BAccountR2.type), typeof(BAccountR2.classID), typeof(BAccountR2.status), typeof(Contact.phone1), typeof(Address.city), typeof(Address.countryID), typeof(Contact.eMail),
        DescriptionField = typeof(BAccountR2.acctName))]
    [PXDBString(30, IsUnicode = true, IsKey = true, InputMask = "")]
    [PXDefault]
    [PXUIField(DisplayName = "Account ID", Visibility = PXUIVisibility.SelectorVisible)]
    [PXFieldDescription]
    public override String AcctCD
    {
        get
        {
            return this._AcctCD;
        }
        set
        {
            this._AcctCD = value;
        }
    }
    #endregion
    #region AcctName
    public new abstract class acctName : PX.Data.BQL.BqlString.Field<acctName> { }
    #endregion
    #region NoteID
    public new abstract class noteID : PX.Data.BQL.BqlGuid.Field<noteID> { }
    #endregion
    #region DefLocationID
    public new abstract class defLocationID : PX.Data.BQL.BqlInt.Field<defLocationID> { }
    #endregion
    #region Type
    public new abstract class type : PX.Data.BQL.BqlString.Field<type> { }
    #endregion
    #region IsCustomerOrCombined
    public new abstract class isCustomerOrCombined : PX.Data.BQL.BqlBool.Field<isCustomerOrCombined> { }
    #endregion
    #region ParentBAccountID
    public new abstract class parentBAccountID : PX.Data.BQL.BqlInt.Field<parentBAccountID> { }
    #endregion
    #region DefContactID
    public new abstract class defContactID : PX.Data.BQL.BqlInt.Field<defContactID> { }
    [PXDBInt()]
    [PXDBChildIdentity(typeof(Contact.contactID))]
    [PXSelector(typeof(Search<Contact.contactID>))]
    [PXUIField(DisplayName = "Default Contact", Visibility = PXUIVisibility.Invisible)]
    public override Int32? DefContactID
    {
        get
        {
            return base.DefContactID;
        }
        set
        {
            base.DefContactID = value;
        }
    }
    #endregion
    #region DefAddressID
    public new abstract class defAddressID : PX.Data.BQL.BqlInt.Field<defAddressID> { }
    #endregion
    #region ViewInCrm
    public new abstract class viewInCrm : PX.Data.BQL.BqlBool.Field<viewInCrm> { }        
    [PXBool]
    [PXUIField(DisplayName = "View In CRM")]
    public new virtual bool? ViewInCrm
    {
        get
        {
            return this._ViewInCrm;
        }
        set
        {
            this._ViewInCrm = value;
        }
    }
    #endregion

    #region Status
    public new abstract class status : PX.Data.BQL.BqlString.Field<status>
    {
        public class ListAttribute : PXStringListAttribute
        {
            public ListAttribute()
                : base(
                    new string[] { Active, Hold, HoldPayments, Inactive, OneTime, CreditHold },
                    new string[] { Messages.Active, Messages.Hold, Messages.HoldPayments, Messages.Inactive, Messages.OneTime, Messages.CreditHold })
            { }
        }

        public const string Active = "A";
        public const string Hold = "H";
        public const string HoldPayments = "P";
        public const string Inactive = "I";
        public const string OneTime = "T";
        public const string CreditHold = "C";

        public class active : PX.Data.BQL.BqlString.Constant<active>
        {
            public active() : base(Active) {; }
        }
        public class hold : PX.Data.BQL.BqlString.Constant<hold>
        {
            public hold() : base(Hold) {; }
        }
        public class holdPayments : PX.Data.BQL.BqlString.Constant<holdPayments>
        {
            public holdPayments() : base(HoldPayments) {; }
        }
        public class inactive : PX.Data.BQL.BqlString.Constant<inactive>
        {
            public inactive() : base(Inactive) {; }
        }
        public class oneTime : PX.Data.BQL.BqlString.Constant<oneTime>
        {
            public oneTime() : base(OneTime) {; }
        }
        public class creditHold : PX.Data.BQL.BqlString.Constant<creditHold>
        {
            public creditHold() : base(CreditHold) {; }
        }
    }
    #endregion
}

В вашем селекторе используйте новый псевдоним DA C, который вы создали. Ниже представлена ​​копия поля SOOrder.CustomerID, в котором я заменил псевдоним BAccountR на новый BAccountR2 и переименовал поле с CustomerID в UsrCustomerID.

public abstract class usrCustomerID : PX.Data.BQL.BqlInt.Field<usrCustomerID> { }

[PXDefault]
[CustomerActive(typeof(Search<BAccountR2.bAccountID, Where<True, Equal<True>>>),
                Visibility = PXUIVisibility.SelectorVisible, 
                DescriptionField = typeof(Customer.acctName), 
                Filterable = true)]
[CustomerOrOrganizationInNoUpdateDocRestrictor]
[PXForeignReference(typeof(Field<SOOrder.usrCustomerID>.IsRelatedTo<BAccount.bAccountID>))]

public virtual Int32? UsrCustomerID { get; set; }
...