1. Найти Функции блокировки/разблокировки
Например, необходимо блокировать/разблокировать элемент таблицы vbak (сбытовой заказ).
* В транзакции se11 в графе "ОбъектБлокировки" ищем "*vbak*" и находим "EVVBAKE".
* Заходи внутрь и нажимаем "Перейти к" - "Модули блокировки"
* Там видим:
DEQUEUE_EVVBAKE Снятие блок. постановки в очередь с объекта EVVBAKE
ENQUEUE_EVVBAKE Запрос блокировки постановки в очередь для объекта EVVBAKE
есть ещё две, но по ним видно, что это что-то специфическое, потому что там блокировка идёт не по vbak-vbeln, а по совершенно другому полю.
2. Снять все блокировки
Эти функции работают не как "блокировать" / "разблокировать", а "увеличить счётчик блокировок" / "уменьшить счетчик блокировок". В некоторых случаях это не очень удобно, например когда мы не можем или не хотим следить за количеством блокировок (в моём случае стандартные ФМ-ы непредсказуемо снимали или устанавливали блокировки).
Вот такой код вернёт в E_COUNT количество блокировок текущим пользователем по заказу l_vbeln:
data lt_enq type table of seqg3.
data ls_enq type seqg3.
data: GTARG TYPE EQEGTARG.
CONCATENATE SY-MANDT l_vbeln into GTARG.
CALL FUNCTION 'ENQUEUE_REPORT'
EXPORTING
GCLIENT = SY-MANDT
GNAME = 'VBAK'
GTARG = GTARG
GUNAME = SY-UNAME
TABLES
ENQ = lt_enq
EXCEPTIONS
COMMUNICATION_FAILURE = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
E_COUNT = 0.
LOOP AT lt_enq into ls_enq.
E_COUNT = E_COUNT + ls_enq-GUSEVB.
ENDLOOP.
Соответственно для полной разблокировки надо запускать соответсвующий фм столько раз.
А при блокировании лучше проверить, а не заблокирован ли уже заказ.
Так же могут быть полезны другие модули группы функций SENT.
3. Ожидание разблокировки стандартными FM-ами
Функции блокировки могут пригодиться в случае, когда по одному объекту (например, сбытовому заказу) необходимо последовательно выполнять разные BAPI-функции. Дело в том, что эти функции часто работаю асинхронно, и возвращают управление в вызывающую функцию раньше, чем закончат свою работу. Не помогает даже bapi_transaction_commit с признаком wait. То есть второй шаг обработки будет провален так как, первый шаг ещё не отработал.
В таких случаях может быть полезен следующий код:
* вызов первой функции, блокирующей заказ. например, SD_SALESDOCUMENT_CREATE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'.
is_ok = space.
DO 10 TIMES. " количество попыток, сколько раз пытаться блокировать заказ. не слишком много
* вызов фм блокирования
IF SY-SUBRC = 0. " если удалось заблокировать
* вызов функции разблокирования
is_ok = 'X'.
exit.
else.
* если надо - запоминаем почему неудалось заблокировать. это хранится в sy-MSG*.
ENDIF.
WAIT UP TO 1 SECONDS. " делаем паузу перед следующей попыткой заблокировать
ENDDO.
if is_ok is not initial.
* вызов второй функции, блокирующей заказ.
endif.
Подробнее...
Сюда я буду сохранять всякие куски кода, конфигов, ссылки, чтобы в один прекрасный день когда мне это снова понадобится - не вспоминать судорожно где и когда я это применял.
27 июня 2011 г.
26 июня 2011 г.
FM для вывода диалога с несколькими опциями
DATA: lt_spopli TYPE TABLE OF SPOPLI,
ls_spopli TYPE SPOPLI.
DATA: lv_answer TYPE CHAR2.
CLEAR ls_spopli.
ls_spopli-VAROPTION = 'Предложение'.
APPEND ls_spopli TO lt_spopli.
CLEAR ls_spopli.
ls_spopli-VAROPTION = 'Заказ с оплатой на месте'.
APPEND ls_spopli TO lt_spopli.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
CURSORLINE = 1
TEXTLINE1 = 'Сохранить документ как:'
TITEL = 'Cохранить'
IMPORTING
ANSWER = lv_answer
TABLES
T_SPOPLI = lt_spopli
EXCEPTIONS
NOT_ENOUGH_ANSWERS = 1
TOO_MUCH_ANSWERS = 2
TOO_MUCH_MARKS = 3
OTHERS = 4
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Результат:
Подробнее...
ls_spopli TYPE SPOPLI.
DATA: lv_answer TYPE CHAR2.
CLEAR ls_spopli.
ls_spopli-VAROPTION = 'Предложение'.
APPEND ls_spopli TO lt_spopli.
CLEAR ls_spopli.
ls_spopli-VAROPTION = 'Заказ с оплатой на месте'.
APPEND ls_spopli TO lt_spopli.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
CURSORLINE = 1
TEXTLINE1 = 'Сохранить документ как:'
TITEL = 'Cохранить'
IMPORTING
ANSWER = lv_answer
TABLES
T_SPOPLI = lt_spopli
EXCEPTIONS
NOT_ENOUGH_ANSWERS = 1
TOO_MUCH_ANSWERS = 2
TOO_MUCH_MARKS = 3
OTHERS = 4
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Результат:
Подробнее...
Подписаться на:
Сообщения (Atom)