AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.10.2019, 14:09   #1  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Ax2012: внезапно отрабатывающий display method в лукапе
Добрый день.

Столкнулся с загадочной ситуацией. Есть кастомный лукап, написанный с помощью SysTableLookup, в нём есть два дисплейных поля. При запуске под админскими правами - работает отлично. При запуске под пользователем, лукап открывается, а в дисплейных полях пусто. Но если изменить сортировку или, скажем, попробовать отфильтровать значения в лукапе, дисплейный метод магическим образом отрабатывает.

Кто-нибудь сталкивался с подобной ситуацией?

ax 2012R3 CU13
Старый 01.11.2019, 05:41   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Предлагаете лечить даже не по фото, а по описанию фото ?
Переопределенный лукап и дисплейные методы в студию ...
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 01.11.2019, 09:41   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,435 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Встречались ситуации, когда ядро в целях оптимизации исключало из выборки поля которые явно не отображаются на гриде. Попробуйте в своём дисплейном методе работать не нпрямую с this, а перевыбрать запись из таблицы по уникальному ключу включающему те поля, которые вынесены в лукап.
Старый 01.11.2019, 09:59   #4  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Простите, привожу код:

Лукап:
X++:
public static void lookupSalesAgreementIdExecutant(FormControl     _callingControl,
                                                CustAccount     _custAccount,
                                                AgreementExecutant _executant)
{
    Query query;
    QueryBuildDataSource qbds;

    SysTableLookup          sysTableLookup = SysTableLookup::newParameters(tableNum(SalesAgreementHeader), _callingControl);

    sysTableLookup.addLookupfield(fieldNum(SalesAgreementHeader, DocumentTitle));
    sysTableLookup.addLookupMethod(tableMethodStr(AgreementHeader, AgreementDate_RU));
    sysTableLookup.addLookupMethod(tableMethodStr(SalesAgreementHeader, custNameAlias));
    
    sysTableLookup.addLookupfield(fieldNum(SalesAgreementHeader, CustAccount));
    sysTableLookup.addLookupfield(fieldNum(SalesAgreementHeader, Currency));
    sysTableLookup.addLookupfield(fieldNum(SalesAgreementHeader, AgreementClassification));
    sysTableLookup.addLookupfield(fieldNum(SalesAgreementHeader, SalesNumberSequence), true);


    query = AgreementHeader::partyAgreementsQuery(tableNum(SalesAgreementHeader),
        fieldNum(SalesAgreementHeader, CustAccount),
        _custAccount ? _custAccount : SysQuery::valueUnlimited(),
        systemDateGet(),
        false,
        0,
        _executant
        ); 

    qbds = query.dataSourceTable(tableNum(SalesAgreementHeader));

    qbds.addSortField(fieldNum(SalesAgreementHeader, DocumentTitle));

    qbds = query.dataSourceTable(tableNum(SalesAgreementHeader));
    qbds = qbds.addDataSource(tableNum(SalesAgreementHeaderExt_RU));
    qbds.relations(true);
    qbds.joinMode(JoinMode::ExistsJoin);

    sysTableLookup.parmQuery(query);
    sysTableLookup.parmUseLookupValue(false);
    sysTableLookup.performFormLookup();
}
Дисплейный метод:
X++:
//BP Deviation Documented
public display CustName custNameAlias()
{
    CustTable       custTable;
    DirPartyTable   partyTable;

    if (this.CustAccount)
    {
        select firstonly Party from custTable
                where custTable.AccountNum == this.CustAccount
            join NameAlias from partyTable
                where partyTable.RecId == custTable.Party;

    }

    return partyTable.NameAlias;
}
Старый 01.11.2019, 10:04   #5  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Встречались ситуации, когда ядро в целях оптимизации исключало из выборки поля которые явно не отображаются на гриде. Попробуйте в своём дисплейном методе работать не нпрямую с this, а перевыбрать запись из таблицы по уникальному ключу включающему те поля, которые вынесены в лукап.
Попробовал, получается ещё более интересный результат. При запуске из-под пользователя, получается, что значение в поле this.CustAccount присутствует, но запрос по этому значению в CustTable не находит строку. При этом с правами админа всё работает корректно.
Старый 01.11.2019, 12:28   #6  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,933 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
RLS?
Старый 01.11.2019, 12:49   #7  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Цитата:
Сообщение от Logger Посмотреть сообщение
RLS?
RLS настроена, да, но не на таблицу клиенты. Плюс, непонятно, почему изменение сортировки в лукапе заставляет дисплейный метод работать.

В итоге, задача решилась созданием формы для лукапа, но всё же хотелось бы понять, что же произошло.
Старый 01.11.2019, 16:00   #8  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
попробуйте указать skipAosValidation(true) в display методе
Старый 01.11.2019, 17:20   #9  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Тут RLS вряд ли влияет. Все таки выборка идет select, а не Query, а, насколько помню, select как раз по умолчанию без RLS и его для select наоборот нужно явно включать, если это нужно.
Есть подозрение, что как-то криво работает SysTableLookup с таблицами, которые в иерархии наследования.
Теги
lookup

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kashperuk Ivan: Tutorial: Caching display methods Blog bot DAX Blogs 3 29.09.2015 22:07
AX2012. Кеширование display method на ListPage. Как? plumbum DAX: Программирование 7 27.03.2015 15:24
kamalblogs: Error: SSRS/EP error when the return type in display method is incorrect – Dynamics AX 2012 Blog bot DAX Blogs 0 11.10.2013 12:11
Solutions Monkey: Async call to display method from the EP via a web service for delay loading Blog bot DAX Blogs 0 11.02.2012 07:16
axaptapedia: Display method Blog bot DAX Blogs 0 29.08.2007 16:30

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:55.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.