11.04.2012, 09:51 | #1 |
Участник
|
DocuRef, addlink на форму
Есть форма договоров RContractTable
Нужно на отдельной закладке вывести список документов к конкретному договору. Добавляю в датасорсы таблицу DocuRef, LinkType=Delayed, перекрываю init и пишу там: X++: void init() { Query q; QueryBuildDataSource qbds; ; super(); q = new Query(); qbds = q.addDataSource(tablenum(DocuRef)); qbds.addLink(fieldnum(RContractTable, RecId), fieldnum(DocuRef,RefRecId)); this.query(q); } Источник данных не входит в состав родительского источника данных. |
|
11.04.2012, 10:26 | #2 |
Участник
|
Цитата:
Зачем вы новый query создаёте? Так вроде должно работать: X++: void init() { ; super(); this.query().dataSourceName(this.name()).addLink(fieldnum(RContractTable, RecId), fieldnum(DocuRef,RefRecId)); } Последний раз редактировалось S.Kuskov; 11.04.2012 в 10:30. |
|
11.04.2012, 11:25 | #3 |
Участник
|
JoinSource заполнено, = RContractTable
с query там производятся другие манипуляции, но сути это не меняет. По вашему примеру выдает такую же ошибку как у меня: Источник данных не входит в состав родительского источника данных. |
|
11.04.2012, 11:52 | #4 |
Участник
|
|
|
11.04.2012, 11:53 | #5 |
Участник
|
Попробовал сделать через DictRelation
X++: public void init() { DictRelation dr; ; super(); //this.query().dataSourceName(this.name()).addLink(fieldnum(RContractTable, RecId), fieldnum(DocuRef, RefRecId)); dr = new DictRelation(tablenum(DocuRef)); dr.loadNameRelation(literalstr(RContractTable)); this.query().dataSourceName(this.name()).addRelation(dr); } |
|
11.04.2012, 12:01 | #6 |
Участник
|
Проблема не в способе задания линка, а в том что система почему-то не считает датасурс DocuRef подчинённым к RContractTable. Система ведёт себя так как будто бы это два обособленных источника данных (как если бы свойство JoinSource не было бы заполненно).
|
|
11.04.2012, 12:01 | #7 |
Участник
|
|
|
11.04.2012, 12:11 | #8 |
Ищущий знания...
|
Я бы при решении этой проблемы изучил форму DocView (вызвал бы с формы договов формочку документооборота, посмотрел бы что за запрос уходит, как он строится на форме документооборота).
Ведь по сути в ней открывается таблица DocuRef, связанная с какой либо аксаптовской таблицей, значит там либо отрабатывает какой то хитрый линк, либо запрограммирован какой нибудь хитрый запрос...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
11.04.2012, 12:21 | #9 |
Участник
|
Ну раз с InnerJoin работает, то этим можно воспользоваться
workaround: X++: public void init() { int linkType_orig = this.linkType(); ; this.linkType(FormLinkType::InnerJoin); super(); this.linkType(linkType_orig); this.query().dataSourceName(this.name()).addLink(fieldnum(RContractTable, RecId), fieldnum(DocuRef,RefRecId)); } Последний раз редактировалось S.Kuskov; 11.04.2012 в 12:23. |
|
11.04.2012, 14:12 | #10 |
Мрачный тип
|
Я извиняюсь, но никак не могу не спросить - а что мешает Relation в Docuref'е повесить на RContractTable и не маяться ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
11.04.2012, 14:32 | #11 |
Участник
|
Пробовал через relation, неявно он его не подхватывает, а если перекрыть init и сделать
X++: addRelation(dr); |
|
11.04.2012, 14:36 | #12 |
Участник
|
Цитата:
Но в общем случае, например когда способ связи определяется в runtime, это не поможет Последний раз редактировалось S.Kuskov; 11.04.2012 в 14:52. |
|
11.04.2012, 14:51 | #13 |
Участник
|
А у меня подхватывает ...
Кажется я понял в чём соль. В случае с LinkType = Delayed. Система реализует связь источников не через join, а через механиз DynaLink! Поэтому такой источник данных становится "подчинённым" только косвенно и выборка данных из него будет осуществляться дополнительным запросом. Итого. В таких случаях нужно использовать не AddLink, а addDynalink X++: public void init() { super(); this.query().dataSourceNo(1).addDynalink(fieldnum(DocuRef,RefRecId), RContractTable, fieldnum(RContractTable, RecId)); } |
|
|
За это сообщение автора поблагодарили: Alenka (1), alvares (1). |
11.04.2012, 15:07 | #14 |
Участник
|
Цитата:
Сообщение от S.Kuskov
А у меня подхватывает ...
Кажется я понял в чём соль. В случае с LinkType = Delayed. Система реализует связь источников не через join, а через механиз DynaLink! Поэтому такой источник данных становится "подчинённым" только косвенно и выборка данных из него будет осуществляться дополнительным запросом. Итого. В таких случаях нужно использовать не AddLink, а addDynalink X++: public void init() { super(); this.query().dataSourceNo(1).addDynalink(fieldnum(DocuRef,RefRecId), RContractTable, fieldnum(RContractTable, RecId)); } Но таки не понятно почему эта таблица особенная? С остальными таблицами же прокатывает addlink |
|
11.04.2012, 15:21 | #15 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: lev (5). |
Теги |
delayed, docuref, dynalink, linktype, querybuilddatasource |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|