Пример создания отчета SAP Query

Posted under SAP Query, Отчетность On By Plank

Думаю, за историю внедрения SAP ERP (SAP S/4HANA) накопилось довольно много документов, описывающих создание отчета с использованием SAP Query. И думаю, многие консультанты умеют обращаться с этой функциональностью или у них есть документ, описывающий процесс создания таких отчетов. Тем не менее выкладываю старый пример создания отчета SAP Query (нашел в закромах, разбирая накопившиеся за годы файлы) сделанный по принципу “how to” может кому-то пригодится и он найдет что-то новое. Отчет будет с использованием нескольких таблиц и с разными принципами их соединения и запускаться через транзакцию с вариантом.

Документ был создан во времена классической SAP ERP, но и в эпоху S/4HANA SAP Query все еще актуален. По тексту даны комментарии для особенностей S/4HANA.

Введение

Итак, бизнес-ситуация:

Есть MM-заказ, поступление материала, поступление счета, FI-документ. В заголовке FI-документа указан номер счета-фактуры, а в позиции кредитора – дата получения счета-фактуры. Все стандартно.

Есть таблица, в которой хранится дополнительная информация по этой бизнес-операции (например, какие-то статусы). В данном случае, что это за дополнительная информация и что это за таблица (пусть даже это Z-таблица) – не важно, эта таблица нас интересует, прежде всего, с точки зрения варианта ее соединения в Query для получения данных в отчете.

Пусть, для примера, это будет таблица, где хранятся документы DMS – таб. DRAW и нас интересует статус документа, поле DOKST.

Задача: сверить значение статуса в таблице с наличием в FI-документе данных о номере счета-фактуры и даты получения счета-фактуры.

Усложнение задачи: часть документов сторнирована, соответственно для них не нужно проверять наличие данных, так как они могут быть неправильными.

Как известно, в первоначальном FI-документе, после сторно поступления счета в MM, данные о том, каким документом он сторнирован, не появляются. Для этого нужно анализировать данные в MM (в данном случае тр. J3RCREV не запускалась и позиции не выравнены).

И, самое главное усложнение – общее количество документов несколько сотен тысяч, так что вариант ручной проверки исключается.

Что делать консультанту? Звать на помощь программиста, объяснять ему на пальцах как сделать простенький проверочный отчет или писать спецификацию? Или оперировать сотнями тысяч записей в Excel?

Или использовать инструмент Query?

Попробуем Query.

Запускаем тр. SQ02 «Инфо-набор» (я не буду указывать пути по меню, желающие могут найти эти пути, воспользовавшись кнопкой «Бинокль» на основном экране SAP Easy Access или тр. SEARCH_SAP_MENU «Поиск в SAP-меню»).

1.     Выбор рабочей области

Выбираем стандартную рабочую область – наши инфо-набор и запрос будут видны только в нашем манданте:

Результат:

2.     Создание группы пользователей

Создадим группу пользователей Z_DEMO_QUERY.

Находясь в тр. SQ02 переходим в ведение групп пользователей.

или тр. SQ03

3.     Присвоение пользователя группе пользователей

тр. SQ03.

Указываем своего пользователя:

Присваиваем своего пользователя нашей группе:

Сохранить.

Потом этой группе присвоим еще и инфо-набор.

4.     Создание инфо-набора

Приготовления закончены, теперь, собственно дело…

Назовем наш инфо-сет Z_DEMO_QUERY_INFO_SET

Находясь в тр. SQ03 переходим к созданию инфо-набора:

или тр. SQ02

Дальше:

Выберем «включить ключевые поля», если нужно потом добавим другие.

Дальше:

Нажимаем «Оператор соединения»:

Переходим в графический редактор и пытаемся соединиться с таблицей RBKP. Нажимаем «Вставить таблицу», указываем RBKP:

И получаем соединение:

Но вот незадача, номера документов в таблицах разные, по полю BELNR соединять записи нельзя.

Но, у нас есть другая связка, в поле BKPF-AWKEY лежит номер MM-фактуры и год. Пытаемся соединиться.

Удаляем соединение через контекстное меню соединения:

И проводим мышкой линию от BELNR к AWKEY:

И резонно получаем ошибку:

Поля то разные. Тут нужен другой способ соединения.

Удаляем таблицу RBKP – выделяем таблицу и нажимаем «Удалить таблицу»:

Возвращаемся на экран изменения инфо-набора – нажимаем «Инфо-набор».

Способ соединения таблиц №1

Нажимаем «Дополнительная информация» на экране изменения инфо-набора:

На вкладке «ДопИнфо» Нажимаем «Создать»:

Выбираем «Дополнительная таблица», указываем RBKP:

По умолчанию система опять предлагает соединение по номеру документа:

Но мы изменим это на AWKEY:

Важно отметить, что это не совсем правильно. Поле AWKEY это поле типа CHAR длинной 20 символов и там лежит 14 символов: Номер MM-документа + Год, а мы это поле присваиваем полю BELNR типа CHAR длинной 10 символов. Но на наше счастье в AWEKEY первые 10 символов и есть номер MM-документа и система не ругается на несовпадение полей, ошибку «Некорректные условия соединения» мы не получаем. Если все делать правильно, то можно воспользоваться способом №2 с использованием кодирования, а тут пока так.

Создали соединение таблиц BKPF и RBKP:

Теперь нужно соединиться с таблицей со статусами, пусть это будет таб. DRAW.

На экране «Изменение инфо-набора» нажимаем «Дополнительная информация»

На вкладке «ДопИнфо» Нажимаем «Создать»:

Способ, который был описан ранее, в данном случае не работает, так как нам нужна выборка по неключевому полю DOKST, которое мы будем связывать, например, с BKPF-XREF1_HD.

Способ соединения таблиц №2

Придется воспользоваться услугами кодирования.

Для начала создадим поле Z_STATUS, куда поместим считанный из соединенной таблицы DRAW статус.

На экране изменения инфо-набора нажимаем «Дополнительная информация»

На вкладке «ДопИнфо» Нажимаем «Создать»:

Выбираем создания дополнительного поля Z_STATUS:

Определим поле. Формат можно указать явно:

а можно через ссылочное поле DRAW-DOKST:

И не забываем указать последовательность фрагмента кода. Для порядка это будет = 2.

Теперь у нас определено поле, которое можно использовать в отчете и заполнить данными из связанной таблицы:

На вкладке «ДопИнфо» помещаем курсор на строчку определения поля Z_STATUS и нажимаем «Кодировка для дополнения»:

Сам код:

Нажимаем «Сохранить» и «Сгенерировать». На предупреждения о том, что поля нет в группе полей пока не обращаем внимание.

Способ соединения таблиц №3

Теперь нужно присоединить таблицу с позицией FI-документа.

Нажимаем «Оператор соединения» на экране изменения инфо-набора. Опять попадаем в графический редактор соединений таблиц:

Примечание: для SAP HANA подход другой, там BSEG прозрачная таблица, можно соединять с нет, ниже описано для классической SAP ERP.

Думаете, будем добавлять BSEG? Нет, BSEG присоединить не получится, это кластерная таблица. Нажимаем «Вставить таблицу»:

Получаем ошибку:

Будем добавлять BSIK и BSAK.

Тут есть один момент. Запись будет или в BSIK или в BSAK, соответственно, если мы сделаем обычное соединение BKPF с BSIK и BKPF с BSAK, то записи у нас никогда не выберутся, так как JOIN дает результат, только если записи есть во всех таблицах.

Тут нам на помощь придет левый JOIN. При таком соединении возвращаются все данные из «левой» таблицы, даже если не найдено соответствий в «правой» таблице. Вдаваться в подробности не буду, о JOIN’ах можно почитать в интернете, например, тут (Рисунок 4).

Итак, добавляем BSIK, соединяем ее по номеру документа, БЕ и году с BKPF. Поля соединяем «ниткой» простым перетаскиванием с нажатой правой кнопкой мыши от одного поля к другому.

В контекстном меню соединения выбираем «Левый внешний оператор соединения»:

Аналогично делаем для BSAK. Получается так:

Способ соединения таблиц №4

Теперь самый простой способ соединения.

Нам нужно получить электронный адрес автора документа.

Добавляем таблицы USR21 и ADR6:

Поля с одинаковым названием система соединила сама, нам остается соединить BKPF и USR21 по имени пользователя:

Нажимаем «Инфо-набор» и на экране изменения инфо-набора нажимаем «Сохранить» и «Сгенерировать».

С соединениями все. Теперь выбираем поля, которые будут использоваться в отчете.

На экране изменения инфо-набора нажимаем «Группы полей» и выбираем Группа полей 01 (заголовок группы полей, куда будем добавлять поля, должен быть активен). Групп полей можно создать несколько, но в данном случае сложим все в одну:

Слева разворачиваем список полей таблиц и выделяем поля, которые хотим добавить в группу 01:

Через контекстное меню добавляем поля в группу (или нажимаем кнопку на панели инструментов левого фрейма).

  • Из таб. BKPF нас интересует поле XBLNR – там лежит номер фактуры и XREF1_HD – там связка со статусом. Также добавим поля «Вид документа» и «Дата проводки» для ограничений выборки;
  • Из таб. RBKP нас интересует поле STBLG – там лежит номер документа сторно;
  • Из таб. BSIK нас интересует поле XREF1 – там лежит дата получения сч.ф;
  • Из таб. BSAK нас интересует поле XREF1 – там лежит дата получения сч.ф;
  • Из таб. ADR6 нас интересуют поле Адрес электронной почты;
  • Также добавим дополнительное поле Z_STATUS.

Вроде бы все. Но есть один нюанс…

У нас 2 поля XREF1. Одно из BSIK, другое из BSAK. C этим можно смериться, а можно переложить все в одно поле, которое и будет в отчете.

Нажимаем «Дополнительная информация»:

Нажимаем «Создать»:

И создаем дополнительное поле Z_XREF1:

Не забываем про последовательность фрагмента кода, у нас он уже = 3

Теперь немного кодирования. Находясь на нужной записи нажимаем «Кодирование для дополнения»:

И пишем простой код:

Нажимаем «Сохранить» и «Сгенерировать»

Не забываем добавить поле в группу полей.

Также не забываем присвоить группу пользователей нашему инфо-набору в тр. SQ03:

С инфо-набором все.

5.     Создание запроса

Если мы находимся НЕ в стандартной рабочей области – переходим в стандартную рабочую область (см. п.1).

Находясь в тр. SQ02 переходим к ведению запросов:

или тр. SQ01.

Если мы находимся не в нашей группе пользователей, то меняем группу пользователей на нашу:

Указываем имя нашего запроса Z_DEMO_QUERY и создаем его:

Выбираем наш инфо-сет:

Заполняем заголовок и нажимаем «Основной список»:

Раздвигаем левый фрейм и выбираем нужные нам поля для селекционного экрана нашего отчета и для вывода в самом отчете:

Нажимаем «Сохранить», потом «Тест» запрос генерируется.

Далее появляется окно:

Варианта ALV-отчета у нас еще нет, а позиций ставим побольше, у нас ведь много документов:

Заполняем селекционный экран, нажимаем на кнопку и получаем результат:

Дополнение

Это не обязательно, но желательно…

Когда мы будем создавать транзакцию, можно указать вариант селекционного экрана, с которым эта транзакция будет запускаться. В принципе, всегда нужно создавать вариант по умолчанию, чтобы можно было управлять действиями пользователей, и они не запускали «тяжёлые» отчеты без указания критериев выбора и эти отчеты не нагружали систему, а потом не вываливались по таймауту.

Итак, на селекционном экране нашего запроса нажимаем «Сохранить» и создаем вариант ZMAIN, который включим потом в транзакцию. Указываем атрибуты полей и, если нужно, значения:

Сохраняем.

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

6.     Создание транзакции для запуска отчета

Теперь нужно обеспечить этот запрос соответствующей транзакцией.

Запускаем тр. SE93. Указываем имя будущей транзакции Z_DEMO_QUERY:

Указываем краткий текст. Выбираем «Транзакция с параметрами»:

В качестве транзакции, запускающий наш отчет будем использовать START_REPORT:

Заполняем параметры:

Сохраняем.

Теперь наш отчет можно запустить транзакцией Z_DEMO_QUERY и поля Дата проводки, БЕ, Финансовый год будут обязательными для заполнения:

7.     «Проваливание»

Если мы хотим «провалиться» в документ из нашего отчета, например, используя тр. FB03 посмотреть FI-документ, то нужно присвоить транзакцию FB03 механизму «отче-отчет» для нашего запроса.

Запускаем тр. SQ01.

Выбираем наш запрос и изменяем его.

Далее выбираем пункт меню «Присвоение отчета»:

Нажимаем «Вставить строчку»:

Выбираем «Другой тип отчета»:

Выбираем «Транзакция»:

Указываем FB03:

Сохраняем присвоение отчетов

Сохраняем запрос.

Запускаем отчет и проваливаемся в строку отчета:

И получаем ошибку:

Транзакция запущена верная, FB03, но, по каким-то причинам, вместо номера документа система подставляет номер документа сторно MM-фактуры.

В принципе, механизм передачи параметров в вызываемую транзакцию основан на PID (GET PARAMETER и SET PARAMETER). У каждого поля свой ID (их можно посмотреть в технической информации к полю).

Вот тут и происходит ошибка (это было в классической SAP ERP EhP7 SP5, может сейчас в S/4HANA такого нет). Система передает и для номера FI-документа и для номера MM-документа одно имя параметра ‘BLN’. Запись для поля STBLG идет после BELNR, так что кто последний, тот и попадет в транзакцию через ее GET PARAMETER:

В данном случае способ борьбы с этим: поиск нот, выставление клиентских сообщений в службу поддержки или удаление поля STBLG из отображаемых на экране отчета. На селекционном экране оно остается, ведь мы должны выбрать только не сторнированные в MM документы. То есть, по большому счету, поля STBLG и не должно быть на экране отчета, так что мы ничего не теряем.

Изменяем запрос, удаляем поля из списка отображаемых в отчете:

Сохраняем запрос.

Получаем отчет, в котором можно провалиться в FI-документ:

 

8.     Перенос между системами

Если мы находимся не в стандартной рабочей области – переходим в стандартную рабочую область (см. п.1).

Находясь в тр. SQ02 переходим к переносу:

Выбираем «Перенос инфо-наборов и запросов», указываем инфо-набор Z_DEMO_QUERY_INFO_SET и запрос Z_DEMO_QUERY. Выбираем опции «Выгрузка»:

Примечание: в данном примере перенос через файл, но можно и через транспортный запрос, для этого выбираем “Экспорт”, а в целевой системе “Импорт”.

Запускаем в тестовом режиме, проверяем что выгрузка возможна:

Возвращаемся, снимаем флаг «Тестовый прогон» и запускаем. Система просит указать имя файла в котором будет сохранено описание нашего инфо-набора и запроса (по умолчанию это в папке по пути: Мои документы -> SAP -> SAP GUI). Указываем имя Z_DEMO_QUERY и сохраняем:

Примечание: появление этого окна зависит от настроек SAP LOGON (можно поменять: в SAP GUI нажимаем кнопку «Настройка локального формата» или нажимаем Alt + F12, потом выбираем пункт меню «Опции…», далее раскрываем папку «Безопасность» и выбираем пункт «Настройки безопасности»):

.

Еще нам нужно перенести нашу группу пользователей Z_DEMO_QUERY. Перенос выполняется аналогично:

Теперь нужно загрузить наш проект в другую систему.

Запускаем тр. SQ02 в другой системе.

Переходим в стандартную рабочую область.

Выбираем пункт меню: Среда -> Переносы.

Выбираем опции «Загрузка» и «Перенос групп пользователей». Снимаем флаг «Тестовый прогон»:

Выбираем файл с нашей группой пользователей:

Аналогично поступаем с файлом с инфо-набором и с запросом:

Перенос самой транзакции тут не рассматривается, это обычная процедура переноса запросов между системами.

Все, можно пользоваться запросом в новой системе.

Leave a comment

Ваш адрес email не будет опубликован.