Показать сообщение отдельно
Старый 24.03.2008, 18:03   #1  
IvanOFF is offline
IvanOFF
MCTS
MCBMSS
 
65 / 87 (3) ++++
Регистрация: 22.09.2005
Адрес: Москва
Оповещения. Переход к источнику оповещения.
Здравствуйте!
Заметил такую особенность в работе стандартного механизма оповещения в AX 4.0.
Например, если настроить оповещение на изменение поля таблицы "Договоры" (RContractTable - неважно, у клиентов или поставщиков), то позже из этого оповещения (форма "Просмотр оповещений" - EventAlertInbox) нельзя перейти к той записи, у которой было изменено поле. Открывается форма договоров, выделяется поле грида, в котором было изменение, но выбрана первая запись, а не та, на которой было сгенерировано оповещение. На других формах функционал отрабатывает корректно - переходит к нужной записи.

После анализа кода, выяснилось то отличие таблицы договоров от других таблиц, которое приводит к такому поведению. Это - составной первичный ключ. В классе EventContextInformation за поиск записи на форме отвечает метод find(), в самом начале которого идет проверка - canUseFindRecord(), который в случае с RContractTable возвращает false. Этот false, в свою очередь, определяется методом canUseLookup() того же класса, который также возвращает false из-за вот этой проверки:
X++:
di = this.getPrimaryIndex();
if (! di || di.numberOfFields() != 1)
    return false;
которая из-за составного первичного ключа возвращает false. Если в отладчике вручную заставить вернуть метод canUseLookup() значение true, то запись корректно находится.
Может, у кого-нибудь есть идеи, зачем так сделано? Зачем таблицы с составным первичным ключом обрабатываются иначе, чем те, у которых первичный ключ содержит одно поле. Может, в этом и есть какой-то смысл, но функционал при этом работает не корректно.
Исправить-то можно, конечно, но хотелось бы разобраться.