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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.10.2009, 20:19   #1  
deo is offline
deo
DAX 3.0;4.0;5.0
 
4 / 10 (1) +
Регистрация: 28.07.2009
Как разорвать dynalink в журналах?
Здравствуйте!

Форма2 вызывается из формы1. Все стандартные связи работаю правильно: когда открыты обе формы, то перемещаясь по записям формы1 обновляются связанные записи формы2. Эти две формы созданы на основе стандартного журнального фреймворка.

Подскажите пожалуйста, как в таком случае разорвать dynalink? Т.е. journalTrans (форма2) открывшись с определенным набором записей не должна обновляться при перемещении курсора по journalTable (форма1).
Старый 27.10.2009, 20:44   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
В форме2, в методе init датасорса, на который накладывается ненужный dynalink - можно вставить код:
X++:
    Query                query   = new Query();
    Query                dsquery = _ds.query();
    QueryBuildDataSource qbds;
    ;
    super();
    dsquery = _ds.query();
    qbds = dsquery.dataSourceName(_ds.name());
    SysQuery::queryAddDynaCursorAsRangeAndValue(query, dsquery, qbds.id());
    _ds.query(query);
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 28.10.2009 в 02:13. Причина: Исправил ошибку в коде
За это сообщение автора поблагодарили: deo (1).
Старый 27.10.2009, 23:31   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
У механизма dynalink есть еще одна неприятная особенность: даже если вы вытрете dynalink из запроса, даже если вы вытрете element.args().record() - все равно у вас будет дергаться linkActive() при каждом телодвижении на вызывающей форме, пусть и вхолостую. Единственный известный мне способ бороться с этим: запомнить переданную при вызове формы запись и вытереть ссылку на нее из element.args().record() ДО вызова init() формы.
За это сообщение автора поблагодарили: tricky (1).
Старый 28.10.2009, 02:12   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Исправил ошибку в коде в своем сообщении.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
все равно у вас будет дергаться linkActive() при каждом телодвижении на вызывающей форме, пусть и вхолостую.
Есть такой момент... Но если речь идет о том, чтобы не менялся набор записей в вызываемой форме при условии отсутствия перекрытого метода linkActive - то приведенного мною примера достаточно. Хотя "зарубку" в отношении этой особенности оставить себе надо
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: DSPIC (2).
Старый 28.10.2009, 10:04   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
В форме2, в методе init датасорса, на который накладывается ненужный dynalink - можно вставить код:
X++:
    Query                query   = new Query();
    Query                dsquery = _ds.query();
    QueryBuildDataSource qbds;
    ;
    super();
    dsquery = _ds.query();
    qbds = dsquery.dataSourceName(_ds.name());
    SysQuery::queryAddDynaCursorAsRangeAndValue(query, dsquery, qbds.id());
    _ds.query(query);
Ой! А что за метод queryAddDynaCursorAsRangeAndValue?
Если я правильно понял коммент:
Цитата:
// This method will traverse dynalinks on QueryBuildDataSource represented by _queryDynaBdsNo
// and convert current dyna-record into ranges and values on that QueryBuildDataSource
, то он конвертит Dynalinks в статические Ranges+Values. Т.е. в данном случае, при открытии дочерней формы "Dynalink" один раз таки сработает, после чего дочерний курсор "отвяжется"?

Спасибо, интересно.

Я пользовался такой конструкцией:
X++:
this.query().dataSourceTable(tablenum(Address)).clearDynalinks();
Как я понимаю - тоже самое, но без первого спозиционирования?
Старый 28.10.2009, 10:10   #6  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
2 sukhanchik: а можно привести исходный код медода queryAddDynaCursorAsRangeAndValue(), а то у меня его нет
Старый 28.10.2009, 10:19   #7  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от ice Посмотреть сообщение
2 sukhanchik: а можно привести исходный код медода queryAddDynaCursorAsRangeAndValue(), а то у меня его нет
X++:
// This method will traverse dynalinks on QueryBuildDataSource represented by _queryDynaBdsNo
// and convert current dyna-record into ranges and values on that QueryBuildDataSource
static client server void queryAddDynaCursorAsRangeAndValue(
    Query   _query,             // new query
    Query   _queryDyna,         // query having external links (=dyna links)
    Integer _queryDynaBdsNO     // queryBuildDataSource on _queryDyna having external links
    )
{
    QueryBuildRange     toQbr;
    QueryBuildDynalink  qbDyna;
    Counter             dynaLinkNo = 1;
    Counter             toI;
    DictField           dictField;
    Integer             dictIndex;
    Integer             originalId;
    Integer             queryDsNO = _queryDynaBdsNO;
    fieldId             id;
    ;
    if (!_queryDynaBdsNO)
        return;

    if (!_query || !_queryDyna)
        throw error(strfmt("@SYS23669",funcname()));

    if (!_queryDyna.dataSourceNo(_queryDynaBdsNO))
        throw error(strfmt("@SYS23667",funcname()));

    if (_query.dataSourceCount() < _queryDynaBdsNO || _query.dataSourceNo(_queryDynaBdsNO).file() != _queryDyna.dataSourceNo(_queryDynaBdsNO).file())
    {
        _query.addDataSource(_queryDyna.dataSourceNo(_queryDynaBdsNO).file());
        queryDsNO = _query.dataSourceCount();
    }
    while (dynaLinkNo <= _queryDyna.dataSourceNo(_queryDynaBdsNO).dynalinkCount())
    {
        qbDyna      = _queryDyna.dataSourceNo(_queryDynaBdsNO).dynalink(dynaLinkNo);
        id          = fieldExt2Id(qbDyna.field());
        originalId  = id;
        toQbr       = null;

        if (_query.dataSourceNo(queryDsNO).findRange(id))
        {
            toI = 1;
            while (true)
            {
                toQbr  = _query.dataSourceNo(queryDsNO).findRange(id,toI);
                if (!toQbr || !toQbr.value() || toQbr.value() == queryValue(qbDyna.cursor().(qbDyna.dynamicField())))
                    break;
                toI++;
            }
        }
        if (!toQbr || (toQbr && toQbr.value() && queryValue(qbDyna.cursor().(qbDyna.dynamicField())) && toQbr.value() != queryValue(qbDyna.cursor().(qbDyna.dynamicField()))))
        {
            // is this a Dimension field?
            dictField = new DictField(_query.dataSourceNo(queryDsNO).table(),id);

            if (dictField.arraySize() > 1)
            {
                // yes, working with Array field
                dictIndex = originalId >> 16;
                toQbr  = _query.dataSourceNo(queryDsNO).addRange(fieldId2Ext(id, dictIndex));
            }
            else
            {
                toQbr  = _query.dataSourceNo(queryDsNO).addRange(id);
            }
        }
        if (toQbr)
            toQbr.value(queryValue(qbDyna.cursor().(qbDyna.dynamicField())));

        dynaLinkNo++;
    }
}
За это сообщение автора поблагодарили: lev (2).
Старый 28.10.2009, 11:29   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Ой! А что за метод queryAddDynaCursorAsRangeAndValue?
Если я правильно понял коммент:


, то он конвертит Dynalinks в статические Ranges+Values. Т.е. в данном случае, при открытии дочерней формы "Dynalink" один раз таки сработает, после чего дочерний курсор "отвяжется"?

Спасибо, интересно.

Я пользовался такой конструкцией:
X++:
this.query().dataSourceTable(tablenum(Address)).clearDynalinks();
Как я понимаю - тоже самое, но без первого спозиционирования?
clearDynalinkls() очистит просто диналинки (и соотв снимутся фильтры, а не просто пропадет позиционирование). А тут (важно) - сохранится условие фильтрации (записи будут не все). Этот метод удобно использовать - если нужно запаковать Query (как известно - query, содержащие диналинки не пакуются) - и я его использовал именно для этих целей.

Да, конечно, после убирания диналинка - курсор "отвяжется". Это заметно на ряде форм, которые открываются без диналинков - например, форма Работа с документами (DocuView). Там эффект диналинка делается "вручную" на init и executeQuery датасорса. Плюс также переход к исходному документу из бух проводок к примеру также для каждой строки нужно делать (т.е. формы отвязаны)

Вообще - класс SysQuery достаточно интересный в плане наличия в нем методов. (DAX 4.0 SP2)
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 28.10.2009 в 11:46.
Старый 28.10.2009, 11:54   #9  
deo is offline
deo
DAX 3.0;4.0;5.0
 
4 / 10 (1) +
Регистрация: 28.07.2009
Вроде как работает
Всем огромное спасибо за помощь!
Теги
dynalink, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как настроить DynaLink или фильтр в форме s.alex DAX: Программирование 9 31.08.2009 14:54
axaptapedia: Tutorial Form Dynalink Blog bot DAX Blogs 0 22.08.2007 23:00
Как программно разорвать или восстановить соединение через AxaptaCOMConnector? sschainik DAX: Программирование 3 24.11.2006 08:49
Ошибка (?) в периодических журналах ГК Anais DAX: Функционал 1 10.06.2005 13:20
Создание строк в журналах ГК May DAX: Функционал 2 03.01.2004 23:29

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

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

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