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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.03.2011, 11:48   #1  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
Работа с данными в отчете
Добрый день коллеги,
помогите новичку

Столкнулся со следующей задачей - в отчете

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  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Внутри цикла queryRun.Next() можно проверять значение этих полей (поставить условие). Вычисляемые поля в запросах аксапты пока не работают. Т.е. Можно использовать агрегатные функции, но сумму 2-х полей вычислить запросом не получится.
Старый 25.03.2011, 12:45   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А если метод fetch по каким либо причинам не перекрыт (используется стандартный обход заранее настроенного query), то проверку можно выполнить в методе send отчёта или даже непосредственно в executeSection секции.

Одно можно сказать абсолютно точно, без вложенной проверки не обойтись.
Старый 30.03.2011, 15:34   #4  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Фильтром такого ограничение добиться нельзя. Нужно внутри цикла проверять if'ом.
Старый 31.03.2011, 09:58   #6  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
не подскажите, как реализовать циклом,
чтобы два поля не равнялись нулю
пытаюсь
qr = new QueryRun(queryRun.query());

while (qr.next())
{
portJournal = qr.get(tableNum(FlxPortJournal));
if

}
Старый 31.03.2011, 10:12   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от romanja Посмотреть сообщение
не подскажите, как реализовать циклом,
чтобы два поля не равнялись нулю
пытаюсь
qr = new QueryRun(queryRun.query());

while (qr.next())
{
portJournal = qr.get(tableNum(FlxPortJournal));
if


}
не понимаю в чём проблема

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  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
чего то не пойму, у меня
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от romanja Посмотреть сообщение
чего то не пойму, у меня
datasourse FlxPortJournal_1
Зачем вы искозили мой пример? Зачем вы поставили отрицание перед нулём? Далее, датасурс может иметь любое имя. Доступ к курсору вы получаете командой
X++:
portJournal = qr.get(tableNum(FlxPortJournal));
соответственно дальше вы должны использовать не FlxPortJournal_1, а portJournal


И ещё ваш addSelectionField должен настраиваться один раз перед циклом, а не внутри него. Ведь это просто команда запросу применить агрегирующую функцию Sum к указаным полям

Последний раз редактировалось S.Kuskov; 31.03.2011 в 11:22.
Старый 31.03.2011, 12:05   #10  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
может не работает что у меня еще одно 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
вы не указали поля по котрым должна идти группировка
X++:
qbds.addSortField(FieldNum(FlxPortJournal,ShipsType));
qbds.orderMode(OrderMode::GroupBy);

P.S.: Какую литературу по аксапте вы читали?
Старый 31.03.2011, 12:41   #12  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
да она есть у меня просто забыл вынести
и так в общем код
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Внутри цикла, после того как убедились что обе суммы не пустые, что делаете?
Старый 31.03.2011, 13:12   #14  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
похоже ничего,
но думаю надо запустить внутри
цикла после проверки 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Что по вашему должен делать метод "void getRangeValues()", который вы пишите? В какой момент и откуда он вызыается?
Старый 31.03.2011, 13:29   #16  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
это метод служит для формирования данных (настройка фильтров)
в дальнейшем вызываю в fetch-e
this.getRangeValues();


public boolean fetch()
{
boolean ret;
QueryBuildDataSource qbds;


..........

this.getRangeValues();
ret = super();
.......

return ret;
}
Старый 31.03.2011, 14:23   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Стандартное назначение метода fetch - это вывод данных запроса в отчёт. Т.е. если метод fetch не перекрывать, то в отчёт автоматически выведуться все строки запроса. Если нужно управлять выводом данных (например заблокировать вывод некоторых строк), то нужно перекрыть метод fetch и организовать самостоятельный обход запроса и вручную посылать нужные строки запроса в отчёт. Делается это при помощи методов element.send() или element.execute, в зависимости от используемых вами типов секций отчёта
Старый 31.03.2011, 14:49   #18  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
эта мне нужно писать 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от romanja Посмотреть сообщение
эта мне нужно писать select
Что-то у вас полнейший сумбур в голове.

Никакого дополнительного 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  
romanja is offline
romanja
Участник
 
30 / 10 (1) +
Регистрация: 06.01.2011
ничего не понимаю, она у меня не удалила, а
добавела запись с двумя 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# LEXAR DAX: Программирование 3 28.05.2010 09:10
Данные в отчете Rect DAX: Программирование 1 29.08.2007 14:12
Динамические контролы в отчете основанные на display-методе petr DAX: Программирование 19 18.09.2006 15:29
Работа с полями-массивами в отчете Dubinski Serguei DAX: Программирование 2 15.04.2004 17:03

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

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

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