Custom entity/Action dialog in RAP using Unmanaged scenario

  • A custom action is like a button (e.g., Approve, Submit) shown in the Fiori app.
  • A dialog is a popup where the user can enter some input before performing the action.


                Refer:- Determination + Side effects(On Modify) in RAP Unmanaged

                Refer:- Determination + Side effects (On Save) in RAP Unmanaged

Step 1: Create behavior definition for abstract entity.

        * Right click on Core data service - New - data definition.

        * Give name and description.

        * Click on Next.

        * Select Abstract entity with parameters and click on finish.

@EndUserText.label: 'Abstart entity for status field'

@Metadata.allowExtensions: true

define abstract entity ZA_AB_STUH_13

//with parameters parameter_name : parameter_type

{

stu_status : abap_boolean;

}


   * Activate the Abstract definition.

Step 2: Create Meta data extension for above abstract entity.

        *  Right click on abstract entity - Click on new meta data extension.

        * Give name and description.

        * Click on next.

        * Selects annotate entity and finish.

@Metadata.layer: #CORE

annotate entity ZA_AB_STUH_13 with

{

@EndUserText.label: 'Set Student Status'

stu_status;


}

Step 3: Change the behavior definition for header interface view.

unmanaged implementation in class zbp_iv_ab_stuh_13 unique;

strict ( 2 );

with draft;

define behavior for ZIV_AB_STUH_13 alias Student

draft table ZDRA_AB_STUH_13

early numbering

lock master

total etag LastChTime

authorization master ( instance )

etag master LastChTime

{

create ( authorization : global );

update ;

delete ;

field ( readonly ) Id,StuId, StuGenDesc;

association _Result { create;with draft; }

draft action Edit;

draft action Activate optimized;

draft action Discard;

draft action Resume;

field ( mandatory ) StuName,StuAge;

validation validation_fields on save { create;update; }

determination updatecoursedur on save { field StuCourse; }

//side effects { field StuCourse affects field StuCourDur; }

draft determine action Prepare{

validation validation_fields;

determination updatecoursedur;

}

action UpdateStudentStatus parameter ZA_AB_STUH_13 result [1] $self;

mapping for ztl_ab_stuh_13 control zstr_up_stuh

{

Id = id;

StuId = stu_id;

StuName = stu_name;

StuAge = stu_age;

StuCourse = stu_course;

StuCourDur = stu_cour_dur;

StuGender = stu_gender;

StuGenDesc = stu_gen_desc;

StuDob = stu_dob;

StuStatus = stu_status;

LastChDate = last_ch_date;

LastChTime = last_ch_time;


}

}


define behavior for ZIV_AB_STUI_13 alias Result

draft table ZDRA_AB_STUI_13

early numbering

lock dependent by _Student

authorization dependent by _Student

etag dependent by _Student

{

update;

delete;

field ( readonly ) Id, CourseDesc, SemesterDesc, SemReDesc;

association _Student{ with draft; }

mapping for ztl_ab_stui_13

{

Id = id;

Course = course;

CourseDesc = course_desc;

Semester = semester;

SemesterDesc = semester_desc;

SemResult = sem_result;

SemReDesc = sem_re_desc;

}

}

Step 4: Change the behavior definition for header consumption view.

projection;

strict ( 2 );

use draft;

//use side effects;

define behavior for ZCV_AB_STUH_13 alias Student

use etag

{

use create;

use update;

use delete;


use action Edit;

use action Activate;

use action Discard;

use action Resume;

use action Prepare;

use action UpdateStudentStatus;

use association _Result { create; with draft; }

}


define behavior for ZCV_AB_STUI_13 alias Result

{

use update;

use delete;


use association _Student { with draft; }

}

Step 5: Change meta data extension- Header and add action button.

@Metadata.layer: #CORE

@UI: {

headerInfo:

{

typeName: 'Student',

typeNamePlural: 'Students',

title: {

type: #STANDARD,

label: 'Student',

value: 'StuId'

}

}

}

annotate entity ZCV_AB_STUH_13

with

{

@UI.facet:

[{

id : 'Student',

purpose: #STANDARD,

type: #IDENTIFICATION_REFERENCE,

label: 'Student',

position: 10

},

{

id : 'Result',

purpose: #STANDARD,

type: #LINEITEM_REFERENCE,

label: 'Results',

position: 20,

targetElement: '_Result'

}

]

@UI:

{

lineItem: [{ position: 10 , label : 'ID'},

{ type : #FOR_ACTION, dataAction: 'UpdateStudentStatus',

label : 'Update Status', position: 10 }],

identification: [{ position: 10 , label : 'ID' }],

selectionField: [{ position: 10 }]

}

Id;

@UI:

{

lineItem: [{ position: 20 , label : 'Student ID'}],

identification: [{ position: 20 , label : 'Student ID' }],

selectionField: [{ position: 20 }]

}

StuId;

@UI:

{

lineItem: [{ position: 30 , label : 'Student Name'}],

identification: [{ position: 30 , label : 'Student Name' }],

selectionField: [{ position: 30 }]

}

StuName;

@UI:

{

lineItem: [{ position: 40 , label : 'Student Age'}],

identification: [{ position: 40 , label : 'Student Age' }]

}

StuAge;

@UI:

{

lineItem: [{ position: 50 , label : 'Student Course'}],

identification: [{ position: 50 , label : 'Student Course' }]

}

StuCourse;

@UI:

{

lineItem: [{ position: 60 , label : 'Course Duration'}],

identification: [{ position: 60 , label : 'Course Duration' }]

}

StuCourDur;

@UI:

{

lineItem: [{ position: 70 , label : 'Status'}],

identification: [{ position: 70 , label : 'Status' }]

}

StuStatus;

@UI:

{

lineItem: [{ position: 80 , label : 'Gender'}],

identification: [{ position: 80 , label : 'Gender' }]

}

@Consumption.valueHelpDefinition: [{ entity: { name : 'ZD_AB_STU_GENDER' , element : 'Value' },

distinctValues: true,

additionalBinding: [{ localElement: 'StuGenDesc',

element: 'Description',

usage: #FILTER_AND_RESULT

}]

}]

StuGender;

@UI:

{

lineItem: [{ position: 90 , label : 'Description'}],

identification: [{ position: 90 , label : 'Description' }]

}

StuGenDesc;

@UI:

{

lineItem: [{ position: 100 , label : 'Date of Birth'}],

identification: [{ position: 100 , label : 'Date of Birth' }]

}

StuDob;

/* Associations */

// _Result : re;

}


Step 5: Implement the method UpdateStudentStatus and write logic for update status.


            * Uncomment the student status validation.

CLASS lhc_Student DEFINITION INHERITING FROM cl_abap_behavior_handler.

PRIVATE SECTION.


METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION

IMPORTING keys REQUEST requested_authorizations FOR Student RESULT result.


METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION

IMPORTING REQUEST requested_authorizations FOR Student RESULT result.


METHODS create FOR MODIFY

IMPORTING entities FOR CREATE Student.


METHODS earlynumbering_create FOR NUMBERING

IMPORTING entities FOR CREATE Student.


METHODS update FOR MODIFY

IMPORTING entities FOR UPDATE Student.


METHODS delete FOR MODIFY

IMPORTING keys FOR DELETE Student.


METHODS read FOR READ

IMPORTING keys FOR READ Student RESULT result.


METHODS lock FOR LOCK

IMPORTING keys FOR LOCK Student.


METHODS rba_Result FOR READ

IMPORTING keys_rba FOR READ Student\_Result FULL result_requested RESULT result LINK association_links.


METHODS cba_Result FOR MODIFY

IMPORTING entities_cba FOR CREATE Student\_Result.

METHODS validation_fields FOR VALIDATE ON SAVE

IMPORTING keys FOR Student~validation_fields.

METHODS updatecoursedur FOR DETERMINE ON SAVE"MODIFY

IMPORTING keys FOR Student~updatecoursedur.

METHODS UpdateStudentStatus FOR MODIFY

IMPORTING keys FOR ACTION Student~UpdateStudentStatus RESULT result.


METHODS earlynumbering_cba_Result FOR NUMBERING

IMPORTING entities FOR CREATE Student\_Result.


ENDCLASS.


CLASS lhc_Student IMPLEMENTATION.


METHOD get_instance_authorizations.

ENDMETHOD.


METHOD get_global_authorizations.

ENDMETHOD.


METHOD create.

zcl_ab_stuh_13=>get_instance( )->create_student(

EXPORTING

entities = entities

CHANGING

failed = failed

mapped = mapped

reported = reported ).

ENDMETHOD.


METHOD earlynumbering_create.

TRY.

zcl_ab_stuh_13=>get_instance( )->earlynumbering_create(

EXPORTING

entities = entities

CHANGING

failed = failed

mapped = mapped

reported = reported ).

CATCH cx_uuid_error.

"handle exception

ENDTRY.


ENDMETHOD.


METHOD update.

zcl_ab_stuh_13=>get_instance( )->update(

EXPORTING

entities = entities

CHANGING

mapped = mapped

failed = failed

reported = reported

).

ENDMETHOD.


METHOD delete.

zcl_ab_stuh_13=>get_instance( )->delete(

EXPORTING

keys = keys

CHANGING

mapped = mapped

failed = failed

reported = reported

).

ENDMETHOD.


METHOD read.

zcl_ab_stuh_13=>get_instance( )->read_student(

EXPORTING

keys = keys

CHANGING

result = result

failed = failed

reported = reported

).

ENDMETHOD.


METHOD lock.

TRY.

DATA(lv_lock) = cl_abap_lock_object_factory=>get_instance( iv_name = 'EZSTUDENT_13' ).

CATCH cx_abap_lock_failure INTO DATA(exception).

RAISE SHORTDUMP exception.

ENDTRY.

LOOP AT keys ASSIGNING FIELD-SYMBOL(<ls_keys>).

TRY.

lv_lock->enqueue(

it_parameter = VALUE #( ( name = 'ID' value = REF #( <ls_keys>-Id ) ) )


).

CATCH cx_abap_foreign_lock INTO DATA(foreign_lock).

APPEND VALUE #(

id = keys[ 1 ]-Id

%msg = new_message_with_text(

severity = if_abap_behv_message=>severity-error

text = 'Record is Locked By' && foreign_lock->user_name

)

) TO reported-student.

APPEND VALUE #(

id = keys[ 1 ]-Id

) TO failed-student.

CATCH cx_abap_lock_failure INTO exception.

RAISE SHORTDUMP exception.

ENDTRY.

ENDLOOP.

ENDMETHOD.


METHOD rba_Result.

ENDMETHOD.


METHOD cba_Result.

zcl_ab_stuh_13=>get_instance( )->cba_result_create(

EXPORTING

entities_cba = entities_cba

CHANGING

mapped = mapped

failed = failed

reported = reported

).


ENDMETHOD.


METHOD earlynumbering_cba_Result.

zcl_ab_stuh_13=>get_instance( )->earlynumbering_cba_result(

EXPORTING

entities = entities

CHANGING

mapped = mapped

failed = failed

reported = reported

).

ENDMETHOD.


METHOD validation_fields.

READ ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

ALL FIELDS WITH CORRESPONDING #( keys )

RESULT DATA(lt_student)

REPORTED DATA(lt_reported)

FAILED DATA(lt_failed).


IF lt_student IS NOT INITIAL.

READ TABLE lt_student ASSIGNING FIELD-SYMBOL(<ls_student>) INDEX 1.


IF <ls_student> IS ASSIGNED.

" Clearing duplicates

reported-student = VALUE #(

( %tky = <ls_student>-%tky %state_area = 'STU_NAME' )

( %tky = <ls_student>-%tky %state_area = 'STU_AGE' )

).

IF <ls_student>-StuName IS INITIAL.

reported-student = VALUE #( (

%tky = <ls_student>-%tky

%state_area = 'STU_NAME' " Focussed on that field

%element-stuname = if_abap_behv=>mk-on

%msg = new_message(

id = 'SY'

number = '02'

severity = if_abap_behv_message=>severity-error

v1 = 'Name is mandatory field'

)

) ).


failed-student = VALUE #( ( %tky = <ls_student>-%tky ) ).

ENDIF.

IF <ls_student>-StuAge IS INITIAL.

reported-student = VALUE #( BASE reported-student (

%tky = <ls_student>-%tky

%state_area = 'STU_AGE' " Focussed on that field

%element-stuage = if_abap_behv=>mk-on

%msg = new_message(

id = 'SY'

number = '02'

severity = if_abap_behv_message=>severity-error

v1 = 'Age is mandatory field'

)

) ).


failed-student = VALUE #( ( %tky = <ls_student>-%tky ) ).

ENDIF.

ENDIF.

ENDIF.



ENDMETHOD.


METHOD updatecoursedur.

READ ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

ALL FIELDS WITH CORRESPONDING #( keys )

RESULT DATA(lt_student)

REPORTED DATA(lt_reported)

FAILED DATA(lt_failed).

LOOP AT lt_student ASSIGNING FIELD-SYMBOL(<ls_student>).

IF <ls_student> IS ASSIGNED.

IF <ls_student>-StuCourse = 'ITI'.

MODIFY ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

UPDATE FIELDS ( StuCourDur )

WITH VALUE #( (

%tky = <ls_student>-%tky

StuCourDur = 2

) ).

ELSE.

MODIFY ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

UPDATE FIELDS ( StuCourDur )

WITH VALUE #( (

%tky = <ls_student>-%tky

StuCourDur = 4

) ).

ENDIF.


ENDIF.

ENDLOOP.

ENDMETHOD.


METHOD UpdateStudentStatus.

DATA(lt_keys) = keys.

READ ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

FIELDS ( StuStatus ) WITH CORRESPONDING #( keys )

RESULT DATA(lt_student).

DATA(lf_new_status) = lt_keys[ 1 ]-%param-stu_status.


MODIFY ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

UPDATE FIELDS ( StuStatus )

WITH VALUE #( (

%tky = lt_student[ 1 ]-%tky

StuStatus = lf_new_status


) ).

READ ENTITIES OF ziv_ab_stuh_13

IN LOCAL MODE

ENTITY Student

FIELDS ( StuStatus ) WITH CORRESPONDING #( keys )

RESULT DATA(lt_student1).

result = VALUE #(

FOR <lr_student1> IN lt_student1

(

%tky = <lr_student1>-%tky

%param = <lr_student1>

)

).

ENDMETHOD.


ENDCLASS.


CLASS lhc_Result DEFINITION INHERITING FROM cl_abap_behavior_handler.

PRIVATE SECTION.


METHODS update FOR MODIFY

IMPORTING entities FOR UPDATE Result.


METHODS delete FOR MODIFY

IMPORTING keys FOR DELETE Result.


METHODS read FOR READ

IMPORTING keys FOR READ Result RESULT result.


METHODS rba_Student FOR READ

IMPORTING keys_rba FOR READ Result\_Student FULL result_requested RESULT result LINK association_links.


ENDCLASS.


CLASS lhc_Result IMPLEMENTATION.


METHOD update.

ENDMETHOD.


METHOD delete.

ENDMETHOD.


METHOD read.

ENDMETHOD.


METHOD rba_Student.

ENDMETHOD.


ENDCLASS.


CLASS lsc_ZIV_AB_STUH_13 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.


CLASS lsc_ZIV_AB_STUH_13 IMPLEMENTATION.


METHOD finalize.

ENDMETHOD.


METHOD check_before_save.

DATA: lt_student TYPE STANDARD TABLE OF ztl_ab_stuh_13.

lt_student = zcl_ab_stuh_13=>get_instance( )->gt_student.

IF lt_student IS NOT INITIAL.

READ TABLE lt_student ASSIGNING FIELD-SYMBOL(<ls_student>) INDEX 1.

IF <ls_student> IS ASSIGNED.


IF <ls_student>-stu_age < 18.

APPEND VALUE #( id = <ls_student>-id

%msg = new_message_with_text(

severity = if_abap_behv_message=>severity-error

text = 'Age is less than 18. Creation is not allowed'

) ) TO reported-student.

APPEND VALUE #( id = <ls_student>-id ) TO failed-student.

ENDIF.


* IF <ls_student>-stu_status EQ abap_false.

* APPEND VALUE #( id = <ls_student>-id

* %msg = new_message_with_text(

* severity = if_abap_behv_message=>severity-error

* text = 'Please select status'

* ) ) TO reported-student.

* APPEND VALUE #( id = <ls_student>-id ) TO failed-student.

* ENDIF.


ENDIF.

ENDIF.


ENDMETHOD.


METHOD save.

zcl_ab_stuh_13=>get_instance( )->save_data(

CHANGING

reported = reported ).

ENDMETHOD.


METHOD cleanup.

ENDMETHOD.


METHOD cleanup_finalize.

ENDMETHOD.


ENDCLASS.


Testing: 
            * Preview the application.    
            * Click on go to see all records.
            
            * As of now student status is NO am selecting 2,3 Student ID's and click on Update status.
            * Pop up appears, select status(yes) and click on update status.
    

            * Status is updated.


******************************Thank you*******************************

Comments

Popular posts from this blog

New syntax for append- VALUE (new syntax 7.4+) in ABAP

Read statement new syntax in ABAP. (7.4+).

Concatenation new syntax( 7.4+ ).