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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.06.2010, 11:07   #1  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Query по идентичным DataSource
Доброго времени суток, уважаемые! Помогите новичку)
В DataSourcе отчета есть 2 ветки построенные на основе одинаковых табличек, отличаются ветки только тем, что в одной ветке пользователь задает фильтр по клиентам, в другой по поставщикам. Как правильно построить запрос?

Заранее спасибо!
Старый 30.06.2010, 11:35   #2  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
пишу что то типа:
X++:
boolean                     ret;
Query                       qIn, qOut;
QueryRun                    qrIn, qrOut;
Slvz_Clusters_CodeClusters  ClTblIn, ClTblOut;
;

ClIn            = cls.parmClIn();
ClOut           = cls.parmClOut();

qIn = this.query();// по приходу
qIn.addDataSource(tablenum(Slvz_Clusters_CodeClusters));
qin.dataSourceName("Slvz_Clusters_CodeClusters_in").addRange(fieldnum(Slvz_Clusters_CodeClusters, ClusterId));
qIn.dataSourceName("Slvz_Clusters_CodeClusters_in").rangeField(fieldnum(Slvz_Clusters_CodeClusters, ClusterId)).value(clIn);
qrIn = new QueryRun(qIn);
qrIn.next();
ClTblIn  = qrIn.get(tablenum(Slvz_Clusters_CodeClusters));
info(strfmt("%1",ClTblIn.ClusterId));

qOut = this.query();// по расходу
qOut.addDataSource(tablenum(Slvz_Clusters_CodeClusters));
qOut.dataSourceName("Slvz_Clusters_CodeClusters_Out").addRange(fieldnum(Slvz_Clusters_CodeClusters, ClusterId));
qOut.dataSourceName("Slvz_Clusters_CodeClusters_Out").rangeField(fieldnum(Slvz_Clusters_CodeClusters, ClusterId)).value(clIn);
qrOut = new QueryRun(qOut);
qrOut.next();
ClTblOut  = qrIn.get(tablenum(Slvz_Clusters_CodeClusters));
info(strfmt("%1",ClTblOut.ClusterId));
в info(strfmt("%1",ClTblOut.ClusterId)) - берет данные с ClTblIn.... что не так?
Старый 30.06.2010, 11:45   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
В QueryRun.Get() есть еще один параметр occurrence (по умолчанию 1) - используйте его, чтобы получить данные из второго датасорса
__________________
Axapta v.3.0 sp5 kr2
Старый 30.06.2010, 13:29   #4  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
нашел 2 ошибки в коде) поправил) но параметр occurrence - не помог (в инфолог пустое значение идет)
Старый 30.06.2010, 13:56   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Прошу прощения, не обратил внимания, что это два разных запроса.
Надо так (если использовать имена датасорсов, то необходимо явно указывать его при добавлении таблиц qIn.addDataSource(tablenum(Slvz_Clusters_CodeClusters, "Slvz_Clusters_CodeClusters_in")).
X++:
boolean                     ret;
Query                       qIn, qOut;
QueryRun                    qrIn, qrOut;
QueryBuildDatasource        qbds;
Slvz_Clusters_CodeClusters  ClTblIn, ClTblOut;
;

ClIn            = cls.parmClIn();
ClOut           = cls.parmClOut();

qIn = new Query(this.query().pack(false));// по приходу
qbds = qIn.addDataSource(tablenum(Slvz_Clusters_CodeClusters));
qbds.addRange(fieldnum(Slvz_Clusters_CodeClusters, ClusterId)).value(clIn);
qrIn = new QueryRun(qIn);
qrIn.next();
ClTblIn  = qrIn.get(tablenum(Slvz_Clusters_CodeClusters));
info(strfmt("%1",ClTblIn.ClusterId));

qOut = new Query(this.query().pack(false));// по расходу
qbds = qOut.addDataSource(tablenum(Slvz_Clusters_CodeClusters));
qbds.addRange(fieldnum(Slvz_Clusters_CodeClusters, ClusterId)).value(ClOut);
qrOut = new QueryRun(qOut);
qrOut.next();
ClTblOut  = qrOut.get(tablenum(Slvz_Clusters_CodeClusters));
info(strfmt("%1",ClTblOut.ClusterId));
И еще.
В this.query() - уже есть таблицы?
Если есть, то надо вашу таблицу приджойнивать после добавления
__________________
Axapta v.3.0 sp5 kr2
Старый 30.06.2010, 14:59   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
пишу что то типа
А вы не пишите. А создайте объект Query в AOT (для определенности пусть он называется myQuery).

Тогда в коде просто создавайте программный объект из объекта AOT
X++:
Query q = new Query(querystr(myQuery));
__________________
полезное на axForum, github, vk, coub.
Старый 30.06.2010, 15:04   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
также обратите внимание на порядок получаемых записей, если вы используете несколько таблиц на одном уровне в Query
http://msdn.microsoft.com/en-us/libr...8AX.10%29.aspx
__________________
полезное на axForum, github, vk, coub.
Старый 01.07.2010, 09:03   #8  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Огромное спасибо за ответы!
Но появились вопросы:
1) что дает создание квери в AOT, а не добавление DS в репорте?
2) если создавать в AOT, то нужно 2 квери (по приходу и расходу) и вызывать их последовательно?
3) как вызвать квери? получается из класса?

Пробовал код AndyD использовать - не то(( -
нашел выход:
X++:
ClIn            = cls.parmClIn();
ClOut           = cls.parmClOut();

qIn = new Query(this);
qrIn = new QueryRun(qIn);
while(qrIn.next())
{
    ClTblIn  = qrIn.get(tablenum(Slvz_Clusters_CodeClusters),1);
    ClTblOut = qrIn.get(tablenum(Slvz_Clusters_CodeClusters),2);
    if(ClTblIn)  info(strfmt("%1",ClTblIn.ClusterId));
    else info(strfmt("%1",ClTblOut.ClusterId));
}
но не то что хотелось(( подразумевалось что пользователь заполняет контролы "clIn" "clOut" (контролы на форме запроса) и накладывает фильтр по поставщикам/клиентам (по кнопке "выбор").
P.S. извините за сумбурность)))) только начинаю вникать в мир Аксапты)))
Старый 01.07.2010, 09:20   #9  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
В this.query() - уже есть таблицы - но таба Slvz_Clusters_CodeClusters не должна использоваться для фильтра, она нужна для связи с табличкой LedgerJournalTrans, в свою очередь, она (LedgerJournalTrans) джойнится к клиентам/поставщикам (разумеется в разных ветках).
может я не тот выход нашел (по созданию 2-х веток)? может все програмно сделать (а по кнопке "выбор" - только клиенты/поставщики)? но тогда как связать 2 Query - первый по Slvz_Clusters_CodeClusters (по clIn, clOut), второй по фильтру на клиентов/поставщиков???
Старый 01.07.2010, 10:03   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
Но появились вопросы:
1) что дает создание квери в AOT, а не добавление DS в репорте?
2) если создавать в AOT, то нужно 2 квери (по приходу и расходу) и вызывать их последовательно?
3) как вызвать квери? получается из класса?
1. результат выполнения кверей - идентичен.
Плюсы:
но создавать в AOT намного проще, чем писать большой код.
код получается более компактным.
объект, созданный в AOT, может оптимизировать отдельный человек, не изменяя код.
Минусы:
некоторые условия связи нельзя задать в AOT (только из кода).

См. также обсуждения на форуме с ключевым словом querystr.

2. нужно создавать столько же, сколько кверей из кода.
Это всего лишь способ создания одного и того же.

3. также как и обычно.

Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 330
Размер:	59.6 Кб
ID:	5941
__________________
полезное на axForum, github, vk, coub.
Старый 01.07.2010, 10:35   #11  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
ч то не совсем понял "так же как и обычно")

qin = new query(querystr(Slvz_FactBdds_In));
qrin = new queryrun(qin);
while(qrIn.next())
{
//
}
*пишу в репорте в fetch - на классе кнопки "выбор" нету)) может не правильно вас понял
если создать джобик - нормально)
Старый 01.07.2010, 10:42   #12  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
вот то что хотелось бы видеть в "ветке" по приходу (вторая ветка такая же, только для поставщиков):
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.GIF
Просмотров: 373
Размер:	21.2 Кб
ID:	5942  
Старый 01.07.2010, 10:47   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
*пишу в репорте в fetch - на классе кнопки "выбор" нету)) может не правильно вас понял если создать джобик - нормально)
да ради бога: опять же накидывайте таблицы в AOT, а не добавляйте в коде
Название: 1.PNG
Просмотров: 217

Размер: 22.1 Кб

прочитайте еще раз:
Цитата:
Сообщение от mazzy Посмотреть сообщение
также обратите внимание на порядок получаемых записей, если вы используете несколько таблиц на одном уровне в Query
http://msdn.microsoft.com/en-us/libr...8AX.10%29.aspx
__________________
полезное на axForum, github, vk, coub.
Старый 01.07.2010, 10:56   #14  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
вот и последовал вашему совету - накидал 2 query в AOT, а вызвать их из под репорта не могу(
полюбому ч то не так делаю)
Старый 01.07.2010, 11:13   #15  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Прошу прощения с Query из аот все получилось)
Старый 01.07.2010, 11:13   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
А что значит "вызвать"?
Цитата:
Сообщение от Che Посмотреть сообщение
X++:
while(qrIn.next())
{
    ClTblIn  = qrIn.get(tablenum(Slvz_Clusters_CodeClusters),1); // это вызвать?
    ClTblOut = qrIn.get(tablenum(Slvz_Clusters_CodeClusters),2); // и это вызвать?
}
а что именно не работает?

попробуйте использовать метод getNo вместо get.
__________________
полезное на axForum, github, vk, coub.
Старый 01.07.2010, 11:22   #17  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
а что именно не работает?
нет кнопки "выбор" - не могу задать параметры когда открываю класс
Старый 01.07.2010, 11:24   #18  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
но в принципе на таблицы (кроме поставщики/клиенты) можно и ranges строгие наложить. А CustTable и VendTable кинуть в DS отчета (что бы задавать фильтры), но как связать это все - ума не приложу.
Старый 01.07.2010, 11:57   #19  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
и все таки как отфильтровать на основе clIn, clOut ?
X++:
ClIn            = cls.parmClIn();
ClOut           = cls.parmClOut();

qIn = new query(queryStr(Slvz_FactBdds_In));
qbds = qIn.addDataSource(tablenum(Slvz_Clusters_CodeClusters));
qbds.addRange(fieldnum(Slvz_Clusters_CodeClusters, ClusterId)).value(clIn);
qrIn = new QueryRun(qIn);
qrIn.next();
//while (qrIn.next())
//{
ClTblIn = qrIn.getNo(1);//.get(tablenum(Slvz_Clusters_CodeClusters));
info(clTblIn.ClusterId);
//}

qOut = new query(queryStr(Slvz_FactBdds_Out));
qbds1 = qOut.addDataSource(tablenum(Slvz_Clusters_CodeClusters));
qbds1.addRange(fieldnum(Slvz_Clusters_CodeClusters, ClusterId)).value(clOut);
qrOut = new QueryRun(qout);
qrOut.next();
//while (qrOut.next()) 
//{
ClTblOut = qrOut.getNo(1);//get(tablenum(Slvz_Clusters_CodeClusters));
info(clTblOut.ClusterId);
//}
при while выдает все записи, при qrOut.next(); - выдает тоже самое что и при qrIn.next();
Старый 01.07.2010, 12:00   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
нет кнопки "выбор" - не могу задать параметры когда открываю класс
я тупой.
какой класс? ведь мы говорим об отчетах?

вы можете скриншот привести что вы открываете, куда смотрите и чего хотите получить?
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Query на Datasource в LookUp-форме. dynamax DAX: Программирование 26 09.10.2009 15:58
Как удалить DataSource из Query??? Maxim Gorbunov DAX: Программирование 17 01.09.2008 14:00
axcoder: Tabax 0.2.14: View query of the active datasource Blog bot DAX Blogs 2 02.02.2007 12:10
How do I delete a datasource from a query ? (by stelsig) Maxim Gorbunov DAX in English 0 22.03.2006 12:21
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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