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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.04.2010, 18:12   #1  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Контекст оповещения Workflow
Доброго дня, коллеги!
Есть воркфлоу, основанное на задачах. Есть форма, из которой вф запускаются, на форме два грида: верхний - документ, нижний - задачи для этого документа (документ и задача - это мои сущности, под них есть таблицы, связанные один ко многим). ВФ запускается по нижнему гриду. После старта ВФ приходит оповещение, о новой задаче, из формы можно перейти к источнику оповещения (это есть задача из нижнего грида). При попытке перейти к источнику оповещения, открывается форма с документами и задачами и вываливается ошибка в инфолог:

Форме не удается найти отсюда контекст оповещения. Попытайтесь получить доступ к записи \"\" с помощью другого способа.

Я в принципе понимаю, почему так происходит. Форма при открытии берет источник данных - документы, встает на первую запись и в этой записи не может найти задачу, которая находится, например, во втором документе.
Отсюда вопрос: как и где узнать RecId записи, которая является источником оповещения? Чтобы можно было выставить нужный документ в верхнем гриде.
Надеюсь на вашу помощь.
Старый 12.04.2010, 18:26   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Позиционированние происходит в \Classes\EventContextInformation\findTimed. Там вызывается findRecord датасорса формы. Соответственно, можно перекрыть этот файндРекорд и обработать ситуацию, спозиционировав самостоятельно. Может не самое лучшее решение, просто первое, что пришло в голову.
За это сообщение автора поблагодарили: AlexeyVS (1).
Старый 12.04.2010, 19:25   #3  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Получилось вот что. По совету 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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от AlexeyVS Посмотреть сообщение
Получилось вот что. По совету OIP. Немного перемаргивает при позиционировании, но работает. ...
что бы не маргало, перед выполнением кода добавьте element.lock();, а после завершения element.unLock();

т.е. в итоге получится что-то типа:
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 is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Рано я порадовался. После отработки позиционирования, в нижнем гриде фокус выставляется на первую запись. Хоть ошибки больше и нет, но позиционирование выполняется некорректно, если источник оповещения, например, вторая запись.
Причем позиционирование в переопределенном методе срабатывает правильно, это видно под отладкой. Но потом фокус съезжает.

Последний раз редактировалось AlexeyVS; 13.04.2010 в 11:27.
Старый 13.04.2010, 11:37   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Коллеги, а как же принцип "посмотри как в стандарте, сделай по аналогии"?
Посмотрите как сделан переход, например, к строкам Заказов на продажу.
__________________
Ivanhoe as is..
Старый 13.04.2010, 16:59   #7  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
В стандарте посмотреть не получилось, падает при попытке перейти к источнику. Кроме того я вообще не нашел ничего похожего на переопределение метода findRecord. Заметил, что на перескок строк влияет выставление датасорсу свойства StartPosition(First, Last). Это свойство можно как-то игнорировать?
Попробовал сделать через element.args().lookupField, но тоже ничего не вышло.
Старый 13.04.2010, 17:36   #8  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А вы не хотите разобраться, почему у вас стандарт падает?

У меня вот все замечательно переходит, автоматически отображается только один заказ и только одна строка (нужная), даже на поле "не на гриде" переходит само.
__________________
Ivanhoe as is..
Старый 14.04.2010, 12:48   #9  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Стандарт падает из-за внесения изменений сторонними разработчиками, это отдельный вопрос.
Вобщем, получилось как-то решить проблему. В перекрытом findRecord реализую поиск по главному датасорсу, перечитываю зависимый. Перекрываю метод linkActive вот так:
X++:
public void linkActive()
{
    if (!element.parmTaskFinded())
    {
        super();
    }
    else
    {
        element.parmTaskFinded(false);
        element.gotoTasks();
    }
}
Но возникает другая проблема! Если не вызвать метод super(); - нарушается связь между датасорсами. То есть все выставляется правильно, но теперь при перемещении по верхнему гриду данные в нижнем не меняются! Метод linkActive больше не вызывается.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Error message “The value ‘xxx’ is not found in the map” when opening Workflow configuration Blog bot DAX Blogs 0 10.02.2010 00:07
emeadaxsupport: Unable to validate the AX 2009 Workflow Webservice URL on a Windows Server 2008 R2 x64 Blog bot DAX Blogs 0 05.01.2010 19:16
axaptapedia: Workflow Blog bot DAX Blogs 0 28.06.2009 03:06
Solutions Monkey: Using Microsoft Dynamics Ax 2009 Workflow controls in EP Blog bot DAX Blogs 0 30.07.2008 10:05
Arijit Basu: AX 2009 Workflows: A Quick overview Blog bot DAX Blogs 0 19.06.2008 02:07
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:35.