27.10.2009, 20:19 | #1 |
DAX 3.0;4.0;5.0
|
Как разорвать dynalink в журналах?
Здравствуйте!
Форма2 вызывается из формы1. Все стандартные связи работаю правильно: когда открыты обе формы, то перемещаясь по записям формы1 обновляются связанные записи формы2. Эти две формы созданы на основе стандартного журнального фреймворка. Подскажите пожалуйста, как в таком случае разорвать dynalink? Т.е. journalTrans (форма2) открывшись с определенным набором записей не должна обновляться при перемещении курсора по journalTable (форма1). |
|
27.10.2009, 20:44 | #2 |
Administrator
|
В форме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 |
Участник
|
У механизма dynalink есть еще одна неприятная особенность: даже если вы вытрете dynalink из запроса, даже если вы вытрете element.args().record() - все равно у вас будет дергаться linkActive() при каждом телодвижении на вызывающей форме, пусть и вхолостую. Единственный известный мне способ бороться с этим: запомнить переданную при вызове формы запись и вытереть ссылку на нее из element.args().record() ДО вызова init() формы.
|
|
|
За это сообщение автора поблагодарили: tricky (1). |
28.10.2009, 02:12 | #4 |
Administrator
|
Исправил ошибку в коде в своем сообщении.
Есть такой момент... Но если речь идет о том, чтобы не менялся набор записей в вызываемой форме при условии отсутствия перекрытого метода linkActive - то приведенного мною примера достаточно. Хотя "зарубку" в отношении этой особенности оставить себе надо
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: DSPIC (2). |
28.10.2009, 10:04 | #5 |
Боец
|
Цитата:
Сообщение от 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); Если я правильно понял коммент: Цитата:
// This method will traverse dynalinks on QueryBuildDataSource represented by _queryDynaBdsNo
// and convert current dyna-record into ranges and values on that QueryBuildDataSource Спасибо, интересно. Я пользовался такой конструкцией: X++: this.query().dataSourceTable(tablenum(Address)).clearDynalinks(); |
|
28.10.2009, 10:10 | #6 |
Участник
|
2 sukhanchik: а можно привести исходный код медода queryAddDynaCursorAsRangeAndValue(), а то у меня его нет
|
|
28.10.2009, 10:19 | #7 |
Боец
|
Цитата:
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 |
Administrator
|
Цитата:
Сообщение от DSPIC
Ой! А что за метод queryAddDynaCursorAsRangeAndValue?
Если я правильно понял коммент: , то он конвертит Dynalinks в статические Ranges+Values. Т.е. в данном случае, при открытии дочерней формы "Dynalink" один раз таки сработает, после чего дочерний курсор "отвяжется"? Спасибо, интересно. Я пользовался такой конструкцией: X++: this.query().dataSourceTable(tablenum(Address)).clearDynalinks(); Да, конечно, после убирания диналинка - курсор "отвяжется". Это заметно на ряде форм, которые открываются без диналинков - например, форма Работа с документами (DocuView). Там эффект диналинка делается "вручную" на init и executeQuery датасорса. Плюс также переход к исходному документу из бух проводок к примеру также для каждой строки нужно делать (т.е. формы отвязаны) Вообще - класс SysQuery достаточно интересный в плане наличия в нем методов. (DAX 4.0 SP2)
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 28.10.2009 в 11:46. |
|
28.10.2009, 11:54 | #9 |
DAX 3.0;4.0;5.0
|
Вроде как работает
Всем огромное спасибо за помощь! |
|