12.04.2010, 18:12 | #1 |
Участник
|
Контекст оповещения Workflow
Доброго дня, коллеги!
Есть воркфлоу, основанное на задачах. Есть форма, из которой вф запускаются, на форме два грида: верхний - документ, нижний - задачи для этого документа (документ и задача - это мои сущности, под них есть таблицы, связанные один ко многим). ВФ запускается по нижнему гриду. После старта ВФ приходит оповещение, о новой задаче, из формы можно перейти к источнику оповещения (это есть задача из нижнего грида). При попытке перейти к источнику оповещения, открывается форма с документами и задачами и вываливается ошибка в инфолог: Форме не удается найти отсюда контекст оповещения. Попытайтесь получить доступ к записи \"\" с помощью другого способа. Я в принципе понимаю, почему так происходит. Форма при открытии берет источник данных - документы, встает на первую запись и в этой записи не может найти задачу, которая находится, например, во втором документе. Отсюда вопрос: как и где узнать RecId записи, которая является источником оповещения? Чтобы можно было выставить нужный документ в верхнем гриде. Надеюсь на вашу помощь. |
|
12.04.2010, 18:26 | #2 |
Axapta
|
Позиционированние происходит в \Classes\EventContextInformation\findTimed. Там вызывается findRecord датасорса формы. Соответственно, можно перекрыть этот файндРекорд и обработать ситуацию, спозиционировав самостоятельно. Может не самое лучшее решение, просто первое, что пришло в голову.
|
|
|
За это сообщение автора поблагодарили: AlexeyVS (1). |
12.04.2010, 19:25 | #3 |
Участник
|
Получилось вот что. По совету OIP. Немного перемаргивает при позиционировании, но работает.
findRecord переопределен в датасорсе источника оповещения X++: public boolean findRecord(Common _record) { boolean ret; Document docTable; Task taskTable; ; select firstonly taskTable where taskTable.RecId == _record.RecId; select firstonly docTable where docTable.DocumentId == taskTable.DocumentId; Document_ds.findRecord(docTable); this.research(); ret = super(_record); return ret; } |
|
13.04.2010, 10:19 | #4 |
Ищущий знания...
|
Цитата:
т.е. в итоге получится что-то типа: X++: public boolean findRecord(Common _record) { boolean ret; Document docTable; Task taskTable; ; element.lock(); select firstonly taskTable where taskTable.RecId == _record.RecId; select firstonly docTable where docTable.DocumentId == taskTable.DocumentId; Document_ds.findRecord(docTable); this.research(); ret = super(_record); element.unLock(); return ret; }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
13.04.2010, 11:12 | #5 |
Участник
|
Рано я порадовался. После отработки позиционирования, в нижнем гриде фокус выставляется на первую запись. Хоть ошибки больше и нет, но позиционирование выполняется некорректно, если источник оповещения, например, вторая запись.
Причем позиционирование в переопределенном методе срабатывает правильно, это видно под отладкой. Но потом фокус съезжает. Последний раз редактировалось AlexeyVS; 13.04.2010 в 11:27. |
|
13.04.2010, 11:37 | #6 |
Участник
|
Коллеги, а как же принцип "посмотри как в стандарте, сделай по аналогии"?
Посмотрите как сделан переход, например, к строкам Заказов на продажу.
__________________
Ivanhoe as is.. |
|
13.04.2010, 16:59 | #7 |
Участник
|
В стандарте посмотреть не получилось, падает при попытке перейти к источнику. Кроме того я вообще не нашел ничего похожего на переопределение метода findRecord. Заметил, что на перескок строк влияет выставление датасорсу свойства StartPosition(First, Last). Это свойство можно как-то игнорировать?
Попробовал сделать через element.args().lookupField, но тоже ничего не вышло. |
|
13.04.2010, 17:36 | #8 |
Участник
|
А вы не хотите разобраться, почему у вас стандарт падает?
У меня вот все замечательно переходит, автоматически отображается только один заказ и только одна строка (нужная), даже на поле "не на гриде" переходит само.
__________________
Ivanhoe as is.. |
|
14.04.2010, 12:48 | #9 |
Участник
|
Стандарт падает из-за внесения изменений сторонними разработчиками, это отдельный вопрос.
Вобщем, получилось как-то решить проблему. В перекрытом findRecord реализую поиск по главному датасорсу, перечитываю зависимый. Перекрываю метод linkActive вот так: X++: public void linkActive() { if (!element.parmTaskFinded()) { super(); } else { element.parmTaskFinded(false); element.gotoTasks(); } } |
|
|
|