0% found this document useful (0 votes)
15 views36 pages

SAP RAP Unmanaged Application

The document outlines the creation of a RAP unmanaged application, detailing the steps to create tables for Sales Order Header and Item, along with their respective interface and consumption views. It includes metadata definitions and behavior definitions for the root and item views, specifying the necessary fields, associations, and actions. The document serves as a comprehensive guide for implementing a sales order management system in a structured manner.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views36 pages

SAP RAP Unmanaged Application

The document outlines the creation of a RAP unmanaged application, detailing the steps to create tables for Sales Order Header and Item, along with their respective interface and consumption views. It includes metadata definitions and behavior definitions for the root and item views, specifying the necessary fields, associations, and actions. The document serves as a comprehensive guide for implementing a sales order management system in a structured manner.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

RAP Unmanaged Application

MANOJKUMAR KOTTI
Manojkumar Kotti

Table of Contents

1. Create a table for Sales Order Header ................................................................. 2


2. Create table for Sales Order Item ........................................................................ 3
3. Create Interface view for the Header Table .......................................................... 4
4. Create Interface view for the Item Table ............................................................... 5
5. Create Consumption view for Header .................................................................. 6
6. Create Consumption view for Item ...................................................................... 7
7. Create Meta Data file for header consumption view ............................................. 8
8. Create Meta Data file for item consumption view ............................................... 11
9. Create Behavior Definition for the Root Interface view ........................................ 13
10. Create Draft Table for Header ........................................................................... 16
11. Create Draft Table for Item ............................................................................... 17
12. Create Behavior Definition Implementation Class .............................................. 18
13. Create custom utility class to save data in Transactional Buffer .......................... 29
14. Create Behavior definition Projection for Root consumption view ........................ 33
15. Create Service Definition with reference to Root Interface view ........................... 34
16. Create Service Binding with reference to Service definition ................................. 34
17. Output Preview ................................................................................................ 35

1|Page
Manojkumar Kotti

RAP UNMANAGED APPLICATION


Step1: Create table for Sales Order Header

Header Table - ZMK_VBAK_T

@[Link] : 'Sales Order Header'

@[Link] : #NOT_EXTENSIBLE

@[Link] : #TRANSPARENT

@[Link] : #A

@[Link] : #RESTRICTED

define table zmk_vbak_t {

key client : [Link] not null;

key salesdocument : zsorder not null;

salesdocumenttype : [Link](4);

orderreason : [Link](3);

salesorganization : [Link](4);

distributionchannel : [Link](2);

division : [Link](2);

salesoffice : [Link](4);

salesgroup : [Link](3);

@[Link] : 'zmk_vbak_t.currency'

netprice : [Link](13,2);

currency : [Link];

local_created_by : abp_creation_user;

local_created_at : abp_creation_tstmpl;

local_last_changed_by : abp_locinst_lastchange_user;

local_last_changed_at : abp_locinst_lastchange_tstmpl;

last_changed_at : abp_lastchange_tstmpl;

2|Page
Manojkumar Kotti

Step2: Create table for Sales Order Item

Item Table - ZMK_VBAP_T

@[Link] : 'Sales Order Items'

@[Link] : #NOT_EXTENSIBLE

@[Link] : #TRANSPARENT

@[Link] : #A

@[Link] : #RESTRICTED

define table zmk_vbap_t {

key client : [Link] not null;

@[Link] : 'Sales'

@[Link] : false

key salesdocument : zsorder not null

with foreign key [0..*,1] zmk_vbak_t

where salesdocument = zmk_vbap_t.salesdocument;

key salesitemnumber : abap.int2 not null;

material : [Link](18);

plant : [Link](4);

@[Link] : 'zmk_vbap_t.quantityunits'

quantity : [Link](13,3);

quantityunits : [Link](3);

local_created_by : abp_creation_user;

local_created_at : abp_creation_tstmpl;

local_last_changed_by : abp_locinst_lastchange_user;

local_last_changed_at : abp_locinst_lastchange_tstmpl;

last_changed_at : abp_lastchange_tstmpl;

3|Page
Manojkumar Kotti

Step3: Create Interface view for the Header Table and add composition to child
(Items) interface view

@[Link]: #NOT_REQUIRED

@[Link]: 'Sales Order Header View'

@[Link]: true

define root view entity ZMK_SALESHDR_UMG_I

as select from zmk_vbak_t as salesHeader

composition [0..*] of ZMK_SALESITM_UMG_I as _salesItem

key salesdocument as SalesDocument,

salesdocumenttype as SalesDocumentType,

orderreason as OrderReason,

salesorganization as SalesOrganization,

distributionchannel as DistributionChannel,

division as Division,

salesoffice as SalesOffice,

salesgroup as SalesGroup,

@[Link]: 'Currency'

netprice as NetPrice,

currency as Currency,

@[Link]: true

local_created_by as LocalCreatedBy,

@[Link]: true

local_created_at as LocalCreatedAt,

@[Link]: true

local_last_changed_by as LocalLastChangedBy,

@[Link]: true

local_last_changed_at as LocalLastChangedAt,

/* Associations */

_salesItem

4|Page
Manojkumar Kotti

Step4: Create Interface view for the Item Table and add association to parent (Header)
interface view
@[Link]: [#NONE]

@[Link]: #NOT_REQUIRED

@[Link]: 'Sales Order Item View'

@[Link]: true

@[Link]:{

serviceQuality: #X,

sizeCategory: #S,

dataClass: #MIXED

define view entity ZMK_SALESITM_UMG_I

as select from zmk_vbap_t

association to parent ZMK_SALESHDR_UMG_I as _salesHeader on $[Link] = _salesHeader.SalesDocument

key salesdocument as SalesDocument,

key salesitemnumber as SalesItemnumber,

material as Material,

plant as Plant,

@[Link]: 'Quantityunits'

quantity as Quantity,

quantityunits as Quantityunits,

@[Link]: true

local_created_by as LocalCreatedBy,

@[Link]: true

local_created_at as LocalCreatedAt,

@[Link]: true

local_last_changed_by as LocalLastChangedBy,

@[Link]: true

local_last_changed_at as LocalLastChangedAt,

/* Associations */

_salesHeader

5|Page
Manojkumar Kotti

Step5: Create Consumption View for Header and mark it as Root view and redirect to
composition child
@[Link]: #NOT_REQUIRED

@[Link]: 'Sales Order Header Consumption View'

@[Link]: true

@[Link]: true

@[Link]: true

define root view entity ZMK_SALESHDR_UMG_C

provider contract transactional_query

as projection on ZMK_SALESHDR_UMG_I

key SalesDocument,

SalesDocumentType,

OrderReason,

SalesOrganization,

DistributionChannel,

Division,

@[Link]: true

SalesOffice,

SalesGroup,

@[Link]: 'Currency'

NetPrice,

Currency,

LocalCreatedBy,

LocalCreatedAt,

LocalLastChangedBy,

LocalLastChangedAt,

/* Associations */

_salesItem : redirected to composition child ZMK_SALESITM_UMG_C

6|Page
Manojkumar Kotti

Step6: Create Consumption view for the item table and redirect to parent association
@[Link]: #NOT_REQUIRED

@[Link]: 'Sales Order Items Projection View'

@[Link]: true

@[Link]: true

@[Link]: true

define view entity ZMK_SALESITM_UMG_C

as projection on ZMK_SALESITM_UMG_I

key SalesDocument,

key SalesItemnumber,

@[Link]: true

Material,

Plant,

@[Link]: 'Quantityunits'

Quantity,

Quantityunits,

LocalCreatedBy,

LocalCreatedAt,

LocalLastChangedBy,

LocalLastChangedAt,

/* Associations */

_salesHeader : redirected to parent ZMK_SALESHDR_UMG_C

7|Page
Manojkumar Kotti

Step7: Meta Data file for the header consumption view


@[Link]: #CORE

@UI: { headerInfo: {

typeName: 'Sales Order',

typeNamePlural: 'Sales Orders',

title:{ type: #STANDARD, // Object Page Title & Info

label: 'Sales Order',

value: 'SalesDocument' } } }

annotate entity ZMK_SALESHDR_UMG_C with

@[Link]: [{

id: 'SalesHeader',

purpose: #STANDARD,

type: #IDENTIFICATION_REFERENCE,

label: 'Sales Details', // Tab1

position: 10

},

id: 'SalesItems',

purpose: #STANDARD,

type: #LINEITEM_REFERENCE,

label: 'Item Details',

position: 20,

targetElement: '_salesItem'

@UI:{ lineItem: [ { position: 10, label: 'Sales Document' } ], // List Page

identification: [ { position: 10, label: 'Sales Document' } ], // Object Page

selectionField: [ { position: 10 } ] }

SalesDocument;

@UI:{ lineItem: [ { position: 20, label: 'Sales Document Type' } ],

identification: [ { position: 20, label: 'Sales Document Type' } ],

8|Page
Manojkumar Kotti

selectionField: [ { position: 20 } ] }

SalesDocumentType;

@UI:{ lineItem: [ { position: 30, label: 'Order Reason' } ],

identification: [ { position: 30, label: 'Order Reason' } ],

selectionField: [ { position: 30 } ] }

OrderReason;

@UI:{ lineItem: [ { position: 40, label: 'Sales Organization' } ],

identification: [ { position: 40, label: 'Sales Organization' } ] }

SalesOrganization;

@UI:{ lineItem: [ { position: 50, label: 'Distribution Channel' } ],

identification: [ { position: 50, label: 'Distribution Channel' } ],

selectionField: [ { position: 50 } ] }

DistributionChannel;

@UI:{ lineItem: [ { position: 60, label: 'Division' } ],

identification: [ { position: 60, label: 'Division' } ],

selectionField: [ { position: 60 } ] }

Division;

@UI:{ lineItem: [ { position: 70, label: 'Sales Office' } ],

identification: [ { position: 70, label: 'Sales Office' } ],

selectionField: [ { position: 70 } ] }

SalesOffice;

@UI:{ lineItem: [ { position: 80, label: 'Sales Group' } ],

identification: [ { position: 80, label: 'Sales Group' } ],

selectionField: [ { position: 80 } ] }

SalesGroup;

@UI:{ lineItem: [ { position: 90, label: 'Net Price' } ],

identification: [ { position: 90, label: 'Net Price' } ] }

NetPrice;

@UI:{ lineItem: [ { position: 100, label: 'Currency' } ],

identification: [ { position: 100, label: 'Currency' } ] }

Currency;

@UI:{ identification: [ { position: 110, label: 'Created By' } ] }

LocalCreatedBy;

@UI:{ identification: [ { position: 120, label: 'Created At' } ] }

9|Page
Manojkumar Kotti

LocalCreatedAt;

@UI:{ identification: [ { position: 130, label: 'Last Changed By' } ] }

LocalLastChangedBy;

@UI:{ identification: [ { position: 140, label: 'Last Changed At' } ] }

LocalLastChangedAt;

10 | P a g e
Manojkumar Kotti

Step8: Meta Data file for the item consumption view


@[Link]: #CORE

@UI: { headerInfo: {

typeName: 'Sales Item',

typeNamePlural: 'Sales Items',

title:{ type: #STANDARD,

label: 'Sales Item',

value: 'SalesItemnumber' } } }

annotate entity ZMK_SALESITM_UMG_C with

@[Link]: [{

id: 'SalesItems',

purpose: #STANDARD,

type: #IDENTIFICATION_REFERENCE,

label: 'Sales Item Details',

position: 10

}]

@UI:{ lineItem: [ { position: 10, label: 'Sales Document' } ],

identification: [{ position: 10, label: 'Sales Document' }] }

SalesDocument;

@[Link] : 'Sales Item'

@UI:{ lineItem: [ { position: 20, label: 'Sales Item' } ],

identification: [{ position: 20, label: 'Sales Item' }] }

SalesItemnumber;

@UI:{ lineItem: [ { position: 30, label: 'Material' } ],

identification: [{ position: 30, label: 'Material' }] }

Material;

@UI:{ lineItem: [ { position: 40, label: 'Plant' } ],

identification: [{ position: 40, label: 'Plant' }] }

Plant;

@UI:{ lineItem: [ { position: 50, label: 'Quantity' } ],

11 | P a g e
Manojkumar Kotti

identification: [{ position: 50, label: 'Quantity' }] }

Quantity;

//@UI:{ lineItem: [ { position: 60, label: 'Unit of Quantity' } ],

//identification: [{ position: 60, label: 'Unit of Quantity' }] }

@[Link]: true

Quantityunits;

@[Link]: true

LocalCreatedBy;

@[Link]: true

LocalCreatedAt;

@[Link]: true

LocalLastChangedBy;

@[Link]: true

LocalLastChangedAt;

12 | P a g e
Manojkumar Kotti

Step9: Create Behavior Definition for the Root Interface view


unmanaged implementation in class zbp_mk_sales_umg unique;

strict ( 2 );

with draft;

define behavior for ZMK_SALESHDR_UMG_I alias SalesOrderHdr

implementation in class zbp_mk_sales_hdr_umg unique

draft table zmk_vbak_umg_d

lock master total etag LocalLastChangedAt

authorization master ( instance )

etag master LocalLastChangedAt

create ( authorization : global );

update;

delete;

draft action Edit;

draft action Resume;

draft determine action Prepare;

draft action Activate optimized;

draft action Discard;

field ( mandatory : create ) SalesDocument;

field ( readonly : update ) SalesDocument;

field ( readonly ) LocalLastChangedAt;

association _salesItem { create; with draft; }

mapping for zmk_vbak_t

SalesDocument = salesdocument;

SalesDocumentType = salesdocumenttype;

OrderReason = orderreason;

SalesOrganization = salesorganization;

13 | P a g e
Manojkumar Kotti

DistributionChannel = distributionchannel;

Division = division;

SalesOffice = salesoffice;

SalesGroup = salesgroup;

NetPrice = netprice;

Currency = currency;

LocalCreatedBy = local_created_by;

LocalCreatedAt = local_created_at;

LocalLastChangedBy = local_last_changed_by;

LocalLastChangedAt = local_last_changed_at;

define behavior for ZMK_SALESITM_UMG_I alias SalesOrderItm

implementation in class zbp_mk_sales_itm_umg unique

draft table zmk_vbap_umg_d

lock dependent by _salesHeader

authorization dependent by _salesHeader

etag master LocalLastChangedAt

update;

delete;

field ( readonly : update, mandatory : create ) SalesItemnumber;

field ( readonly ) SalesDocument;

association _salesHeader { with draft; }

mapping for zmk_vbap_t

SalesDocument = salesdocument;

SalesItemnumber = salesitemnumber;

Material = material;

Plant = plant;

Quantity = quantity;

Quantityunits = quantityunits;

14 | P a g e
Manojkumar Kotti

LocalCreatedBy = local_created_by;

LocalCreatedAt = local_created_at;

LocalLastChangedBy = local_last_changed_by;

LocalLastChangedAt = local_last_changed_at;

15 | P a g e
Manojkumar Kotti

Step10: Create Draft Table for Header


@[Link] : 'Draft table for entity ZMK_SALESHDR_UMG_I'

@[Link] : #EXTENSIBLE_ANY

@[Link] : #TRANSPARENT

@[Link] : #A

@[Link] : #RESTRICTED

define table zmk_vbak_umg_d {

key mandt : mandt not null;

key salesdocument : zsorder not null;

salesdocumenttype : [Link](4);

orderreason : [Link](3);

salesorganization : [Link](4);

distributionchannel : [Link](2);

division : [Link](2);

salesoffice : [Link](4);

salesgroup : [Link](3);

@[Link] : 'zmk_vbak_umg_d.currency'

netprice : [Link](13,2);

currency : [Link];

localcreatedby : abp_creation_user;

localcreatedat : abp_creation_tstmpl;

locallastchangedby : abp_locinst_lastchange_user;

locallastchangedat : abp_locinst_lastchange_tstmpl;

"%admin" : include sych_bdl_draft_admin_inc;

16 | P a g e
Manojkumar Kotti

Step11: Create Draft Table for Item


@[Link] : 'Draft table for entity ZMK_SALESITM_UMG_I'

@[Link] : #EXTENSIBLE_ANY

@[Link] : #TRANSPARENT

@[Link] : #A

@[Link] : #RESTRICTED

define table zmk_vbap_umg_d {

key mandt : mandt not null;

key salesdocument : zsorder not null;

key salesitemnumber : abap.int2 not null;

material : [Link](18);

plant : [Link](4);

@[Link] : 'zmk_vbap_umg_d.quantityunits'

quantity : [Link](13,3);

quantityunits : [Link](3);

localcreatedby : abp_creation_user;

localcreatedat : abp_creation_tstmpl;

locallastchangedby : abp_locinst_lastchange_user;

locallastchangedat : abp_locinst_lastchange_tstmpl;

"%admin" : include sych_bdl_draft_admin_inc;

17 | P a g e
Manojkumar Kotti

Step12: Create Behavior Definition Implementation Class


a. Root Behavior Implementation Class Code Reference [Auto Created]

CLASS zbp_mk_sales_umg DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zmk_saleshdr_umg_i.

ENDCLASS.

CLASS zbp_mk_sales_umg IMPLEMENTATION.

ENDCLASS.

b. Header Behavior Implementation Class Code Reference [Auto Created]

CLASS zbp_mk_sales_hdr_umg DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zmk_saleshdr_umg_i.

ENDCLASS.

CLASS zbp_mk_sales_hdr_umg IMPLEMENTATION.

ENDCLASS.

c. Header Handler Class [Manually Implemented]

CLASS lhc_SalesOrderHdr DEFINITION INHERITING FROM cl_abap_behavior_handler.

PRIVATE SECTION.

METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION

IMPORTING keys REQUEST requested_authorizations FOR SalesOrderHdr RESULT result.

METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION

IMPORTING REQUEST requested_authorizations FOR SalesOrderHdr RESULT result.

METHODS create FOR MODIFY

IMPORTING entities FOR CREATE SalesOrderHdr.

METHODS update FOR MODIFY

IMPORTING entities FOR UPDATE SalesOrderHdr.

METHODS delete FOR MODIFY

IMPORTING keys FOR DELETE SalesOrderHdr.

18 | P a g e
Manojkumar Kotti

METHODS read FOR READ

IMPORTING keys FOR READ SalesOrderHdr RESULT result.

METHODS lock FOR LOCK

IMPORTING keys FOR LOCK SalesOrderHdr.

METHODS rba_Salesitem FOR READ

IMPORTING keys_rba FOR READ SalesOrderHdr\_Salesitem FULL result_requested RESULT result LINK association_links.

METHODS cba_Salesitem FOR MODIFY

IMPORTING entities_cba FOR CREATE SalesOrderHdr\_Salesitem.

ENDCLASS.

CLASS lhc_SalesOrderHdr IMPLEMENTATION.

METHOD get_instance_authorizations.

ENDMETHOD.

METHOD get_global_authorizations.

ENDMETHOD.

METHOD create.

DATA : ls_sales_hdr TYPE zmk_vbak_t.

LOOP AT entities INTO DATA(ls_entities).

ls_sales_hdr = CORRESPONDING #( ls_entities MAPPING FROM ENTITY ).

IF ls_sales_hdr-salesdocument IS NOT INITIAL.

SELECT * FROM zmk_vbak_t

WHERE salesdocument = @ls_sales_hdr-salesdocument

INTO TABLE @DATA(lt_sales_hdr) .

IF sy-subrc NE 0.

" Save Data to Buffer

DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).

19 | P a g e
Manojkumar Kotti

" Set the buffer value

lo_util->set_hdr_value( EXPORTING im_sales_hdr = ls_sales_hdr

IMPORTING ex_created = DATA(lv_created) ).

IF lv_created EQ abap_true.

" Fill Return Parameter for Framework

APPEND VALUE #( %cid = ls_entities-%cid

salesdocument = ls_sales_hdr-salesdocument ) TO mapped-salesorderhdr.

" Report Success

APPEND VALUE #( %cid = ls_entities-%cid

salesdocument = ls_sales_hdr-salesdocument

%msg = new_message( id = 'ZMK_SALES_MSG'

number = 001

v1 = 'Sales Order Creation Successful'

severity = if_abap_behv_message=>severity-success ) ) TO reported-salesorderhdr.

ENDIF.

ELSE.

" Fill Return Parameter for Framework

APPEND VALUE #( %cid = ls_entities-%cid

salesdocument = ls_sales_hdr-salesdocument ) TO failed-salesorderhdr.

" Report Error

APPEND VALUE #( %cid = ls_entities-%cid

salesdocument = ls_sales_hdr-salesdocument

%msg = new_message( id = 'ZMK_SALES_MSG'

number = 001

v1 = 'Duplicate Sales Order'

severity = if_abap_behv_message=>severity-error ) ) TO reported-salesorderhdr.

ENDIF.

ENDIF.

ENDLOOP.

ENDMETHOD.

METHOD update.

20 | P a g e
Manojkumar Kotti

DATA : ls_sales_hdr TYPE zmk_vbak_t.

LOOP AT entities INTO DATA(ls_entities).

ls_sales_hdr = CORRESPONDING #( ls_entities MAPPING FROM ENTITY ).

IF ls_sales_hdr-salesdocument IS NOT INITIAL.

SELECT * FROM zmk_vbak_t

WHERE salesdocument = @ls_sales_hdr-salesdocument

INTO TABLE @DATA(lt_sales_hdr) .

IF sy-subrc EQ 0.

" Save Data to Buffer

DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).

" Set the buffer value

lo_util->set_hdr_value( EXPORTING im_sales_hdr = ls_sales_hdr

IMPORTING ex_created = DATA(lv_created) ).

IF lv_created EQ abap_true.

" Fill Return Parameter for Framework

* APPEND VALUE #( salesdocument = ls_sales_hdr-salesdocument ) TO mapped-salesorderhdr.

" Report Success

APPEND VALUE #(

%key = ls_entities-%key

%msg = new_message(

id = 'ZMK_SALES_MSG'

number = 001

v1 = 'Sales Order Updation Successful'

severity = if_abap_behv_message=>severity-success )

) TO reported-salesorderhdr.

ENDIF.

ELSE.

" Fill Return Parameter for Framework

APPEND VALUE #( %cid = ls_entities-%cid_ref

salesdocument = ls_sales_hdr-salesdocument ) TO failed-salesorderhdr.

21 | P a g e
Manojkumar Kotti

" Report Error

APPEND VALUE #( %cid = ls_entities-%cid_ref

salesdocument = ls_sales_hdr-salesdocument

%msg = new_message( id = 'ZMK_SALES_MSG'

number = 001

v1 = 'Sales Order Not Found !'

severity = if_abap_behv_message=>severity-error ) ) TO reported-salesorderhdr.

ENDIF.

ENDIF.

ENDLOOP.

ENDMETHOD.

METHOD delete.

TYPES : BEGIN OF ty_sales_hdr,

salesdocument TYPE zsorder,

END OF ty_sales_hdr,

BEGIN OF ty_sales_item,

salesdocument TYPE zsorder,

salesitemnumber TYPE int2,

END OF ty_sales_item.

DATA ls_sales_hdr TYPE ty_sales_hdr.

" Save Data to Buffer

DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).

LOOP AT keys INTO DATA(ls_key).

CLEAR ls_sales_hdr.

ls_sales_hdr = ls_key-salesdocument.

lo_util->set_hdr_t_deletion( EXPORTING im_sales_doc = ls_sales_hdr ).

lo_util->set_hdr_deletion_flag( EXPORTING im_so_delete = abap_true ).

22 | P a g e
Manojkumar Kotti

APPEND VALUE #( %cid = ls_key-%cid_ref

salesdocument = ls_key-salesdocument

%msg = new_message( id = 'ZMK_SALES_MSG'

number = 001

v1 = 'Sales Order Deletion Successful'

severity = if_abap_behv_message=>severity-success ) ) TO reported-salesorderhdr.

ENDLOOP.

ENDMETHOD.

METHOD read.

LOOP AT keys INTO DATA(ls_key).

SELECT SINGLE * FROM zmk_vbak_t

WHERE salesdocument = @ls_key-salesdocument

INTO @DATA(ls_hdr).

IF sy-subrc = 0.

APPEND CORRESPONDING #( ls_hdr ) TO result.

ENDIF.

ENDLOOP.

ENDMETHOD.

METHOD lock.

ENDMETHOD.

METHOD rba_Salesitem.

LOOP AT keys_rba INTO DATA(ls_key).

SELECT * FROM zmk_vbap_t

WHERE salesdocument = @ls_key-salesdocument

INTO TABLE @DATA(lt_items).

LOOP AT lt_items INTO DATA(ls_item).

APPEND CORRESPONDING #( ls_item ) TO result.

APPEND VALUE #( source-salesdocument = ls_key-salesdocument

23 | P a g e
Manojkumar Kotti

target-salesdocument = ls_item-salesdocument

target-salesitemnumber = ls_item-salesitemnumber ) TO association_links.

ENDLOOP.

ENDLOOP.

ENDMETHOD.

METHOD cba_Salesitem.

DATA ls_sales_itm TYPE zmk_vbap_t.

LOOP AT entities_cba INTO DATA(ls_entities_cba).

ls_sales_itm = CORRESPONDING #( ls_entities_cba-%target[ 1 ] ).

IF ls_sales_itm-salesdocument IS NOT INITIAL AND

ls_sales_itm-salesitemnumber IS NOT INITIAL.

SELECT * FROM zmk_vbap_t

WHERE salesdocument = @ls_sales_itm-salesdocument

AND salesitemnumber = @ls_sales_itm-salesitemnumber

INTO TABLE @DATA(lt_sales_itm).

IF sy-subrc NE 0.

" Save Data to Buffer

DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).

" Set the buffer value

lo_util->set_itm_value( EXPORTING im_sales_itm = ls_sales_itm

IMPORTING ex_created = DATA(lv_created) ).

IF lv_created EQ abap_true.

" Fill Return Parameter for Framework

APPEND VALUE #( %cid = ls_entities_cba-%target[ 1 ]-%cid

salesdocument = ls_sales_itm-salesdocument

salesitemnumber = ls_sales_itm-salesitemnumber ) TO mapped-salesorderitm.

" Report Success

APPEND VALUE #( %cid = ls_entities_cba-%target[ 1 ]-%cid

salesdocument = ls_sales_itm-salesdocument

%msg = new_message( id = 'ZMK_SALES_MSG'

number = 001

v1 = 'Sales Item Creation Successful'

24 | P a g e
Manojkumar Kotti

severity = if_abap_behv_message=>severity-success ) ) TO reported-salesorderitm.

ENDIF.

ELSE.

" Fill Return Parameter for Framework

APPEND VALUE #( %cid = ls_entities_cba-%target[ 1 ]-%cid

salesdocument = ls_sales_itm-salesdocument

salesitemnumber = ls_sales_itm-salesitemnumber ) TO failed-salesorderitm.

" Report Error

APPEND VALUE #( %cid = ls_entities_cba-%target[ 1 ]-%cid

salesdocument = ls_sales_itm-salesdocument

salesitemnumber = ls_sales_itm-salesitemnumber

%msg = new_message( id = 'ZMK_SALES_MSG'

number = 002

v1 = 'Duplicate Sales Item'

severity = if_abap_behv_message=>severity-error ) ) TO reported-salesorderitm.

ENDIF.

ENDIF.

ENDLOOP.

ENDMETHOD.

ENDCLASS.

d. Item Behavior Implementation Class Code Reference [Auto Created]

CLASS zbp_mk_sales_itm_umg DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zmk_saleshdr_umg_i.


ENDCLASS.

CLASS zbp_mk_sales_itm_umg IMPLEMENTATION.


ENDCLASS.

e. Item Handler Class [Manually Implemented]


CLASS lhc_SalesOrderItm DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.

METHODS update FOR MODIFY


IMPORTING entities FOR UPDATE SalesOrderItm.

METHODS delete FOR MODIFY


IMPORTING keys FOR DELETE SalesOrderItm.

25 | P a g e
Manojkumar Kotti

METHODS read FOR READ


IMPORTING keys FOR READ SalesOrderItm RESULT result.

METHODS rba_Salesheader FOR READ


IMPORTING keys_rba FOR READ SalesOrderItm\_Salesheader FULL result_requested RESULT result LINK
association_links.

ENDCLASS.

CLASS lhc_SalesOrderItm IMPLEMENTATION.

METHOD update.

DATA : ls_sales_itm TYPE zmk_vbap_t.


LOOP AT entities INTO DATA(ls_entities).
ls_sales_itm = CORRESPONDING #( ls_entities mapping from entity ).
IF ls_sales_itm-salesdocument IS NOT INITIAL.
SELECT * FROM zmk_vbap_t
WHERE salesdocument = @ls_sales_itm-salesdocument
AND salesitemnumber = @ls_sales_itm-salesitemnumber
INTO TABLE @DATA(lt_sales_hdr) .
IF sy-subrc EQ 0.
" Save Data to Buffer
DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).
" Set the buffer value
lo_util->set_itm_value( EXPORTING im_sales_itm = ls_sales_itm
IMPORTING ex_created = DATA(lv_created) ).
IF lv_created EQ abap_true.
" Fill Return Parameter for Framework
APPEND VALUE #( salesdocument = ls_sales_itm-salesdocument
salesitemnumber = ls_sales_itm-salesitemnumber ) TO mapped-salesorderitm.
" Report Success
APPEND VALUE #( %key = ls_entities-%key
%msg = new_message( id = 'ZMK_SALES_MSG'
number = 001
v1 = 'Sales Item Updation Successful'
severity = if_abap_behv_message=>severity-success ) ) TO reported-salesorderitm.
ENDIF.

ELSE.
" Fill Return Parameter for Framework
APPEND VALUE #( %cid = ls_entities-%cid_ref
salesdocument = ls_sales_itm-salesdocument
salesitemnumber = ls_sales_itm-salesitemnumber ) TO failed-salesorderitm.
" Report Error
APPEND VALUE #( %cid = ls_entities-%cid_ref
salesdocument = ls_sales_itm-salesdocument
salesitemnumber = ls_sales_itm-salesitemnumber
%msg = new_message( id = 'ZMK_SALES_MSG'
number = 001
v1 = 'Duplicate Sales Order'
severity = if_abap_behv_message=>severity-error ) ) TO reported-salesorderitm.

ENDIF.
ENDIF.
ENDLOOP.

26 | P a g e
Manojkumar Kotti

ENDMETHOD.

METHOD delete.
TYPES : BEGIN OF ty_sales_hdr,
salesdocument TYPE zsorder,
END OF ty_sales_hdr,
BEGIN OF ty_sales_item,
salesdocument TYPE zsorder,
salesitemnumber TYPE int2,
END OF ty_sales_item.

DATA ls_sales_itm TYPE ty_sales_item.

" Save Data to Buffer


DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).

LOOP AT keys INTO DATA(ls_key).


CLEAR ls_sales_itm.
ls_sales_itm-salesdocument = ls_key-salesdocument.
ls_sales_itm-salesitemnumber = ls_key-SalesItemnumber.
lo_util->set_itm_t_deletion( im_sales_itm_info = ls_sales_itm ).

APPEND VALUE #( %cid = ls_key-%cid_ref


salesdocument = ls_key-salesdocument
salesitemnumber = ls_key-SalesItemnumber
%msg = new_message( id = 'ZMK_SALES_MSG'
number = 001
v1 = 'Sales Item Deletion Successful'
severity = if_abap_behv_message=>severity-success ) ) TO reported-salesorderitm.
ENDLOOP.

ENDMETHOD.

METHOD read.
ENDMETHOD.

METHOD rba_Salesheader.
ENDMETHOD.

ENDCLASS.

f. Saver Class for the Root BO [Manually Implemented]


CLASS lsc_ZMK_SALESHDR_UMG_I DEFINITION INHERITING FROM cl_abap_behavior_saver.
PROTECTED SECTION.

METHODS finalize REDEFINITION.

METHODS check_before_save REDEFINITION.

METHODS save REDEFINITION.

METHODS cleanup REDEFINITION.

METHODS cleanup_finalize REDEFINITION.

ENDCLASS.

27 | P a g e
Manojkumar Kotti

CLASS lsc_ZMK_SALESHDR_UMG_I IMPLEMENTATION.

METHOD finalize.
ENDMETHOD.

METHOD check_before_save.
ENDMETHOD.

METHOD save.
" Save Data to Buffer
DATA(lo_util) = zmk_sales_util_umg=>get_instance( ).
lo_util->get_hdr_value( IMPORTING ex_sales_hdr = DATA(ls_sales_hdr) ).
lo_util->get_itm_value( IMPORTING ex_sales_itm = DATA(ls_sales_itm) ).
lo_util->get_hdr_t_deletion( IMPORTING ex_sales_docs = DATA(lt_sales_header) ).
lo_util->get_itm_t_deletion( IMPORTING ex_sales_info = DATA(lt_sales_items) ).
lo_util->get_deletion_flags( IMPORTING ex_so_hdr_del = DATA(lv_so_hdr_del) ).

IF ls_sales_hdr IS NOT INITIAL.


MODIFY zmk_vbak_t FROM @ls_sales_hdr.
ENDIF.
IF ls_sales_itm IS NOT INITIAL.
MODIFY zmk_vbap_t FROM @ls_sales_itm.
ENDIF.

" If lv_so_header is flagged then delete both header and item entries
" If lv_so_header is not flagged then look for the respective sales order and item and then delete entry
" Delete Logic
IF lv_so_hdr_del = abap_true.
" Delete header and all items for sales documents in lt_sales_header
LOOP AT lt_sales_header INTO DATA(ls_del_hdr).
DELETE FROM zmk_vbak_t WHERE salesdocument = @ls_del_hdr-salesdocument.
DELETE FROM zmk_vbap_t WHERE salesdocument = @ls_del_hdr-salesdocument.
ENDLOOP.
ELSE.
" Delete individual headers if present in lt_sales_header
LOOP AT lt_sales_header INTO ls_del_hdr.
DELETE FROM zmk_vbak_t WHERE salesdocument = @ls_del_hdr-salesdocument.
ENDLOOP.

" Delete individual items if present in lt_sales_items


LOOP AT lt_sales_items INTO DATA(ls_del_itm).
DELETE FROM zmk_vbap_t WHERE salesdocument = @ls_del_itm-salesdocument
AND salesitemnumber = @ls_del_itm-salesitemnumber.
ENDLOOP.
ENDIF.

ENDMETHOD.

METHOD cleanup.
zmk_sales_util_umg=>get_instance( )->cleanup_buffer( ).
ENDMETHOD.

METHOD cleanup_finalize.

ENDMETHOD.

ENDCLASS.

28 | P a g e
Manojkumar Kotti

Step13: Transactional Buffer – Manually created custom utility class to save data in
transactional buffer

CLASS zmk_sales_util_umg DEFINITION

PUBLIC

FINAL

CREATE PRIVATE .

PUBLIC SECTION.

TYPES : BEGIN OF ty_sales_hdr,

salesdocument TYPE zsorder,

END OF ty_sales_hdr,

BEGIN OF ty_sales_item,

salesdocument TYPE zsorder,

salesitemnumber TYPE int2,

END OF ty_sales_item.

TYPES : tt_sales_item TYPE STANDARD TABLE OF ty_sales_item,

tt_sales_hdr TYPE STANDARD TABLE OF ty_sales_hdr.

" Static method to get the singleton instance

CLASS-METHODS get_instance RETURNING VALUE(ro_instance) TYPE REF TO zmk_sales_util_umg.

METHODS : set_hdr_value IMPORTING im_sales_hdr TYPE zmk_vbak_t

EXPORTING ex_created TYPE abap_boolean,

get_hdr_value EXPORTING ex_sales_hdr TYPE zmk_vbak_t,

set_itm_value IMPORTING im_sales_itm TYPE zmk_vbap_t

EXPORTING ex_created TYPE abap_boolean,

get_itm_value EXPORTING ex_sales_itm TYPE zmk_vbap_t,

set_hdr_t_deletion IMPORTING im_sales_doc TYPE ty_sales_hdr,

set_itm_t_deletion IMPORTING im_sales_itm_info TYPE ty_sales_item,

29 | P a g e
Manojkumar Kotti

get_hdr_t_deletion EXPORTING ex_sales_docs TYPE tt_sales_hdr,

get_itm_t_deletion EXPORTING ex_sales_info TYPE tt_sales_item,

set_hdr_deletion_flag IMPORTING im_so_delete TYPE abap_boolean,

get_deletion_flags EXPORTING ex_so_hdr_del TYPE abap_boolean,

cleanup_buffer.

PROTECTED SECTION.

PRIVATE SECTION.

CLASS-DATA : gs_sales_hdr_buff TYPE zmk_vbak_t,

gs_sales_itm_buff TYPE zmk_vbap_t,

gt_sales_hdr_t_buff TYPE tt_sales_hdr,

gt_sales_itm_t_buff TYPE tt_sales_item,

gv_so_delete TYPE abap_boolean,

mo_instance TYPE REF TO zmk_sales_util_umg.

ENDCLASS.

CLASS zmk_sales_util_umg IMPLEMENTATION.

METHOD set_hdr_value.

" Save Header Info to Transaction Buffer

IF im_sales_hdr-salesdocument IS NOT INITIAL.

gs_sales_hdr_buff = im_sales_hdr.

ex_created = abap_true.

ENDIF.

ENDMETHOD.

METHOD get_hdr_value.

" Get Header Info to Transaction Buffer

ex_sales_hdr = gs_sales_hdr_buff.

ENDMETHOD.

30 | P a g e
Manojkumar Kotti

METHOD get_instance.

IF mo_instance IS INITIAL.

CREATE OBJECT mo_instance.

ENDIF.

ro_instance = mo_instance.

ENDMETHOD.

METHOD set_itm_value.

" Save Item Values to Transaction Buffer

IF im_sales_itm IS NOT INITIAL.

gs_sales_itm_buff = im_sales_itm.

ex_created = abap_true.

ENDIF.

ENDMETHOD.

METHOD get_itm_value.

" Get Item Values from Transaction Buffer

ex_sales_itm = gs_sales_itm_buff.

ENDMETHOD.

METHOD cleanup_buffer.

" Clean Buffer

CLEAR : gs_sales_hdr_buff,

gs_sales_itm_buff,

gt_sales_hdr_t_buff,

gt_sales_itm_t_buff,

gv_so_delete.

ENDMETHOD.

METHOD set_hdr_deletion_flag.

" Save Header Deletion Flag to Transaction Buffer

gv_so_delete = im_so_delete.

ENDMETHOD.

31 | P a g e
Manojkumar Kotti

METHOD get_deletion_flags.

" Get Header Deletion Flag from Transaction Buffer

ex_so_hdr_del = gv_so_delete.

ENDMETHOD.

METHOD set_hdr_t_deletion.

" Save Sales Documents to Transaction Buffer

APPEND im_sales_doc TO gt_sales_hdr_t_buff.

ENDMETHOD.

METHOD set_itm_t_deletion.

" Save Sales Documents & Items to Transaction Buffer

APPEND im_sales_itm_info TO gt_sales_itm_t_buff.

ENDMETHOD.

METHOD get_hdr_t_deletion.

" Get Sales Documents from Transaction Buffer

ex_sales_docs = gt_sales_hdr_t_buff.

ENDMETHOD.

METHOD get_itm_t_deletion.

" Get Sales Items from Transaction Buffer

ex_sales_info = gt_sales_itm_t_buff.

ENDMETHOD.

ENDCLASS.

32 | P a g e
Manojkumar Kotti

Step14: Create Behavior definition with Implementation type as Projection for the root
consumption view
projection;

strict ( 2 );

use draft;

define behavior for ZMK_SALESHDR_UMG_C

use create;

use update;

use delete;

use action Edit;

use action Activate;

use action Discard;

use action Prepare;

use action Resume;

use association _salesItem { create; with draft; }

define behavior for ZMK_SALESITM_UMG_C

use update;

use delete;

use association _salesHeader { with draft; }

33 | P a g e
Manojkumar Kotti

Step15: Create Service Definition with reference to the root Interface view

@[Link]: 'Sales Service Definition - Unmanged'

define service ZMK_SALES_UMG_UI {

expose ZMK_SALESHDR_UMG_C;

expose ZMK_SALESITM_UMG_C;

Step16: Create Service Binding with reference to the service definition

34 | P a g e
Manojkumar Kotti

Output:
List Page View

Object Page View – Header

Object Page View – Item

35 | P a g e

You might also like