Текущее время: Сб, авг 02 2025, 23:49

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 13:50 
Ассистент
Ассистент

Зарегистрирован:
Вт, ноя 13 2007, 12:25
Сообщения: 40
Господа форумчане!
Есть проблема. В рамках проекта реализована упаковка ЕО в поставках посредством WS_DELIVERY_UPDATE.
Вот все, что подается на вход:
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
VBKOK_WA = LS_VBKOK
DELIVERY = GF_VBELN
TABLES
VBPOK_TAB = LT_VBPOK[]
VERKO_TAB = LT_VERKO[]
VERPO_TAB = LT_VERPO[]
EXCEPTIONS
ERROR_MESSAGE = 1
OTHERS = 2.

IF SY-SUBRC = 0. " в случае успеха упаковки
COMMIT WORK AND WAIT.

Но для успешной упаковки таким способом необходимо, чтобы поставка была неупакована и не было свободных ЕО к данной поставке.
Специфика проекта подразумевает неоднократную упаковку одних и тех же ЕО, т.е. переупаковку. Здесь возникает проблема: для упаковки вышеописанным способом нужно сначала распаковать поставку и удалить имеющиеся ЕО, хотя проблема собственно не в распаковке и удалении ЕО, а в том, что после переупаковки ЕО уже имеют другой внутренний индекс (VENUM).
Задача состоит в том, чтобы при переупаковке сохранить VENUM.

Если кто с этим связывался, подскажите или подтолкните в нужную сторону.
Может у кого есть какая-либо документация по WS_DELIVERY_UPDATE?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 13:57 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
Сталкивался именно с таким на одном проекте. ;)

пришлось немного повозиться ;))

кидаю вам код целиком, с упаковкой и прочей. (сейчас лень вырезать не нужное, думаю сами вытащите/уберете что вам необходимо

Code:

*&---------------------------------------------------------------------*
*&      Form  pack_deliveries
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_LIKP  text
*----------------------------------------------------------------------*
FORM pack_deliveries
  TABLES   pt_likp STRUCTURE likp
  USING    pf_post
           pf_pack.

  DATA ls_likp             TYPE likp.
  DATA ls_lips             TYPE lips.
  DATA lt_lips             TYPE STANDARD TABLE OF lips.
  DATA lt_likp             TYPE STANDARD TABLE OF likp WITH HEADER LINE.


  DATA l_delivery          LIKE likp-vbeln.
  DATA lt_return           TYPE TABLE OF bapiret2  WITH HEADER LINE.
  DATA lt_prot             TYPE TABLE OF prott     WITH HEADER LINE.

  DATA lt_verko            TYPE TABLE OF verko     WITH HEADER LINE.
  DATA lt_verpo            TYPE TABLE OF verpo     WITH HEADER LINE.
  DATA ls_vbkok            TYPE vbkok.
  DATA lt_created_hus      TYPE STANDARD TABLE OF  vekpvb        WITH HEADER LINE.
  DATA lt_hum_rehang_hu    TYPE STANDARD TABLE OF  hum_rehang_hu WITH HEADER LINE.

  DATA lt_ordtab           LIKE ordtab OCCURS 0 WITH HEADER LINE.
  DATA l_error             TYPE flag.
  DATA l_venum             TYPE venum.

  lt_ordtab[] = ordtab[].

  CHECK NOT pt_likp[] IS INITIAL.

* Read Delivery Items
  REFRESH lt_lips[].
  SELECT *
    INTO TABLE lt_lips
    FROM lips
    FOR ALL ENTRIES IN pt_likp
    WHERE vbeln EQ pt_likp-vbeln.


  SORT lt_ordtab BY ebeln.
  SORT lt_lips   BY vbeln posnr.


  REFRESH lt_likp[].
  CLEAR lt_likp.

* For all deliveries
  LOOP AT pt_likp INTO ls_likp.

    CLEAR ls_vbkok.
    REFRESH lt_verko[].
    REFRESH lt_verpo[].

    l_delivery = ls_likp-vbeln.

*   Get first item of delivery
    READ TABLE lt_lips INTO ls_lips
      WITH KEY vbeln = l_delivery
      BINARY SEARCH.

    CHECK sy-subrc EQ 0.

*   Read Target Header record (PO)
    READ TABLE lt_ordtab
      WITH KEY ebeln = ls_lips-vgbel
               saved = 0
*      BINARY SEARCH
      .

    CHECK sy-subrc EQ 0.

*    break parshenkov.

*   Check if HU allready exists
    CLEAR l_venum.
    SELECT SINGLE venum
      INTO l_venum
      FROM vekp
      WHERE exidv EQ lt_ordtab-exidv
        AND status NE '0060'
      .


*   Nothing to do
    IF ( lt_ordtab-exidv IS INITIAL OR pf_pack IS INITIAL )
       AND pf_post      IS INITIAL.

      lt_likp-vbeln = l_delivery.
      APPEND lt_likp.

      CONTINUE.
    ENDIF.


*   Delivery is to be packed
    IF NOT lt_ordtab-exidv IS INITIAL AND
       NOT pf_pack         IS INITIAL.

*     Packing Delivery
      MESSAGE s038(zmm01)
        WITH l_delivery
        INTO g_mes_dummy.

*     Add message to Application Log
      PERFORM append_log USING gt_log_handle.
    ENDIF.


*   Delivery is to be posted
    IF NOT pf_post IS INITIAL.
*     Posting Delivery
      MESSAGE s058(zmm01)
        WITH l_delivery
        INTO g_mes_dummy.

*     Add message to Application Log
      PERFORM append_log USING gt_log_handle.
    ENDIF.



*   Prepare header control
    ls_vbkok-vbeln           = l_delivery.       " Delivery Number
    ls_vbkok-vbeln_vl        = l_delivery.       " Delivery Number
    ls_vbkok-wabuc           = pf_post.          " Post good issue automatically
    ls_vbkok-packing_refresh = 'X'.

*   Post Date
*    IF NOT ls_vbkok-wabuc IS INITIAL.
*
*
*      SELECT SINGLE lfdat
*        INTO ls_vbkok-wadat_ist
*        FROM likp
*        WHERE vbeln EQ l_delivery.
*
*    ENDIF.


*   HU Header
    lt_verko-exidv    = lt_ordtab-exidv.    " External Handling Unit
    lt_verko-vhilm    = lt_ordtab-vhilm.    " Packaging Materials
    lt_verko-exidv2   = lt_ordtab-exidv2.   " Handling Unit's 2nd
    lt_verko-werks    = ls_lips-werks.
    lt_verko-lgort    = ls_lips-lgort.

    APPEND lt_verko.

*   Delivery Items to pack
    LOOP AT lt_lips INTO ls_lips WHERE vbeln EQ ls_likp-vbeln.

*     HU Item
      lt_verpo-exidv_ob = lt_ordtab-exidv.  " External Handling Unit

      lt_verpo-velin    = '1'.              " Type of position - material
      lt_verpo-vbeln    = ls_lips-vbeln.    " Delivery Number
      lt_verpo-posnr    = ls_lips-posnr.    " Delivery Position
      lt_verpo-werks    = ls_lips-werks.
      lt_verpo-lgort    = ls_lips-lgort.
      lt_verpo-matnr    = ls_lips-matnr.    " Material
      lt_verpo-tmeng    = ls_lips-lfimg.    " Qty
      APPEND lt_verpo.

    ENDLOOP.

    REFRESH lt_hum_rehang_hu[].

    IF NOT l_venum IS INITIAL.
      lt_hum_rehang_hu-top_hu_external = lt_ordtab-exidv.
      APPEND lt_hum_rehang_hu.
    ENDIF.


*   Update Delivery (packing and posting)
    REFRESH lt_prot[].

    DATA l_err   TYPE xfeld.

*   not to be packed
    IF lt_ordtab-exidv IS INITIAL OR
       pf_pack         IS INITIAL.

      REFRESH lt_verko[].
      REFRESH lt_verpo[].
      REFRESH lt_hum_rehang_hu[].
    ENDIF.

*   Only assign HU to delivery
    DATA l_status LIKE vekp-status.

    IF NOT lt_hum_rehang_hu[] IS INITIAL.
      PERFORM unsign_hu
        USING    l_venum
        CHANGING l_status.

      IF l_status EQ '0060'.
        REFRESH lt_hum_rehang_hu[].
      ELSE.
        REFRESH lt_verko[].
        REFRESH lt_verpo[].
      ENDIF.
    ENDIF.


    SET UPDATE TASK LOCAL.
    CALL FUNCTION 'WS_DELIVERY_UPDATE'
      EXPORTING
        vbkok_wa                 = ls_vbkok
*        no_messages_update       = 'X'
        synchron                 = 'X'
        delivery                 = l_delivery
        nicht_sperren            = space
        if_error_messages_send_0 = space

      IMPORTING
        ef_error_any_0           = l_err
      TABLES
        prot                     = lt_prot
        verko_tab                = lt_verko
        verpo_tab                = lt_verpo
        it_handling_units        = lt_hum_rehang_hu
        et_created_hus           = lt_created_hus
      EXCEPTIONS
        error_message            = 1
        OTHERS                   = 99.

    CLEAR l_error.


    IF sy-subrc NE 0.
      l_error = 'X'.
      PERFORM check_sys_mess.
    ENDIF.

*   Protocol to BAPI log structure
    REFRESH lt_return[].

    LOOP AT lt_prot.

      IF lt_prot-msgty CA 'EAX'.
        l_error = 'X'.
      ENDIF.

      lt_return-type       = lt_prot-msgty.
      lt_return-id         = lt_prot-msgid.
      lt_return-number     = lt_prot-msgno.
      lt_return-message_v1 = lt_prot-msgv1.
      lt_return-message_v2 = lt_prot-msgv2.
      lt_return-message_v3 = lt_prot-msgv3.
      lt_return-message_v4 = lt_prot-msgv4.

      APPEND lt_return.
    ENDLOOP.


*   Bapi Messages to Application Log
    PERFORM bapi_mess_to_log TABLES lt_return.

    CHECK l_error IS INITIAL.

*    PERFORM commit_bapi.
*    CHECK sy-subrc EQ 0.

    IF NOT lt_ordtab-exidv IS INITIAL AND
       NOT pf_pack         IS INITIAL.
*     Delivery '&' has been packeged
      MESSAGE s035(zmm01)
        WITH l_delivery
        INTO g_mes_dummy.

*     Add message to Application Log
      PERFORM append_log USING gt_log_handle.
    ENDIF.

    IF NOT pf_post IS INITIAL.
*     Delivery '&' has been posted
      MESSAGE s059(zmm01)
        WITH l_delivery
        INTO g_mes_dummy.

*     Add message to Application Log
      PERFORM append_log USING gt_log_handle.
    ENDIF.


    lt_likp-vbeln = l_delivery.
    APPEND lt_likp.

*    IF NOT pf_post IS INITIAL.
    PERFORM commit_bapi.
    CHECK sy-subrc EQ 0.
*    ENDIF.

  ENDLOOP.


  pt_likp[] = lt_likp[].


ENDFORM.                    " pack_deliveries




*&---------------------------------------------------------------------*
*&      Form  unsign_hu
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM unsign_hu
  USING     p_venum LIKE vekp-venum
  CHANGING  p_status.

  DATA ls_vekp   LIKE vekp.

  CLEAR ls_vekp.
  CLEAR p_status.

  break parshenkov.

  SELECT SINGLE *
    INTO ls_vekp
    FROM vekp
    WHERE venum EQ p_venum.

  CHECK sy-subrc EQ 0.

  CHECK ls_vekp-vpobj  EQ '01'. " Outbound delivery

  CHECK ls_vekp-status EQ '0030' OR
        ls_vekp-status EQ '0040'.

  ls_vekp-status = '0060'.

  UPDATE vekp FROM ls_vekp.

  p_status = ls_vekp-status.

ENDFORM.                    " unsign_hu



Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 14:06 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Porter, а почему вы решили, что ЕО нужно именно удалять?
Нужно всего лишь разассайнить ЕО и старую поставку.
Поиск, как обычно, дает ответ.

Pokusannoe_Zubilo, UPDATE vekp FROM ls_vekp - :twisted:


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 14:12 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
Пономарев Артем написал:
Pokusannoe_Zubilo, UPDATE vekp FROM ls_vekp - :twisted:


абсолютно понимаю ваш гнев ;)) и согласен что очень не красиво.

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

т.к. если поставка уже запостирована, то вы ни как не удалити из нее ЕО, ни какими стандартными процедурами., а в моем случае было именно такое требование.
что одна ЕИ может использоваться в других поставках, а в предыдущих она уже запостирована.


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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 14:27 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Pokusannoe_Zubilo, знаю эту проблему. Тоже решал. Возможно пригодится.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 14:52 
Ассистент
Ассистент

Зарегистрирован:
Вт, ноя 13 2007, 12:25
Сообщения: 40
Артем, разассайнить я пробовал именно по Вашему алгоритму, только у меня переупаковка не идет при этом почему-то пока не удалишь ЕО "физически"))
Кстати, в сегодняшней версии у меня распаковка так и работает по Вашему коду + удаление ЕО. Респект!!!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пт, мар 20 2009, 15:08 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Porter, а тут надо разбираться дальше.
Если по поставке, от которой необходимо отвязать ЕО, у вас уже было движение материала - нужно делать как по ссылке, что я привел. Т.е. проверить правильность истории, HUMSEG'а и заголовка ЕО.
Тогда все будет работать и пересоздавать ЕО не придется.

UPD:
Это если у вас цепочка поставок.
Если поставка одна и движения по ней не было или оно было сторнировано - то все должно работать и так. ЕО становятся свободными и их можно присвоить другой поставке. По крайней мере у меня происходит именно так.

Еще раз перечитал исходное сообщение, и понял что не совсем понимаю проблему. Опишите более подробно.
Т.е. на начальный момент времени есть поставка, к которой привязаны ЕО. Затем вы разассайниваете ЕО от поставки. У вас получается некоторое кол-во свободных ЕО на складе и "мусорная" пустая поставка. Что должно происходить дальше?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пн, мар 23 2009, 07:26 
Ассистент
Ассистент

Зарегистрирован:
Вт, ноя 13 2007, 12:25
Сообщения: 40
Не, немного по-другому.
В начальный момент времени есть исходящая поставка, которую нужно упаковать. Причем, ЕО к данной поставке еще нет. ЕО появляются при упаковке этой поставки при пом. WS_DELIVERY_UPDATE. Сюда из "ключей" ЕО подается только внешний номер ЕО (EXIDV), а внутренний (VENUM) генерится "самостоятельно" из диапазона номеров. Далее, при поступлении дополнительной информации по ЕО, поставку необходимо переупаковать, при этом сохранив старые VENUMы, чтобы попусту не съедать диапазон номеров.
Просто, смотрел в VL02N, там при переупаковке, при условии сохранения внешних номеров ЕО, внутренние тоже сохраняются.

Т.е. у нас сейчас такая переупаковка: unassign + delete HUs и затем упаковка заново.
А нужна просто переупаковка без удаления ЕО, т.к. именно это и приводит к замене VENUM на новые.

UPD
Здесь еще один момент: мы используем ЕО без управления запасами, т.о. статус ЕО в поставке постоянно 0020 - запас не на складе ЕО.
Может поэтому переупаковать не так просто?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Пн, мар 23 2009, 12:15 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Ну EXIDV тоже самостоятельно генерится. К нему диапазон есть. Не совсем понимаю - вы в первом случае автоматически пакуете, не через интерфейс пользователя? Интересно, по какому алгоритму. Просто любопытство :)

В вашем случае вижу два варианта:
1. самый простой:
удалять после разассайнивания не ЕО, а поставку. потом на базе свободных ЕО создавать новую поставку через ФМ 'GN_DELIVERY_CREATE' (см. таблицу it_handling_units). Если надо будет - могу выложить пример.
2. несколько сложнее:
производить обратную операцию с помощью V51P_ADD_HU_TO_OBJEKT. Там по аналогии с разассайниванием надо V51P_FILL_GT вызывать, 'HU_INITIALIZE_PACKING' и т.п. Готового примера у меня нет.

Если надо менять что-то в самих ЕО - то V51P_FILL_GT, V51P_XVEKP_YVEKP_UPDATE, V51P_XVEPO_YVEPO_UPDATE помогут.

По поводу статусов и складов - не имеет значения.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Вт, мар 24 2009, 10:57 
Ассистент
Ассистент

Зарегистрирован:
Вт, ноя 13 2007, 12:25
Сообщения: 40
Во всех случаях поставка пакуется посредством интерфейса пользователя, алгоритм почти такой же, как и у Pokusannoe_Zubilo (если интересно, могу выложить), поэтому его решение не помогло. Особенно важно то, что у нас при переупаковке должно поменяться пакуемое количество. Для изменения пакуемого количества, как я понял нужно заполнить таблицы VERKO и VERPO, но если заполнить эти таблицы, WS_DELIVERY_UPDATE автоматически "считает", что ЕО нужно создать (и создать именно с новыми VENUM).

А операции с V51P_ADD_HU_TO_OBJEKT могут привести к упаковке поставки?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Вт, мар 24 2009, 11:24 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Porter, такого понятия, как упаковка поставки - не существует. Вы пакуете материал. Если буквально.

Теперь стало более понятно.
Т.е. у вас была поставка, в которой были созданы ЕО. Затем кол-во материалов в поставке изменилось. Поэтому вам приходится разассайнивать и удалять старые ЕО и запаковать материалы по новой. Так?
А вы хотите изменить кол-ва в уже существующих ЕО?
Тогда разассайнивать ничего не надо. И удалять тоже.
После изменения кол-ва в поставке попробуйте поменять кол-ва в существующих ЕО с помощью последовательности:
ФМ HU_GET_HUS_FROM_VBFA
ФМ V51P_FILL_GT
ФМ V51P_XVEPO_YVEPO_UPDATE
ФМ HU_POST.

Только я не понимаю смысла вопроса. Если пользователи все делают руками через интерфейс - то менять кол-ва в ЕО можно чере него без привлечения разработкика.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Упаковка поставки
СообщениеДобавлено: Вт, мар 24 2009, 12:12 
Ассистент
Ассистент

Зарегистрирован:
Вт, ноя 13 2007, 12:25
Сообщения: 40
Совершенно верно, именно это и нужно (Да, в понятиях я немного напутал :) ).
идимо, я понял под интерфейсом пользователя нечто другое, упаковка в рамках нашего проекта производится посредством собственной Z-разработки.

UPD
Реализовал последовательность с ФМ V51P_XVEKP_YVEKP_UPDATE - меняет количество даже в упакованных ЕО в поставках.
Все же у нас количество материала меняется сначала в ЕО, а затем его нужно уравнить и в позиции поставки (все это делается для того, чтобы сохранить статус упаковки поставки PKSTK = C).
WS_DELIVERY_UPDATE при попытке поменять кол-во в позиции поставки отрабатывает с ошибкой (видимо, потому что статус упаковки у поставки PKSTK = C)(с распакованной поставкой работает, проверял). Подскажите, может есть какой-нибудь ФМ, который можно было бы применить после V51P_XVEKP_YVEKP_UPDATE для изменения позиции поставки с уже упакованным материалом?


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB