Первоначально сортировать заказ клиента в поиске клиента по acctName - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь сначала отсортировать поиск клиентов по имени учетной записи. В DAC я выбрал SO.SOrder, настроил атрибуты, выбрав «Заменить оригинал», и добавил это:

[PXDefault] [CustomerActive(typeof(Search<BAccountR.bAccountID,Where<Customer.type, IsNotNull, Or<Current<SOOrder.aRDocType>, Equal<ARDocType.noUpdate>, And<BAccountR.type, Equal<BAccountType.companyType>>>>, OrderBy<Asc<BAccountR.acctName>>>), Visibility = PXUIVisibility.SelectorVisible, DescriptionField = typeof(Customer.acctName), Filterable = true)]

Обратите внимание, я добавил, OrderBy<Asc<BAccountR.acctName>>.

После успешной сборки и открытия экрана SOOrder я получаю эту ошибку:

Error: The parameter length exceeds the allowed value.
Parameter name: types 
   at PX.Data.BqlCommand.Compose(Type[] types) 
   at PX.Objects.AR.CustomerAttribute..ctor(Type search, Type[] fields) 
   at System.Reflection.CustomAttribute._CreateCaObject(RuntimeModule pModule, IRuntimeMethodInfo pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs) 
   at System.Reflection.CustomAttribute.CreateCaObject(RuntimeModule module, IRuntimeMethodInfo ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs) 
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean.

Метод Search имеет перегрузку, которая принимает OrderBy. Что я делаю неправильно?

Спасибо за вашу помощь.

- Paul

1 Ответ

0 голосов
/ 05 июля 2018

Здесь нужно упомянуть две вещи:

Первая проблема, с которой вы столкнетесь, заключается в том, что селектор упорядочивается только по значению ключа, что делает вашу конечную цель недостижимой:

Изменить селектор по умолчанию для сортировки

Вторым является сообщение об ошибке. Проблема, по-видимому, связана с ошибкой Acumatica в CustomerAttribute при построении BqlCommand во время выполнения заказа клиента. В конструкторе CustomerAttribute(Type search, params Type[] fields) есть оператор, который проверяет searchType == typeof(Search<,,>), а затем пытается построить запрос, используя Search2<Field, Join, Where>, когда он должен использовать Search2<Field, Join, Where, OrderBy>, включая OrderBy. Я подтвердил, что ошибка исчезла с моей собственной пользовательской версией этого класса, использованной вместо оригинала, но порядок на вашем селекторе не изменится. В результате исправление не поможет вашей конечной цели.

// ...
else if (searchType == typeof(Search<,,>)) //when Search<Field, Where, OrderBy>
{
    cmd = BqlCommand.Compose(
                    typeof(Search2<,,>), //need Search2<Field, Join, Where, OrderBy> 
                           //   however using Search2<Field, Join, Where> and results in an error
                    typeof(BAccountR.bAccountID),
                    typeof(LeftJoin<,,>),
                    typeof(Customer),
                    typeof(On<Customer.bAccountID, Equal<BAccountR.bAccountID>, And<Match<Customer, Current<AccessInfo.userName>>>>),
                    typeof(LeftJoin<,,>),
                    typeof(Contact),
                    typeof(On<Contact.bAccountID, Equal<BAccountR.bAccountID>, And<Contact.contactID, Equal<BAccountR.defContactID>>>),
                    typeof(LeftJoin<,,>),
                    typeof(Address),
                    typeof(On<Address.bAccountID, Equal<BAccountR.bAccountID>, And<Address.addressID, Equal<BAccountR.defAddressID>>>),
                    typeof(LeftJoin<,>),
                    typeof(Location),
                    typeof(On<Location.bAccountID, Equal<BAccountR.bAccountID>, And<Location.locationID, Equal<BAccountR.defLocationID>>>),
                    searchArgs[1],
                    searchArgs[2]);
}
// ...
...