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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.04.2012, 09:51   #1  
alvares is offline
alvares
Участник
 
45 / 12 (1) ++
Регистрация: 27.10.2011
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от alvares Посмотреть сообщение
При запуске получаю:
Источник данных не входит в состав родительского источника данных.
Свойство JoinSource у вас заполнено на датасурсе?

Зачем вы новый 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  
alvares is offline
alvares
Участник
 
45 / 12 (1) ++
Регистрация: 27.10.2011
JoinSource заполнено, = RContractTable

с query там производятся другие манипуляции, но сути это не меняет.

По вашему примеру выдает такую же ошибку как у меня: Источник данных не входит в состав родительского источника данных.
Старый 11.04.2012, 11:52   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от alvares Посмотреть сообщение
По вашему примеру выдает такую же ошибку как у меня: Источник данных не входит в состав родительского источника данных.
Действительно. Интересно что если LinkType = InnerJoin, то оно работает. Странно
Старый 11.04.2012, 11:53   #5  
alvares is offline
alvares
Участник
 
45 / 12 (1) ++
Регистрация: 27.10.2011
Попробовал сделать через 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Проблема не в способе задания линка, а в том что система почему-то не считает датасурс DocuRef подчинённым к RContractTable. Система ведёт себя так как будто бы это два обособленных источника данных (как если бы свойство JoinSource не было бы заполненно).
Старый 11.04.2012, 12:01   #7  
alvares is offline
alvares
Участник
 
45 / 12 (1) ++
Регистрация: 27.10.2011
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Действительно. Интересно что если LinkType = InnerJoin, то оно работает. Странно
c InnerJoin тоже попробовал, но это не так интересно
Старый 11.04.2012, 12:11   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Я бы при решении этой проблемы изучил форму DocView (вызвал бы с формы договов формочку документооборота, посмотрел бы что за запрос уходит, как он строится на форме документооборота).

Ведь по сути в ней открывается таблица DocuRef, связанная с какой либо аксаптовской таблицей, значит там либо отрабатывает какой то хитрый линк, либо запрограммирован какой нибудь хитрый запрос...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.04.2012, 12:21   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ну раз с 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));
}
to lev: Дело не в DocuRef. Проблема воспроизводится и на других таблицах (без преднастроенных связей). Баг ...

Последний раз редактировалось S.Kuskov; 11.04.2012 в 12:23.
Старый 11.04.2012, 14:12   #10  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Я извиняюсь, но никак не могу не спросить - а что мешает Relation в Docuref'е повесить на RContractTable и не маяться ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 11.04.2012, 14:32   #11  
alvares is offline
alvares
Участник
 
45 / 12 (1) ++
Регистрация: 27.10.2011
Пробовал через relation, неявно он его не подхватывает, а если перекрыть init и сделать
X++:
addRelation(dr);
вышибает клиент...
Старый 11.04.2012, 14:36   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Я извиняюсь, но никак не могу не спросить - а что мешает Relation в Docuref'е повесить на RContractTable и не маяться ?
Ничего не мешает Туда можно повесить ссылки вообще на все таблицы
Но в общем случае, например когда способ связи определяется в runtime, это не поможет

На самом деле здесь имеет место явный баг ядра. Если на датасурсе настроено свойство JoinSource, то это должно всегда делать этот датасурс подчинённым. Даже если преднастроенных связей между таблицами нет.

Последний раз редактировалось S.Kuskov; 11.04.2012 в 14:52.
Старый 11.04.2012, 14:51   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от alvares Посмотреть сообщение
Пробовал через relation, неявно он его не подхватывает ...
А у меня подхватывает ...

Кажется я понял в чём соль. В случае с 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  
alvares is offline
alvares
Участник
 
45 / 12 (1) ++
Регистрация: 27.10.2011
Цитата:
Сообщение от 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от alvares Посмотреть сообщение
Но таки не понятно почему эта таблица особенная?
С остальными таблицами же прокатывает addlink
Нет никакая она не особенная. Это справедливо для всех таблиц. Всё дело в типе связи. Связь с типом delayed задаётся только при помощи AddDynaLink, и никогда через AddLink.
За это сообщение автора поблагодарили: lev (5).
Теги
delayed, docuref, dynalink, linktype, querybuilddatasource

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблемы с трансфером DocuRef HorrR DAX: Программирование 4 01.11.2010 18:50
Вложение файлов через метод .NET Business Connector (DocuRef, DocuValue) kornix DAX: Программирование 6 18.09.2009 10:36
Как вывести форму в верхнем левом углу? miklenew DAX: Программирование 7 09.02.2009 13:53
Можно ли редактировать форму, если на нее наложен addRange? Hans DAX: Программирование 10 22.05.2006 16:35
Проблема - не получается редактировать форму shestakov DAX: Программирование 1 18.12.2001 13:32

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.