cancel
Showing results for 
Search instead for 
Did you mean: 

Managed RAP application to create PurchaseOrder

10-06-2026 9:50 AM
RITZZ Explorer
317 views 5 comments Go to solution
0 Likes
Subscribe

I have created one managed RAP application to create PurchaseRequisition and store it in a custom table along with messages. 

Now I want to extend this application to create PurchaseOrder also and store it along with Vendor details in that same Z table. But I am facing some issue. is it possible to create PO using managed application with Unamanaged Save.

I am also attaching my code for the PR creation scenario.

Behavior Def

managed implementation in class zbp_i_pr_request unique;
strict ( 2 );

define behavior for ZI_PR_REQUEST alias PRReq
//persistent table zpr_request
lock master
authorization master ( instance )
//with additional save
//etag master <field_name>
with unmanaged save
{
create ( authorization : global );
update;
delete;
field ( readonly, numbering : managed ) ReqUuid;
field ( readonly ) Purchaserequisition, Message, Messagetype;

determination createPRAuto on save { create; }

mapping for zpr_request
{
ReqUuid                    = req_uuid;
Purreqdescription          = purreqdescription;
Purchaserequsitiontype     = purchaserequsitiontype;
Purchaserequisitionitem    = purchaserequisitionitem;
Purchaserequsitionitemtext = purchaserequsitionitemtext;
Plant                      = plant;
Material                   = material;
Deliverydate               = deliverydate;
Requestedquantity          = requestedquantity;
Baseunitisocode            = baseunitisocode;
Purchasinggroup            = purchasinggroup;
Purchaserequisition        = purchaserequisition;
Message                    = message;
Messagetype                = messagetype;
}
}

Global Class

CLASS zbp_i_pr_request DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zi_pr_request.
public section.
TYPES: BEGIN OF ty_pr_details,
pid        TYPE abp_behv_pid,
cid        TYPE abp_behv_cid,
pur_req    TYPE zpr_request-purchaserequisition,
req_uuid TYPE zpr_request-req_uuid,
END OF ty_pr_details.
CLASS-DATA purchase_requisition_details TYPE TABLE OF ty_pr_details.
protected section.
private section.

ENDCLASS.

CLASS zbp_i_pr_request IMPLEMENTATION.
ENDCLASS.

CreatePr method

METHOD createPRAuto.
    READ ENTITIES OF zi_pr_request  IN LOCAL MODE
        ENTITY PRReq
            ALL FIELDS WITH CORRESPONDING #( keys )
        RESULT DATA(lt_resquest).

    LOOP AT lt_resquest ASSIGNING FIELD-SYMBOL(<fs_req>).
      IF <fs_req>-Purchaserequisition IS NOT INITIAL.
        CONTINUE.
      ENDIF.

      DATA(lv_cid_hdr)  = |PRHDR_{ sy-tabix }|.
      DATA(lv_cid_item) = |PRITM_{ sy-tabix }|.

      MODIFY ENTITIES OF i_purchaserequisitiontp
          ENTITY PurchaseRequisition
            CREATE
              FIELDS ( purchaserequisitiontype PurReqnDescription )
              WITH VALUE #(
                ( %cid                     = lv_cid_hdr
                  PurchaseRequisitionType  = <fs_req>-Purchaserequsitiontype
                  PurReqnDescription       = <fs_req>-Purreqdescription ) )

            CREATE BY \_purchaserequisitionitem
              FIELDS ( purchaserequisitionitem plant material
                        purchasinggroup requestedquantity baseunit
                        deliverydate PurchaseRequisitionItemText )
              WITH VALUE #(
                ( %cid_ref = lv_cid_hdr
                  %target  = VALUE #(
                    ( %cid                      = lv_cid_item
                      PurchaseRequisitionItem    = <fs_req>-PurchaseRequisitionItem
                      Plant                      = <fs_req>-Plant
                      Material                   = <fs_req>-Material
                      PurchasingGroup            = <fs_req>-PurchasingGroup
                      RequestedQuantity          = <fs_req>-RequestedQuantity
                      BaseUnit                   = <fs_req>-BaseUnitISOCode
                      DeliveryDate               = <fs_req>-DeliveryDate
                      PurchaseRequisitionItemText = <fs_req>-Purchaserequsitionitemtext ) ) ) )

          MAPPED   DATA(lt_mapped)
          FAILED   DATA(lt_failed)
          REPORTED DATA(lt_reported).

      IF lt_failed IS INITIAL.

        READ TABLE lt_mapped-purchaserequisition
        INDEX 1
        INTO DATA(ls_mapped_pr).

        IF sy-subrc = 0.

          APPEND VALUE #(
          pid = ls_mapped_pr-%pid
          cid = ls_mapped_pr-%cid
          req_uuid = <fs_req>-ReqUuid
          ) TO zbp_i_pr_request=>purchase_requisition_details.

        ENDIF.

        <fs_req>-Messagetype = 'S'.
        <fs_req>-Message = 'PR creation initiated successfully'.
      ELSE.
        <fs_req>-Messagetype = 'E'.
        <fs_req>-Message = 'Error occured while creating PR'.
      ENDIF.

      MODIFY ENTITIES OF zi_pr_request IN LOCAL MODE
          ENTITY PRReq
              UPDATE FIELDS ( Message Messagetype )
              WITH VALUE #( ( %tky        = <fs_req>-%tky
                         Message     = <fs_req>-Message
                         MessageType = <fs_req>-Messagetype ) ).

    ENDLOOP.
  ENDMETHOD.

Save_modfied method

DATA: lt_pr_request_as TYPE STANDARD TABLE OF zpr_request.

IF create-prreq IS NOT INITIAL.
  lt_pr_request_as = CORRESPONDING #( create-prreq MAPPING FROM ENTITY ).
  INSERT zpr_request FROM TABLE @LT_pr_request_as.

  LOOP AT zbp_i_pr_request=>purchase_requisition_details INTO DATA(purchase_reqn_via_eml) WHERE  pid IS NOT INITIAL .
    CONVERT KEY OF i_purchaserequisitiontp FROM purchase_reqn_via_eml-pid TO DATA(ls_pr_key1).
    DATA(lv_pr) = condense( |{ ls_pr_key1-PurchaseRequisition ALPHA = OUT }| ).
    DATA(lv_message) = |PR Number { lv_pr } created successfully|.
    UPDATE zpr_request SET purchaserequisition = @LV_pr,
                           message = @LV_message
                           WHERE req_uuid = @Purchase_reqn_via_eml-req_uuid.
  ENDLOOP.
ENDIF.

Now how can I adjust the PO creation logic? is it possible so?

ABAP RESTful Application Programming Model ABAP Development SAP S/4HANA Cloud ABAP Environment ABAP Cloud SAP S/4HANA Cloud Public Edition 

0 Likes
View Entire Topic
RITZZ
Explorer

@AlexandrePassarelli 

I am getting this error. My PurchaseOrderItem is getting failed. I am also sharing my code below.

{
  "error": {
    "code": "06/010",
    "message": "Document contains no items",
    "@SAP__common.ExceptionCategory": "Provider_Application_Error",
    "innererror": {
      "ErrorDetails": {
        "@SAP__common.Application": {
          "ComponentId": "BC-ESI-ESF-GW",
          "ServiceRepository": "SRVD",
          "ServiceId": "ZSD_PR_REQUEST",
          "ServiceVersion": "0001"
        },
        "@SAP__common.TransactionId": "C83CB3D2A1420010E006AC72303CC720",
        "@SAP__common.Timestamp": "20261008052329.186745",
        "@SAP__common.ErrorResolution": {
          "Analysis": "Use ADT feed reader \"SAP Gateway Error Log\" or run transaction /IWFND/ERROR_LOG on SAP Gateway hub system and search for entries with the timestamp above for more details",
          "Note": "See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)"
        }
      }
    }
  }
}

 

Method CreatePOAuto

READ ENTITIES OF zi_po_request IN LOCAL MODE
        ENTITY POReq
            ALL FIELDS WITH CORRESPONDING #( keys )
        RESULT DATA(lt_request).
    LOOP AT lt_request ASSIGNING FIELD-SYMBOL(<fs_req>).

      IF <fs_req>-Purchaseorder IS NOT INITIAL.
        CONTINUE.   " Already processed
      ENDIF.
      DATA(lv_pr) = |{ <fs_req>-purchaserequisition ALPHA = OUT }|.
      SELECT SINGLE purchaserequisition, purchaserequisitionitem,
                     material, plant, requestedquantity, baseunitisocode
        FROM zpr_request
        WHERE purchaserequisition = @lv_pr
        INTO @DATA(ls_pr).
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

      DATA(lv_cid_hdr_po)  = |POHDR_{ sy-tabix }|.
      DATA(lv_cid_item_po) = |POITM_{ sy-tabix }|.
      MODIFY ENTITIES OF I_PurchaseOrderTP_2
          ENTITY PurchaseOrder
            CREATE
              FIELDS ( PurchaseOrderType CompanyCode PurchasingOrganization Supplier PurchasingGroup )
              WITH VALUE #(
                ( %cid                     = lv_cid_hdr_po
                  PurchaseOrderType        = 'NB'
                  CompanyCode              = '1710'
                  PurchasingOrganization   = '1710'
                  Supplier                 = '0017300002'
                  PurchasingGroup          = <fs_req>-Purchasinggroup ) )

            CREATE BY \_PurchaseOrderItem
              FIELDS ( PurchaseRequisition purchaserequisitionitem plant material
                       OrderQuantity PurchaseOrderQuantityUnit
                        )
              WITH VALUE #(
                ( %cid_ref = lv_cid_hdr_po
                  %target  = VALUE #(
                    ( %cid                       = lv_cid_item_po
                      PurchaseOrderItem          = '00002'
                      PurchaseRequisitionItem    = ls_pr-PurchaseRequisitionItem
                      OrderQuantity              = ls_pr-RequestedQuantity
                      PurchaseRequisition        = ls_pr-Purchaserequisition
                      PurchaseOrderQuantityUnit  = ls_pr-BaseUnitISOCode
                       ) ) ) )

          MAPPED   DATA(lt_po_mapped)
          FAILED   DATA(lt_po_failed)
          REPORTED DATA(lt_po_reported)
RITZZ
Explorer
Issue has been solved. Thanks