массовое удаление входящих поставок

Автор Victor Ghost, Серпень 21, 2017, 12:48:02 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Victor Ghost

Доброго дня всем,
имеется транзакция VL32N, в которой возможно удаление входящей поставки. Пользователям захотелось удалять массово, указывая номера поставок списком. Возможно, плохо искал... но есть ли какой фм/класс для этого дела? Или может стандартная транзакция уже существует с таким функционалом?

Uukrul

Цитата: Victor Ghost від Серпень 21, 2017, 12:48:02 ПП
Пользователям захотелось удалять массово, указывая номера поставок списком. Возможно, плохо искал... но есть ли какой фм/класс для этого дела? Или может стандартная транзакция уже существует с таким функционалом?
Небольшой специалист в SD, но написать свой отчетик с удалением поставок через CALL TRANSACTION, там работы на полдня если честно. Хотя может SD-шники подтянутся да подскажут что.

Uukrul

Ну SD  говорит что нет такого... В общем ABAP в руки и за день будет всем счастье.

Victor Ghost

блин.. как всегда забываю о самом простом способе...
спасибо! :))

Uukrul

Цитата: Victor Ghost від Серпень 22, 2017, 07:40:55 ДП
блин.. как всегда забываю о самом простом способе...
Ну не факт, вдруг бы был стандартный метод?! Так что писать на абапе это всегда успеешь, сначала лучше все таки поискать стандартный метод.

Victor Ghost

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

в общем, записал через 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 = ' ', то выдает ошибку "первый экран не содержится в данных пакетного ввода".


Victor Ghost

upd: не тот пример я все-таки взял за основу, блин.. разобрался вроде :))

Victor Ghost

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

Uukrul

Цитата: Victor Ghost від Серпень 25, 2017, 12:33:07 ПП
забавная штука. если удаляю через вызов транзакции несколько поставок, то первая не удаляется сразу. если еще раз запускаю удаление
Не это какая-то ошибка в программе. Такое не должно быть.

Victor Ghost

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

Uukrul

Цитата: Victor Ghost від Вересень 13, 2017, 08:33:23 ДП
подозреваю, что программа тупо не успевает отрабатывать шаг цикла (то, что в VL32N происходит) и переходит уже на следующий шаг, а заказ то еще занят...
Именно так и есть. Как вариант выполните проверку блокировки, вызов модуля блокировки с флагом V - Проверка и флажок _WAIT = Х, в среднем оно будет ждать секунд 5 (зависит от настройки системы), потом еще раз делаешь проверку если все ОК, тогда можно идти дальше, документ не блокирован.

Victor Ghost

спасибо! получилось :)

долго тупил и думал, почему не работает. оказалось, что 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.

SMF spam blocked by CleanTalk