Способов добавления текстовых полей в отчёты
Одна из настойчивых просьб “бизнеса” – это просьбы создать дополнительные поля в «стандартном» отчёте. Иногда в них выводится текстовая информация, взамен SAP-овских кодов, иногда это выборка дополнительных данных из связанных документов. Реализовать эту просьбу с точки зрения программного кода можно различными способами. В рамках этой статьи я рассмотрю несколько возможных способов реализации соответствующей доработки. Критерием эффективности будет быстродействие и простота реализации, с точки зрения программирования.
Одна из настойчивых просьб “бизнеса” – это просьбы создать дополнительные поля в отчёте. Иногда в них выводится текстовая информация, взамен SAP-овских кодов, иногда это выборка дополнительных данных из связанных документов. Реализовать эту просьбу с точки зрения программного кода можно различными способами. В рамках этой статьи я рассмотрю несколько возможных способов реализации соответствующей доработки. Критерием эффективности будет быстродействие и простота реализации, с точки зрения программирования.
Для примера, будем рассматривать выборку данных из документов движения материалов за год. В качестве текстового поля, которое мы будем заполнять, будет поле “Краткий текст материала” на языке, указанном при входе в мандант. Результатом выборки должна стать таблица, приведенная на Рис.1.
Рис.1 (Структура итоговой таблицы)
В качестве основной выборки документов материалов будем рассматривать следующую конструкцию (Рис.2).
Рис.2 (Основная выборка)
Первый способ реализации - select single.
Программный код данного способа выборки приведен на Рис.3. Динамические характеристики (анализ) данного способа выборки приведены на Рис.4 и 5.
Рис.3 (Конструкция select single)
Рис.4 (Конструкция select single – динамический анализ)
Рис.5 (Конструкция select single – ранговый список)
Суть способа – выборка текстов для каждой записи основной выборки (в отчёт) «отдельным select-ом».
Такой способ является самым простым способом добавления текстового поля в отчёт (и не только текстового). Нет ничего проще, чем перед выводом таблицы в ALV пройтись по ней loop-ом и выполнить N-ое количество select-ов. Часто программы, которые в течение длительного времени дорабатываются различными программистами, обрастают большим количеством дополнительных выборок перед самим выводом в ALV, которые частично дублируют/заменяют выборки написанные изначально.
Резюмируя все вышесказанное, можем выделить следующие положительные и отрицательные стороны предложенного способа заполнения текстовых полей:
Плюсы:
- Простота реализации с точки зрения программирования.
- Хорошая скорость реализации задачи добавления полей.
Минусы:
- Наличие большого количества повторяющихся «select-ов» и для случая, когда в выборке документов материалов встречается небольшое количество различных номеров ОЗМ.
- Неоптимальность, с точки зрения количества обращений к БД.
- Слишком большое время построения отчёта.
Способ второй - JOIN.
Программный код данного способа выборки приведен на Рис.6. Динамические характеристики данного способа выборки приведены на Рис.7 и 8.
Рис.6 (Конструкция с join)
Рис.7 (Конструкция с join – динамический анализ)
Рис.8 (Конструкция с join – ранговый список)
Суть способа – объединение выборки текстов с выборкой из основных таблиц.
Этот способ является значительно более удачным решением, с точки зрения динамических характеристик. Выборка всех данных выполняется за один select. Так же не менее важным фактом является то, что при использовании этого метода вся “основная работа” происходит исключительно на сервере БД (это видно из временной диаграммы) и не требуется никаких дополнительных преобразований данных на сервере приложений.
Резюмируя все вышесказанное, можем выделить следующие положительные и отрицательные стороны этого способа заполнения текстовых полей:
Плюсы:
- Простота реализации, с точки зрения программирования.
- Простота добавления полей.
- Оптимальность, с точки зрения количества обращений к БД.
- Приемлемое время построения отчёта
Минусы:
- Существует ограничение на максимальное количество соединяемых таблиц в select-е.
- Перенос нагрузки по комбинированию данных с сервера приложений на сервер БД.
Способ третий - select single с буферизацией.
Программный код этого способа выборки приведен на Рис.9. Динамические характеристики данного способа выборки приведены на Рис.10 и 11.
Рис.9 (Конструкция “select single с буферизацией”)
Рис.10 (Конструкция select single с буферизацией – динамический анализ)
Рис.11 (Конструкция select
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти
Обсуждения 5
Комментарий от
Олег Точенюк
| 03 апреля 2015, 10:58
Комментарий от
Михаил Коваль
| 06 апреля 2015, 17:27
Олег Точенюк 03 апреля 2015, 10:58
Написано хорошо, но яркий пример когда название статьи совсем не отражает изложенной в ней сути?! Пока читал все пытался понять где же тут стандартные отчеты SAP для которых будут "описаны способы добавления текстовых полей". Потом по ходу понял, что это статья по поводу оптимизации выбора данных на ABAP.
Комментарий от
Дмитрий Захаров
| 22 апреля 2015, 08:49
Код:
IF CH_OUT_TAB[] IS NOT INITIAL.
SELECT MATNR MAKTX
INTO TABLE LT_MATNR_MAKTX
FROM MAKT
FOR ALL ENTRIES IN CH_OUT_TAB
WHERE MATNR = CH_OUT_TAB-MATNR
AND SPRAS = SY-LANGU
.
ENDIF.
Комментарий от
Михаил Коваль
| 24 апреля 2015, 20:01
Дмитрий Захаров 22 апреля 2015, 08:49
Еще как вариант предложил бы дополнить анализом выбора данных при помощи FOR ALL ENTRIES
Код:
IF CH_OUT_TAB[] IS NOT INITIAL.
SELECT MATNR MAKTX
INTO TABLE LT_MATNR_MAKTX
FROM MAKT
FOR ALL ENTRIES IN CH_OUT_TAB
WHERE MATNR = CH_OUT_TAB-MATNR
AND SPRAS = SY-LANGU
.
ENDIF.
У конструкции FOR ALL ENTRIES есть один нюанс, если смотреть ее трассировку через St04, то можно увидеть следующую ситуацию. Система разбивает конструкцию на выборку маленькими блоками по 5 шт. Что конечно лучше, чем первый вариант, но хуже чем четвертый , где за счет минимизации числа обращений к БД снижается время работы программы.
Комментарий от
Олег Точенюк
| 28 апреля 2015, 01:25
Михаил Коваль 24 апреля 2015, 20:01
Дмитрий, спасибо.
У конструкции FOR ALL ENTRIES есть один нюанс, если смотреть ее трассировку через St04, то можно увидеть следующую ситуацию. Система разбивает конструкцию на выборку маленькими блоками по 5 шт. Что конечно лучше, чем первый вариант, но хуже чем четвертый , где за счет минимизации числа обращений к БД снижается время работы программы.
rsdb/prefer_join - преобразовать к JOIN
rsdb/prefer_union_all - преобразовать к UNION ALL
rsdb/prefer_in_itab_opt - преобразовать к IN
rsdb/max_blocking_factor - максимальное количество строк переданных из itab
rsdb/max_in_blocking_factor - максимальное количество строк переданных из itab в случае с IN
В общем подробности в нотах: 48230, 129385 и 1622681.
Думаю если покрутить эти параметры то в зависимости от вашей СУБД тоже могут на выходе получится разные цифры.