AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 27.10.2009, 20:19   #1  
deo ist offline
deo
DAX 3.0;4.0;5.0
 
4 / 10 (1) +
Registriert seit: 28.07.2009
Как разорвать dynalink в журналах?
Здравствуйте!

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

Подскажите пожалуйста, как в таком случае разорвать dynalink? Т.е. journalTrans (форма2) открывшись с определенным набором записей не должна обновляться при перемещении курсора по journalTable (форма1).
Alt 27.10.2009, 20:44   #2  
sukhanchik ist offline
sukhanchik
Administrator
Benutzerbild von sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.342 / 3563 (125) ++++++++++
Registriert seit: 13.06.2004
Ort: Москва
В форме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);
__________________
Возможно сделать все. Вопрос времени

Geändert von sukhanchik (28.10.2009 um 02:13 Uhr) Grund: Исправил ошибку в коде
This post has been rated by: deo (1).
Alt 27.10.2009, 23:31   #3  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
У механизма dynalink есть еще одна неприятная особенность: даже если вы вытрете dynalink из запроса, даже если вы вытрете element.args().record() - все равно у вас будет дергаться linkActive() при каждом телодвижении на вызывающей форме, пусть и вхолостую. Единственный известный мне способ бороться с этим: запомнить переданную при вызове формы запись и вытереть ссылку на нее из element.args().record() ДО вызова init() формы.
This post has been rated by: tricky (1).
Alt 28.10.2009, 02:12   #4  
sukhanchik ist offline
sukhanchik
Administrator
Benutzerbild von sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.342 / 3563 (125) ++++++++++
Registriert seit: 13.06.2004
Ort: Москва
Исправил ошибку в коде в своем сообщении.

Zitat:
Zitat von gl00mie Beitrag anzeigen
все равно у вас будет дергаться linkActive() при каждом телодвижении на вызывающей форме, пусть и вхолостую.
Есть такой момент... Но если речь идет о том, чтобы не менялся набор записей в вызываемой форме при условии отсутствия перекрытого метода linkActive - то приведенного мною примера достаточно. Хотя "зарубку" в отношении этой особенности оставить себе надо
__________________
Возможно сделать все. Вопрос времени
This post has been rated by: DSPIC (2).
Alt 28.10.2009, 10:04   #5  
DSPIC ist offline
DSPIC
Боец
 
1.077 / 1243 (44) ++++++++
Registriert seit: 11.04.2008
Zitat:
Zitat von sukhanchik Beitrag anzeigen
В форме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?
Если я правильно понял коммент:
Zitat:
// 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();
Как я понимаю - тоже самое, но без первого спозиционирования?
Alt 28.10.2009, 10:10   #6  
ice ist offline
ice
Участник
Benutzerbild von ice
Лучший по профессии 2014
 
1.821 / 402 (17) +++++++
Registriert seit: 23.03.2006
2 sukhanchik: а можно привести исходный код медода queryAddDynaCursorAsRangeAndValue(), а то у меня его нет
Alt 28.10.2009, 10:19   #7  
DSPIC ist offline
DSPIC
Боец
 
1.077 / 1243 (44) ++++++++
Registriert seit: 11.04.2008
Zitat:
Zitat von ice Beitrag anzeigen
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++;
    }
}
This post has been rated by: lev (2).
Alt 28.10.2009, 11:29   #8  
sukhanchik ist offline
sukhanchik
Administrator
Benutzerbild von sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.342 / 3563 (125) ++++++++++
Registriert seit: 13.06.2004
Ort: Москва
Zitat:
Zitat von DSPIC Beitrag anzeigen
Ой! А что за метод queryAddDynaCursorAsRangeAndValue?
Если я правильно понял коммент:


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

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

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

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

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

Geändert von sukhanchik (28.10.2009 um 11:46 Uhr)
Alt 28.10.2009, 11:54   #9  
deo ist offline
deo
DAX 3.0;4.0;5.0
 
4 / 10 (1) +
Registriert seit: 28.07.2009
Вроде как работает
Всем огромное спасибо за помощь!
Stichworte
dynalink, полезное

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Как настроить 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 09:08 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.