-
Notifications
You must be signed in to change notification settings - Fork 23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enhance Behavior With Action and Validation #2545
Comments
I've made some modifications, and now it works fine in my environment CLASS lhc_Travel DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF travel_status,
open TYPE c LENGTH 1 VALUE 'O', "Open
accepted TYPE c LENGTH 1 VALUE 'A', "Accepted
rejected TYPE c LENGTH 1 VALUE 'X', "Rejected
END OF travel_status.
METHODS get_instance_features FOR INSTANCE FEATURES
IMPORTING keys REQUEST requested_features FOR Travel RESULT result.
METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION
IMPORTING REQUEST requested_authorizations FOR Travel RESULT result.
METHODS acceptTravel FOR MODIFY
IMPORTING keys FOR ACTION Travel~acceptTravel RESULT result.
METHODS CalculateTravelKey FOR DETERMINE ON MODIFY
IMPORTING keys FOR Travel~CalculateTravelKey.
METHODS validateAgency FOR VALIDATE ON SAVE
IMPORTING keys FOR Travel~validateAgency.
METHODS validateCustomer FOR VALIDATE ON SAVE
IMPORTING keys FOR Travel~validateCustomer.
METHODS validateDates FOR VALIDATE ON SAVE
IMPORTING keys FOR Travel~validateDates.
ENDCLASS.
CLASS lhc_Travel IMPLEMENTATION.
METHOD get_instance_features.
READ ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY travel
FROM VALUE #( FOR key IN keys ( mykey = key-mykey
%control-overall_status = if_abap_behv=>mk-on ) )
RESULT DATA(lt_travel).
result = VALUE #( FOR travel IN lt_travel
( %key = travel-%key
%features-%action-acceptTravel = COND #( WHEN travel-overall_status = 'A'
THEN if_abap_behv=>fc-o-disabled
ELSE if_abap_behv=>fc-o-enabled )
) ).
ENDMETHOD.
METHOD get_global_authorizations.
ENDMETHOD.
METHOD acceptTravel.
MODIFY ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY travel
UPDATE FROM VALUE #( FOR key IN keys ( mykey = key-mykey
overall_status = 'A' " Accepted
%control-overall_status = if_abap_behv=>mk-on ) )
FAILED failed
REPORTED reported.
READ ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY travel
FROM VALUE #( FOR key IN keys ( mykey = key-mykey
%control = VALUE #(
agency_id = if_abap_behv=>mk-on
customer_id = if_abap_behv=>mk-on
begin_date = if_abap_behv=>mk-on
end_date = if_abap_behv=>mk-on
booking_fee = if_abap_behv=>mk-on
total_price = if_abap_behv=>mk-on
currency_code = if_abap_behv=>mk-on
overall_status = if_abap_behv=>mk-on
description = if_abap_behv=>mk-on
created_by = if_abap_behv=>mk-on
created_at = if_abap_behv=>mk-on
last_changed_by = if_abap_behv=>mk-on
last_changed_at = if_abap_behv=>mk-on
) ) )
RESULT DATA(lt_travel).
result = VALUE #( FOR travel IN lt_travel ( mykey = travel-mykey
%param = travel
) ).
ENDMETHOD.
METHOD CalculateTravelKey.
READ ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY travel
FIELDS ( travel_id )
WITH CORRESPONDING #( keys )
RESULT DATA(travels).
DELETE travels WHERE travel_id IS NOT INITIAL.
CHECK travels IS NOT INITIAL.
SELECT SINGLE FROM ztravel_### FIELDS MAX( travel_id ) INTO @DATA(lv_max_travel_id).
MODIFY ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY travel
UPDATE FIELDS ( travel_id )
WITH VALUE #( FOR ls_travel IN travels INDEX INTO i (
%key = ls_travel-%key
travel_id = lv_max_travel_id + i ) )
REPORTED DATA(lt_reported).
ENDMETHOD.
METHOD validateAgency.
READ ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY Travel
FIELDS ( agency_id )
WITH CORRESPONDING #( keys )
RESULT DATA(travels).
DATA agencies TYPE SORTED TABLE OF /dmo/agency WITH UNIQUE KEY agency_id.
" Optimization of DB select: extract distinct non-initial customer IDs
agencies = CORRESPONDING #( travels DISCARDING DUPLICATES MAPPING agency_id = agency_id EXCEPT * ).
DELETE agencies WHERE agency_id IS INITIAL.
CHECK agencies IS NOT INITIAL.
" Check if customer ID exist
SELECT FROM /dmo/agency FIELDS agency_id
FOR ALL ENTRIES IN @agencies
WHERE agency_id = @agencies-agency_id
INTO TABLE @DATA(lt_agency_db).
" Raise msg for non existing customer id
LOOP AT travels INTO DATA(travel).
IF travel-agency_id IS NOT INITIAL AND NOT line_exists( lt_agency_db[ agency_id = travel-agency_id ] ).
APPEND VALUE #( mykey = travel-mykey ) TO failed-travel.
APPEND VALUE #( mykey = travel-mykey
%msg = new_message( id = /dmo/cx_flight_legacy=>agency_unkown-msgid
number = /dmo/cx_flight_legacy=>agency_unkown-msgno
v1 = travel-agency_id
severity = if_abap_behv_message=>severity-error )
%element-agency_id = if_abap_behv=>mk-on ) TO reported-travel.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD validateCustomer.
READ ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY Travel
FIELDS ( customer_id )
WITH CORRESPONDING #( keys )
RESULT DATA(travels).
DATA customers TYPE SORTED TABLE OF /dmo/customer WITH UNIQUE KEY customer_id.
" Optimization of DB select: extract distinct non-initial customer IDs
customers = CORRESPONDING #( travels DISCARDING DUPLICATES MAPPING customer_id = customer_id EXCEPT * ).
DELETE customers WHERE customer_id IS INITIAL.
CHECK customers IS NOT INITIAL.
" Check if customer ID exist
SELECT FROM /dmo/customer FIELDS customer_id
FOR ALL ENTRIES IN @customers
WHERE customer_id = @customers-customer_id
INTO TABLE @DATA(lt_customer_db).
" Raise msg for non existing customer id
LOOP AT travels INTO DATA(travel).
IF travel-customer_id IS NOT INITIAL AND NOT line_exists( lt_customer_db[ customer_id = travel-customer_id ] ).
APPEND VALUE #( mykey = travel-mykey ) TO failed-Travel.
APPEND VALUE #( mykey = travel-mykey
%msg = new_message( id = /dmo/cx_flight_legacy=>customer_unkown-msgid
number = /dmo/cx_flight_legacy=>customer_unkown-msgno
v1 = travel-customer_id
severity = if_abap_behv_message=>severity-error )
%element-customer_id = if_abap_behv=>mk-on ) TO reported-Travel.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD validateDates.
READ ENTITIES OF ZI_TRAVEL_M_### IN LOCAL MODE
ENTITY travel
FIELDS ( begin_date end_date travel_id )
WITH CORRESPONDING #( keys )
RESULT DATA(travels).
LOOP AT travels INTO DATA(travel).
IF travel-end_date < travel-begin_date. "end_date before begin_date
APPEND VALUE #( %key = travel-%key
mykey = travel-mykey ) TO failed-travel.
APPEND VALUE #( %key = travel-%key
%msg = new_message( id = /dmo/cx_flight_legacy=>end_date_before_begin_date-msgid
number = /dmo/cx_flight_legacy=>end_date_before_begin_date-msgno
v1 = travel-begin_date
v2 = travel-end_date
v3 = travel-travel_id
severity = if_abap_behv_message=>severity-error )
%element-begin_date = if_abap_behv=>mk-on
%element-end_date = if_abap_behv=>mk-on ) TO reported-travel.
ELSEIF travel-begin_date < cl_abap_context_info=>get_system_date( ). " begin_date must be in the future
APPEND VALUE #( %key = travel-%key
mykey = travel-mykey ) TO failed-travel.
APPEND VALUE #( %key = travel-%key
%msg = new_message( id = /dmo/cx_flight_legacy=>begin_date_before_system_date-msgid
number = /dmo/cx_flight_legacy=>begin_date_before_system_date-msgno
severity = if_abap_behv_message=>severity-error )
%element-begin_date = if_abap_behv=>mk-on
%element-end_date = if_abap_behv=>mk-on ) TO reported-travel.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tutorials: https://developers.sap.com/tutorials/abap-environment-behavior-action.html
Write here how you think we can improve the tutorial ...
Hello,
I want to share some feedback regarding the object names in this tutorial. Before I completed the tutorial on Enhance Behavior With Action and Validation, I finished the tutorial on Create Behavior Definition for Managed Scenario. I believe there may be some errors in the object names in the tutorial on enhancing behavior. Specifically, I think ZR_TRAVELTP_### should be ZI_TRAVEL_M_xxx, and ZC_TRAVELTP_### should be ZC_TRAVEL_M_xxx.
Thank you!
The text was updated successfully, but these errors were encountered: