Tasks: Enhance the Custom Business Object’s application with business logic

Example: Bonus plans get an ID automatically and are checked for consistent data.


Prerequisites

Having completed all preceding parts of SAP S/4HANA Extensibility Tutorial.


Step 1: Implementing the Bonus Plan’s Business logic

At published business objects without an existing draft version you can implement business logic.

1. Open the business object “Bonus Plan” in Custom Business Objects application

2. “Go to Fields and Logic”.

3. Enter the After Modification Event Logic which is a “Determination Logic”.

4. In the logic view you initially see the not editable empty published version.
Click the “Create Draft” action. An editable copy of the published version appears left to it. With the “Draft Version” and “Published Version” actions you can decide what coding to see.

5. Implement After Modification event with following functionality:
General:

  • Set the key field “ID” if still initial.
    Hint: You can read existing Bonus Plan data via the CDS View that is named as the Business Object’s Identifier (here: YY1_BONUSPLAN).
    Hint: With the key combination CTRL + Space you can access the very helpful code completion.

    * set ID
    IF data-id IS INITIAL.
        SELECT MAX( id ) FROM yy1_bonusplan INTO @DATA(current_max_id).
        data-id = current_max_id + 1.
    ENDIF.​
  • Set the Unit of Measure for the Bonus Percentages to ‘%’
    * set percentage unit
    data-lowbonuspercentage_u = data-highbonuspercentage_u = '%'.​
  • Determine and set the Employee Name from the Employee ID
    Hint: Extensibility offers Helper class CL_ABAP_CONTEXT_INFO with method GET_USER_FORMATTED_NAME that needs a user ID to return its formatted name

    * set Employee Name
    IF data-employeeid IS NOT INITIAL.
        data-employeename = cl_abap_context_info=>get_user_formatted_name( data-employeeid ).
    ENDIF.​

 

Consistency Check: In dependence on following checks, set the isconsistent property.

  • Check that ValidityStartDate and ValidityEndDate are set and that ValidityStartDate is earlier in time than ValidityEndDate.
  • Check that Factors and Percentages are set correctly (all > 0, Percentages < 100, LowBonusAssignmentFactor < HighBonusAssignmentFactor)
  • Check that Employee ID is set
* consistency check START
IF data-validitystartdate IS INITIAL
 OR data-validityenddate IS INITIAL
 OR data-validitystartdate GE data-validityenddate
 OR data-lowbonusassignmentfactor IS INITIAL
 OR data-highbonusassignmentfactor IS INITIAL
 OR data-lowbonuspercentage IS INITIAL
 OR data-highbonuspercentage IS INITIAL
 OR data-lowbonuspercentage GE 100
 OR data-highbonuspercentage GE 100
 OR data-lowbonusassignmentfactor GE data-highbonusassignmentfactor
 OR data-employeeid IS INITIAL.
    data-isconsistent = abap_false.
ELSE.
    data-isconsistent = abap_true.
ENDIF.
* consistency check END

6. On top of the coding you can maintain runtime data for the current node structure which represents the data before running the test functionality. This data can also be saved as variant for later usages.

Enter following data

Field Value
validitystartdate 2017-01-01
validityenddate 2017-12-31
targetamount_v 1000
targetamount_c EUR
lowbonusassignmentfactor 1
highbonusassignmentfactor 3
lowbonuspercentage 10
highbonuspercentage 20
employeeid <any>

employeeid <any> shall be the one of a sales person that created sales orders with a Net Amount of more than 3000.00 EUR in 2016 and that are completed.

This will look as follows.

7. Execute the “Test” action and you can see the node data after your logic was executed.

You can see that your logic works as id, *percentage_u fields and employename are filled and isconsistent is X.

8. Publish the After Modification Logic

9. Implement Before Save event with following functionality

  • If the bonus plan is consistent, it can be continued to save, if not save shall be rejected. In case of save no further processing is needed and logic can be left.
    Hint: Exporting parameter valid must be set to true for save and to false for save rejection

    * decide about save rejection
    IF data-isconsistent EQ abap_true.
        valid = abap_true.
        RETURN.
    ELSE.
        valid = abap_false.
    ENDIF.
  • If the bonus plan is not consistent, write the first found error into the message and end the logic processing.
    These are the possible errors in detail:

    • ValidityStartDate and ValidityEndDate must be set
    • ValidityStartDate must be earlier in time than ValidityEndDate
    • Factors and Percentages must be > 0
    • Percentages must be < 100
    • LowBonusAssignmentFactor must be < HighBonusAssignmentFactor
    • Empoyee ID must be set
    * consistency error message START
    IF data-validitystartdate IS INITIAL OR data-validityenddate IS INITIAL.
        message = 'Validity Period must not be empty.'.
        RETURN.
    ELSEIF data-validitystartdate GE data-validityenddate.
        CONCATENATE 'Validity End Date' data-validityenddate 'must be later than Validity Start Date' data-validitystartdate '!' INTO message SEPARATED BY space.
        RETURN.
    ENDIF.
    
    IF data-targetamount_v IS INITIAL.
        message = 'Target Amount must be over 0!'.
        RETURN.
    ENDIF.
    
    IF data-targetamount_c IS INITIAL.
        message = 'Target Amount Currency must be set!'.
        RETURN.
    ENDIF.
    
    IF data-lowbonusassignmentfactor IS INITIAL
     OR data-highbonusassignmentfactor IS INITIAL.
        message = 'Assignment Factors must be over 0!'.
        RETURN.
    ENDIF.
    
    IF data-lowbonuspercentage IS INITIAL
     OR data-highbonuspercentage IS INITIAL.
        message = 'Percentages must be over 0!'.
        RETURN.
    ENDIF.
    
    IF data-lowbonuspercentage GE 100
     OR data-highbonuspercentage GE 100.
        message = 'Percentage must be below 100!'.
        RETURN.
    ENDIF.
    
    IF data-lowbonusassignmentfactor GE data-highbonusassignmentfactor.
        message = 'Low Bonus Factor must be smaller than High Bonus Factor!'.
        RETURN.
    ENDIF.
    
    IF data-employeeid IS INITIAL.
        message = 'Employee ID must be set!'.
        RETURN.
    ENDIF.
    * consistency error message  END

10. Publish the Before Save Logic


Step 2: Testing via the UI

Once ensured that both logic implementations were successfully published you can start testing the Application like an end user via the UI.

1. Open the Bonus Plan application

2. Open the Bonus Plan, created in Part I tutorial

3. Save the Bonus plan. You can see that your business logic works as the ID gets filled, but save fails due to the first of the implemented validation error messages.

4. Enter following data

field value
Validity Start Date 01/01/2016
Validity End Date 31/12/2016
Target Amount 1000.00 EUR
Low Bonus Assignment Factor 1
High Bonus Assignment Factor 3
Low Bonus Percentage 10
High Bonus Percentage 20
Employee ID <any>

Employee ID <any> shall be the one of a sales person that created sales orders with a Net Amount of more than 3000.00 EUR in 2016 and that are completed.

5. Save the Bonus Plan. Now it will not be rejected.

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply