![]() |
#1 |
Участник
|
Конструктор Query
Столкнулся с такой на первый взгляд простой задачей.
Есть форма, у ней есть DataSource ProdRoute. Вот у него в методе init. Идет привязка готового Query из AOT. Там запрос составленый из 2-х таблиц ProdRoute - ProdTable. this.query(new Query(querystr(ProdRouteOprOverview))); Необходимо также в связку добавить таблицу RouteOprTable... связь возможна только: ProdRoute- ProdTable - ProdRoute. - RouteOprTable либо ProdRoute - ProdTable - RouteOprTable Ни в том, ни в другом случае это нормально не работает... Как понимаю в первом случае, когда я на таблицу ProdRoute накладываю Ranges, то на вторую такуюже таблицу оно не накладывается. Как мне это обойти? Может есть возможность наложить на обе одноимённые таблицы условие? Поменять очерёдность DataSource-ов не могу....вообще всё перестаёт работать. Заранее спасибо. Последний раз редактировалось raniel; 12.08.2010 в 11:10. |
|
![]() |
#2 |
Мрачный тип
|
Цитата:
X++: datasource = query.datasourceTable(< >) Т.е. обращаетесь и накладываете фильтр только на первый экземпляр. Чтобы наложить Range на второй экземпляр - инициализируйте доп.датасорс с явным указанием номера экземпляра, равным двум, и уже на него накладывайте такой же Range
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
|
За это сообщение автора поблагодарили: raniel (1). |
![]() |
#3 |
Участник
|
Примерно так выглядит код:
Цитата:
void init()
{ super(); this.query(new Query(querystr(ProdRouteOprOverview2))); criteriaTaskGroupId = this.query().dataSourceTable(tablenum(ProdRoute)).addRange(fieldnum(ProdRoute,TaskGroupId)); criteriaWrkCtrId = this.query().dataSourceTable(tablenum(ProdRoute)).addRange(fieldnum(ProdRoute,WrkCtrId)); criteriaOprId = this.query().dataSourceTable(tablenum(ProdRoute)).addRange(fieldnum(ProdRoute,OprId)); criteriaProdStatus = this.query().dataSourceTable(tablenum(ProdTable)).addRange(fieldnum(ProdTable,ProdStatus)); criteriaOprName = this.query().dataSourceTable(tablenum(ProdTable)).addRange(fieldnum(ProdTable,Name)); criteriaExpired = this.query().dataSourceTable(tablenum(ProdRoute)).addRange(fieldnum(ProdRoute,ToDate)); criteriaRouteOprName = this.query().dataSourceTable(tablenum(RouteOprTable)).addRange(fieldnum(RouteOprTable,Name)); ... Цитата:
void executeQuery()
{ if (ctrlLockTaskGroup.value()) criteriaTaskGroupId.value(queryValue(ctrlTaskGroupId.text())); else criteriaTaskGroupId.value(SysQuery::valueUnlimited()); if (ctrlLockOprId.value()) criteriaOprId.value(queryValue(ctrlOprId.text())); else criteriaOprId.value(SysQuery::valueUnlimited()); ... |
|
![]() |
#4 |
Участник
|
Попробуйте в конце метода executeQuery() вставить такой код:
X++: info(this.Query().DataSourceNo(1).toString()); |
|
![]() |
#5 |
Участник
|
Цитата:
Цитата:
Info Сообщение (12:41:44) SELECT * FROM ProdRoute ORDER BY ProdRoute.FromDate ASC, ProdRoute.FromTime ASC
Info Сообщение (12:41:44) SELECT * FROM ProdTable WHERE ProdRoute.ProdId = ProdTable.ProdId Info Сообщение (12:41:44) SELECT * FROM RouteOprTable WHERE ProdRoute.OprId = RouteOprTable.OprId |
|
![]() |
#6 |
Участник
|
Цитата:
вы же напрочь убиваете весь механизм dynalink. понятно, что сейчас вы вашу форму не вызываете из других. но это не значит, что вы не захотите открыть вашу форму из другого места. А dynalink у вас и не работает. |
|
![]() |
#7 |
Участник
|
Это так было.....изначально так было написано до меня....моя задача добавить связь с другой таблицей...чтоб на форме можно было бы фильтровать значения...
|
|
![]() |
#8 |
Участник
|
Стоп! Откуда три запроса? executeQuery() какого DataSource вы перекрываете?
Должен быть один текст запроса, полученный по первому (верхнему) DataSource. В тексте запроса должны быть видны все подчинйнные таблицы и связи между ними. Попробуйте вот так: X++: info(this.Query().DataSourceName(this.name()).toString()); |
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() Стоп! Откуда три запроса? executeQuery() какого DataSource вы перекрываете?
Должен быть один текст запроса, полученный по первому (верхнему) DataSource. В тексте запроса должны быть видны все подчинйнные таблицы и связи между ними. Попробуйте вот так: X++: info(this.Query().DataSourceName(this.name()).toString()); info(this.Query().DataSourceNo(1).toString()); info(this.Query().DataSourceNo(2).toString()); info(this.Query().DataSourceNo(3).toString()); чтоб всё увидеть. а при info(this.Query().DataSourceName(this.name()).toString()); выходит Ошибка: Ошибка времени выполнения: QueryBuildDataSource Объект не инициализирован. Трассировка стека (C)\Classes\QueryBuildDataSource\toString (C)\Forms\ProdRouteOprOverview\Data Sources\ProdRoute\Methods\init - line 68 |
|
![]() |
#10 |
Участник
|
|
|
![]() |
#11 |
Участник
|
Цитата:
Сообщение (13:31:07) SELECT * FROM ProdRoute ORDER BY ProdRoute.FromDate ASC, ProdRoute.FromTime ASC WHERE ((NOT (Stopped = 1))) SELECT * FROM ProdTable WHERE ProdRoute.ProdId = ProdTable.ProdId AND ((ProdStatus>=2 AND ProdStatus<=4)) SELECT * FROM RouteOprTable WHERE ProdRoute.OprId = RouteOprTable.OprId |
|
![]() |
#12 |
Ищущий знания...
|
Цитата:
Сообщение от raniel
![]() Там тоже так же ругается... а по трём пред идущим info вот что выходит
Сообщение (13:31:07) SELECT * FROM ProdRoute ORDER BY ProdRoute.FromDate ASC, ProdRoute.FromTime ASC WHERE ((NOT (Stopped = 1))) SELECT * FROM ProdTable WHERE ProdRoute.ProdId = ProdTable.ProdId AND ((ProdStatus>=2 AND ProdStatus<=4)) SELECT * FROM RouteOprTable WHERE ProdRoute.OprId = RouteOprTable.OprId
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: raniel (1). |
![]() |
#13 |
Ищущий знания...
|
и что то я в коде не нашел строчки, в которой вы прикрепляете таблицу ProdRoute к запросу полученному из ProdRouteOprOverview2.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#14 |
Участник
|
|
|
![]() |
#15 |
Ищущий знания...
|
Цитата:
Сообщение от raniel
![]() так вот же эта таблица на самом вверху
Вложение 6013 ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#16 |
Ищущий знания...
|
попробуйте для начала посмотреть что получается из "чистого" АОТовского запроса.
Т.е. закоментируйте добавление ренджы в методе формы init() и добавление value в эти ренджы в методе формы executeQuery(). В методе executeQuery() напишите перед супер строку X++: info(this.Query().DataSourceNo(1).toString());
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
![]() |
#17 |
Участник
|
Цитата:
Но меня ещё всё-таки волнует чистота эксперимента. Попробуйте запустить ещё такой тестовый джоб: X++: static void JobTestQueryProdRouteOprOverview2(Args _args) { Query Query = new Query(querystr(ProdRouteOprOverview2)); ; info(Query.dataSourceNo(1).toString()); } |
|
![]() |
#18 |
Ищущий знания...
|
ещё вопрос
![]() в АОТовском запросе ProdRouteOprOverview2, у датаСорсов прикрепленных к ProdRoute свойство FetchMode какое?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#19 |
Участник
|
Цитата:
Цитата:
Информация:
SELECT * FROM ProdRoute ORDER BY ProdRoute.FromDate ASC, ProdRoute.FromTime ASC Все связи в Query я прописал через AOT Кстати вот убрал свою ветку в запросе и результат стал вот таким: Цитата:
Информация:
SELECT * FROM ProdRoute ORDER BY ProdRoute.FromDate ASC, ProdRoute.FromTime ASC EXISTS JOIN * FROM ProdTable WHERE ProdRoute.ProdId = ProdTable.ProdId |
|
![]() |
#20 |
Ищущий знания...
|
Цитата:
![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|