Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => Тема розпочата: Victor Ghost від Серпень 21, 2017, 12:48:02 ПП

Назва: массовое удаление входящих поставок
Відправлено: Victor Ghost від Серпень 21, 2017, 12:48:02 ПП
Доброго дня всем,
имеется транзакция VL32N, в которой возможно удаление входящей поставки. Пользователям захотелось удалять массово, указывая номера поставок списком. Возможно, плохо искал... но есть ли какой фм/класс для этого дела? Или может стандартная транзакция уже существует с таким функционалом?
Назва: Re: массовое удаление входящих поставок
Відправлено: Uukrul від Серпень 21, 2017, 05:30:53 ПП
Цитата: Victor Ghost від Серпень 21, 2017, 12:48:02 ПП
Пользователям захотелось удалять массово, указывая номера поставок списком. Возможно, плохо искал... но есть ли какой фм/класс для этого дела? Или может стандартная транзакция уже существует с таким функционалом?
Небольшой специалист в SD, но написать свой отчетик с удалением поставок через CALL TRANSACTION, там работы на полдня если честно. Хотя может SD-шники подтянутся да подскажут что.
Назва: Re: массовое удаление входящих поставок
Відправлено: Uukrul від Серпень 21, 2017, 09:11:35 ПП
Ну SD  говорит что нет такого... В общем ABAP в руки и за день будет всем счастье.
Назва: Re: массовое удаление входящих поставок
Відправлено: Victor Ghost від Серпень 22, 2017, 07:40:55 ДП
блин.. как всегда забываю о самом простом способе...
спасибо! :))
Назва: Re: массовое удаление входящих поставок
Відправлено: Uukrul від Серпень 22, 2017, 10:34:00 ПП
Цитата: Victor Ghost від Серпень 22, 2017, 07:40:55 ДП
блин.. как всегда забываю о самом простом способе...
Ну не факт, вдруг бы был стандартный метод?! Так что писать на абапе это всегда успеешь, сначала лучше все таки поискать стандартный метод.
Назва: Re: массовое удаление входящих поставок
Відправлено: Victor Ghost від Серпень 23, 2017, 02:46:54 ПП
в инете пишут тоже, что транзакций нет для массового удаления.
а я тут второй день не могу понять, почему не работает у меня переход в транзакцию..

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

Назва: Re: массовое удаление входящих поставок
Відправлено: Victor Ghost від Серпень 23, 2017, 03:39:48 ПП
upd: не тот пример я все-таки взял за основу, блин.. разобрался вроде :))
Назва: Re: массовое удаление входящих поставок
Відправлено: Victor Ghost від Серпень 25, 2017, 12:33:07 ПП
забавная штука. если удаляю через вызов транзакции несколько поставок, то первая не удаляется сразу. если еще раз запускаю удаление, то и она удаляется (ее точно никто не блокирует во время удаления). это не напрягает - отрабатыает то быстро все и два раза на одну кнопку можно нажать, но странно как-то..
Назва: Re: массовое удаление входящих поставок
Відправлено: Uukrul від Серпень 25, 2017, 01:15:17 ПП
Цитата: Victor Ghost від Серпень 25, 2017, 12:33:07 ПП
забавная штука. если удаляю через вызов транзакции несколько поставок, то первая не удаляется сразу. если еще раз запускаю удаление
Не это какая-то ошибка в программе. Такое не должно быть.
Назва: Re: массовое удаление входящих поставок
Відправлено: Victor Ghost від Вересень 13, 2017, 08:33:23 ДП
в общем, снова к этой заявке вернулся.
короче, если запускать в отладке и делать все медленно по шагам, то удаляет прекрасно и сразу.
если запускать напрямую и удалять 3 и более заявок, то периодически затыкается в VL32N с сообщением "пользователь хххх уже обрабатывает заказ уууу" (где хххх - это я как раз).
подозреваю, что программа тупо не успевает отрабатывать шаг цикла (то, что в VL32N происходит) и переходит уже на следующий шаг, а заказ то еще занят...
Назва: Re: массовое удаление входящих поставок
Відправлено: Uukrul від Вересень 13, 2017, 03:52:09 ПП
Цитата: Victor Ghost від Вересень 13, 2017, 08:33:23 ДП
подозреваю, что программа тупо не успевает отрабатывать шаг цикла (то, что в VL32N происходит) и переходит уже на следующий шаг, а заказ то еще занят...
Именно так и есть. Как вариант выполните проверку блокировки, вызов модуля блокировки с флагом V - Проверка и флажок _WAIT = Х, в среднем оно будет ждать секунд 5 (зависит от настройки системы), потом еще раз делаешь проверку если все ОК, тогда можно идти дальше, документ не блокирован.
Назва: Re: массовое удаление входящих поставок
Відправлено: Victor Ghost від Вересень 20, 2017, 01:49:26 ПП
спасибо! получилось :)

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