Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: Victor Ghost от Август 21, 2017, 12:48:02 pm
-
Доброго дня всем,
имеется транзакция VL32N, в которой возможно удаление входящей поставки. Пользователям захотелось удалять массово, указывая номера поставок списком. Возможно, плохо искал... но есть ли какой фм/класс для этого дела? Или может стандартная транзакция уже существует с таким функционалом?
-
Пользователям захотелось удалять массово, указывая номера поставок списком. Возможно, плохо искал... но есть ли какой фм/класс для этого дела? Или может стандартная транзакция уже существует с таким функционалом?
Небольшой специалист в SD, но написать свой отчетик с удалением поставок через CALL TRANSACTION, там работы на полдня если честно. Хотя может SD-шники подтянутся да подскажут что.
-
Ну SD говорит что нет такого... В общем ABAP в руки и за день будет всем счастье.
-
блин.. как всегда забываю о самом простом способе...
спасибо! :))
-
блин.. как всегда забываю о самом простом способе...
Ну не факт, вдруг бы был стандартный метод?! Так что писать на абапе это всегда успеешь, сначала лучше все таки поискать стандартный метод.
-
в инете пишут тоже, что транзакций нет для массового удаления.
а я тут второй день не могу понять, почему не работает у меня переход в транзакцию..
в общем, записал через SHDB сценарий. в VL32N для удаления заказа действий почти не происходит: переход с 4104 экрана на 1000й (непонятно только, почему) и нажатие на кнопку "удалить" (BDC_OKCODE = '/ELOES_T').
написал у себя в программе (это кусок небольшой):
LOOP AT lt_vbeln INTO ls_vbeln.
PERFORM bdc_dynpro USING 'SAPMV50A' '1602'. "1202
PERFORM bdc_field USING 'LIKP-VBELN' ls_vbeln-vbeln.
PERFORM bdc_field USING 'BDC_OKCODE' '/ELOES_T'.
opt-dismode = 'A'.
opt-defsize = 'X'.
TRY.
CALL TRANSACTION 'VL32N' WITH AUTHORITY-CHECK
USING it_bdcdata OPTIONS FROM opt.
CATCH cx_sy_authorization_error ##NO_HANDLER.
ENDTRY.
REFRESH it_bdcdata.
ENDLOOP.
вот что ни ставь в качестве экрана, все-равно переходит на 4104й
FORM bdc_field USING fnam fval.
CLEAR it_bdcdata.
it_bdcdata-fnam = fnam.
it_bdcdata-fval = fval.
APPEND it_bdcdata.
ENDFORM. "BDC_FIELD
FORM bdc_dynpro USING prog scr.
CLEAR it_bdcdata.
it_bdcdata-program = prog.
it_bdcdata-dynpro = scr.
it_bdcdata-dynbegin = 'X'.
APPEND it_bdcdata.
ENDFORM. "BDC_DYNPRO
если сделать it_bdcdata-dynbegin = ' ', то выдает ошибку "первый экран не содержится в данных пакетного ввода".
-
upd: не тот пример я все-таки взял за основу, блин.. разобрался вроде :))
-
забавная штука. если удаляю через вызов транзакции несколько поставок, то первая не удаляется сразу. если еще раз запускаю удаление, то и она удаляется (ее точно никто не блокирует во время удаления). это не напрягает - отрабатыает то быстро все и два раза на одну кнопку можно нажать, но странно как-то..
-
забавная штука. если удаляю через вызов транзакции несколько поставок, то первая не удаляется сразу. если еще раз запускаю удаление
Не это какая-то ошибка в программе. Такое не должно быть.
-
в общем, снова к этой заявке вернулся.
короче, если запускать в отладке и делать все медленно по шагам, то удаляет прекрасно и сразу.
если запускать напрямую и удалять 3 и более заявок, то периодически затыкается в VL32N с сообщением "пользователь хххх уже обрабатывает заказ уууу" (где хххх - это я как раз).
подозреваю, что программа тупо не успевает отрабатывать шаг цикла (то, что в VL32N происходит) и переходит уже на следующий шаг, а заказ то еще занят...
-
подозреваю, что программа тупо не успевает отрабатывать шаг цикла (то, что в VL32N происходит) и переходит уже на следующий шаг, а заказ то еще занят...
Именно так и есть. Как вариант выполните проверку блокировки, вызов модуля блокировки с флагом V - Проверка и флажок _WAIT = Х, в среднем оно будет ждать секунд 5 (зависит от настройки системы), потом еще раз делаешь проверку если все ОК, тогда можно идти дальше, документ не блокирован.
-
спасибо! получилось :)
долго тупил и думал, почему не работает. оказалось, что VBAK-VBELN и LIKP-VBELN - это совершенно разные вещи (ну, описание посмотреть сложно, да...) и я пытался проверять не тот объект блокировки ~_~
а проверку такую запилил:
* проверка блокировки заявки
* в таблице LIKP VBELN - это VBELN_VL
* EVVBLKE - объект блокировки
CALL FUNCTION 'ENQUEUE_EVVBLKE'
EXPORTING
MODE_LIKP = 'V'
MANDT = sy-mandt
VBELN = ls_vbeln-vbeln
* X_VBELN = ' '
* _SCOPE = '2'
_WAIT = 'X'
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
"какая-то обработка
ENDIF.