21.02.2013, 09:41 | #1 |
Участник
|
Помогите с 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 |
Участник
|
|
|
21.02.2013, 12:05 | #3 |
Участник
|
Судя по всему не оно, потому как не работает
Я не совсем кодер, но иногда приходится. Поэтому разобраться иногда сложно бывает |
|
21.02.2013, 12:23 | #4 |
Программатор
|
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 |
Участник
|
|
|
21.02.2013, 12:52 | #6 |
Участник
|
|
|
26.02.2013, 09:35 | #7 |
Участник
|
Был немного занят, поэтому только сегодня получилось вернуться к этой теме...
Посмотрел еще раз код отчета и вот что получается. У меня как бы два запроса: 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; } 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 |
Участник
|
Если нужна будет оставшаяся часть второго запроса, то допишу
|
|
26.02.2013, 09:40 | #9 |
Участник
|
Вот в этом месте
X++: if (dimensionCriteria5 && rDeferralsGroupId) { qbr = qbds.addRange(fieldId2Ext(fieldnum(RDeferralsBook, Dimension), 5)); qbr.value(dimensionCriteria5); qbr = qbds.addRange(fieldNum(RDeferralsBook, DeferralsGroupId)); qbr.value(rDeferralsGroupId); } Попробуйте разделить эти два условия вот так : 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 |
Участник
|
Попробовал сделать два условия. Ну не хочет работать фильтр
|
|
26.02.2013, 10:17 | #11 |
Участник
|
|
|
26.02.2013, 10:29 | #12 |
Участник
|
Да, в обоих методах сделал в два условия
При компиляции никаких ошибок система не выдает. Ну значит инициализируется |
|
26.02.2013, 10:35 | #13 |
Участник
|
Цитата:
Каким образом вы запрашиваете у пользователя группу расхода для фильтрации? Не может ли ошибка скрываться там? Т.е. точно ли значение, которое ввёл пользователь доходит до вашего кода? Для проверки этого я вам и предложил вывести значение переменной в инфолог. |
|
26.02.2013, 13:09 | #14 |
Участник
|
Может я ни туда инфолог поместил. Я его записал в условие, но отчет сформировался, а сообщение не вывелось. Можно поконкретнее, куда мне его поместить?
|
|
26.02.2013, 13:25 | #15 |
Участник
|
Ооо. Видимо я был прав и переменная у вас не содержит значения для фильтрации. Поместить info можно не в условие, а перед условием, хотя уже понятно что переменная пустая. Искать ошибку нужно там, где переменным присваиваются значения, возможно в методе init().
|
|
26.02.2013, 14:32 | #16 |
Участник
|
Если не трудно можно поконкретнее. У меня класс, который отчет генерит, наследник ранбэйс
|
|
26.02.2013, 14:44 | #17 |
Участник
|
Покажите код метода initFromDialog()
|
|
|
За это сообщение автора поблагодарили: Apollon33 (1). |
26.02.2013, 17:12 | #18 |
Участник
|
Спасибо большое, теперь разобрался
Ну вот как, как я мог забыть по initFromDialog??? Теперь все работает! |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Помогите с query ... | 10 | |||
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers | 0 | |||
Помогите с Query | 22 | |||
Помогите новичку в создании Query | 2 | |||
Помогите с query | 23 |
|