Меню

Способов добавления текстовых полей в отчёты

Одна из настойчивых просьб “бизнеса” – это просьбы создать дополнительные поля в «стандартном» отчёте. Иногда в них выводится текстовая информация, взамен 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, которые частично дублируют/заменяют выборки написанные изначально.

Резюмируя все вышесказанное, можем выделить следующие положительные и отрицательные стороны предложенного способа заполнения текстовых полей:

Плюсы:

  1. Простота реализации с точки зрения программирования.
  2. Хорошая скорость реализации задачи добавления полей.

Минусы:

  1. Наличие большого количества повторяющихся «select-ов» и для случая, когда в выборке документов материалов встречается небольшое количество различных номеров ОЗМ.
  2. Неоптимальность, с точки зрения количества обращений к БД.
  3. Слишком большое время построения отчёта.

Способ второй - JOIN.

Программный код данного способа выборки приведен на Рис.6. Динамические характеристики данного способа выборки приведены на Рис.7 и 8.

Рис.6 (Конструкция с join)

Рис.7 (Конструкция с join – динамический анализ)

Рис.8 (Конструкция с join – ранговый список)

Суть способа – объединение выборки текстов с выборкой из основных таблиц.

Этот способ является значительно более удачным решением, с точки зрения динамических характеристик. Выборка всех данных выполняется за один select. Так же не менее важным фактом является то, что при использовании этого метода вся “основная работа” происходит исключительно на сервере БД (это видно из временной диаграммы) и не требуется никаких дополнительных преобразований данных на сервере приложений.

Резюмируя все вышесказанное, можем выделить следующие положительные и отрицательные стороны этого способа заполнения текстовых полей:

Плюсы:

  1. Простота реализации, с точки зрения программирования.
  2. Простота добавления полей.
  3. Оптимальность, с точки зрения количества обращений к БД.
  4. Приемлемое время построения отчёта

Минусы:

  1. Существует ограничение на максимальное количество соединяемых таблиц в select-е.
  2. Перенос нагрузки по комбинированию данных с сервера приложений на сервер БД.

Способ  третий - select single с буферизацией.

Программный код этого способа выборки приведен на Рис.9. Динамические характеристики данного способа выборки приведены на Рис.10 и 11.

Рис.9 (Конструкция “select single с буферизацией”)

Рис.10 (Конструкция select single с буферизацией – динамический анализ)

Рис.11 (Конструкция select

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти

Обсуждения Количество комментариев5

Комментарий от  

Олег Точенюк

  |  03 апреля 2015, 10:58

Написано хорошо, но яркий пример когда название статьи совсем не отражает изложенной в ней сути?! Пока читал все пытался понять где же тут стандартные отчеты SAP для которых будут "описаны способы добавления текстовых полей". Потом по ходу понял, что это статья по поводу оптимизации выбора данных на ABAP.

Комментарий от  

Михаил Коваль

  |  06 апреля 2015, 17:27

Написано хорошо, но яркий пример когда название статьи совсем не отражает изложенной в ней сути?! Пока читал все пытался понять где же тут стандартные отчеты SAP для которых будут "описаны способы добавления текстовых полей". Потом по ходу понял, что это статья по поводу оптимизации выбора данных на ABAP.

Олег, спасибо. Действительно забыли название  при редактирование исправить.

Комментарий от  

Дмитрий Захаров

  |  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.

Комментарий от  

Михаил Коваль

  |  24 апреля 2015, 20:01

Еще как вариант предложил бы дополнить анализом выбора данных при помощи 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

Дмитрий, спасибо.
У конструкции FOR ALL ENTRIES есть один нюанс, если смотреть  ее трассировку через St04, то можно увидеть следующую ситуацию. Система разбивает конструкцию  на выборку маленькими блоками по 5 шт.  Что конечно  лучше, чем первый вариант, но  хуже чем четвертый , где за счет минимизации числа обращений к БД    снижается  время работы программы.  

Ну как разбивается FOR ALL ENTRIES еще зависит от параметров профиля системы (RZ11) которые определяют как транслировать это дело в SQL конкретной СУБД
 
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.
 
Думаю если покрутить эти параметры то в зависимости от вашей СУБД тоже могут на выходе получится разные цифры.