25.03.2011, 11:48 | #1 |
Участник
|
Работа с данными в отчете
Добрый день коллеги,
помогите новичку Столкнулся со следующей задачей - в отчете 1.делаю группировку по оределенному полю 2.собираю сумму 2 полей qbds.addSelectionField(fieldNum(......,PassengersTotalArrival),SelectionField::Sum); qbds.addSelectionField(fieldNum(......,PassengersTotalDeparture),SelectionField::Sum); как сделать,если во всех 2 колонках результат нули ету строку не показывать например: 122 45 15 0 0 0 - не показывать 0 12 в Oracle сделал бы так: select from where... having nul(sum(PassengersTotalArrival))+nul(sum(PassengersTotalDeparture)>0 Спасибо |
|
25.03.2011, 12:07 | #2 |
MCP
|
Внутри цикла queryRun.Next() можно проверять значение этих полей (поставить условие). Вычисляемые поля в запросах аксапты пока не работают. Т.е. Можно использовать агрегатные функции, но сумму 2-х полей вычислить запросом не получится.
|
|
25.03.2011, 12:45 | #3 |
Участник
|
А если метод fetch по каким либо причинам не перекрыт (используется стандартный обход заранее настроенного query), то проверку можно выполнить в методе send отчёта или даже непосредственно в executeSection секции.
Одно можно сказать абсолютно точно, без вложенной проверки не обойтись. |
|
30.03.2011, 15:34 | #4 |
Участник
|
cоздал дисплейный метод
display int getPassengersTotal() { return this.FlxNumPassengersTotalArrival + this.FlxNumPassengersTotalDeparture; } пытаюсь обработать в фильтре, но не получается qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalArrival),SelectionField::Sum); qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalDeparture),SelectionField::Sum); qbds.addRange(element....????? должно быть больше нуля |
|
30.03.2011, 15:38 | #5 |
Участник
|
Фильтром такого ограничение добиться нельзя. Нужно внутри цикла проверять if'ом.
|
|
31.03.2011, 09:58 | #6 |
Участник
|
не подскажите, как реализовать циклом,
чтобы два поля не равнялись нулю пытаюсь qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if } |
|
31.03.2011, 10:12 | #7 |
Участник
|
Цитата:
X++: qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (PortJournal.FlxNumPassengersTotalArrival == 0 && PortJournal.FlxNumPassengersTotalDeparture == 0) continue; // ... } Последний раз редактировалось S.Kuskov; 31.03.2011 в 11:27. |
|
31.03.2011, 10:58 | #8 |
Участник
|
чего то не пойму, у меня
datasourse FlxPortJournal_1 cтавлю проверку, фильтрую ни чего не происходит X++: qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (FlxPortJournal_1.FlxNumPassengersTotalArrival == !0 && FlxPortJournal_1.FlxNumPassengersTotalDeparture == !0) continue; qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalArrival),SelectionField::Sum); qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalDeparture),SelectionField::Sum); } |
|
31.03.2011, 11:16 | #9 |
Участник
|
Зачем вы искозили мой пример? Зачем вы поставили отрицание перед нулём? Далее, датасурс может иметь любое имя. Доступ к курсору вы получаете командой
X++: portJournal = qr.get(tableNum(FlxPortJournal)); И ещё ваш addSelectionField должен настраиваться один раз перед циклом, а не внутри него. Ведь это просто команда запросу применить агрегирующую функцию Sum к указаным полям Последний раз редактировалось S.Kuskov; 31.03.2011 в 11:22. |
|
31.03.2011, 12:05 | #10 |
Участник
|
может не работает что у меня еще одно querry работает
щас у меня так void getRangeValues() { QueryRun qr; FlxPortJournal portJournal; QueryBuildDataSource qbds = this.queryRun().query().dataSourceTable(tableNum(FlxPortJournal)); ; if (this.queryRun()) { qbds = this.queryRun().query().dataSourceTable(tableNum(FlxPortJournal)); } else { qbds = this.query().dataSourceTable(tableNum(FlxPortJournal)); } qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalArrival),SelectionField::Sum); qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalDeparture),SelectionField::Sum); qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (portJournal.FlxNumPassengersTotalArrival == 0 && portJournal.FlxNumPassengersTotalDeparture == 0) continue; } |
|
31.03.2011, 12:30 | #11 |
Участник
|
вы не указали поля по котрым должна идти группировка
X++: qbds.addSortField(FieldNum(FlxPortJournal,ShipsType));
qbds.orderMode(OrderMode::GroupBy); P.S.: Какую литературу по аксапте вы читали? |
|
31.03.2011, 12:41 | #12 |
Участник
|
да она есть у меня просто забыл вынести
и так в общем код void getRangeValues() { QueryRun qr; FlxPortJournal portJournal; QueryBuildDataSource qbds = this.queryRun().query().dataSourceTable(tableNum(FlxPortJournal)); ; if (this.queryRun()) { qbds = this.queryRun().query().dataSourceTable(tableNum(FlxPortJournal)); } else { qbds = this.query().dataSourceTable(tableNum(FlxPortJournal)); } qbds.addSortField(FieldNum(FlxPortJournal,ShipsType)); qbds.orderMode(OrderMode::GroupBy); qbds.addSelectionField(fieldNum (FlxPortJournal,FlxNumPassengersTotalArrival),SelectionField::Sum); qbds.addSelectionField(fieldNum(FlxPortJournal,FlxNumPassengersTotalDeparture),SelectionField::Sum); qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (portJournal.FlxNumPassengersTotalArrival == 0 && portJournal.FlxNumPassengersTotalDeparture == 0) continue; } } не судите строго, сейчас изучаю Inside Microsoft Dynamics AX 4.0 |
|
31.03.2011, 12:45 | #13 |
Участник
|
Внутри цикла, после того как убедились что обе суммы не пустые, что делаете?
|
|
31.03.2011, 13:12 | #14 |
Участник
|
похоже ничего,
но думаю надо запустить внутри цикла после проверки querry c настроенным фильтром, while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (portJournal.FlxNumPassengersTotalArrival == 0 && portJournal.FlxNumPassengersTotalDeparture == 0) continue; this.query()................... } this.query(). |
|
31.03.2011, 13:19 | #15 |
Участник
|
Что по вашему должен делать метод "void getRangeValues()", который вы пишите? В какой момент и откуда он вызыается?
|
|
31.03.2011, 13:29 | #16 |
Участник
|
это метод служит для формирования данных (настройка фильтров)
в дальнейшем вызываю в fetch-e this.getRangeValues(); public boolean fetch() { boolean ret; QueryBuildDataSource qbds; .......... this.getRangeValues(); ret = super(); ....... return ret; } |
|
31.03.2011, 14:23 | #17 |
Участник
|
Стандартное назначение метода fetch - это вывод данных запроса в отчёт. Т.е. если метод fetch не перекрывать, то в отчёт автоматически выведуться все строки запроса. Если нужно управлять выводом данных (например заблокировать вывод некоторых строк), то нужно перекрыть метод fetch и организовать самостоятельный обход запроса и вручную посылать нужные строки запроса в отчёт. Делается это при помощи методов element.send() или element.execute, в зависимости от используемых вами типов секций отчёта
|
|
31.03.2011, 14:49 | #18 |
Участник
|
эта мне нужно писать select в цикле с условием
и отправлять qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (portJournal.FlxNumPassengersTotalArrival == !0 && portJournal.FlxNumPassengersTotalDeparture == !0) continue; Select...... element.send(portJournal); } |
|
31.03.2011, 15:00 | #19 |
Участник
|
Что-то у вас полнейший сумбур в голове.
Никакого дополнительного select'а не нужно. У вас уже есть QueryRun. QueryRun - это такой способ пробежаться по запросу Query, структуру, которого вы заблоговременно сконструировали всякими там addRange, addSortField, addSelectionField и т.д. т.е цикл "while (qr.next()) {}" делает не что иное как перебирает записи сконструированного вами запроса. Строчка кода "portJournal = qr.get(tableNum(FlxPortJournal));" нужна для того чтобы получить текущую запись перебираемого запроса. "qr.next()" переходит на следующую строку. Итого: в send вам нужно отправить portJournal. Дополнительно ничего выбирать не нужно |
|
|
За это сообщение автора поблагодарили: kornix (1). |
31.03.2011, 15:15 | #20 |
Участник
|
ничего не понимаю, она у меня не удалила, а
добавела запись с двумя 0 qr = new QueryRun(queryRun.query()); while (qr.next()) { portJournal = qr.get(tableNum(FlxPortJournal)); if (portJournal.FlxNumPassengersTotalArrival == 0 && portJournal.FlxNumPassengersTotalDeparture == 0) element.send(portJournal); } |
|
|
Похожие темы | ||||
Тема | Ответов | |||
DAX2009 EP: Работа с данными в C# | 3 | |||
Данные в отчете | 1 | |||
Динамические контролы в отчете основанные на display-методе | 19 | |||
Работа с полями-массивами в отчете | 2 |
|