|  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 | 
			
			Вроде как работает   Всем огромное спасибо за помощь! | 
|  | 
| Теги | 
| dynalink, полезное | 
|  | 
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |