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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.08.2010, 10:29   #1  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Конструктор 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.
Старый 12.08.2010, 11:21   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от raniel Посмотреть сообщение
Как понимаю в первом случае, когда я на таблицу ProdRoute накладываю Ranges, то на вторую такуюже таблицу оно не накладывается. Как мне это обойти? Может есть возможность наложить на обе одноимённые таблицы условие?
А к какому датасорсу накладываете Range ? Есть подозрение, что он получен чем-то типа такой конструкции :
X++:
datasource = query.datasourceTable(< >)
datasourceTable() имеет у себя два параметра - код таблицы(обязательный) и номер экземпляра такой таблицы в дереве запроса (опционален, по умолчанию = 1).
Т.е. обращаетесь и накладываете фильтр только на первый экземпляр.
Чтобы наложить Range на второй экземпляр - инициализируйте доп.датасорс с явным указанием номера экземпляра, равным двум, и уже на него накладывайте такой же Range
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: raniel (1).
Старый 12.08.2010, 12:09   #3  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Примерно так выглядит код:
Цитата:
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));
...
После в методе executeQuery уже передаю значения...
Цитата:
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());
...
Старый 12.08.2010, 12:20   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Попробуйте в конце метода executeQuery() вставить такой код:
X++:
info(this.Query().DataSourceNo(1).toString());
И результат запостьте сюда. Может текст запроса что-то прояснит.
Старый 12.08.2010, 12:41   #5  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Попробуйте в конце метода executeQuery() вставить такой код:
X++:
info(this.Query().DataSourceNo(1).toString());
И результат запостьте сюда. Может текст запроса что-то прояснит.
Вот что вышло по всем 3 DataSource:
Цитата:
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
А вот сам Query
Название: AOS.jpg
Просмотров: 762

Размер: 46.3 Кб
Старый 12.08.2010, 12:45   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от raniel Посмотреть сообщение
Примерно так выглядит код:
X++:
void init()
{

super();

this.query(new Query(querystr(ProdRouteOprOverview2)));
Не, ни в коем случае не делаейте new Query.
вы же напрочь убиваете весь механизм dynalink.

понятно, что сейчас вы вашу форму не вызываете из других.
но это не значит, что вы не захотите открыть вашу форму из другого места. А dynalink у вас и не работает.
__________________
полезное на axForum, github, vk, coub.
Старый 12.08.2010, 12:50   #7  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
Не, ни в коем случае не делаейте new Query.
вы же напрочь убиваете весь механизм dynalink.

понятно, что сейчас вы вашу форму не вызываете из других.
но это не значит, что вы не захотите открыть вашу форму из другого места. А dynalink у вас и не работает.
Это так было.....изначально так было написано до меня....моя задача добавить связь с другой таблицей...чтоб на форме можно было бы фильтровать значения...
Старый 12.08.2010, 12:55   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от raniel Посмотреть сообщение
Вот что вышло по всем 3 DataSource: ..
Стоп! Откуда три запроса? executeQuery() какого DataSource вы перекрываете?
Должен быть один текст запроса, полученный по первому (верхнему) DataSource. В тексте запроса должны быть видны все подчинйнные таблицы и связи между ними.

Попробуйте вот так:
X++:
info(this.Query().DataSourceName(this.name()).toString());
Старый 12.08.2010, 13:02   #9  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от 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
Старый 12.08.2010, 13:14   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от raniel Посмотреть сообщение
а при info(this.Query().DataSourceName(this.name()).toString()); выходит Ошибка
А зачем вы в написали это в методе init()? Договаривались же вроде в конце метода executeQuery().
Старый 12.08.2010, 13:26   #11  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А зачем вы в написали это в методе init()? Договаривались же вроде в конце метода executeQuery().
Там тоже так же ругается... а по трём пред идущим 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
Старый 12.08.2010, 13:31   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от 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).
Старый 12.08.2010, 13:34   #13  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
и что то я в коде не нашел строчки, в которой вы прикрепляете таблицу ProdRoute к запросу полученному из ProdRouteOprOverview2.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 12.08.2010, 13:36   #14  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от lev Посмотреть сообщение
и что то я в коде не нашел строчки, в которой вы прикрепляете таблицу ProdRoute к запросу полученному из ProdRouteOprOverview2.
Так метод init таблицы ProdRoute и там именно его Query this.query(new Query(querystr(ProdRouteOprOverview2)));
Старый 12.08.2010, 13:38   #15  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от raniel Посмотреть сообщение
так вот же эта таблица на самом вверху
Вложение 6013
Извините недоглядел вижу
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 12.08.2010, 13:43   #16  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
попробуйте для начала посмотреть что получается из "чистого" АОТовского запроса.
Т.е. закоментируйте добавление ренджы в методе формы init() и добавление value в эти ренджы в методе формы executeQuery(). В методе executeQuery() напишите перед супер строку
X++:
info(this.Query().DataSourceNo(1).toString());
так проверим на сколько вообще правильно построен изначально запрос.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 12.08.2010, 13:44   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
Судя по первому у Вас не джойнятся таблицы между собой. В инфо по первому дата соурсу должен быть целиковый запрос со всеми джойнами.
Именно!

Но меня ещё всё-таки волнует чистота эксперимента. Попробуйте запустить ещё такой тестовый джоб:
X++:
static void JobTestQueryProdRouteOprOverview2(Args _args)
{
    Query Query = new Query(querystr(ProdRouteOprOverview2));
    ;
    
    info(Query.dataSourceNo(1).toString());
}
Старый 12.08.2010, 13:54   #18  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
ещё вопрос
в АОТовском запросе ProdRouteOprOverview2, у датаСорсов прикрепленных к ProdRoute свойство FetchMode какое?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 12.08.2010, 13:59   #19  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Именно!

Но меня ещё всё-таки волнует чистота эксперимента. Попробуйте запустить ещё такой тестовый джоб:
X++:
static void JobTestQueryProdRouteOprOverview2(Args _args)
{
    Query Query = new Query(querystr(ProdRouteOprOverview2));
    ;
    
    info(Query.dataSourceNo(1).toString());
}
Хм сделал ... результат такой же:
Цитата:
Информация:
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
вот как выглядил Кверик до моих изменений(там как было первый и как стало второй):
Нажмите на изображение для увеличения
Название: AOT2.jpg
Просмотров: 266
Размер:	68.4 Кб
ID:	6014
Старый 12.08.2010, 14:04   #20  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от lev Посмотреть сообщение
ещё вопрос
в АОТовском запросе ProdRouteOprOverview2, у датаСорсов прикрепленных к ProdRoute свойство FetchMode какое?
вопрос остается открытым
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
jinx: Dynamics AX &ndash; Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:13.