24.03.2008, 18:03 | #1 |
MCTS
|
Оповещения. Переход к источнику оповещения.
Здравствуйте!
Заметил такую особенность в работе стандартного механизма оповещения в AX 4.0. Например, если настроить оповещение на изменение поля таблицы "Договоры" (RContractTable - неважно, у клиентов или поставщиков), то позже из этого оповещения (форма "Просмотр оповещений" - EventAlertInbox) нельзя перейти к той записи, у которой было изменено поле. Открывается форма договоров, выделяется поле грида, в котором было изменение, но выбрана первая запись, а не та, на которой было сгенерировано оповещение. На других формах функционал отрабатывает корректно - переходит к нужной записи. После анализа кода, выяснилось то отличие таблицы договоров от других таблиц, которое приводит к такому поведению. Это - составной первичный ключ. В классе EventContextInformation за поиск записи на форме отвечает метод find(), в самом начале которого идет проверка - canUseFindRecord(), который в случае с RContractTable возвращает false. Этот false, в свою очередь, определяется методом canUseLookup() того же класса, который также возвращает false из-за вот этой проверки: X++: di = this.getPrimaryIndex(); if (! di || di.numberOfFields() != 1) return false; Может, у кого-нибудь есть идеи, зачем так сделано? Зачем таблицы с составным первичным ключом обрабатываются иначе, чем те, у которых первичный ключ содержит одно поле. Может, в этом и есть какой-то смысл, но функционал при этом работает не корректно. Исправить-то можно, конечно, но хотелось бы разобраться. |
|
25.03.2008, 09:24 | #2 |
Участник
|
Что бы долго не ждать, когда отфетчится нужная запись
Когда создается форма, то запись в ней позиционируется с помощью механизма JumpRef (с помощью методов LookupField(), LookupValue() класса Args). При использовании на таблице составного ключа, ищется по первому полю первого уникального индекса. После открытия формы происходит дополнительное позиционирование с помощью метода findRecord() нужного датасорса. Если переход был выполнен по составному ключу, то после открытия формы запись будет отпозиционирована на первом поле составного ключа (для RContractTable на значении поля RContractPartnerType) и, если закомментировать соответствующий код в методе canUseFindRecord(), будут фетчиться записи на клиента, пока будет получена нужная, что в общем случае может занять много времени.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: IvanOFF (1). |
25.03.2008, 12:30 | #3 |
MCTS
|
Цитата:
Сообщение от AndyD
Что бы долго не ждать, когда отфетчится нужная запись
Когда создается форма, то запись в ней позиционируется с помощью механизма JumpRef (с помощью методов LookupField(), LookupValue() класса Args). При использовании на таблице составного ключа, ищется по первому полю первого уникального индекса. После открытия формы происходит дополнительное позиционирование с помощью метода findRecord() нужного датасорса. Если переход был выполнен по составному ключу, то после открытия формы запись будет отпозиционирована на первом поле составного ключа (для RContractTable на значении поля RContractPartnerType) и, если закомментировать соответствующий код в методе canUseFindRecord(), будут фетчиться записи на клиента, пока будет получена нужная, что в общем случае может занять много времени. То есть, получается, что лучше быстро, чем правильно Ведь, согласитесь, искать запись, откуда было сгенерировано оповещение, вручную вряд ли окажется быстрее, чем подождать, пока "отфетчится" нужная запись по составному ключу. |
|
27.03.2009, 16:07 | #4 |
Участник
|
Подниму тему. Кто-нибудь решал такую задачу? Попробовал закоментить анализ количества полей в индексе и вообще установку поля лукапа в args - запись все равно находится верно.
Кроме производительности, есть еще узкие места такой модификации?
__________________
Ivanhoe as is.. |
|
Теги |
оповещения, ax4.0 |
|
|