Пока читал всякие документы по программированию, наткнулся в том числе на краткий экскурс в пакетный ввод.
Ещё один из подходов к массовому вводу всякой всячины. Однако он годится только для пакетного ввода и не касается остальных способов, таких как BAPI.
Сначала открываем сессию:
CALL FUNCTION ‘BDC_OPEN_GROUP’
EXPORTING
CLIENT = SY-MANDT
GROUP = ‘POTHURI’
HOLDDATE = DATE1
KEEP = ‘X’
USER = SY-UNAME
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11.
Затем начинаем обработку данных:
LOOP AT ITAB.
в цикле заполняем BDCDATA на основании внутренней таблицы, то есть формируем стандартный пакетный ввод, а затем:
CALL FUNCTION ‘BDC_INSERT’
EXPORTING
TCODE = ‘TCODE’
TABLES
DYNPROTAB = BDCTAB
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID= 6
OTHERS = 7.
А в случае проводки в режиме реального времени обычно пишут:
Call transaction ‘TCODE’ using BCDDATA Mode ‘A’ Update ‘S’.
И завершаем цикл.
ENDLOOP.
Осталось только закрыть сессию:
CALL FUNCTION ‘BDC_CLOSE_GROUP’
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
И уже потом прорываться в транзакцию SM35 и запускать сессию целиком.
А в чём собственно разница:
- Сессии, которые активно используют серверные ресурсы, можно запускать в удобное запланированное время
- Журнал сессии запоминает, какие вызовы прошли, а какие – нет
- Ошибочные вызовы можно обработать отдельно и неоднократно, и в том числе вручную
- Многие саповские фишки типа долгосрочных проводок, LSMW и другие работают именно через сессии
Также можно специальным образом настроить, чтоб например всё, что скопилось в SM35 проводилось автоматически ночью. Планирование можно производить с помощью программы RSBDCSUB.