AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 30.06.2010, 11:07   #1  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
Query по идентичным DataSource
Доброго времени суток, уважаемые! Помогите новичку)
В DataSourcе отчета есть 2 ветки построенные на основе одинаковых табличек, отличаются ветки только тем, что в одной ветке пользователь задает фильтр по клиентам, в другой по поставщикам. Как правильно построить запрос?

Заранее спасибо!
Alt 30.06.2010, 11:35   #2  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 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.... что не так?
Alt 30.06.2010, 11:45   #3  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2499 (89) +++++++++
Registriert seit: 20.08.2005
В QueryRun.Get() есть еще один параметр occurrence (по умолчанию 1) - используйте его, чтобы получить данные из второго датасорса
__________________
Axapta v.3.0 sp5 kr2
Alt 30.06.2010, 13:29   #4  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
нашел 2 ошибки в коде) поправил) но параметр occurrence - не помог (в инфолог пустое значение идет)
Alt 30.06.2010, 13:56   #5  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2499 (89) +++++++++
Registriert seit: 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
Alt 30.06.2010, 14:59   #6  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Che Beitrag anzeigen
пишу что то типа
А вы не пишите. А создайте объект Query в AOT (для определенности пусть он называется myQuery).

Тогда в коде просто создавайте программный объект из объекта AOT
X++:
Query q = new Query(querystr(myQuery));
__________________
полезное на axForum, github, vk, coub.
Alt 30.06.2010, 15:04   #7  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
также обратите внимание на порядок получаемых записей, если вы используете несколько таблиц на одном уровне в Query
http://msdn.microsoft.com/en-us/libr...8AX.10%29.aspx
__________________
полезное на axForum, github, vk, coub.
Alt 01.07.2010, 09:03   #8  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 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. извините за сумбурность)))) только начинаю вникать в мир Аксапты)))
Alt 01.07.2010, 09:20   #9  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
В this.query() - уже есть таблицы - но таба Slvz_Clusters_CodeClusters не должна использоваться для фильтра, она нужна для связи с табличкой LedgerJournalTrans, в свою очередь, она (LedgerJournalTrans) джойнится к клиентам/поставщикам (разумеется в разных ветках).
может я не тот выход нашел (по созданию 2-х веток)? может все програмно сделать (а по кнопке "выбор" - только клиенты/поставщики)? но тогда как связать 2 Query - первый по Slvz_Clusters_CodeClusters (по clIn, clOut), второй по фильтру на клиентов/поставщиков???
Alt 01.07.2010, 10:03   #10  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Che Beitrag anzeigen
Но появились вопросы:
1) что дает создание квери в AOT, а не добавление DS в репорте?
2) если создавать в AOT, то нужно 2 квери (по приходу и расходу) и вызывать их последовательно?
3) как вызвать квери? получается из класса?
1. результат выполнения кверей - идентичен.
Плюсы:
но создавать в AOT намного проще, чем писать большой код.
код получается более компактным.
объект, созданный в AOT, может оптимизировать отдельный человек, не изменяя код.
Минусы:
некоторые условия связи нельзя задать в AOT (только из кода).

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

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

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

Klicken Sie auf die Grafik für eine größere Ansicht

Name:	1.PNG
Hits:	331
Größe:	59,6 KB
ID:	5941
__________________
полезное на axForum, github, vk, coub.
Alt 01.07.2010, 10:35   #11  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
ч то не совсем понял "так же как и обычно")

qin = new query(querystr(Slvz_FactBdds_In));
qrin = new queryrun(qin);
while(qrIn.next())
{
//
}
*пишу в репорте в fetch - на классе кнопки "выбор" нету)) может не правильно вас понял
если создать джобик - нормально)
Alt 01.07.2010, 10:42   #12  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
вот то что хотелось бы видеть в "ветке" по приходу (вторая ветка такая же, только для поставщиков):
Miniaturansicht angehängter Grafiken
Klicken Sie auf die Grafik für eine größere Ansicht

Name:	Снимок.GIF
Hits:	383
Größe:	21,2 KB
ID:	5942  
Alt 01.07.2010, 10:47   #13  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Che Beitrag anzeigen
*пишу в репорте в fetch - на классе кнопки "выбор" нету)) может не правильно вас понял если создать джобик - нормально)
да ради бога: опять же накидывайте таблицы в AOT, а не добавляйте в коде
Name:  1.PNG
Hits: 4262
Größe:  22,1 KB

прочитайте еще раз:
Zitat:
Zitat von mazzy Beitrag anzeigen
также обратите внимание на порядок получаемых записей, если вы используете несколько таблиц на одном уровне в Query
http://msdn.microsoft.com/en-us/libr...8AX.10%29.aspx
__________________
полезное на axForum, github, vk, coub.
Alt 01.07.2010, 10:56   #14  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
вот и последовал вашему совету - накидал 2 query в AOT, а вызвать их из под репорта не могу(
полюбому ч то не так делаю)
Alt 01.07.2010, 11:13   #15  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
Прошу прощения с Query из аот все получилось)
Alt 01.07.2010, 11:13   #16  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
А что значит "вызвать"?
Zitat:
Zitat von Che Beitrag anzeigen
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.
Alt 01.07.2010, 11:22   #17  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
Zitat:
а что именно не работает?
нет кнопки "выбор" - не могу задать параметры когда открываю класс
Alt 01.07.2010, 11:24   #18  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 25.01.2010
но в принципе на таблицы (кроме поставщики/клиенты) можно и ranges строгие наложить. А CustTable и VendTable кинуть в DS отчета (что бы задавать фильтры), но как связать это все - ума не приложу.
Alt 01.07.2010, 11:57   #19  
Che ist offline
Che
Участник
 
92 / 12 (1) ++
Registriert seit: 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();
Alt 01.07.2010, 12:00   #20  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Che Beitrag anzeigen
нет кнопки "выбор" - не могу задать параметры когда открываю класс
я тупой.
какой класс? ведь мы говорим об отчетах?

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 17:27 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.