Был немного занят, поэтому только сегодня получилось вернуться к этой теме...
Посмотрел еще раз код отчета и вот что получается. У меня как бы два запроса:
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));
Дальше идет код который собственно и рассчитывает суммы за месяц, за год и т.д.
Пытался сделать по аналогии с выборкой данных по аналитике, но где-то "косяк", потому как по группе расхода категорически не хочет делать фильтр: отчет формируется, но в него попадают лишние РБП