Чтение данных с использованием Field Symbols в ABAP

9th Октябрь 2015 ;)

Один из первых вопросов который возникает при реализации новой логики в SAP User Exit это: какие данные доступны на входе и что мы можем изменить на выходе. Несмотря на ограничения, чаще всего параметры передаваемые в User Exit функцию позволяют выполнить задачу. Но иногда можно оказаться в тупике, потому что какое-то поле недоступно. Это поле может быть глобальным в вызывающей программе или глобальным полем в группе функций которая используется для вызова программы (Вы должны помнить, что во втором случае данные остаются в памяти даже после завершения работы программы или транзакции и могут быть использованы при следующем вызове).

Вот простой способ который позволяет вам читать и изменять глобальные данные любого модуля загруженного запускаемой программой. Для этого используется существующая в ABAP возможность динамического присвоения Field Symbols. Лучше показать это на примере.

User Exit ZXCO1U06 запускается когда мы сохраняем производственный заказ в транзакции CO02. В этом User Exit вы можете выполнить дополнительные проверки, модифицировать данные, возможно вывести какие-то сообщения и тому подобные вещи. К сожалению, в нём в качестве параметра доступны только данные заголовка заказа. Чтение из базы данных тоже не вариант, так как любые новые данные на этот момент ещё отсутствуют в ней. Если вы хотите видеть, скажем, операции производственного заказа или их статус, вы можете вызвать теже функции, что используются в CO02 или обратиться к данным напрямую. Если мы хотим проверить статус заказа и его операций мы должны прочитать глобальные данные (внутренние таблицы) группы функций BSVA, которая используется для управления статуса в CO02. Таблица которая содержит флаг статуса называется JEST_BUF и мы можем получить содержимое таблицы в нашем User Exit следующим способом:

* Смотрите объявления в LBSVATOP
* Этот тип должен совпадать с используемым в программе!
types: begin of t_jest.
            include structure jest_upd.
types:
            mod,
            inact_old like jest-inact,
          end of t_jest.

data:
  lf_text(40)   type c,
  lt_jest       type standard table of t_jest.

field-symbols:
  <ls_jest_buf>      type any table.

lf_text = '(SAPLBSVA)JEST_BUF[]'.
assign (lf_text) to <ls_jest_buf>.
check sy-subrc = 0.
lt_jest[] = <ls_jest_buf>.  "теперь все данные в lt_jest

Если мы хотим записать данные обратно, необходимо выполнить обратное присвоение:

<ls_jest_buf> = lt_jest[].

Поиск нужной программ и имени нужных переменных в ней достаточно сложная задача, но отладчик поможет это сделать. Лучший мотивация это то, что в некоторых случаях других альтернатив просто нет или они будут не такими красивыми. Важное замечание: использование User Exits является задачей повышенной сложности так как можно легко нарушить целостность внутренних данных и логики работы SAP.


Сегодня: 2016.12.03
jAntivirus