Перед нами стояла следующая задача:
1. Создать ЕО;
2. Упаковать в нее материалы и другие ЕО;
3. ЕО и неупакованные материалы поместить в заказ на перемещение (MO) аналогично работе тр. VL10B и VL10HU;
4. На основе MO создать исходящую поставку (OD) таким образом, чтобы в нее попали материалы и ЕО из MO.
1. Создание ЕО реализовано с помощью BAPI.
Code:
LS_HUHEADER-PACK_MAT = U_VHILM.
LS_HUHEADER-EXT_ID_HU_2 = U_EXIDV2.
call function 'BAPI_HU_CREATE'
exporting
HEADERPROPOSAL = LS_HUHEADER
importing
HUHEADER = LS_HUHEADER_E
HUKEY = C_EXIDV
tables
RETURN = LT_RETURN.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
WAIT = 'X'
importing
RETURN = LS_RETURN.
2.1 Упаковка материалов в ЕО. Не забыдь вызвать 'BAPI_TRANSACTION_COMMIT'.
Code:
form HU_PACK_MATERIAL using U_EXIDV type EXIDV
US_HUITEM type TYPE_HUITEM.
data
:
LS_HUITEM type BAPIHUITMPROPOSAL
, LT_RETURN type table of BAPIRET2
, LS_RETURN type BAPIRET2
.
LS_HUITEM-MATERIAL = US_HUITEM-MATNR. " Номер материала
LS_HUITEM-BATCH = US_HUITEM-CHARG. " Номер партии
LS_HUITEM-PACK_QTY = US_HUITEM-MENGE. " Упакованное базисное количество в позиции ЕО
LS_HUITEM-BASE_UNIT_QTY = US_HUITEM-MEINS.
LS_HUITEM-PLANT = US_HUITEM-WERKS. " Завод
LS_HUITEM-STGE_LOC = US_HUITEM-LGORT. " Склад
LS_HUITEM-SPEC_STOCK = US_HUITEM-SOBKZ. " Код особого запаса
LS_HUITEM-SP_STCK_NO = US_HUITEM-SONUM. " Номер особого запаса
LS_HUITEM-HU_ITEM_TYPE = '1'.
clear: LT_RETURN, LS_RETURN.
call function 'BAPI_HU_PACK'
exporting
HUKEY = U_EXIDV
ITEMPROPOSAL = LS_HUITEM
tables
RETURN = LT_RETURN
.
endform. " HU_PACK_MATERIAL
2.2. Упаковка ЕО в ЕО. Не забыдь вызвать 'BAPI_TRANSACTION_COMMIT'.
Code:
form HU_PACK_HU using U_EXIDV type EXIDV
US_HUITEM type TYPE_HUITEM.
data
:
LS_HUITEM type BAPIHUITMPROPOSAL
, LT_RETURN type table of BAPIRET2
, LS_RETURN type BAPIRET2
.
LS_HUITEM-LOWER_LEVEL_EXID = US_HUITEM-EXIDV. " Внешний ид. единицы обработки
LS_HUITEM-HU_ITEM_TYPE = '3'.
clear: LT_RETURN, LS_RETURN.
call function 'BAPI_HU_PACK'
exporting
HUKEY = U_EXIDV
ITEMPROPOSAL = LS_HUITEM
tables
RETURN = LT_RETURN.
endform. " HU_PACK_HU
3. Создание заказа к делу не относится, поэтому здесь описывать не буду. Если будет необходимо, спрашивайте, отвечу.
4.1. Создание OD. В нашем случае выбор позиций из MO, поэтому SELECT по EKPO.
Code:
clear : LT_STITEM, LT_HU, LT_HUS.
select * into LS_EKPO from EKPO where EBELN = PA_EBELN and LOEKZ = ''.
" Данные позиций для создания поставки
LS_STITEM-REF_DOC = LS_EKPO-EBELN.
LS_STITEM-REF_ITEM = LS_EKPO-EBELP.
LS_STITEM-DLV_QTY = LS_EKPO-MENGE.
LS_STITEM-SALES_UNIT = LS_EKPO-MEINS.
append LS_STITEM to LT_STITEM.
" Данные ЕО для соединения с позициями поставки
clear LS_HU.
select HURES~VENUM HURES~VEPOS VEKP~EXIDV VEKP~CHARG
into (LS_HU-VENUM, LS_HU-VEPOS, LS_HU-TOP_HU_EXTERNAL, LS_HU-CHARG)
from HURES join VEKP on HURES~VENUM = VEKP~VENUM
where HURES~OBJECT = 'PO'
and HURES~OBJKEY = LS_EKPO-EBELN
and HURES~OBJITM = LS_EKPO-EBELP.
LS_HU-TOP_HU_INTERNAL = LS_HU-VENUM.
LS_HU-RFBEL = LS_EKPO-EBELN.
LS_HU-RFPOS = LS_EKPO-EBELP.
append LS_HU to LT_HU.
LS_HUS-EXIDV = LS_HU-TOP_HU_EXTERNAL.
append LS_HUS to LT_HUS.
endselect.
endselect.
clear: LS_RETURN, LT_RETURN.
set update task local.
" создаем исходящую поставку
call function 'BAPI_OUTB_DELIVERY_CREATE_STO'
importing
DELIVERY = LV_DELIVERY
tables
STOCK_TRANS_ITEMS = LT_STITEM
RETURN = LT_RETURN.
.
if LV_DELIVERY is initial.
exit.
endif.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
WAIT = 'X'.
4.2. Включение ЕО в OD.
Code:
data: LS_VBKOK type VBKOK,
LT_PROT type table of PROTT.
data: LV_ERRCODE type SY-SUBRC,
LT_HUS_O type VSEP_T_EXIDV.
data: LS_LIKP type LIKP.
constants: LC_HUOBJ01 type HU_OBJECT value '01'. " исходящая поставка (см. диапазон значений домена HU_OBJECT)
constants: LC_KOMUE1 type KOMUE value '01'. " Копирование комплектуемого количества из интерфейса
" считываем в память таблицы, относящиеся к поставке (ls_object)
clear LS_OBJECT.
LS_OBJECT-OBJECT = LC_HUOBJ01. " исходящая поставка (см. диапазон значений домена HU_OBJECT)
LS_OBJECT-OBJKEY = LV_DELIVERY.
call function 'V51P_GET_TABLES'
exporting
IS_OBJECT = LS_OBJECT
exceptions
HUS_LOCKED = 1
NO_HU_FOUND = 2
FATAL_ERROR = 3
others = 4.
if SY-SUBRC <> 0.
endif.
" добавляем ЕО к поставке
call function 'V51P_ADD_HU_TO_OBJEKT'
exporting
IT_HUS = LT_HUS
importing
EF_RCODE = LV_ERRCODE
ET_HUS = LT_HUS_O
ET_MESSAGES = LT_MESSAGES
exceptions
HUS_LOCKED = 1
NOT_POSSIBLE = 2
NOTHING_FOUND = 3
FATAL_ERROR = 4
others = 5.
if SY-SUBRC <> 0.
endif.
call function 'HU_PACKING_UPDATE'
exporting
IF_SYNCHRON = 'X'.
" обновляем данные поставки (с учетом упакованного материала)
select single *
into LS_LIKP
from LIKP
where VBELN = LV_DELIVERY.
clear LS_VBKOK.
LS_VBKOK-VBELN = LS_VBKOK-VBELN_VL = LV_DELIVERY.
LS_VBKOK-VBTYP_VL = LS_LIKP-VBTYP.
LS_VBKOK-KOMUE = LC_KOMUE1.
LS_VBKOK-PACKING_REFRESH = 'X'.
LS_VBKOK-PACKING_FINAL = 'X'.
call function 'WS_DELIVERY_UPDATE'
exporting
VBKOK_WA = LS_VBKOK
SYNCHRON = 'X'
COMMIT = 'X'
DELIVERY = LV_DELIVERY
UPDATE_PICKING = 'X'
NICHT_SPERREN = ' '
tables
PROT = LT_PROT.
if SY-SUBRC <> 0.
rollback work.
else.
commit work and wait.
endif.