переписать PXUIFieldAttribute.SetEnabled в PXUIEnabledAttribute - PullRequest
0 голосов
/ 09 октября 2019

Добрый день, я усердно пишу PXUIEnabledAttribute для SOOrder.orderType Это ограничивает пользователя в изменении типа заказа, если (в этом случае) у него есть роль склада.

    protected void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {

        var row = (SOOrder)e.Row;

        string username = Base.Accessinfo.UserName;
        UsersInRoles a = PXSelect<UsersInRoles, Where2<Where<UsersInRoles.rolename, Equal<Required<UsersInRoles.rolename>>>,
                                                         And<UsersInRoles.username, Equal<Required<UsersInRoles.username>>>>>.Select(this.Base, "Warehousing", Base.Accessinfo.UserName);

        if (a != null)
        {
            PXUIFieldAttribute.SetEnabled<SOOrder.orderType>(cache, e.Row, false);

        }

    } 

Этот код работает наполовинувремя. при переходе между записями код не всегда работает / срабатывает.

Я надеялся поменять вышеприведенный код на что-то в строке:

[PXMergeAttributes(Method = MergeMethod.Merge)]
[PXUIEnabled(add magic code here)]
protected virtual void SOOrder_OrderType_CacheAttached(PXCache cache)
{ }

Но я пытаюсь создатькласс PX.Data.BQL.BqlString.Constant для складирования и имени пользователя.

1 Ответ

1 голос
/ 09 октября 2019

Одной из проблем может быть то, что вы устанавливаете только поле как отключенное, но другой логики для его повторного включения нет (если == ноль).

Поэтому измените код следующим образом:

   protected void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        var row = (SOOrder)e.Row;
        string username = Base.Accessinfo.UserName;
        UsersInRoles a = PXSelect<UsersInRoles, Where2<Where<UsersInRoles.rolename, 
                              Equal<Required<UsersInRoles.rolename>>>,
                              And<UsersInRoles.username,      
                              Equal<Required<UsersInRoles.username>>>>>
        .Select(this.Base, "Warehousing", Base.Accessinfo.UserName);

        PXUIFieldAttribute.SetEnabled<SOOrder.orderType>(cache, e.Row, a == null);

        } 

Что касается констант BQL, вы можете создать новый класс BQLConstants, в котором вы будете хранить ваши константы, например:

public class BQLConstants
{
  public class warehousing: Constant<String>
        {
            public warehousing() : base("Warehousing") { }
        } 
}

, тогда ваш запрос станет примерно таким:

   Where<UsersInRoles.rolename, Equal<BQLConstants.warehousing>>,

Однако я не рекомендую хранить имена пользователей или существующие константы Acumatica как свои собственные [дубликаты] константы.

Что касается PXUIEnabledAttribute, он работает следующим образом [PXUIEnabled (typeof (Где <... добавьте ваше условие здесь ...>))]

Я бы определенно рекомендовал взять T100, T200и курсы T300 для ознакомления с настройками Acumatica.

...