SAP ABAP Infoset Query - ВЫБЕРИТЕ СУММУ и Дубликаты строк
У меня проблемы с выяснением, с чего начать / как получить правильный вывод. Я очень новичок в кодировании ABAP. Я пытаюсь создать запрос Infoset, и мне нужно немного кодировать в SQ02.
У меня объединены две таблицы: одна - RBKP в качестве заголовка для квитанций счетов, другая - RBDRSEG для позиций документов счетов.
Запрос должен выполняться по некоторым не относящимся к делу параметрам / вариантам, но когда он это делает, он должен - - -
Посмотрите в RBDRSEG все те же номера документов RBKP-BELNR EQ RBDRSEG-RBLNR
При этом RBDRSEG может иметь или не иметь несколько строк результатов для каждого документа.
Мне нужно суммировать поле RBDRSEG-DMBTR для каждого документа № Результат. (Если есть 5 строк для Док. №; DMBTR будет иметь различное значение для каждого, который должен быть подсчитан)
На данный момент мне нужен вывод только для отображения (вместе с другими полями в RBKP) одной строки с суммой поля DMBTR для каждого документа. Нет.
Затем мне нужно иметь другое поле, показывающее разницу поля RBKP - RMWWWR, которое является суммой счета-фактуры и суммой, рассчитанной ранее для этого документа. № для поля ДМБТР.
Если бы вы могли помочь, я был бы невероятно благодарен.
1 ответ
Сначала вам нужно определить структуру, которая будет содержать ваши данные выбора. Пример структуры для вашего требования может выглядеть следующим образом:
не забудьте активировать структуру и убедиться, что она не содержит ошибок.
Теперь создайте отчет выбора. Чтобы использовать отчет в качестве метода выбора данных, вам нужно добавить два комментария, *<QUERY_HEAD>
а также *<QUERY_BODY>
, *<QUERY_HEAD>
должен быть размещен там, где обычно должен начинаться ваш выбор, *<QUERY_BODY>
внутри цикла, который помещает выбранные строки во внутреннюю таблицу с тем же именем, что и структура, которую вы определили в SE11.
Я сделал пример отчета, чтобы показать, как это будет работать:
REPORT ZSTACK_RBKP_INFOSET_QUERY.
tables:
rbkp,
ZSTACK_RBKP_INFOSET_STR.
select-OPTIONS:
so_belnr for rbkp-belnr,
so_gjahr for rbkp-gjahr.
data:
itab type standard table of ZSTACK_RBKP_INFOSET_STR,
wa_itab type ZSTACK_RBKP_INFOSET_STR.
data:
lv_diff type dmbtr.
*here your selection starts.
*<QUERY_HEAD>
select rbkp~belnr
rbkp~gjahr
rbkp~rmwwr
rbkp~waers
sum( RBDRSEG~DMBTR ) as DMBTR
from RBKP left outer join RBDRSEG
on RBDRSEG~RBLNR eq RBKP~BELNR and
RBDRSEG~RJAHR eq RBKP~GJAHR
into corresponding fields of table itab
where rbkp~belnr in so_belnr and
rbkp~gjahr in so_gjahr
group by rbkp~belnr rbkp~gjahr rbkp~rmwwr rbkp~waers.
loop at itab into wa_itab.
lv_diff = wa_itab-dmbtr - wa_itab-rmwwr.
move lv_diff to wa_itab-diff.
modify itab from wa_itab.
endloop.
* this is the part that forwards your result set to the infoset
LOOP AT itab INTO ZSTACK_RBKP_INFOSET_STR.
*<QUERY_BODY>
ENDLOOP.
образец отчета сначала выбирает RBKP
линии вместе с суммой RBDRSEG-DMBTR
за каждый документ в RBKP
, После этого loop
обновляет DIFF
столбец с разницей между выбранными столбцами RMWWR
а также DMBTR
,
К сожалению в нашей системе SAP таблица RBDRSEG
пусто, поэтому я не могу проверить эту часть отчета. Но вы можете проверить отчет в своей системе, просто добавив точку останова перед первым loop
и затем запустите отчет. После этого вы сможете увидеть выбранные строки во внутренней таблице. ITAB
и посмотреть, если выбор работает, как ожидалось.
предостережения в примере отчета: оба RBKP
а также RBDRSEG
ссылаться на разные валютные поля. Так что, возможно, ваши ценности RMWWR
а также DMBTR
в разных валютах (RMWWR
в валюте документа, DMBTR
похоже в валюте компании по умолчанию). Если это так, вам придется конвертировать их в соответствующую валюту, прежде чем рассчитывать разницу. Пожалуйста, не забудьте присоединиться RBKP
а также RBDRSEG
используя как номер документа в BELNR
/RBLNR
и год в GJAHR
/RJAHR
(поле в RBDRSEG
является RJAHR
не GJAHR
, хотя GJAHR
также существует в RBDRSEG
).
когда ваш отчет работает должным образом, создайте информационный набор на основе вашего отчета. Затем вы можете использовать информационный набор, как и любой другой.
Обновление: я только что понял, что, поскольку вы написали о том, что вы новичок в ABAP, я сразу же решил, что вам нужно создать отчет для вашего информационного набора. В зависимости от ваших реальных требований это может быть не так. Вы можете создать простой информационный запрос к таблице RBKP, а затем с помощью редактора информационного набора добавить еще два поля для итоговой суммы и разности, а затем добавить некоторый abap-код, который выбирает сумму всех соответствующих строк в RBDRSEG и вычисляет разницу между RMWWR. и эта совокупная сумма. Это, вероятно, будет медленнее, чем настраиваемый отчет abap, так как выбор придется повторять для каждой строки в RBKP, поэтому он действительно зависит от объема данных, которые ваши пользователи будут запрашивать. Настроенный отчет ABAP - это хорошо, гибко и быстро, но может оказаться излишним, и количество людей, способных изменить отчет, меньше, чем количество людей, способных изменить инфо-набор.
Дополнительная информация о варианте с использованием конструктора инфо-наборов
сначала создайте простую таблицу RBKP только для чтения инфо-набора (чтобы в определении инфо-набора не было объединения таблиц). Теперь перейдите к конкретным улучшениям приложения:
В моем примере я уже добавил 2 поля, LINETOTAL
а также DIFFERENCE
, Оба имеют те же свойства, что и RBDRSEG-DMBTR
, Убедитесь, что ваше поле содержит сумму RBDRSEG-DMBTR
имеет более низкую последовательность (здесь "1"), чем поле, содержащее разницу. Последовательность определяет, какие поля будут вычислены первыми.
Нажмите на кнопку кодирования для первого поля и добавьте кодировку, чтобы выбрать сумму для одного RBKP
запись:
Затем сделайте то же самое для поля разницы:
Теперь у вас есть оба поля в списке полей, вы можете добавить их в свою группу полей справа:
Как упоминалось ранее, код, который вы только что ввели, будет обрабатываться для каждой строки в RBKP. Так что это может оказать огромное влияние на производительность во время выполнения, в зависимости от размера вашего начального набора результатов.