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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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