Prerequisites: ◉ Knowledge on ABAP Restful Application Programming ◉ Knowledge on Entity Manipulation Language (EML) ◉ [Optional] Hands on exercises in Open SAP course https://open.sap.com/courses/cp13. This blog gives you an idea to develop a custom action with a dialog for additional input fields that are needed based on scenario. ◉ Use case: ◉ There is a purchase contract that needs to be extended to next year by buyer. ◉ Business logic: ◉ Only extend those validities which are running on existing valid to ◉ [i.e. continue business with same supplier]. ◉ Don’t touch items which are older than existing valid to. ◉ [i.e. no need to continue business with this supplier] In my example: Old valid to: Jun 30, 2021 New valid to: Dec 31, 2021 Item #10 runs on Jun 30,2021 hence it is expected to extend till Dec 31, 2021 Item #20 ends on Mar 31, 2021 hence it is not expected to touch. Click the button Extend and to see results on Object page and item page Implementation steps: 1. Create a data model with Header (Parent), Item (Child), Conditions (Grand Child) having fields “Valid from”, “Valid to “. 2. Create an abstract CDS entity with required input fields. @EndUserText.label: 'Abstract entity to extend the validity' @Metadata.allowExtensions: true define abstract entity ZRK_A_Doc_Extend // with parameters parameter_name : parameter_type { extend_till : /dmo/end_date; comments : abap.string( 300 ); } 3. Enrich the entity with UI annotations such as labels. @Metadata.layer: #CORE annotate entity ZRK_A_Doc_Extend with { @EndUserText.label: 'New validity to:' extend_till; @EndUserText.label: 'Enter your comments:' comments; } 4. In Behavior Definition, define action “extendDoc” with parameter using the abstract entity created in step#2. action extendDoc parameter ZRK_A_Doc_Extend result [1] $self; 5. Implement the core ABAP logic for extend in Behavior Pool Class METHOD extendDoc. DATA : lt_update_doc TYPE TABLE FOR UPDATE zrk_i_doc_head. DATA(lt_keys) = keys. DATA(lv_today) = cl_abap_context_info=>get_system_date( ). LOOP AT lt_keys ASSIGNING FIELD-SYMBOL(). IF -%param-extend_till < lv_today. APPEND VALUE #( %tky = -%tky ) TO failed-head. APPEND VALUE #( %tky = -%tky %msg = new_message( id = 'ZRK_CM_DOC' number = '001' " Document cannot be extended into the past severity = if_abap_behv_message=>severity-error ) %element-ValidTo = if_abap_behv=>mk-on ) TO reported-head. DELETE lt_keys. ELSE. DATA(lv_new_valid_to) = -%param-extend_till. ENDIF. ENDLOOP. " Once the validations are passed, proceed with extending document. CHECK lt_keys IS NOT INITIAL. READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Head FIELDS ( ValidFrom ValidTo ) WITH CORRESPONDING #( keys ) RESULT DATA(lt_doc_head). CHECK lt_doc_head IS NOT INITIAL. LOOP AT lt_doc_head ASSIGNING FIELD-SYMBOL(). " Capture old valid to DATA(lv_old_valid_to) = -ValidTo. " Read items from entity READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Head BY \_Items FIELDS ( ValidFrom ValidTo ) WITH VALUE #( ( %tky = -%tky ) ) RESULT DATA(lt_items). " Loop through items that are running on old valid to LOOP AT lt_items ASSIGNING FIELD-SYMBOL() WHERE ValidFrom LE lv_old_valid_to AND ValidTo GE lv_old_valid_to. " Modify item with new valid to -ValidTo = lv_new_valid_to. " Read conditions from entity READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Items BY \_Conds FIELDS ( ValidFrom ValidTo ) WITH VALUE #( ( %tky = -%tky ) ) RESULT DATA(lt_conds). LOOP AT lt_conds ASSIGNING FIELD-SYMBOL() WHERE ValidFrom LE lv_old_valid_to AND ValidTo GE lv_old_valid_to.. -ValidTo = lv_new_valid_to. ENDLOOP. " Modify conditions entity MODIFY ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Conds UPDATE FIELDS ( ValidTo ) WITH CORRESPONDING #( lt_conds ). ENDLOOP. " Modify Items entity MODIFY ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Items UPDATE FIELDS ( ValidTo ) WITH CORRESPONDING #( lt_items ). ENDLOOP. " Modify header entity MODIFY ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Head UPDATE FIELDS ( ValidTo ) WITH VALUE #( FOR IN lt_doc_head ( %tky = -%tky validTo = COND #( WHEN lv_new_valid_to IS NOT INITIAL THEN lv_new_valid_to ELSE -ValidTo ) ) ) REPORTED DATA(lt_update_reported). reported = CORRESPONDING #( DEEP lt_update_reported ). " Return result to UI READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE ENTITY Head ALL FIELDS WITH CORRESPONDING #( keys ) RESULT lt_doc_head. result = VALUE #( FOR IN lt_doc_head ( %tky = -%tky %param = ) ). ENDMETHOD. 6. Position the Action button on List Report and Object Page using annotations. @UI: { lineItem: [ { type: #FOR_ACTION, dataAction: 'ExtendDoc' , label: 'Extend' , position: 90 } ] , identification : [ { type: #FOR_ACTION, dataAction: 'ExtendDoc' , label: 'Extend' , position: 90 } ] }