30.06.2010, 11:07 | #1 |
Участник
|
Query по идентичным DataSource
Доброго времени суток, уважаемые! Помогите новичку)
В DataSourcе отчета есть 2 ветки построенные на основе одинаковых табличек, отличаются ветки только тем, что в одной ветке пользователь задает фильтр по клиентам, в другой по поставщикам. Как правильно построить запрос? Заранее спасибо! |
|
30.06.2010, 11:35 | #2 |
Участник
|
пишу что то типа:
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)); |
|
30.06.2010, 11:45 | #3 |
Участник
|
В QueryRun.Get() есть еще один параметр occurrence (по умолчанию 1) - используйте его, чтобы получить данные из второго датасорса
__________________
Axapta v.3.0 sp5 kr2 |
|
30.06.2010, 13:29 | #4 |
Участник
|
нашел 2 ошибки в коде) поправил) но параметр occurrence - не помог (в инфолог пустое значение идет)
|
|
30.06.2010, 13:56 | #5 |
Участник
|
Прошу прощения, не обратил внимания, что это два разных запроса.
Надо так (если использовать имена датасорсов, то необходимо явно указывать его при добавлении таблиц 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 |
Участник
|
А вы не пишите. А создайте объект Query в AOT (для определенности пусть он называется myQuery).
Тогда в коде просто создавайте программный объект из объекта AOT X++: Query q = new Query(querystr(myQuery)); |
|
30.06.2010, 15:04 | #7 |
Участник
|
также обратите внимание на порядок получаемых записей, если вы используете несколько таблиц на одном уровне в Query
http://msdn.microsoft.com/en-us/libr...8AX.10%29.aspx |
|
01.07.2010, 09:03 | #8 |
Участник
|
Огромное спасибо за ответы!
Но появились вопросы: 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)); } P.S. извините за сумбурность)))) только начинаю вникать в мир Аксапты))) |
|
01.07.2010, 09:20 | #9 |
Участник
|
В this.query() - уже есть таблицы - но таба Slvz_Clusters_CodeClusters не должна использоваться для фильтра, она нужна для связи с табличкой LedgerJournalTrans, в свою очередь, она (LedgerJournalTrans) джойнится к клиентам/поставщикам (разумеется в разных ветках).
может я не тот выход нашел (по созданию 2-х веток)? может все програмно сделать (а по кнопке "выбор" - только клиенты/поставщики)? но тогда как связать 2 Query - первый по Slvz_Clusters_CodeClusters (по clIn, clOut), второй по фильтру на клиентов/поставщиков??? |
|
01.07.2010, 10:03 | #10 |
Участник
|
Цитата:
Плюсы: но создавать в AOT намного проще, чем писать большой код. код получается более компактным. объект, созданный в AOT, может оптимизировать отдельный человек, не изменяя код. Минусы: некоторые условия связи нельзя задать в AOT (только из кода). См. также обсуждения на форуме с ключевым словом querystr. 2. нужно создавать столько же, сколько кверей из кода. Это всего лишь способ создания одного и того же. 3. также как и обычно. |
|
01.07.2010, 10:35 | #11 |
Участник
|
ч то не совсем понял "так же как и обычно")
qin = new query(querystr(Slvz_FactBdds_In)); qrin = new queryrun(qin); while(qrIn.next()) { // } *пишу в репорте в fetch - на классе кнопки "выбор" нету)) может не правильно вас понял если создать джобик - нормально) |
|
01.07.2010, 10:42 | #12 |
Участник
|
вот то что хотелось бы видеть в "ветке" по приходу (вторая ветка такая же, только для поставщиков):
|
|
01.07.2010, 10:47 | #13 |
Участник
|
Цитата:
прочитайте еще раз: Цитата:
Сообщение от mazzy
также обратите внимание на порядок получаемых записей, если вы используете несколько таблиц на одном уровне в Query
http://msdn.microsoft.com/en-us/libr...8AX.10%29.aspx |
|
01.07.2010, 10:56 | #14 |
Участник
|
вот и последовал вашему совету - накидал 2 query в AOT, а вызвать их из под репорта не могу(
полюбому ч то не так делаю) |
|
01.07.2010, 11:13 | #15 |
Участник
|
Прошу прощения с Query из аот все получилось)
|
|
01.07.2010, 11:13 | #16 |
Участник
|
А что значит "вызвать"?
Цитата:
попробуйте использовать метод getNo вместо get. |
|
01.07.2010, 11:22 | #17 |
Участник
|
Цитата:
а что именно не работает?
|
|
01.07.2010, 11:24 | #18 |
Участник
|
но в принципе на таблицы (кроме поставщики/клиенты) можно и ranges строгие наложить. А CustTable и VendTable кинуть в DS отчета (что бы задавать фильтры), но как связать это все - ума не приложу.
|
|
01.07.2010, 11:57 | #19 |
Участник
|
и все таки как отфильтровать на основе 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); //} |
|
01.07.2010, 12:00 | #20 |
Участник
|
я тупой.
какой класс? ведь мы говорим об отчетах? вы можете скриншот привести что вы открываете, куда смотрите и чего хотите получить? |
|
|
|