Advertising:
CRUD operations on purchase requisition in MM with Behavior Definition/Implementation I PURCHASEREQUISITIONTP: Difference between revisions
From SAP Knowledge Base
(Created page with "Category:Behavior_Definitions_and_Implementations After reading this wiki entry, you should able to do operations Create and Cancel for purchase order goods receipt.<br /> <br />This is done by Entity Manipulation Language (EML) * https://learning.sap.com/learning-journeys/acquire-core-abap-skills/using-the-entity-manipulation-language_b378f225-0471-45bf-8b7a-f48d00e1bccb === Create purchase requisition with position === <syntaxhighlight line copy> DATA rap_pr_he...") |
No edit summary |
||
Line 4: | Line 4: | ||
* https://learning.sap.com/learning-journeys/acquire-core-abap-skills/using-the-entity-manipulation-language_b378f225-0471-45bf-8b7a-f48d00e1bccb | * https://learning.sap.com/learning-journeys/acquire-core-abap-skills/using-the-entity-manipulation-language_b378f225-0471-45bf-8b7a-f48d00e1bccb | ||
=== Create purchase requisition with position === | === Create purchase requisition with position === | ||
<syntaxhighlight line copy> | <syntaxhighlight lang="abap" line copy> | ||
DATA rap_pr_header TYPE TABLE FOR CREATE I_PurchaseRequisitionTP. | DATA rap_pr_header TYPE TABLE FOR CREATE I_PurchaseRequisitionTP. | ||
DATA rap_pr_items_cba TYPE TABLE FOR CREATE i_purchaserequisitiontp\_purchaserequisitionitem. | DATA rap_pr_items_cba TYPE TABLE FOR CREATE i_purchaserequisitiontp\_purchaserequisitionitem. | ||
Line 189: | Line 189: | ||
=== Purchase Requisition mit Positionen lesen === | === Purchase Requisition mit Positionen lesen === | ||
<syntaxhighlight line copy> | <syntaxhighlight lang="abap" line copy> | ||
READ ENTITIES OF i_purchaserequisitiontp | READ ENTITIES OF i_purchaserequisitiontp | ||
ENTITY purchaserequisitionitem | ENTITY purchaserequisitionitem | ||
Line 199: | Line 199: | ||
=== Change purchase requisition item === | === Change purchase requisition item === | ||
<syntaxhighlight line copy> | <syntaxhighlight lang="abap" line copy> | ||
DATA read_result TYPE TABLE FOR READ RESULT yc_prmonitor\\prmonitor. | DATA read_result TYPE TABLE FOR READ RESULT yc_prmonitor\\prmonitor. | ||
DATA read_failed TYPE RESPONSE FOR FAILED EARLY yc_prmonitor. | DATA read_failed TYPE RESPONSE FOR FAILED EARLY yc_prmonitor. | ||
Line 274: | Line 274: | ||
=== Mark purchase requisition item as deleted === | === Mark purchase requisition item as deleted === | ||
<syntaxhighlight line copy> | <syntaxhighlight lang="abap" line copy> | ||
DATA delete TYPE TABLE FOR UPDATE I_PurchaseRequisitionTP\\PurchaseRequisitionItem. | DATA delete TYPE TABLE FOR UPDATE I_PurchaseRequisitionTP\\PurchaseRequisitionItem. | ||
Line 326: | Line 326: | ||
=== Undo deletion of purchase requisition item === | === Undo deletion of purchase requisition item === | ||
<syntaxhighlight line copy> | <syntaxhighlight lang="abap" line copy> | ||
DATA undo TYPE TABLE FOR UPDATE I_PurchaseRequisitionTP\\PurchaseRequisitionItem. | DATA undo TYPE TABLE FOR UPDATE I_PurchaseRequisitionTP\\PurchaseRequisitionItem. | ||
Latest revision as of 10:36, 4 June 2025
After reading this wiki entry, you should able to do operations Create and Cancel for purchase order goods receipt.
This is done by Entity Manipulation Language (EML)
Create purchase requisition with position
DATA rap_pr_header TYPE TABLE FOR CREATE I_PurchaseRequisitionTP.
DATA rap_pr_items_cba TYPE TABLE FOR CREATE i_purchaserequisitiontp\_purchaserequisitionitem.
DATA rap_pr_acct_cba TYPE TABLE FOR CREATE i_purchasereqnitemtp\_purchasereqnacctassgmt.
DATA rap_pr_addr_cba TYPE TABLE FOR CREATE i_purchasereqnitemtp\_purchasereqndelivaddress.
DATA pr_line_rap TYPE R_PurchaseRequisitionItemTP.
DATA pr_line_rap_create TYPE STRUCTURE FOR CREATE R_PurchaseRequisitionItemTP.
DATA rap_pr_item_cba TYPE STRUCTURE FOR CREATE i_purchaserequisitiontp\_purchaserequisitionitem.
DATA target_item_cba LIKE LINE OF rap_pr_item_cba-%target.
DATA pr_acct_rap_rview TYPE R_PurchaseReqnAcctAssgmtTP.
DATA rap_pr_acct_cba TYPE STRUCTURE FOR CREATE i_purchasereqnitemtp\_purchasereqnacctassgmt.
DATA pr_acct_rap_create TYPE STRUCTURE FOR CREATE R_PurchaseReqnAcctAssgmtTP.
DATA rap_pr_addr_cba TYPE STRUCTURE FOR CREATE i_purchasereqnitemtp\_purchasereqndelivaddress.
DATA pr_addr_rap TYPE I_PurchaseReqnDelivAddrTP.
DATA target_acc_cba LIKE LINE OF rap_pr_acct_cba-%target.
DATA pr_data TYPE TABLE FOR READ RESULT yc_prmonitor\\prmonitor.
DATA pr_failed TYPE RESPONSE FOR FAILED EARLY yc_prmonitor.
DATA pr_reported TYPE RESPONSE FOR REPORTED EARLY yc_prmonitor.
DATA lv_cid_item_numbering TYPE abp_behv_cid.
read( EXPORTING keys = CORRESPONDING #( keys )
CHANGING result = pr_data
failed = pr_failed
reported = pr_reported ).
IF pr_data IS INITIAL OR pr_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-prmonitor.
RETURN.
ENDIF.
LOOP AT keys ASSIGNING FIELD-SYMBOL(<keys>).
DATA(lv_pr) = <keys>-%key-PurchaseRequisition.
DATA(lv_pr_item) = <keys>-%key-PurchaseRequisitionItem.
DATA(lv_pr_type) = pr_data[
%key-PurchaseRequisition = <keys>-%key-PurchaseRequisition ]-PurchaseRequisitionType.
IF <keys>-%cid IS NOT INITIAL AND lines( keys ) = 1.
DATA(lv_cid) = <keys>-%cid.
ELSE.
lv_cid = 'My%CID_1'.
ENDIF.
rap_pr_header = VALUE #( ( %cid = lv_cid "'My%CID_1'
%data-PurchaseRequisitionType = lv_pr_type " pr_data[ 1 ]-%data-PurchaseRequisitionType
"%control-PurchaseRequisitionType = if_abap_behv=>mk-on
%data-PurReqnDescription = <keys>-%param-PurchaseRequisitionDesc ) ).
LOOP AT pr_data INTO DATA(pr_data) WHERE %key-PurchaseRequisition = lv_pr
AND %key-PurchaseRequisitionItem = lv_pr_item.
CLEAR : pr_line_rap_create,
rap_pr_acct_cba,
rap_pr_addr_cba,
target_acc_cba,
target_item_cba,
rap_pr_item_cba-%target.
lv_cid_item_numbering += 1.
pr_line_rap = CORRESPONDING #( pr_data ).
pr_line_rap_create = CORRESPONDING #( pr_line_rap CHANGING CONTROL " %Control fields are also filled if non-initial
EXCEPT PurReqnReleaseStatus CreatedByUser ItemDeliveryAddressID
LastChangeDateTime PurchaseReqnItemUniqueID ). " Display only fields removed
target_item_cba = CORRESPONDING #( pr_line_rap_create ).
target_item_cba-%cid = |My%ItemCID_{ lv_cid_item_numbering }|. "'My%ItemCID_1'. " target_item_cba-purchaserequisitionitem.
target_item_cba-%data-RequestedQuantity = <keys>-%param-RequestedQuantity.
target_item_cba-%data-OrderedQuantity = 0.
target_item_cba-%data-IsDeleted = abap_false.
target_item_cba-%data-ProcessingStatus = 'N'.
target_item_cba-%data-PurReqnReleaseStatus = '02'.
CLEAR: target_item_cba-%data-PurchasingDocument,
target_item_cba-%data-PurchasingDocumentItem.
rap_pr_item_cba-%cid_ref = lv_cid. "'My%CID_1'. " Give same CID of PR header
APPEND target_item_cba TO rap_pr_item_cba-%target.
" Fill in Accounting
SELECT FROM I_PurchaseReqnAcctAssgmtTP
FIELDS *
WHERE PurchaseRequisition = @lv_pr
AND PurchaseRequisitionItem = @lv_pr_item
INTO TABLE @DATA(pr_item_acctassgmt).
LOOP AT pr_item_acctassgmt INTO DATA(pr_accounting).
pr_acct_rap_rview = CORRESPONDING #( pr_accounting ).
pr_acct_rap_create = CORRESPONDING #( pr_acct_rap_rview CHANGING CONTROL ).
pr_acct_rap_create-%control-PurchaseReqnAcctAssgmtNumber = if_abap_behv=>mk-off.
target_acc_cba = CORRESPONDING #( pr_acct_rap_create ).
CONCATENATE 'Accnt' 'My%ItemCID_' lv_cid_item_numbering pr_acct_rap_create-PurchaseReqnAcctAssgmtNumber
INTO target_acc_cba-%cid.
APPEND target_acc_cba TO rap_pr_acct_cba-%target.
rap_pr_acct_cba-%cid_ref = |My%ItemCID_{ lv_cid_item_numbering }|. "'My%ItemCID_1'.
ENDLOOP.
IF rap_pr_acct_cba IS NOT INITIAL.
APPEND rap_pr_acct_cba TO rap_pr_acct_cba.
ENDIF.
" Fill in Address
SELECT SINGLE FROM I_PurchaseReqnDelivAddrTP
FIELDS *
WHERE PurchaseRequisition = @lv_pr
AND PurchaseRequisitionItem = @lv_pr_item
INTO @DATA(pr_item_addr).
IF pr_item_addr IS NOT INITIAL.
" rap_pr_addr_cba-%cid_ref = 'My%ItemCID_1'.
rap_pr_addr_cba-%cid_ref = |My%ItemCID_{ lv_cid_item_numbering }|. "'My%ItemCID_1'. " pr_line_rap_create-%cid.
APPEND INITIAL LINE TO rap_pr_addr_cba-%target ASSIGNING FIELD-SYMBOL(<fs_rap_pr_addr_cba>).
pr_addr_rap-AddressID = pr_item_addr-AddressID.
pr_addr_rap-BusinessPartnerName1 = pr_item_addr-BusinessPartnerName1.
pr_addr_rap-BusinessPartnerName2 = pr_item_addr-BusinessPartnerName2.
pr_addr_rap-Country = pr_item_addr-Country.
<fs_rap_pr_addr_cba> = CORRESPONDING #( pr_addr_rap CHANGING CONTROL
EXCEPT AddressID PurchasingDeliveryAddressType ManualDeliveryAddressID FullName LastChangeDateTime ).
CONCATENATE 'Deliv' 'My%ItemCID_' lv_cid_item_numbering INTO <fs_rap_pr_addr_cba>-%cid.
APPEND rap_pr_addr_cba TO rap_pr_addr_cba.
ENDIF.
ENDLOOP.
IF rap_pr_item_cba IS NOT INITIAL.
APPEND rap_pr_item_cba TO rap_pr_items_cba.
ENDIF.
ENDLOOP.
MODIFY ENTITIES OF i_purchaserequisitiontp
ENTITY purchaserequisition CREATE FROM rap_pr_header
CREATE BY \_purchaserequisitionitem FROM rap_pr_items_cba
ENTITY purchaserequisitionitem
CREATE BY \_purchasereqnacctassgmt FROM rap_pr_acct_cba
ENTITY purchaserequisitionitem
CREATE BY \_purchasereqndelivaddress FROM rap_pr_addr_cba
MAPPED DATA(mapped) REPORTED DATA(reported) FAILED DATA(failed).
IF failed IS INITIAL.
APPEND VALUE #( %msg = new_message( id = ycl_p2p_prmonitor_constants=>cv_message_class
number = '040'
severity = if_abap_behv_message=>severity-success
v1 = '' ) )
TO reported-prmonitor.
ELSE.
IF reported-PurchaseRequisition IS NOT INITIAL.
APPEND VALUE #( %msg = new_message_with_text(
severity = reported-PurchaseRequisition[ 1 ]-%msg->m_severity
text = reported-PurchaseRequisition[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
IF reported-PurchaseRequisitionItem IS NOT INITIAL.
APPEND VALUE #( %msg = new_message_with_text(
severity = reported-PurchaseRequisitionItem[ 1 ]-%msg->m_severity
text = reported-PurchaseRequisitionItem[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
IF reported-purreqnitmaccountassignment IS NOT INITIAL.
APPEND VALUE #(
%msg = new_message_with_text(
severity = reported-purreqnitmaccountassignment[ 1 ]-%msg->m_severity
text = reported-purreqnitmaccountassignment[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
IF reported-purreqnitmdeliveryaddress IS NOT INITIAL.
APPEND VALUE #(
%msg = new_message_with_text(
severity = reported-purreqnitmdeliveryaddress[ 1 ]-%msg->m_severity
text = reported-purreqnitmdeliveryaddress[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
APPEND VALUE #( PurchaseRequisition = keys[ 1 ]-PurchaseRequisition
PurchaseRequisitionItem = keys[ 1 ]-PurchaseRequisitionItem )
TO failed-prmonitor.
ENDIF.
Purchase Requisition mit Positionen lesen
READ ENTITIES OF i_purchaserequisitiontp
ENTITY purchaserequisitionitem
FROM VALUE #( ( PurchaseRequisition = opr-banfn
PurchaseRequisitionItem = opr-bnfpo ) )
RESULT DATA(pr_items).
Change purchase requisition item
DATA read_result TYPE TABLE FOR READ RESULT yc_prmonitor\\prmonitor.
DATA read_failed TYPE RESPONSE FOR FAILED EARLY yc_prmonitor.
DATA read_reported TYPE RESPONSE FOR REPORTED EARLY yc_prmonitor.
read( EXPORTING keys = CORRESPONDING #( keys )
CHANGING result = read_result
failed = read_failed
reported = read_reported ).
IF read_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-prmonitor.
RETURN.
ENDIF.
MODIFY ENTITIES OF i_purchaserequisitiontp
ENTITY purchaserequisitionitem UPDATE FROM VALUE #(
( PurchaseRequisition = keys[ 1 ]-PurchaseRequisition
PurchaseRequisitionItem = keys[ 1 ]-PurchaseRequisitionItem
%data-RequestedQuantity = keys[ 1 ]-%param-RequestedQuantity
%data-DeliveryDate = keys[ 1 ]-%param-DeliveryDate
%data-Plant = keys[ 1 ]-%param-PLant
%data-StorageLocation = keys[ 1 ]-%param-StorageLocation
%data-PurchasingOrganization = keys[ 1 ]-%param-PurchasingOrganization
%data-PurchasingGroup = keys[ 1 ]-%param-PurchasingGroup
%control-RequestedQuantity = COND #( WHEN keys[ 1 ]-%param-RequestedQuantity <> read_result[ 1 ]-RequestedQuantity
THEN if_abap_behv=>mk-on )
%control-DeliveryDate = COND #( WHEN keys[ 1 ]-%param-DeliveryDate <> read_result[ 1 ]-DeliveryDate
THEN if_abap_behv=>mk-on )
%control-Plant = COND #( WHEN keys[ 1 ]-%param-Plant <> read_result[ 1 ]-Plant
THEN if_abap_behv=>mk-on )
%control-StorageLocation = COND #( WHEN keys[ 1 ]-%param-StorageLocation <> read_result[ 1 ]-StorageLocation
THEN if_abap_behv=>mk-on )
%control-PurchasingOrganization = COND #( WHEN keys[ 1 ]-%param-PurchasingOrganization <> read_result[ 1 ]-PurchasingOrganization
THEN if_abap_behv=>mk-on )
%control-PurchasingGroup = COND #( WHEN keys[ 1 ]-%param-PurchasingGroup <> read_result[ 1 ]-PurchasingGroup
THEN if_abap_behv=>mk-on ) ) )
REPORTED DATA(update_reported)
FAILED DATA(update_failed)
" TODO: variable is assigned but never used (ABAP cleaner)
MAPPED DATA(update_mappend).
IF update_failed IS INITIAL.
APPEND VALUE #( %msg = new_message( id = ycl_p2p_prmonitor_constants=>cv_message_class
number = '046'
severity = if_abap_behv_message=>severity-success ) )
TO reported-prmonitor.
APPEND VALUE #( %cid = keys[ 1 ]-%cid
PurchaseRequisition = keys[ 1 ]-PurchaseRequisition
PurchaseRequisitionItem = keys[ 1 ]-PurchaseRequisitionItem ) TO mapped-prmonitor.
RETURN.
ELSE.
IF update_reported-PurchaseRequisitionItem IS NOT INITIAL.
APPEND VALUE #(
%msg = new_message_with_text(
severity = update_reported-PurchaseRequisitionItem[ 1 ]-%msg->m_severity
text = update_reported-PurchaseRequisitionItem[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
APPEND VALUE #( PurchaseRequisition = keys[ 1 ]-PurchaseRequisition
PurchaseRequisitionItem = keys[ 1 ]-PurchaseRequisitionItem )
TO failed-prmonitor.
ENDIF.
Mark purchase requisition item as deleted
DATA delete TYPE TABLE FOR UPDATE I_PurchaseRequisitionTP\\PurchaseRequisitionItem.
delete = CORRESPONDING #( keys ).
LOOP AT delete ASSIGNING FIELD-SYMBOL(<delete>).
<delete>-IsDeleted = abap_true.
<delete>-%data-IsDeleted = abap_true.
<delete>-%control-IsDeleted = if_abap_behv=>mk-on.
ENDLOOP.
MODIFY ENTITIES OF i_purchaserequisitiontp
ENTITY PurchaseRequisitionItem UPDATE FROM delete
MAPPED DATA(mapped) REPORTED DATA(reported) FAILED DATA(failed).
IF failed IS INITIAL.
APPEND VALUE #( %msg = new_message( id = ycl_p2p_prmonitor_constants=>cv_message_class
number = '049'
severity = if_abap_behv_message=>severity-success ) )
TO reported-prmonitor.
ELSE.
IF reported-PurchaseRequisitionItem IS NOT INITIAL.
APPEND VALUE #( %msg = new_message_with_text(
severity = reported-PurchaseRequisition[ 1 ]-%msg->m_severity
text = reported-PurchaseRequisition[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
IF reported-PurchaseRequisitionItem IS NOT INITIAL.
LOOP AT reported-PurchaseRequisitionItem ASSIGNING FIELD-SYMBOL(<rep_po_item>).
APPEND VALUE #(
%msg = new_message_with_text(
severity = reported-PurchaseRequisitionItem[ sy-tabix ]-%msg->m_severity
text = reported-PurchaseRequisitionItem[ sy-tabix ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDLOOP.
ENDIF.
APPEND VALUE #( PurchaseRequisition = keys[ 1 ]-PurchaseRequisition
PurchaseRequisitionItem = keys[ 1 ]-PurchaseRequisitionItem )
TO failed-prmonitor.
ENDIF.
LOOP AT keys ASSIGNING FIELD-SYMBOL(<keys>).
APPEND VALUE #( "%cid = <keys>-%cid
PurchaseRequisition = <keys>-PurchaseRequisition
PurchaseRequisitionItem = <keys>-PurchaseRequisitionItem ) TO mapped-prmonitor.
ENDLOOP.
Undo deletion of purchase requisition item
DATA undo TYPE TABLE FOR UPDATE I_PurchaseRequisitionTP\\PurchaseRequisitionItem.
undo = CORRESPONDING #( keys ).
LOOP AT undo ASSIGNING FIELD-SYMBOL(<undo>).
<undo>-IsDeleted = abap_false.
<undo>-%data-IsDeleted = abap_false.
<undo>-%control-IsDeleted = if_abap_behv=>mk-on.
ENDLOOP.
MODIFY ENTITIES OF i_purchaserequisitiontp
ENTITY PurchaseRequisitionItem UPDATE FROM undo
MAPPED DATA(mapped) REPORTED DATA(reported) FAILED DATA(failed).
IF failed IS INITIAL.
APPEND VALUE #( %msg = new_message( id = ycl_p2p_prmonitor_constants=>cv_message_class
number = '044'
severity = if_abap_behv_message=>severity-success ) )
TO reported-prmonitor.
ELSE.
IF reported-PurchaseRequisitionItem IS NOT INITIAL.
APPEND VALUE #( %msg = new_message_with_text(
severity = reported-PurchaseRequisition[ 1 ]-%msg->m_severity
text = reported-PurchaseRequisition[ 1 ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDIF.
IF reported-PurchaseRequisitionItem IS NOT INITIAL.
" TODO: variable is assigned but never used (ABAP cleaner)
LOOP AT reported-PurchaseRequisitionItem ASSIGNING FIELD-SYMBOL(<rep_po_item>).
APPEND VALUE #(
%msg = new_message_with_text(
severity = reported-PurchaseRequisitionItem[ sy-tabix ]-%msg->m_severity
text = reported-PurchaseRequisitionItem[ sy-tabix ]-%msg->if_message~get_text( ) ) )
TO reported-prmonitor.
ENDLOOP.
ENDIF.
APPEND VALUE #( PurchaseRequisition = keys[ 1 ]-PurchaseRequisition
PurchaseRequisitionItem = keys[ 1 ]-PurchaseRequisitionItem )
TO failed-prmonitor.
ENDIF.
LOOP AT keys ASSIGNING FIELD-SYMBOL(<keys>).
APPEND VALUE #( %cid = <keys>-%cid
PurchaseRequisition = <keys>-PurchaseRequisition
PurchaseRequisitionItem = <keys>-PurchaseRequisitionItem ) TO mapped-prmonitor.
ENDLOOP.