Создание отчётов с использованием SAP Query

Система SAP ERP содержит множество отчетов с огромным количеством полей. Для настройки отображения нужных полей существует механизм, позволяющий скрыть лишние поля, изменить порядок, выполнить сортировку, подвести промежуточные и общие итоги. Ко всему прочему, система позволяет хранить несколько вариантов настроек и быстро выбирать требуемый.

Со временем у конечного пользователя появляется необходимость в отчетах, в которых присутствуют как стандартные поля, так и дополнительные. Примером могут послужить такие отчеты, как история по счёту главной книги, открытые счета-фактуры от поставщиков, список клиентов.

В случае если отчеты довольно специфичны или имеют некую нестандартную функциональность, для их реализации приходится обращаться к программистам. В остальных случаях достаточно воспользоваться SAP Query.

Инструмент SAP Query позволяет создавать отчёты без значительных трудозатрат.

Ниже будет рассмотрен пример создания отчета средствами SAP Query.

Основные шаги для создания отчета:
  1. Создание инфо-набора
  2. Создание группы пользователей, присвоение ей инфо-набора
  3. Создание запроса на базе инфо-набора.

Постановка задачи

Время от времени появляются ситуации, в которых пользователь не может разобраться с причинами ошибки «Превышена стоимость договора» в заказах на поставку. В большинстве случаев причину подобной ошибки легко найти.
Но если в контракте 1000 позиций, и по какой-то из них стоимость в поступлении больше, чем стоимость в позиции контракта (при этом стоимость в контракте равна стоимости в заказах), то выявить данную позицию становится проблематично.

В системе существуют отчеты, показывающие стоимость позиций заказа к позиции контракта или документы поступления со ссылками на заказ на поставку. Единого отчета нет.

Необходимо создать отчет, отображающий заданные контракты по позициям. Каждая позиция должна отображать свою стоимость, стоимость позиций заказов на поставку, стоимость поступлений, стоимость счетов-фактур. Все стоимости должны отображаться во внутренней валюте.
Так же необходимо добавить признак, позволяющий отображать только проблемные позиции.

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

Инфо-набор должен содержать перечень полей, которые требуется отобразить в отчете. В нашем наборе будут созданы такие поля, как номер контракта, позиция контракта, стоимость позиции в контракте, стоимость в заказах на поставку, стоимость поступлений, стоимость счетов-фактур.

Запустите транзакцию SQ02.

image

  • Введите имя Инфо-набора «Z_SUPPLY_TO_CONTRACT»и нажмите кнопку «Создать»
  • Определите описание инфо-набора «Поступление к контрактам»
  • Введите имя таблицы EKPO (см. Рисунок 2). Это стандартная таблица с позициями документов закупки, включая контракты.

image

SAP предлагает несколько источников для создания инфо-набора, это:

  • объединение таблиц (англ. join)
  • считывание таблицы напрямую
  • логическая база данных
  • сбор данных программой

Каждый из источников данных имеет свои особенности, которые не обсуждаются в настоящей статье. Мы выбрали таблицу, так как весь отчет будет строиться именно на этой таблице, а остальные данные мы получим через настройку дополнительных полей.

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

image

Теперь мы находимся на первом экране ведения инфо-набора.

image

Экран разделен на 3 части:
  • Слева — таблицы и дополнительные поля
  • Справа сверху — группы полей, которые должны попасть в запрос и, в дальнейшем, в отчет
  • Справа снизу — детальная информация по полям из группы полей. Для отображения необходимо дважды кликнуть по требуемому полю из группы полей

Если на предыдущем экране выбран тот же пункт с ключевыми полями, то в группе полей должны отображаться номер документа закупки и позиция. Если нет, то включите эти поля (правой кнопкой мы по полю из таблицы и выбрать пункт «включить поле в группу полей»), или исключите лишние.

Затем следует добавить оставшиеся поля, необходимые для нашего отчета. Для этого следует нажать кнопку на панели инструментов «Дополнительная информация» (F5). Для переключения в исходное положение следует нажать кнопку «Группы полей» (F6).

image

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

Создадим требуемые нам поля. Для этого необходимо нажать на кнопку «Создать» (кнопка в виде белого листа). В открывшемся окне следует указать имя нового поля и выбрать пункт «Дополнительное поле»

image

Далее следует заполнить наименование, текст заголовка в отчете и ссылку на поле-образец «EKPO-BRTWR». Формат нашего поля будет скопирован с образца.

image

Следующее поле создается аналогично, за исключением порядкового номера поля.

image

Стоимость поступлений и стоимость счетов-фактур будем брать из истории заказа на поставку из таблицы EKBE.

image

image

Добавленные поля отображаются в левом блоке в ветке «дополнительные поля».
Данные поля следует добавить в группу полей. Для этого переключитесь в режим группы полей (кнопка «Группа полей») и щелкнув правой кнопкой мыши выберите пункт «Добавить в группу полей».
Затем возвращаемся обратно в режим дополнительной информации.

Определим правила формирования стоимости позиции контракта.
Для этого необходимо установить курсор мыши на требуемой позиции и нажать кнопку «Кодировка для дополнений».

image

Зададим следующий код для поля «BRTWR»:
data:
  ii_WKURS like EKKO-WKURS.

SELECT SINGLE WKURS INTO ii_WKURS FROM EKKO
  WHERE EBELN = EKPO-EBELN.

CLEAR BRTWR.

IF EKPO-LOEKZ IS INITIAL.
  BRTWR = EKPO-NETPR / EKPO-PEINH * EKPO-KTMNG * ii_WKURS.
ELSE.
  BRTWR = '0'.
ENDIF.

Определяем переменную для курса валюты, в которой ведется контракт. Затем получаем ее значение.
Если позиций контракта не удалена, то стоимость равна произведения количества и цены, с учетом количества единицы цены и курса валюты. Если контракт в валюте учета, то система автоматически равна 1.
Если позиция удалена, то стоимость рана 0.

Код для поля «ORDER_BRTWR»:
data:
  s_NETPR like EKPO-NETPR,
  s_PEINH like EKPO-PEINH,
  s_MENGE like EKPO-MENGE,
  c_BRTWR like ORDER_BRTWR,
  i_ebeln like EKKO-EBELN,
  i_WKURS like EKKO-WKURS.

ORDER_BRTWR = '0'.

select NETPR PEINH MENGE EBELN
  INTO (s_NETPR, s_PEINH, s_MENGE, i_ebeln)
  from EKPO as e
  where
    e~KONNR = EKPO-EBELN AND
    e~KTPNR = EKPO-EBELP AND
    e~LOEKZ = ''.

  SELECT SINGLE WKURS INTO i_WKURS FROM EKKO
    WHERE EBELN = i_ebeln.

    CLEAR c_BRTWR.
    c_BRTWR = s_NETPR / s_PEINH * s_MENGE * i_WKURS.
    ORDER_BRTWR = ORDER_BRTWR + c_BRTWR.
endselect.

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

Код для поля «DMBTR»:
data:
  s_SHKZG like ekbe-SHKZG,
  s_DMBTR like ekbe-DMBTR.

DMBTR = '0'.

select DMBTR SHKZG INTO (s_DMBTR, s_SHKZG) from EKBE as e
  INNER JOIN EKPO as z
    ON e~EBELN EQ z~EBELN AND
      e~EBELP EQ z~EBELP
  where
    z~KONNR = EKPO-EBELN AND
    z~KTPNR = EKPO-EBELP AND
    e~VGABE = '1'.
  if s_SHKZG = 'S'.
    DMBTR = DMBTR + s_DMBTR.
  else.
    DMBTR = DMBTR - s_DMBTR.
  endif.
endselect.

Для документов поступления мы сразу берем в расчет стоимость во внутренней валюте. По этой причине нет необходимости пересчитывать валюту. В документах поступления отсутствует признак удаления, так как для бухгалтерских проводок возможно только сторнирование. В связи с этим по полю «EKBE-SHKZG» определяем прямой это документ или сторнирующий.

Код для поля «F_DMBTR»:
data:
  s_SHKZG_f like ekbe-SHKZG,
  s_DMBTR_f like ekbe-DMBTR.

F_DMBTR = '0'.

select DMBTR SHKZG INTO (s_DMBTR_f, s_SHKZG_f) from EKBE as e
  INNER JOIN EKPO as z
    ON e~EBELN EQ z~EBELN AND
      e~EBELP EQ z~EBELP
  where
    z~KONNR = EKPO-EBELN AND
    z~KTPNR = EKPO-EBELP AND
    ( e~VGABE = '2' OR e~VGABE = '3' ).
  if s_SHKZG_f = 'S'.
    F_DMBTR = F_DMBTR + s_DMBTR_f.
  else.
    F_DMBTR = F_DMBTR - s_DMBTR_f.
  endif.
endselect.

Сумма для счетов-фактур рассчитывается аналогично поступлению. При этом для счетов-фактур следует учитывать такие операции как доп. дебетование и доп. кредитование.

Далее следует перейти во вкладку «Критерии выбора». Там мы создадим поле «Номер контракта» и признак «только позиции с превышением».

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

Создадим критерий выбора «Номер контракта».

image

и параметр «Только позиции с превышением»

image

Обратите внимание на то, что параметр в поле «ДопИнфо» содержит текст «AS CHECKBOX» для того, чтобы отобразиться в качестве чекбокса.

Для критериев выбора «Номер контракта» каких то дополнительных настроек не требуется. Отчет будет ограничиваться по полю, указанному в настройках. Для параметра же внесем ограничения в формируемый отчет. Для этого перейдем на вкладку «Кодировки» и выберем фрагмент кодировки «5 Обработка записей».

image

и добавив код:
CHECK EKPO-BSTYP = 'K'.

IF Z_ONLY = 'X'.
  CHECK BRTWR < DMBTR.
ENDIF.

Этим кодом мы ограничиваем вывод только тех записей, для которых BRTWR < DMBTR, т.е. стоимость позиции контракта меньше стоимости поступлений. Так же мы ограничиваем записи по типу «Контракт».

Обратите внимание, что на момент проверок данные поля должны быть рассчитаны. Именно по этой причине для данной проверки последовательный номер был указан равным 10 (любой номер, превышающий номера предыдущих полей).

Теперь сохраняем инфо-набор и генерируем его image.

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

Группы пользователей обеспечивают контроль доступа к инфо-наборам и запросам.

Перейдите по меню «Среда» -> «Группы пользователей» с первого экрана ведения инфо-набора.

image

  • Вводим имя группы пользователей «ZMM»
  • Нажимаем кнопку «Создать»

image

  • Определяем название «Отчеты ММ»
  • Нажимаем кнопку «Сохранить». На этом этапе система может запросить ключ разработчика или запрос на перенос
  • Нажимаем кнопку «Присвоить пользователей и инфо-наборы»
  • В открывшемся окне вводим пользователей, для которых предназначен данный отчет
  • Сохраняем внесенные изменения

image

  • Нажимаем кнопку «Присвоить инфо-наборы»

image

  • Прокручиваем список вниз, чтобы найти пользовательские инфо-наборы и отмечаем созданный ранее инфо-набор «Z_SUPPLY_TO_CONTRACT»
  • Сохраняем

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

Запрос — это следующий шаг формирования отчета после создания инфо-набора и группы пользователей. На этом шаге определяется окончательный состав полей, которые войдут в отчет, порядок полей, внешний вид отчета, сортировка, итоги и прочее.

Запускаем транзакцию SQ01.

image

Проверяем, что работаем с группой пользователей, созданной ранее. (см. название группы в верхней части экрана). Если нет, нажимаем кнопку «Другая группа пользователей» (Shift + F7) и выбираем нужную группу.

Вводим имя «Z_SUPPLY» и нажимаем кнопку «Создать». Система выведет список инфо-наборов, привязанных к данной группе пользователей. Выбираем наш инфо-набор и подтверждаем ввод.

Формат списка желательно сопоставить с существующим форматом печати, иначе отчет не может быть напечатан. Распространенные форматы: 65x132 и 65x80. Оставим формат по умолчанию: 0 строк (без ограничения) и 83 столбца.

image

Назовем отчет «Поступление к контрактам» и перейдем непосредственно к «рисованию» отчета, нажав кнопку «Основной список».

image

На экране основного списка в левой части расположены поля, которые можно добавить в отчет. В левой нижней части отображены свойства выделенного элемента, а основная часть — это графическое представление будущего отчета.

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

Внесем небольшие коррективы. Стоимостные поля отображаются с доп. полем «Валюта» значение которого нам не требуется. Чтобы убрать отображение валюты, выделим стоимостное поле и в левой нижней части экрана выделим пункт «Без поля валюты». Затем нажмем «Apply».

image

На этом наш отчет можно считать сформированным. Сохраняем отчет.

Тут же его можно протестировать, нажав кнопку «Тест».

Создание транзакции для отчета

Убедившись, что отчет полностью удовлетворяет нашим потребностям, следует создать для его запуска транзакцию.

  1. Изначально генерируем программу. Для этого переходим на первый экран транзакции SQ01. В данной транзакции выделяем созданный нами запрос и выбираем в меню «Запрос» -> «Другие функции» -> «Сгенерировать программу».
  2. После генерации программы получаем имя программы в меню «Запрос» -> «Другие функции» -> «Просмотреть имя отчета».
  3. Формируем транзакцию через SE93.
    1. Указываем имя транзакции
    2. Нажимаем кнопку «Создать»
    3. Указываем название транзакции
    4. Отмечаем пункт «Программа и экран выбора»
    5. Подтверждаем ввод
    6. В открывшемся экране в поле «Программа» вводим ранее полученное имя отчета
    7. Отмечаем GUI-способность
    8. Сохраняем

image

Теперь можно формировать отчет, используя транзакцию.

image

P.S.

  1. На некоторых экранах может отображаться в заголовке «Изменение» вместо «Создание». Это связано с тем, что отчет был создан ранее
  2. Приведенный код вряд ли является наиболее оптимальным. Если Вы считаете, что Ваш вариант лучше, готов его рассмотреть и заменить
  3. Существует несколько вариантов формирования данного отчета в SAP Query. Приведенный вариант не является оптимальным. Но он раскрывает возможности SAP Query
  4. Я всегда рад конструктивной критике
Поделиться публикацией

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

    0
    Что-то хочется написать, аж зудит, но все фигня какая-то выходит. Резюмируя фигню скажу — СКД в 1с круче :) v8.1c.ru/overview/dcs_sample_report.htm
      0
      Не очень понятно, чем же круче… Функционал примерно такой-же.
      0
      А в чем смысл Вашего сравнения?
      Если уж сравниваете разные системы, то сравнивайте по основным критериям.
      А так, на бумажке (ну или в XLS) мне отчет нарисовать намного легче (речь идет о самом отчет, а не о его содержимом). Но это же не значит, что бумажка круче в плане формирования отчетов?
        0
        Умеют ли бумажка или excel автоматически заполняться содержимым после того как вы их нарисуете?
          0
          Это уже пошло сравнение теплого с мягким.
          Изначально было сказано, что «СКД в 1с круче». Я привел альтернативу.
          Теперь Вы говорите что моя альтернатива не умеет заполнять данные.
          Заметьте:
          1. Я уже писал, что если сравнивать, то по основным критериям. Своим комментарием Вы это подтвердили.
          2. В приведенном примере 1с показана инструкция использования конструктора. В своем посту я пошел дальше и показал пример формирования отчета с нестандартными решениями. Да, пример простой, и можно обойтись без кода, но это учебный материал. А может ли конструктор 1с решать подобные задачи?
          3. Что является показателем «крутизны»? Если простота, то я привел пример с ручкой и карандашом, и тут действительно все проще, если возможности, то я не думаю, что просто конструктор способен решать нестандартные задачи. А если он не простой и не отображены все его возможности (речь про 1с), то к чему тогда было приводить пример из первого комментария?
          P.S. я не говорил, что бумажка или xls (хотя он тоже может автоматически формировать данные используя макросы) является лучше, чем система формирования отчетов в 1с. Я лишь показал, что они проще в использовании, т.е. сравнил по тем же параметрам, по которым сравнили 1с и SAP.
            0
            1. так где список критериев?
            2. Какие «подобные»? То, что в статье — да.
            3. Возможностей больше. Хотя тут — хз, конечно. Например, в СКД достаточно просто можно сделать произвольную иерархию, «правильную» агрегацию данных из нескольких наборов (в смысле отсутствия задвоений при агрегации, порождаемых обычными join, в случае, когда одной строке одного набора соответствует несколько строк другого), дополнение периода (когда нужно сделать отчет «по дням») при отсутствующих данных за какие-либо периоды без доп. join с таблицей периодов, правильный расчет начального и конечного остатка на границы «дополненных» периодов и их агрегации, например при выводе в вертикальном виде такого плана:

            Группировка НачальноеКоличество ВсегоОборот КонечноеКоличество (тут за весть период отчета)
            Дата 1: НачальноеКоличество ОборотЗаДату1 КонечноеКоличествоНаДату1
            Дата 2: НачальноеКоличествоНаДату2 ОборотЗаДату2 КонечноеКоличествоНаДату2
            Дата 3: НачальноеКоличествоНаДату3 ОборотЗаДату3 КонечноеКоличествоНаДату3
            Дата 4: НачальноеКоличествоНаДату4 ОборотЗаДату4 КонечноеКоличество

            Да и вообще куча других возможностей, например собирание информации из нескольких ODBC источников в одном отчете, сериализация отчетов и настроек с возможностью их выполнения в другой базе (например через SOAP) и отображение результата в исходной базе (кстати, кроме 1с нигде не видел штатного механизма распределенной информационной базы, все предлагают онлайн доступ в одно место, что в условиях большой филиальной сети вызывает много проблем).
              0
              Я не задавался целью сравнивать системы. Всего лишь описал небольшой пример.
              В связи с этим не предлагаю ни критериев сравнения, ни других данных для сравнения.
              Если в 1с возможности уходят намного дальше инструкций или знаний среднего специалиста, то Вы в праве рассказать об этом. Я же, если пост меня заинтересует, с радостью его почитаю.
      0
      Спасибо! Очень наглядная статья! Пишите еще подобные и подробные описания. Например можно что-то типа «ABAP для самых маленьких» :)
        0
        Плюсую, не хватает именно самых азов.
        0
        Хм. Статья частично пригодилась. Но есть проблема, если создать дополнительное поле в инфонаборе отличное от текстового(конкретно поле тип P) SAP Query потом не работает по нему если включить это поле в запрос, ругается дескать «ошибка компиляции — проблема в инфонаборе» при попытке выполнить запрос.
        Может, я что-то упустил?

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое