Skip to content
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

Open
Yuxin61 opened this issue Oct 8, 2024 · 1 comment
Open

Enhance Behavior With Action and Validation #2545

Yuxin61 opened this issue Oct 8, 2024 · 1 comment

Comments

@Yuxin61
Copy link

Yuxin61 commented Oct 8, 2024

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!

@Yuxin61
Copy link
Author

Yuxin61 commented Oct 10, 2024

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
Projects
None yet
Development

No branches or pull requests

2 participants