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.

This is a wiki created in the spare time of a private person working in the SAP ERP area. The aim is to collect knowledge for the own use. The wiki is maintained to the best of knowledge and belief.
All products shown, including in form of screenshots, belong to SAP SE. Their trademarks are, among others: SAP®,ABAP®,SAP Fiori®,SAP HANA®,SAP NetWeaver®,SAP® R/3®,SAP S/4HANA®,SAP S/4HANA® Cloud