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 25.03.2011, 11:48   #1  
romanja ist offline
romanja
Участник
 
30 / 10 (1) +
Registriert seit: 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

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

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

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

}
Alt 31.03.2011, 10:12   #7  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.448 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Zitat:
Zitat von romanja Beitrag anzeigen
не подскажите, как реализовать циклом,
чтобы два поля не равнялись нулю
пытаюсь
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;

    // ...
}

Geändert von S.Kuskov (31.03.2011 um 11:27 Uhr)
Alt 31.03.2011, 10:58   #8  
romanja ist offline
romanja
Участник
 
30 / 10 (1) +
Registriert seit: 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);
}
Alt 31.03.2011, 11:16   #9  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.448 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Zitat:
Zitat von romanja Beitrag anzeigen
чего то не пойму, у меня
datasourse FlxPortJournal_1
Зачем вы искозили мой пример? Зачем вы поставили отрицание перед нулём? Далее, датасурс может иметь любое имя. Доступ к курсору вы получаете командой
X++:
portJournal = qr.get(tableNum(FlxPortJournal));
соответственно дальше вы должны использовать не FlxPortJournal_1, а portJournal


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

Geändert von S.Kuskov (31.03.2011 um 11:22 Uhr)
Alt 31.03.2011, 12:05   #10  
romanja ist offline
romanja
Участник
 
30 / 10 (1) +
Registriert seit: 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;


}
Alt 31.03.2011, 12:30   #11  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.448 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
вы не указали поля по котрым должна идти группировка
X++:
qbds.addSortField(FieldNum(FlxPortJournal,ShipsType));
qbds.orderMode(OrderMode::GroupBy);

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


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


..........

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

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


}
Alt 31.03.2011, 15:00   #19  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.448 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Zitat:
Zitat von romanja Beitrag anzeigen
эта мне нужно писать select
Что-то у вас полнейший сумбур в голове.

Никакого дополнительного select'а не нужно. У вас уже есть QueryRun.
QueryRun - это такой способ пробежаться по запросу Query, структуру, которого вы заблоговременно сконструировали всякими там addRange, addSortField, addSelectionField и т.д.

т.е цикл "while (qr.next()) {}" делает не что иное как перебирает записи сконструированного вами запроса. Строчка кода "portJournal = qr.get(tableNum(FlxPortJournal));" нужна для того чтобы получить текущую запись перебираемого запроса. "qr.next()" переходит на следующую строку.

Итого: в send вам нужно отправить portJournal. Дополнительно ничего выбирать не нужно
This post has been rated by: kornix (1).
Alt 31.03.2011, 15:15   #20  
romanja ist offline
romanja
Участник
 
30 / 10 (1) +
Registriert seit: 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);


}
 

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

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 22:54 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.