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

«MVC или как писать отчеты быстро и просто»
Олег Точенюк:
>>"Самое главное - это расположить инклуды с моделью и представлением до инклуда с контроллером"   А может проще написать в начале что-то типа: CLASS: <имя> DEFINITION...
«MVC или как писать отчеты быстро и просто»
Юрий Жуков:
Передавать таблицу в display не совсем правильно с точки зрения ООП, вроде. Например, появиться требование вывести кроме таблицы, ещё какую-нибудь заголовочную часть. Потребуется вносить изменения...
«Глава 1. Создание ALV GRID. Часть 1»
Олег Точенюк:
Цель данной главы создать ALV Grid - Серьезно? После прочтения цель данной главы создание объектов словаря данных, а вот лично ALVGrid-у вроде как все равно что выводить, пользовательскую таблицу...

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

2514
5

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

Суть способа – перед выполнением select-а происходит проверка наличия выбираемой записи во внутренней таблице. В случае наличия записи во внутренней

Ограниченный доступ

Для прочтения полной версии статьи необходимо зайти как зарегистрированный пользователь.

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

Олег Точенюк (Рейтинг: 10202) 10:58, 03 апреля 2015

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

Михаил Коваль (Рейтинг: 197)

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

Дмитрий Захаров (Рейтинг: 13) 08:49, 22 апреля 2015

Еще как вариант предложил бы дополнить анализом выбора данных при помощи 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.
20:01, 24 апреля 2015

Михаил Коваль (Рейтинг: 197)

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

Олег Точенюк (Рейтинг: 10202)

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

Любое воспроизведение запрещено.
Копирайт © «Издательство ООО «Эксперт РП»