Каков наиболее эффективный способ подсчета количества повторяющихся строк в запросе?
Я создаю отчет в SAP SQ01/SQ02, цель которого - показать, сколько раз продукт был выбран за указанный период времени.
Данные в основном получены из таблицы LTAP. Мне просто нужно иметь возможность подсчитать количество строк. Материал дублируется в XYZ, вывести число в дополнительное поле и показать значение. Также я хочу, чтобы этот подсчет происходил в указанный период времени, скажем, в последние 30 дней, чтобы убедиться, что он актуален и актуален.
Приведенный ниже код работает, но он настолько медленный, что требуется всего несколько секунд, чтобы вывести счетчик только для одного материала, и мне нужен отчет для вывода топ-1000 на основе счетчика. Есть ли более эффективный способ сделать то же самое?
DATA TAB
DATA : YEAR(4) TYPE N,
MTH(2) TYPE N,
DAY(2) TYPE N,
YEAR1(4) TYPE N,
MTH1(2) TYPE N,
DAY1(2) TYPE N,
FROM_DATE LIKE SY-DATUM,
count1 like LTAP-UMREZ.
FIELD-SYMBOLS <fs_dtab> TYPE STANDARD TABLE.
DATA: sort_f1 TYPE fieldname.
TAB ИНИЦИАЛИЗАЦИИ
sort_f1 = 'ltap-matnr'.
TAB Обработки Записи
YEAR = SY-DATUM(4).
MTH = SY-DATUM+4(2).
DAY = SY-DATUM+6(2).
IF MTH eq 1.
MTH1 = MTH + 11.
ELSE.
MTH1 = MTH - 1.
ENDIF.
IF MTH eq 1.
YEAR1 = YEAR - 1.
ELSE.
YEAR1 = YEAR.
ENDIF.
FROM_DATE(4) = YEAR1.
FROM_DATE+4(2) = MTH1.
FROM_DATE+6(2) = DAY.
КОНЕЦ ВЫБОРА ПОСЛЕ ТАБЛИЦЫ
ASSIGN ('%G00[]') TO <fs_dtab>.
IF <fs_dtab> IS ASSIGNED.
SORT <fs_dtab> BY (sort_f1)
DESCENDING.
DELETE ADJACENT DUPLICATES FROM <fs_dtab>
COMPARING (sort_f1).
ENDIF.
Код дополнительного поля
В LTAP поле UMREZ заполняется числом "1", поэтому я использую его здесь для подсчета дубликатов.
clear count.
Select sum( UMREZ ) as UMREZ
from *LTAP into COUNT
where *LTAP~MATNR eq LTAP-MATNR
and *LTAP~QDATU GE from_date.
Я ожидаю, что отчет выйдет за считанные секунды, а не минуты за пару кодов материала. Буду очень признателен за альтернативный код или улучшение текущего, которое могло бы достичь этого.
1 ответ
DATA materials TYPE RANGE OF matnr.
SELECT
matnr AS material,
COUNT(*) AS count
FROM ltap
INTO TABLE @DATA(result)
WHERE matnr IN materials
AND qdatu >= @from_date
GROUP BY matnr.
Убедитесь, что в столбце есть индекс MATNR
, В текущем S/4HANA есть один HW6
это подходит, но развертывается только на SAP HANA и может быть недоступно в более старых выпусках.