Advertising:
Create and cancel operation for goods receipt purchase order with Behavior Definition/Implementation R MATERIALDOCUMENTTP
From SAP Knowledge Base
Create goods receipt for purchase order
DATA material_doc_header TYPE TABLE FOR CREATE r_materialdocumenttp\\materialdocumentheader.
DATA material_doc_items TYPE TABLE FOR CREATE r_materialdocumenttp\\materialdocumentheader\_materialdocumentitem.
DATA material_doc_serials TYPE TABLE FOR CREATE r_materialdocumenttp\\MaterialDocumentItem\_SerialNumber.
CONSTANTS cid_mat_doc_hdr TYPE abp_behv_cid VALUE 'CID_MAT_DOC_HDR'.
CONSTANTS cid_mat_doc_itm TYPE abp_behv_cid VALUE 'CID_MAT_DOC_ITM'.
CONSTANTS cid_mat_doc_ser TYPE abp_behv_cid VALUE 'CID_MAT_DOC_SER'.
CONSTANTS gmcode_gr TYPE char2 VALUE '01'.
CONSTANTS movetype_gr TYPE bwart VALUE '101'.
CONSTANTS moveflag_po TYPE kzbew VALUE 'B'.
READ ENTITIES OF yc_purchaseorderitem IN LOCAL MODE ENTITY POItem
FIELDS ( purchaseorder purchaseorderitem )
WITH VALUE #( ( PurchaseOrder = keys[ 1 ]-PurchaseOrder
PurchaseOrderItem = keys[ 1 ]-PurchaseOrderItem ) )
RESULT FINAL(pitems)
" TODO: variable is assigned but never used (ABAP cleaner)
REPORTED DATA(reported)
FAILED DATA(failed).
IF pitems IS INITIAL OR failed IS NOT INITIAL.
APPEND VALUE #( %msg = new_message( id = ycl_p2p_prmonitor_constants=>cv_message_class
number = '005'
severity = if_abap_behv_message=>severity-error ) )
TO reported-poitem.
RETURN.
ENDIF.
" Material document header
material_doc_header = VALUE #(
( %cid = cid_mat_doc_hdr
PostingDate = sy-datum
DocumentDate = sy-datum
GoodsMovementCode = gmcode_gr
TransactionCode = 'MB01'
InventoryTransactionType = 'WE'
MaterialDocumentHeaderText = |USER { cl_abap_context_info=>get_system_date( ) }| ) ).
" Material document item
material_doc_items = VALUE #(
( %cid_ref = cid_mat_doc_hdr
%target = VALUE #( ( %cid = cid_mat_doc_itm
Material = pitems[ 1 ]-Material
Plant = keys[ 1 ]-%param-Plant
StorageLocation = keys[ 1 ]-%param-StorageLocation
GoodsMovementType = movetype_gr
GoodsMovementRefDocType = moveflag_po
PurchaseOrder = pitems[ 1 ]-PurchaseOrder
PurchaseOrderItem = pitems[ 1 ]-PurchaseOrderItem
MaterialBaseUnit = pitems[ 1 ]-PurchaseOrderQuantityUnit "lv_unit_output " keys[ 1 ]-%param-PurchaseOrderQuantityUnit
QuantityInBaseUnit = keys[ 1 ]-%param-OpenQuantityforGR
EntryUnit = pitems[ 1 ]-PurchaseOrderQuantityUnit "lv_unit_output " keys[ 1 ]-%param-PurchaseOrderQuantityUnit
QuantityInEntryUnit = keys[ 1 ]-%param-OpenQuantityforGR ) ) ) ).
DATA(rnd) = NEW cl_random_number( ).
rnd->if_random_number~init( ).
DO keys[ 1 ]-%param-OpenQuantityforGR TIMES.
APPEND INITIAL LINE TO material_doc_serials ASSIGNING FIELD-SYMBOL(<serial>).
<serial>-%cid_ref = cid_mat_doc_itm.
APPEND VALUE #( %cid = cid_mat_doc_ser && rnd->if_random_number~get_random_int( 99999 )
SerialNumber = rnd->if_random_number~get_random_int( 99999 ) )
TO <serial>-%target.
ENDDO.
" Create inventory document
MODIFY ENTITIES OF r_materialdocumenttp
ENTITY materialdocumentheader
CREATE FROM material_doc_header
ENTITY materialdocumentheader
CREATE BY \_materialdocumentitem FROM material_doc_items
ENTITY MaterialDocumentItem
CREATE BY \_SerialNumber FROM material_doc_serials
" TODO: variable is assigned but never used (ABAP cleaner)
MAPPED DATA(mapped_early)
FAILED DATA(failed_early)
REPORTED DATA(reported_early).
IF failed_early IS INITIAL.
APPEND VALUE #( %msg = new_message( id = ycl_p2p_prmonitor_constants=>cv_message_class
number = '074'
severity = if_abap_behv_message=>severity-success
v1 = '' ) )
TO reported-poitem.
ELSE.
IF reported_early-materialdocumentheader IS NOT INITIAL.
APPEND VALUE #(
%msg = new_message_with_text(
severity = reported_early-materialdocumentheader[ 1 ]-%msg->m_severity
text = reported_early-materialdocumentheader[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-poitem.
ENDIF.
IF reported_early-materialdocumentitem IS NOT INITIAL.
APPEND VALUE #(
%msg = new_message_with_text(
severity = reported_early-MaterialDocumentItem[ 1 ]-%msg->m_severity
text = reported_early-MaterialDocumentItem[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-poitem.
ENDIF.
IF reported_early-serialnumber IS NOT INITIAL.
APPEND VALUE #( %msg = new_message_with_text(
severity = reported_early-serialnumber[ 1 ]-%msg->m_severity
text = reported_early-serialnumber[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-poitem.
ENDIF.
APPEND VALUE #( PurchaseOrder = keys[ 1 ]-PurchaseOrder
PurchaseOrderItem = keys[ 1 ]-PurchaseOrderItem )
TO failed-poitem.
ENDIF.
IF mapped_early IS NOT INITIAL.
APPEND VALUE #( %cid = keys[ 1 ]-%cid
purchaseorder = keys[ 1 ]-PurchaseOrder
purchaseorderItem = keys[ 1 ]-PurchaseOrderItem ) TO mapped-poitem.
ENDIF.