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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.02.2013, 09:41   #1  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Помогите с Query
Друзья, всем доброго времени суток
Возможно подобные темы здесь уже не раз обсуждались, но что-то не нашел ничего подходящего.
Помогите, пожалуйста, с запросом. Нужно реализовать формирование отчета по РБП в разрезе групп расхода. Как выбрать подели учета по соответствующей группе я примерно знаю, но вот как выбрать соответствующие проводки? Вот кусок кода метода, который подсчитывает суммы по проводкам
X++:
query = new Query();

    qbds = query.addDataSource(tablenum(RDeferralsTable));
    qbds.orderMode(orderMode::GroupBy);
    qbds.addSortField(fieldNum(RDeferralsTable, DeferralsId));
    qbds.addSortField(fieldnum(RDeferralsTable, Name));
    qbds.addSortField(fieldNum(RDeferralsTable, AcquisitionDate));
    qbds.addSelectionField(fieldNum(RDeferralsTable, Name));
    qbds.addSelectionField(fieldNum(RDeferralsTable, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsTable, AcquisitionDate));

    qbds = qbds.addDataSource(tablenum(RDeferralsTrans));
    qbds.orderMode(orderMode::GroupBy);
    qbds.relations(true);
    qbds.addSortField(fieldNum(RDeferralsTrans, TransDate));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, DeferralsBookId));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, TransDate));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, Amount), SelectionField::Sum);
    qbds.addRange(fieldNum(RDeferralsTrans, TransDate)).value(queryRange(dateStartYr(reportDate), reportDate));
    qbds.addRange(fieldNum(RDeferralsTrans, DeferralsBookId)).value(rDeferralsBookId);
    qbds.addRange(fieldNum(RDeferralsTrans, StornoRecId)).value(int2str(0));

    if (dimensionCriteria5)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsTrans, Dimension), 5));
        qbr.value(dimensionCriteria5);
    }

    qbds = qbds.addDataSource(tablenum(RDeferralsBook));
    qbds.orderMode(orderMode::GroupBy);
    qbds.relations(true);
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsBookId));
    qbds.addSelectionField(fieldNum(RDeferralsBook, LifeTime), SelectionField::Sum);
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsAmount), SelectionField::Sum);
    qbds.addRange(fieldNum(RDeferralsBook, Status)).value(queryValue(RDeferralsStatus::Open));

    if (dimensionCriteria5)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5));
        qbr.value(dimensionCriteria5);
    }

    if (rDeferralsGroupId)
    {
        qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId)).value(rDeferralsGroupId);
    }

    qbds = qbds.addDataSource(tablenum(RDeferralsLedger));
    qbds.joinMode(joinMode::ExistsJoin);
    qbds.relations(false);
    qbds.addLink(fieldNum(RDeferralsBook, PostingProfile), fieldNum(RDeferralsLedger, PostingProfile));
Буду очень благодарен за помощь.
Старый 21.02.2013, 10:20   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Apollon33 Посмотреть сообщение
как выбрать соответствующие проводки?
Эмм... а вот эта часть вашего кода
X++:
qbds = qbds.addDataSource(tablenum(RDeferralsTrans));
qbds.relations(true);
разве не оно?
Старый 21.02.2013, 12:05   #3  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Судя по всему не оно, потому как не работает
Я не совсем кодер, но иногда приходится. Поэтому разобраться иногда сложно бывает
Старый 21.02.2013, 12:23   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
qbds = query.addDataSource(tablenum(RDeferralsTable));
qbds.orderMode(orderMode::GroupBy);
qbds.addSortField(fieldNum(RDeferralsTable, DeferralsId));
qbds.addSortField(fieldnum(RDeferralsTable, Name));
qbds.addSortField(fieldNum(RDeferralsTable, AcquisitionDate));
qbds.addSelectionField(fieldNum(RDeferralsTable, Name));
qbds.addSelectionField(fieldNum(RDeferralsTable, DeferralsId));
qbds.addSelectionField(fieldNum(RDeferralsTable, AcquisitionDate));

qbds = qbds.addDataSource(tablenum(RDeferralsTrans)); !!!!!!!! косяк
qbdsTrans = qbds.addDataSource(tablenum(RDeferralsTrans)); объявите новую переменную для каждого ДС

Последний раз редактировалось Sada; 21.02.2013 в 12:27.
Старый 21.02.2013, 12:45   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Apollon33 Посмотреть сообщение
не работает
Как именно не работает? Выдаёт не то значение, которое вы ожидаете?
Старый 21.02.2013, 12:52   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sada Посмотреть сообщение
qbds = qbds.addDataSource(tablenum(RDeferralsTrans)); !!!!!!!! косяк
Само по себе переприсваиваение переменной не является ошибкой. И вроде бы как далее по коду работа осмысленно происходит с уже новым значением qbds.
Старый 26.02.2013, 09:35   #7  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Был немного занят, поэтому только сегодня получилось вернуться к этой теме...
Посмотрел еще раз код отчета и вот что получается. У меня как бы два запроса:
1. Выбирает номер РБП и название (как я понял). Вот его код
X++:
public Query query()
{
    QueryBuildDataSource qbds, qbds1;
    QueryBuildRange      qbr, qbr1, qbr2;
    ;

    query = new Query();

    qbds = query.addDataSource(tablenum(RDeferralsTable));
    qbds.orderMode(orderMode::GroupBy);
    qbds.addSortField(fieldNum(RDeferralsTable, DeferralsId));
    qbds.addSortField(fieldnum(RDeferralsTable, Name));
    qbds.addSortField(fieldNum(RDeferralsTable, AcquisitionDate));
    qbds.addSelectionField(fieldNum(RDeferralsTable, Name));
    qbds.addSelectionField(fieldNum(RDeferralsTable, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsTable, AcquisitionDate));
    qbds.addRange(fieldNum(RDeferralsTable, AcquisitionDate)).value(queryRange(dateNull(), reportDate));

    qbds1 = qbds;

    qbds = qbds.addDataSource(tablenum(RDeferralsBook));
    qbds.orderMode(orderMode::GroupBy);
    qbds.relations(true);
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsBookId));
    qbds.addSelectionField(fieldNum(RDeferralsBook, LifeTime), SelectionField::Sum);
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsAmount), SelectionField::Sum);
    qbds.addRange(fieldNum(RDeferralsBook, DeferralsBookId)).value(rDeferralsBookId);

    if (dimensionCriteria5 && rDeferralsGroupId)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5));
        qbr.value(dimensionCriteria5);
        qbr = qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId));
        qbr.value(rDeferralsGroupId);
    }

    return query;
}
2. рассчитывает суммы. Вот его код
X++:
client server static Map calcRDeferralsSum(TransDate reportDate, rDeferralsBookId rDeferralsBookId, DimensionCriteria5 dimensionCriteria5, RDeferralsGroupId rDeferralsGroupId)
{
    QueryRun                queryRun;
    Query                      query;
    QueryBuildDataSource    qbds, qbds1;
    QueryBuildRange         qbr, qbr1, qbr2;
    Map                     outMap = New Map(Types::String, Types::Container);
    Container               inMap;
    RDeferralsTable         rDeferralsTable;
    RDeferralsTrans         rDeferralsTrans;
    RDeferralsBook          rDeferralsBook;
    int                     mthNum = MthOfYr(reportDate);
    RDeferralsSum           sumYer, sumMth, sumAmount;
    boolean                 isMth;
    ;

    query = new Query();

    qbds = query.addDataSource(tablenum(RDeferralsTable));
    qbds.orderMode(orderMode::GroupBy);
    qbds.addSortField(fieldNum(RDeferralsTable, DeferralsId));
    qbds.addSortField(fieldnum(RDeferralsTable, Name));
    qbds.addSortField(fieldNum(RDeferralsTable, AcquisitionDate));
    qbds.addSelectionField(fieldNum(RDeferralsTable, Name));
    qbds.addSelectionField(fieldNum(RDeferralsTable, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsTable, AcquisitionDate));

    qbds = qbds.addDataSource(tablenum(RDeferralsTrans));
    qbds.orderMode(orderMode::GroupBy);
    qbds.relations(true);
    qbds.addSortField(fieldNum(RDeferralsTrans, TransDate));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, DeferralsBookId));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, TransDate));
    qbds.addSelectionField(fieldNum(RDeferralsTrans, Amount), SelectionField::Sum);
    qbds.addRange(fieldNum(RDeferralsTrans, TransDate)).value(queryRange(dateStartYr(reportDate), reportDate));
    qbds.addRange(fieldNum(RDeferralsTrans, DeferralsBookId)).value(rDeferralsBookId);
    qbds.addRange(fieldNum(RDeferralsTrans, StornoRecId)).value(int2str(0));

    if (dimensionCriteria5)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsTrans, Dimension), 5));
        qbr.value(dimensionCriteria5);
    }

    qbds = qbds.addDataSource(tablenum(RDeferralsBook));
    qbds.orderMode(orderMode::GroupBy);
    qbds.relations(true);
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsId));
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsBookId));
    qbds.addSelectionField(fieldNum(RDeferralsBook, LifeTime), SelectionField::Sum);
    qbds.addSelectionField(fieldNum(RDeferralsBook, DeferralsAmount), SelectionField::Sum);
    qbds.addRange(fieldNum(RDeferralsBook, Status)).value(queryValue(RDeferralsStatus::Open));

    if (dimensionCriteria5 && rDeferralsGroupId)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5));
        qbr.value(dimensionCriteria5);
        qbr = qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId));
        qbr.value(rDeferralsGroupId);
    }

    qbds = qbds.addDataSource(tablenum(RDeferralsLedger));
    qbds.joinMode(joinMode::ExistsJoin);
    qbds.relations(false);
    qbds.addLink(fieldNum(RDeferralsBook, PostingProfile), fieldNum(RDeferralsLedger, PostingProfile));
Дальше идет код который собственно и рассчитывает суммы за месяц, за год и т.д.
Пытался сделать по аналогии с выборкой данных по аналитике, но где-то "косяк", потому как по группе расхода категорически не хочет делать фильтр: отчет формируется, но в него попадают лишние РБП
Старый 26.02.2013, 09:36   #8  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Если нужна будет оставшаяся часть второго запроса, то допишу
Старый 26.02.2013, 09:40   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Apollon33 Посмотреть сообщение
Пытался сделать по аналогии с выборкой данных по аналитике
Вот в этом месте
X++:
    if (dimensionCriteria5 && rDeferralsGroupId)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5));
        qbr.value(dimensionCriteria5);
        qbr = qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId));
        qbr.value(rDeferralsGroupId);
    }
у вас написано, что ограничение по группе должно применяться только если одновременно задано и ограничение по 5-ой аналитике. Это специально так сделано?

Попробуйте разделить эти два условия вот так :
X++:
    if (dimensionCriteria5)
    {
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5));
        qbr.value(dimensionCriteria5);
    }
    if (rDeferralsGroupId)
    {
        qbr = qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId));
        qbr.value(rDeferralsGroupId);
    }

На самом деле если не используете фунцию queryValue() для экранирования спецсимволов (позволяете пользователям искать по маске, а не саму маску), то можно предварительно не проверять наличие значения в переменной а просто всегда накладывать фильтр.
X++:
        qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5));
        qbr.value(dimensionCriteria5);
   
        qbr = qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId));
        qbr.value(rDeferralsGroupId);
Пустая строка в фильтре будет трактоваться системой как отсутствие фильтра.

Последний раз редактировалось S.Kuskov; 26.02.2013 в 09:48.
Старый 26.02.2013, 10:07   #10  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Попробовал сделать два условия. Ну не хочет работать фильтр
Старый 26.02.2013, 10:17   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Apollon33 Посмотреть сообщение
Попробовал сделать два условия. Ну не хочет работать фильтр
Вы в обоих методах исправили?

А переменная rDeferralsGroupId точно инициализируется?
Временно добавьте в код строку:
X++:
info(rDeferralsGroupId);
что бы убедится что значение в переменной есть.
Старый 26.02.2013, 10:29   #12  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Да, в обоих методах сделал в два условия
При компиляции никаких ошибок система не выдает. Ну значит инициализируется
Старый 26.02.2013, 10:35   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Apollon33 Посмотреть сообщение
При компиляции никаких ошибок система не выдает. Ну значит инициализируется
Не, копиляцией этого не определишь.
Каким образом вы запрашиваете у пользователя группу расхода для фильтрации? Не может ли ошибка скрываться там? Т.е. точно ли значение, которое ввёл пользователь доходит до вашего кода? Для проверки этого я вам и предложил вывести значение переменной в инфолог.
Старый 26.02.2013, 13:09   #14  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Может я ни туда инфолог поместил. Я его записал в условие, но отчет сформировался, а сообщение не вывелось. Можно поконкретнее, куда мне его поместить?
Старый 26.02.2013, 13:25   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Apollon33 Посмотреть сообщение
Может я ни туда инфолог поместил. Я его записал в условие, но отчет сформировался, а сообщение не вывелось. Можно поконкретнее, куда мне его поместить?
Ооо. Видимо я был прав и переменная у вас не содержит значения для фильтрации. Поместить info можно не в условие, а перед условием, хотя уже понятно что переменная пустая. Искать ошибку нужно там, где переменным присваиваются значения, возможно в методе init().
Старый 26.02.2013, 14:32   #16  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Если не трудно можно поконкретнее. У меня класс, который отчет генерит, наследник ранбэйс
Старый 26.02.2013, 14:44   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Покажите код метода initFromDialog()
За это сообщение автора поблагодарили: Apollon33 (1).
Старый 26.02.2013, 17:12   #18  
Apollon33 is offline
Apollon33
Участник
 
53 / 10 (1) +
Регистрация: 05.10.2007
Спасибо большое, теперь разобрался
Ну вот как, как я мог забыть по initFromDialog???
Теперь все работает!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помогите с query ... Rimantas DAX: Программирование 10 18.03.2010 15:45
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Помогите с Query Vitali_i DAX: Программирование 22 21.11.2009 17:59
Помогите новичку в создании Query lev DAX: Программирование 2 19.06.2006 10:29
Помогите с query 6apcyk DAX: Программирование 23 09.09.2005 13:50

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

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

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