{"id":283,"date":"2026-07-30T09:12:47","date_gmt":"2026-07-30T09:12:47","guid":{"rendered":"https:\/\/sapabap.dwimansolution.com\/?p=283"},"modified":"2026-07-30T09:31:04","modified_gmt":"2026-07-30T09:31:04","slug":"sap-abap-fast-coding-with-this-template-editable-alv-with-events","status":"publish","type":"post","link":"https:\/\/sapabap.dwimansolution.com\/index.php\/2026\/07\/30\/sap-abap-fast-coding-with-this-template-editable-alv-with-events\/","title":{"rendered":"SAP ABAP Fast Coding With This Template &#8211; Editable ALV With Events"},"content":{"rendered":"\n<p>Bismillah.<\/p>\n\n\n\n<p>This template is need to complete with some action before run.<\/p>\n\n\n\n<p>*&amp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*<br>*&amp;&nbsp;MANUAL&nbsp;OBJECTS&nbsp;TO&nbsp;CREATE&nbsp;(cannot&nbsp;be&nbsp;generated&nbsp;from&nbsp;source&nbsp;code)<br>*&amp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*<br>*&amp;&nbsp;1.&nbsp;SCREEN&nbsp;0100&nbsp;(SE51)<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Attributes&nbsp;:&nbsp;Screen&nbsp;type&nbsp;=&nbsp;Normal,&nbsp;Next&nbsp;screen&nbsp;=&nbsp;0<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Element&nbsp;list&nbsp;-&gt;&nbsp;add&nbsp;a&nbsp;&#8220;Custom&nbsp;Control&#8221;&nbsp;named&nbsp;CC_0100_ALV<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(resizing:&nbsp;vertical&nbsp;+&nbsp;horizontal&nbsp;=&nbsp;X&nbsp;so&nbsp;the&nbsp;ALV&nbsp;grows)<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;OK&nbsp;code&nbsp;field&nbsp;(Element&nbsp;list&nbsp;-&gt;&nbsp;tab&nbsp;&#8220;OK&#8221;)&nbsp;=&nbsp;OK_CODE<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Flow&nbsp;logic&nbsp;:<br>*&amp;<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS&nbsp;BEFORE&nbsp;OUTPUT.<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;status_0100.<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;display_alv_0100.<br>*&amp;<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS&nbsp;AFTER&nbsp;INPUT.<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;exit_0100&nbsp;AT&nbsp;EXIT-COMMAND.<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;user_command_0100.<br>*&amp;<br>*&amp;&nbsp;2.&nbsp;GUI&nbsp;STATUS&nbsp;&#8216;ST_0100&#8217;&nbsp;(SE41)<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Function&nbsp;keys&nbsp;:&nbsp;BACK&nbsp;(F3),&nbsp;EXIT&nbsp;(Shift+F3),&nbsp;CANC&nbsp;(F12)<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Application&nbsp;toolbar&nbsp;(optional)&nbsp;:&nbsp;SAVE,&nbsp;REFRESH<br>*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Set&nbsp;BACK&nbsp;\/&nbsp;EXIT&nbsp;\/&nbsp;CANC&nbsp;as&nbsp;type&nbsp;&#8220;E&#8221;&nbsp;(Exit&nbsp;command)<br>*&amp;<br>*&amp;&nbsp;3.&nbsp;GUI&nbsp;TITLE&nbsp;&#8216;T_0100&#8217;&nbsp;(SE41)&nbsp;:&nbsp;e.g.&nbsp;&#8220;ALV&nbsp;Template&nbsp;&#8211;&nbsp;Maintenance&#8221;<br>*&amp;<br>*&amp;&nbsp;4.&nbsp;TEXT&nbsp;SYMBOL&nbsp;:&nbsp;TEXT-B01&nbsp;=&nbsp;&#8220;Selection&#8221;<br>*&amp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*&amp;---------------------------------------------------------------------*\n*&amp; Copyright (c) 2026 &lt;COMPANY NAME>. All rights reserved.\n*&amp;\n*&amp; This program is the confidential and proprietary information of\n*&amp; &lt;COMPANY NAME>. Unauthorized copying, modification, distribution or\n*&amp; use of this program, in whole or in part, via any medium, is\n*&amp; strictly prohibited without prior written consent.\n*&amp;---------------------------------------------------------------------*\n*&amp; Program Name : ZR_ALV_TEMPLATE_0100\n*&amp; Title        : &lt;SHORT TITLE OF THE PROGRAM>\n*&amp; Author       : &lt;YOUR NAME \/ SAP USER ID>\n*&amp; Created On   : &lt;DD.MM.YYYY>\n*&amp; Package      : &lt;Z_PACKAGE>\n*&amp; Type         : Report (Dynpro + OO ALV Grid)\n*&amp;---------------------------------------------------------------------*\n*&amp; Description  :\n*&amp;   &lt;Describe the business purpose here>\n*&amp;   &lt;e.g. Maintain and display XXX data, allow inline editing of the\n*&amp;    editable columns and save the changes back to table ZXXX.>\n*&amp;\n*&amp; Related Objects :\n*&amp;   Screen        : 0100\n*&amp;   GUI Status    : ST_0100\n*&amp;   GUI Title     : T_0100\n*&amp;   Custom Control: CC_0100_ALV\n*&amp;---------------------------------------------------------------------*\n*&amp; CHANGE LOG\n*&amp;---------------------------------------------------------------------*\n*&amp; No. | Date       | Author          | TR Number   | Description\n*&amp;-----|------------|-----------------|-------------|-------------------\n*&amp; 001 | DD.MM.YYYY | &lt;NAME>          | &lt;DEVK9xxxxx>| Initial creation\n*&amp; 002 |            |                 |             |\n*&amp; 003 |            |                 |             |\n*&amp;---------------------------------------------------------------------*\nREPORT ztemplate.\n\nTYPE-POOLS: icon.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; G L O B A L   T Y P E S\n*&amp;---------------------------------------------------------------------*\nTYPES: BEGIN OF ty_data,\n         carrid   TYPE c LENGTH 3,        \"editable + custom F4\n         connid   TYPE c LENGTH 4,        \"hotspot\n         fldate   TYPE dats,\n         price    TYPE p LENGTH 9 DECIMALS 2, \"editable + validation\n         currency TYPE waers,\n         remark   TYPE c LENGTH 40,       \"editable\n         locked   TYPE flag,              \"row lock flag -> celltab demo\n         \"--- ALV technical fields -------------------------------------\n         celltab  TYPE lvc_t_styl,        \"cell level edit control\n         rowcolor TYPE c LENGTH 4,        \"row color (layout-info_fname)\n       END OF ty_data,\n\n       tt_data TYPE STANDARD TABLE OF ty_data WITH NON-UNIQUE DEFAULT KEY.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; G L O B A L   D A T A  (dynpro related only)\n*&amp;---------------------------------------------------------------------*\nDATA: ok_code TYPE sy-ucomm,\n      gs_data TYPE ty_data.          \"work area for SELECT-OPTIONS only\n\n*&amp;---------------------------------------------------------------------*\n*&amp; S E L E C T I O N   S C R E E N\n*&amp;---------------------------------------------------------------------*\nSELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.\n  SELECT-OPTIONS: s_carrid FOR gs_data-carrid.\nSELECTION-SCREEN END OF BLOCK b01.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; L O C A L   C L A S S   D E F I N I T I O N\n*&amp;---------------------------------------------------------------------*\nCLASS lcl_app DEFINITION FINAL CREATE PRIVATE.\n\n  PUBLIC SECTION.\n\n    CONSTANTS:\n      BEGIN OF c_fcode,\n        insert TYPE ui_func VALUE 'ZINS',\n        delete TYPE ui_func VALUE 'ZDEL',\n        save   TYPE ui_func VALUE 'ZSAV',\n        toggle TYPE ui_func VALUE 'ZTGL',\n      END OF c_fcode.\n\n    CLASS-METHODS get_instance\n      RETURNING VALUE(ro_app) TYPE REF TO lcl_app.\n\n    METHODS:\n      load_data,\n      \"! PBO of screen 0100 - creates container\/grid on first call\n      pbo_0100,\n      \"! PAI of screen 0100\n      \"! @parameter rv_leave | 'X' -> caller must leave the screen\n      pai_0100 IMPORTING iv_ok_code      TYPE sy-ucomm\n               RETURNING VALUE(rv_leave) TYPE abap_bool,\n      \"! AT EXIT-COMMAND of screen 0100\n      exit_0100 IMPORTING iv_ok_code      TYPE sy-ucomm\n                RETURNING VALUE(rv_leave) TYPE abap_bool.\n\n  PRIVATE SECTION.\n\n    CLASS-DATA go_app TYPE REF TO lcl_app.\n\n    DATA:\n      mo_container TYPE REF TO cl_gui_custom_container,\n      mo_grid      TYPE REF TO cl_gui_alv_grid,\n      mt_data      TYPE tt_data,\n      mt_fcat      TYPE lvc_t_fcat,\n      ms_layout    TYPE lvc_s_layo,\n      ms_variant   TYPE disvariant,\n      mt_exclude   TYPE ui_functions,\n      mv_edit      TYPE abap_bool VALUE abap_true,\n      mv_changed   TYPE abap_bool.\n\n    METHODS:\n      build_fieldcat,\n      build_layout,\n      build_exclude,\n      set_celltab,\n      register_f4,\n      display_alv,\n      refresh_alv IMPORTING iv_soft TYPE char01 DEFAULT abap_true,\n      toggle_edit_mode,\n      insert_row,\n      delete_selected_rows,\n      save_data,\n      \"&amp;------------------------------------------------------------ *\n      \"&amp; A L V   E V E N T   H A N D L E R S\n      \"&amp;------------------------------------------------------------ *\n      on_toolbar\n        FOR EVENT toolbar OF cl_gui_alv_grid\n        IMPORTING e_object e_interactive,\n\n      on_user_command\n        FOR EVENT user_command OF cl_gui_alv_grid\n        IMPORTING e_ucomm,\n\n      on_hotspot_click\n        FOR EVENT hotspot_click OF cl_gui_alv_grid\n        IMPORTING e_row_id e_column_id es_row_no,\n\n      on_double_click\n        FOR EVENT double_click OF cl_gui_alv_grid\n        IMPORTING e_row e_column es_row_no,\n\n      \"! Fires per changed cell block - use for validation\n      on_data_changed\n        FOR EVENT data_changed OF cl_gui_alv_grid\n        IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm,\n\n      \"! Fires once AFTER all changes are applied to the output table\n      on_data_changed_finished\n        FOR EVENT data_changed_finished OF cl_gui_alv_grid\n        IMPORTING e_modified et_good_cells,\n\n      \"! Custom search help (F4) inside the editable cell\n      on_f4\n        FOR EVENT onf4 OF cl_gui_alv_grid\n        IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data\n                  et_bad_cells e_display.\n\nENDCLASS.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; L O C A L   C L A S S   I M P L E M E N T A T I O N\n*&amp;---------------------------------------------------------------------*\nCLASS lcl_app IMPLEMENTATION.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD get_instance.\n    IF go_app IS NOT BOUND.\n      go_app = NEW lcl_app( ).\n    ENDIF.\n    ro_app = go_app.\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD load_data.\n    \" Replace the subroutine content with your real SELECT.\n    PERFORM f_get_data USING    s_carrid&#91;]\n                       CHANGING mt_data.\n    set_celltab( ).\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD pbo_0100.\n\n    IF mo_container IS BOUND.\n      \" Screen is already built -> only refresh\n      refresh_alv( ).\n      RETURN.\n    ENDIF.\n\n    mo_container = NEW cl_gui_custom_container(\n                         container_name = 'CC_0100_ALV' ).\n\n    mo_grid = NEW cl_gui_alv_grid( i_parent = mo_container ).\n\n    build_fieldcat( ).\n    build_layout( ).\n    build_exclude( ).\n\n    \" Register the event handlers of this local class\n    SET HANDLER: me->on_toolbar               FOR mo_grid,\n                 me->on_user_command          FOR mo_grid,\n                 me->on_hotspot_click         FOR mo_grid,\n                 me->on_double_click          FOR mo_grid,\n                 me->on_data_changed          FOR mo_grid,\n                 me->on_data_changed_finished FOR mo_grid,\n                 me->on_f4                    FOR mo_grid.\n\n    \" When shall DATA_CHANGED be raised?\n    \"   MC_EVT_ENTER    -> only when ENTER is pressed\n    \"   MC_EVT_MODIFIED -> whenever a cell is left after modification\n    mo_grid->register_edit_event(\n      i_event_id = cl_gui_alv_grid=>mc_evt_modified ).\n\n    register_f4( ).\n    display_alv( ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD build_fieldcat.\n\n    CLEAR mt_fcat.\n\n    \" Built manually so the template has no DDIC dependency.\n    \" In a real program prefer:\n    \"   LVC_FIELDCATALOG_MERGE (FM) or CL_SALV_TABLE metadata,\n    \"   then only overwrite the properties you need.\n    mt_fcat = VALUE lvc_t_fcat(\n      ( fieldname = 'CARRID'   col_pos = 1  outputlen = 3\n        coltext   = 'Airline'  edit = abap_true\n        f4availabl = abap_true )                      \"enable F4 button\n      ( fieldname = 'CONNID'   col_pos = 2  outputlen = 4\n        coltext   = 'Conn.'    hotspot = abap_true )   \"hotspot column\n      ( fieldname = 'FLDATE'   col_pos = 3  outputlen = 10\n        coltext   = 'Date' )\n      ( fieldname = 'PRICE'    col_pos = 4  outputlen = 15\n        coltext   = 'Price'    edit = abap_true\n        cfieldname = 'CURRENCY' )\n      ( fieldname = 'CURRENCY' col_pos = 5  outputlen = 5\n        coltext   = 'Curr.' )\n      ( fieldname = 'REMARK'   col_pos = 6  outputlen = 40\n        coltext   = 'Remark'   edit = abap_true )\n      ( fieldname = 'LOCKED'   col_pos = 7  outputlen = 6\n        coltext   = 'Locked'   checkbox = abap_true ) ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD build_layout.\n\n    CLEAR ms_layout.\n\n    \" SEL_MODE:\n    \"   'A' multiple rows + column selection\n    \"   'B' single row (simple)\n    \"   'C' multiple rows, no cell selection\n    \"   'D' cell + multiple row selection  &lt;-- used here\n    ms_layout-sel_mode   = 'D'.\n    ms_layout-cwidth_opt = abap_true.\n    ms_layout-zebra      = abap_true.\n    ms_layout-stylefname = 'CELLTAB'.    \"cell level edit control\n    ms_layout-info_fname = 'ROWCOLOR'.   \"row coloring\n    ms_layout-grid_title = 'ALV Template - Screen 0100'.\n\n    \" Optional: extra checkbox column synchronized with row selection\n    \" ms_layout-box_fname = 'MARK'.  \"requires a FLAG field in ty_data\n\n    \" Layout variant (i_save = 'A' -> user + global variants allowed)\n    ms_variant-report  = sy-repid.\n    ms_variant-handle  = '0100'.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD build_exclude.\n    \" \"SET FUNCTION ALL\":\n    \" CL_GUI_ALV_GRID shows ALL standard functions when\n    \"   I_DEFAULT = 'X' and IT_TOOLBAR_EXCLUDING is empty.\n    \" Only fill this table if you really need to hide something, e.g.:\n    \"   APPEND cl_gui_alv_grid=>mc_fc_graph      TO mt_exclude.\n    \"   APPEND cl_gui_alv_grid=>mc_fc_info       TO mt_exclude.\n    CLEAR mt_exclude.\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD register_f4.\n\n    DATA lt_f4 TYPE lvc_t_f4.\n\n    lt_f4 = VALUE lvc_t_f4(\n      ( fieldname   = 'CARRID'\n        register    = abap_true    \"raise ONF4 for this field\n        getbefore   = abap_true    \"supply current cell value\n        chngeafter  = abap_true ) ).\"allow value change afterwards\n\n    mo_grid->register_f4_for_fields( it_f4 = lt_f4 ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD display_alv.\n\n    mo_grid->set_table_for_first_display(\n      EXPORTING\n        is_variant           = ms_variant\n        i_save               = 'A'\n        i_default            = abap_true\n        is_layout            = ms_layout\n        it_toolbar_excluding = mt_exclude\n      CHANGING\n        it_outtab            = mt_data\n        it_fieldcatalog      = mt_fcat\n      EXCEPTIONS\n        invalid_parameter_combination = 1\n        program_error                = 2\n        too_many_lines               = 3\n        OTHERS                       = 4 ).\n\n    IF sy-subrc &lt;> 0.\n      MESSAGE 'Error while building the ALV grid' TYPE 'E'.\n    ENDIF.\n\n    \" Global edit mode switch (1 = ready for input, 0 = display only)\n    mo_grid->set_ready_for_input( i_ready_for_input = COND i( WHEN mv_edit = abap_true\n                                                    THEN 1 ELSE 0 ) ).\n\n    \" Allow the user to change the toolbar interactively\n    mo_grid->set_toolbar_interactive( ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD set_celltab.\n\n    DATA lt_styl TYPE lvc_t_styl.\n\n    LOOP AT mt_data ASSIGNING FIELD-SYMBOL(&lt;ls_data>).\n\n      CLEAR: lt_styl, &lt;ls_data>-celltab, &lt;ls_data>-rowcolor.\n\n      IF &lt;ls_data>-locked = abap_true.\n        \" Whole row not editable + highlighted\n        lt_styl = VALUE lvc_t_styl(\n          ( fieldname = 'CARRID' style = cl_gui_alv_grid=>mc_style_disabled )\n          ( fieldname = 'PRICE'  style = cl_gui_alv_grid=>mc_style_disabled )\n          ( fieldname = 'REMARK' style = cl_gui_alv_grid=>mc_style_disabled ) ).\n        &lt;ls_data>-rowcolor = 'C610'.   \"C + intensity + inverse\n      ELSE.\n        lt_styl = VALUE lvc_t_styl(\n          ( fieldname = 'CARRID' style = cl_gui_alv_grid=>mc_style_enabled )\n          ( fieldname = 'PRICE'  style = cl_gui_alv_grid=>mc_style_enabled )\n          ( fieldname = 'REMARK' style = cl_gui_alv_grid=>mc_style_enabled ) ).\n      ENDIF.\n\n      &lt;ls_data>-celltab = lt_styl.\n\n    ENDLOOP.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD refresh_alv.\n\n    IF mo_grid IS NOT BOUND.\n      RETURN.\n    ENDIF.\n\n    mo_grid->refresh_table_display(\n      EXPORTING\n        is_stable      = VALUE lvc_s_stbl( row = abap_true col = abap_true )\n        i_soft_refresh = iv_soft\n      EXCEPTIONS\n        finished       = 1\n        OTHERS         = 2 ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD toggle_edit_mode.\n\n    mv_edit = COND abap_bool( WHEN mv_edit = abap_true\n                              THEN abap_false ELSE abap_true ).\n\n    mo_grid->set_ready_for_input( i_ready_for_input = COND i( WHEN mv_edit = abap_true\n                                                    THEN 1 ELSE 0 ) ).\n    refresh_alv( ).\n\n    MESSAGE |Edit mode: { COND string( WHEN mv_edit = abap_true\n                                       THEN 'ON' ELSE 'OFF' ) }| TYPE 'S'.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD insert_row.\n\n    APPEND VALUE ty_data( currency = 'IDR' ) TO mt_data.\n    set_celltab( ).\n    refresh_alv( iv_soft = abap_false ).\n    mv_changed = abap_true.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD delete_selected_rows.\n\n    DATA lt_rows TYPE lvc_t_row.\n\n    \" MULTIPLE ROW SELECTION is read here\n    mo_grid->get_selected_rows( IMPORTING et_index_rows = lt_rows ).\n\n    IF lt_rows IS INITIAL.\n      MESSAGE 'Please select at least one row' TYPE 'S' DISPLAY LIKE 'W'.\n      RETURN.\n    ENDIF.\n\n    \" Delete from the highest index downwards\n    SORT lt_rows BY index DESCENDING.\n    LOOP AT lt_rows INTO DATA(ls_row).\n      DELETE mt_data INDEX ls_row-index.\n    ENDLOOP.\n\n    refresh_alv( iv_soft = abap_false ).\n    mv_changed = abap_true.\n    MESSAGE |{ lines( lt_rows ) } row(s) deleted| TYPE 'S'.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD save_data.\n\n    \" IMPORTANT: force the grid to hand over the cells that are still\n    \" in the frontend buffer. This triggers DATA_CHANGED.\n    mo_grid->check_changed_data( IMPORTING e_valid = DATA(lv_valid) ).\n\n    IF lv_valid = abap_false.\n      MESSAGE 'Data contains errors - correct them first' TYPE 'S'\n              DISPLAY LIKE 'E'.\n      RETURN.\n    ENDIF.\n\n    PERFORM f_save_data USING mt_data.\n\n    mv_changed = abap_false.\n    refresh_alv( ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD pai_0100.\n\n    rv_leave = abap_false.\n\n    CASE iv_ok_code.\n      WHEN 'BACK' OR 'EXIT' OR 'CANC'.\n        rv_leave = exit_0100( iv_ok_code ).\n\n      WHEN 'SAVE'.                 \"function code of the GUI status\n        save_data( ).\n\n      WHEN 'REFRESH'.\n        load_data( ).\n        refresh_alv( iv_soft = abap_false ).\n\n      WHEN OTHERS.\n        \" ALV toolbar commands are handled in ON_USER_COMMAND\n    ENDCASE.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n  METHOD exit_0100.\n\n    rv_leave = abap_true.\n\n    IF mv_changed = abap_true AND iv_ok_code &lt;> 'EXIT'.\n      DATA(lv_answer) = ``.\n      CALL FUNCTION 'POPUP_TO_CONFIRM'\n        EXPORTING\n          titlebar              = 'Unsaved data'\n          text_question         = 'Data has been changed. Leave anyway?'\n          default_button        = '2'\n          display_cancel_button = abap_false\n        IMPORTING\n          answer                = lv_answer\n        EXCEPTIONS\n          OTHERS                = 0.\n      IF lv_answer &lt;> '1'.\n        rv_leave = abap_false.\n        RETURN.\n      ENDIF.\n    ENDIF.\n\n    \" Free the controls before leaving the screen\n    IF mo_grid IS BOUND.\n      mo_grid->free( ).\n      CLEAR mo_grid.\n    ENDIF.\n    IF mo_container IS BOUND.\n      mo_container->free( ).\n      CLEAR mo_container.\n    ENDIF.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: TOOLBAR - add your own buttons\n*&amp;---------------------------------------------------------------------*\n  METHOD on_toolbar.\n\n    \" butn_type: 0 = button, 1 = menu+default, 2 = menu, 3 = separator\n    APPEND VALUE stb_button( butn_type = 3 ) TO e_object->mt_toolbar.\n\n    APPEND VALUE stb_button( function  = c_fcode-insert\n                             icon      = icon_insert_row\n                             quickinfo = 'Insert row'\n                             text      = 'Insert'\n                             butn_type = 0 ) TO e_object->mt_toolbar.\n\n    APPEND VALUE stb_button( function  = c_fcode-delete\n                             icon      = icon_delete_row\n                             quickinfo = 'Delete selected rows'\n                             text      = 'Delete'\n                             butn_type = 0 ) TO e_object->mt_toolbar.\n\n    APPEND VALUE stb_button( function  = c_fcode-save\n                             icon      = icon_system_save\n                             quickinfo = 'Save changes'\n                             text      = 'Save'\n                             butn_type = 0 ) TO e_object->mt_toolbar.\n\n    APPEND VALUE stb_button( function  = c_fcode-toggle\n                             icon      = icon_toggle_display_change\n                             quickinfo = 'Toggle display \/ change'\n                             text      = 'Display&lt;->Change'\n                             butn_type = 0 ) TO e_object->mt_toolbar.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: USER_COMMAND - reaction to the buttons added above\n*&amp;---------------------------------------------------------------------*\n  METHOD on_user_command.\n\n    CASE e_ucomm.\n      WHEN c_fcode-insert.\n        insert_row( ).\n      WHEN c_fcode-delete.\n        delete_selected_rows( ).\n      WHEN c_fcode-save.\n        save_data( ).\n      WHEN c_fcode-toggle.\n        toggle_edit_mode( ).\n      WHEN OTHERS.\n        \" standard functions are processed by the grid itself\n    ENDCASE.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: HOTSPOT_CLICK\n*&amp;---------------------------------------------------------------------*\n  METHOD on_hotspot_click.\n\n    READ TABLE mt_data INTO DATA(ls_data) INDEX e_row_id-index.\n    IF sy-subrc &lt;> 0.\n      RETURN.\n    ENDIF.\n\n    CASE e_column_id-fieldname.\n      WHEN 'CONNID'.\n        \" Example: jump to another transaction \/ display detail\n        \" SET PARAMETER ID 'XXX' FIELD ls_data-connid.\n        \" CALL TRANSACTION 'XXXX' AND SKIP FIRST SCREEN.\n        MESSAGE |Hotspot on { ls_data-carrid } \/ { ls_data-connid }|\n                TYPE 'S'.\n      WHEN OTHERS.\n    ENDCASE.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: DOUBLE_CLICK\n*&amp;---------------------------------------------------------------------*\n  METHOD on_double_click.\n\n    READ TABLE mt_data INTO DATA(ls_data) INDEX e_row-index.\n    IF sy-subrc = 0.\n      MESSAGE |Double click row { e_row-index } column { e_column-fieldname }|\n              TYPE 'S'.\n    ENDIF.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: DATA_CHANGED - validation of the changed cells\n*&amp;        er_data_changed->mt_good_cells : successfully typed cells\n*&amp;        er_data_changed->mt_mod_cells  : all modified cells\n*&amp;---------------------------------------------------------------------*\n  METHOD on_data_changed.\n\n    LOOP AT er_data_changed->mt_good_cells INTO DATA(ls_cell).\n\n      CASE ls_cell-fieldname.\n\n        WHEN 'PRICE'.\n          \" Read the new value in the correct type\n          DATA: lv_price TYPE sflight-price.\n          er_data_changed->get_cell_value(\n            EXPORTING i_row_id    = ls_cell-row_id\n                      i_fieldname = ls_cell-fieldname\n            IMPORTING e_value     = lv_price ).\n\n          IF lv_price &lt; 0.\n            er_data_changed->add_protocol_entry(\n              i_msgid     = '00'\n              i_msgty     = 'E'\n              i_msgno     = '001'\n              i_msgv1     = 'Price must not be negative'\n              i_fieldname = ls_cell-fieldname\n              i_row_id    = ls_cell-row_id ).\n\n            \" Reset the cell to zero\n            er_data_changed->modify_cell(\n              i_row_id    = ls_cell-row_id\n              i_fieldname = ls_cell-fieldname\n              i_value     = 0 ).\n          ENDIF.\n\n        WHEN 'CARRID'.\n          DATA: lv_carrid TYPE sflight-carrid.\n          er_data_changed->get_cell_value(\n            EXPORTING i_row_id    = ls_cell-row_id\n                      i_fieldname = ls_cell-fieldname\n            IMPORTING e_value     = lv_carrid ).\n\n          TRANSLATE lv_carrid TO UPPER CASE.\n          er_data_changed->modify_cell(\n            i_row_id    = ls_cell-row_id\n            i_fieldname = ls_cell-fieldname\n            i_value     = lv_carrid ).\n\n          \" Example of a check against a check table:\n          \" SELECT SINGLE ... IF sy-subrc &lt;> 0 -> add_protocol_entry.\n\n        WHEN OTHERS.\n      ENDCASE.\n\n    ENDLOOP.\n\n    \" Show the collected messages in an application log popup\n    IF er_data_changed->mt_protocol IS NOT INITIAL.\n      er_data_changed->display_protocol( ).\n    ENDIF.\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: DATA_CHANGED_FINISHED\n*&amp;        Raised ONCE after all changes have been written into MT_DATA.\n*&amp;        Best place for: recalculation, re-building CELLTAB, refresh.\n*&amp;---------------------------------------------------------------------*\n  METHOD on_data_changed_finished.\n\n    IF e_modified &lt;> abap_true.\n      RETURN.\n    ENDIF.\n\n    mv_changed = abap_true.\n\n    \" Example: derive dependent fields for every changed row\n    LOOP AT et_good_cells INTO DATA(ls_cell).\n      READ TABLE mt_data ASSIGNING FIELD-SYMBOL(&lt;ls_data>)\n                         INDEX ls_cell-row_id.\n      IF sy-subrc = 0 AND &lt;ls_data>-currency IS INITIAL.\n        &lt;ls_data>-currency = 'IDR'.\n      ENDIF.\n    ENDLOOP.\n\n    set_celltab( ).\n    refresh_alv( iv_soft = abap_false ).\n\n  ENDMETHOD.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; EVENT: ONF4 - custom search help inside the ALV cell\n*&amp;---------------------------------------------------------------------*\n  METHOD on_f4.\n\n    TYPES: BEGIN OF ty_f4,\n             carrid   TYPE c LENGTH 3,\n             carrname TYPE c LENGTH 30,\n           END OF ty_f4.\n\n    DATA: lt_values TYPE STANDARD TABLE OF ty_f4 WITH EMPTY KEY,\n          lt_return TYPE STANDARD TABLE OF ddshretval WITH EMPTY KEY.\n\n    FIELD-SYMBOLS &lt;lt_modi> TYPE lvc_t_modi.\n\n    CASE e_fieldname.\n\n      WHEN 'CARRID'.\n\n        \" Fill the value list. In a real program: SELECT from your\n        \" check table \/ CDS view \/ call a search help exit.\n        lt_values = VALUE #(\n          ( carrid = 'GA' carrname = 'Garuda Indonesia' )\n          ( carrid = 'JT' carrname = 'Lion Air' )\n          ( carrid = 'QG' carrname = 'Citilink' )\n          ( carrid = 'ID' carrname = 'Batik Air' )\n          ( carrid = 'SQ' carrname = 'Singapore Airlines' ) ).\n\n        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'\n          EXPORTING\n            retfield        = 'CARRID'\n            value_org       = 'S'\n            window_title    = 'Airline Code'\n          TABLES\n            value_tab       = lt_values\n            return_tab      = lt_return\n          EXCEPTIONS\n            parameter_error = 1\n            no_values_found = 2\n            OTHERS          = 3.\n\n        IF sy-subrc = 0 AND lt_return IS NOT INITIAL.\n          \" Hand the chosen value back to the grid\n          ASSIGN er_event_data->m_data->* TO &lt;lt_modi>.\n          IF &lt;lt_modi> IS ASSIGNED.\n            APPEND VALUE lvc_s_modi(\n                     row_id    = es_row_no-row_id\n                     fieldname = e_fieldname\n                     value     = lt_return&#91; 1 ]-fieldval ) TO &lt;lt_modi>.\n          ENDIF.\n        ENDIF.\n\n        \" Tell the grid that we handled F4 ourselves\n        er_event_data->m_event_handled = abap_true.\n\n      WHEN OTHERS.\n    ENDCASE.\n\n  ENDMETHOD.\n\nENDCLASS.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; M A I N\n*&amp;---------------------------------------------------------------------*\nSTART-OF-SELECTION.\n\n  lcl_app=>get_instance( )->load_data( ).\n  CALL SCREEN 0100.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; D Y N P R O   M O D U L E S   -   S C R E E N   0 1 0 0\n*&amp;---------------------------------------------------------------------*\nMODULE status_0100 OUTPUT.\n  SET PF-STATUS 'ST_0100'.\n  SET TITLEBAR  'T_0100'.\nENDMODULE.\n\nMODULE display_alv_0100 OUTPUT.\n  lcl_app=>get_instance( )->pbo_0100( ).\nENDMODULE.\n\nMODULE user_command_0100 INPUT.\n  DATA(lv_ucomm) = ok_code.\n  CLEAR ok_code.\n  IF lcl_app=>get_instance( )->pai_0100( lv_ucomm ) = abap_true.\n    SET SCREEN 0.\n    LEAVE SCREEN.\n  ENDIF.\nENDMODULE.\n\nMODULE exit_0100 INPUT.\n  DATA(lv_exit) = ok_code.\n  CLEAR ok_code.\n  IF lcl_app=>get_instance( )->exit_0100( lv_exit ) = abap_true.\n    SET SCREEN 0.\n    LEAVE SCREEN.\n  ENDIF.\nENDMODULE.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; S U B R O U T I N E S   (optional - data access layer)\n*&amp;---------------------------------------------------------------------*\n*&amp;---------------------------------------------------------------------*\n*&amp; Form  F_GET_DATA\n*&amp;---------------------------------------------------------------------*\n*&amp; Replace the demo data with your own SELECT statement.\n*&amp;---------------------------------------------------------------------*\nFORM f_get_data USING    it_carrid TYPE ANY TABLE\n                CHANGING ct_data   TYPE tt_data.\n\n  CLEAR ct_data.\n\n  \" ------------------------------------------------------------------\n  \" Example of the real implementation:\n  \"\n  \" SELECT carrid, connid, fldate, price, currency\n  \"   FROM sflight\n  \"   WHERE carrid IN @it_carrid\n  \"   INTO CORRESPONDING FIELDS OF TABLE @ct_data.\n  \" ------------------------------------------------------------------\n\n  ct_data = VALUE tt_data(\n    ( carrid = 'GA' connid = '0100' fldate = sy-datum\n      price = '1250000.00' currency = 'IDR' remark = 'Demo row 1' )\n    ( carrid = 'JT' connid = '0200' fldate = sy-datum + 1\n      price = '890000.00'  currency = 'IDR' remark = 'Demo row 2' )\n    ( carrid = 'QG' connid = '0300' fldate = sy-datum + 2\n      price = '760000.00'  currency = 'IDR' remark = 'Locked row'\n      locked = abap_true )\n    ( carrid = 'SQ' connid = '0400' fldate = sy-datum + 3\n      price = '4200000.00' currency = 'IDR' remark = 'Demo row 4' ) ).\n\n  IF it_carrid IS NOT INITIAL.\n    DELETE ct_data WHERE carrid NOT IN s_carrid.\n  ENDIF.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form  F_SAVE_DATA\n*&amp;---------------------------------------------------------------------*\n*&amp; Put your update \/ BAPI \/ enqueue logic here.\n*&amp;---------------------------------------------------------------------*\nFORM f_save_data USING it_data TYPE tt_data.\n\n  \" ------------------------------------------------------------------\n  \" 1. ENQUEUE the object\n  \" 2. MODIFY ztable FROM TABLE lt_db.  (or call a BAPI)\n  \" 3. COMMIT WORK AND WAIT.\n  \" 4. DEQUEUE\n  \" ------------------------------------------------------------------\n\n  MESSAGE |{ lines( it_data ) } record(s) ready to be saved (dummy)|\n          TYPE 'S'.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; MANUAL OBJECTS TO CREATE (cannot be generated from source code)\n*&amp;---------------------------------------------------------------------*\n*&amp; 1. SCREEN 0100 (SE51)\n*&amp;    - Attributes : Screen type = Normal, Next screen = 0\n*&amp;    - Element list -> add a \"Custom Control\" named CC_0100_ALV\n*&amp;      (resizing: vertical + horizontal = X so the ALV grows)\n*&amp;    - OK code field (Element list -> tab \"OK\") = OK_CODE\n*&amp;    - Flow logic :\n*&amp;\n*&amp;      PROCESS BEFORE OUTPUT.\n*&amp;        MODULE status_0100.\n*&amp;        MODULE display_alv_0100.\n*&amp;\n*&amp;      PROCESS AFTER INPUT.\n*&amp;        MODULE exit_0100 AT EXIT-COMMAND.\n*&amp;        MODULE user_command_0100.\n*&amp;\n*&amp; 2. GUI STATUS 'ST_0100' (SE41)\n*&amp;    - Function keys : BACK (F3), EXIT (Shift+F3), CANC (F12)\n*&amp;    - Application toolbar (optional) : SAVE, REFRESH\n*&amp;    - Set BACK \/ EXIT \/ CANC as type \"E\" (Exit command)\n*&amp;\n*&amp; 3. GUI TITLE 'T_0100' (SE41) : e.g. \"ALV Template - Maintenance\"\n*&amp;\n*&amp; 4. TEXT SYMBOL : TEXT-B01 = \"Selection\"\n*&amp;---------------------------------------------------------------------*<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Bismillah. This template is need to complete with some action before run. *&amp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;**&amp;&nbsp;MANUAL&nbsp;OBJECTS&nbsp;TO&nbsp;CREATE&nbsp;(cannot&nbsp;be&nbsp;generated&nbsp;from&nbsp;source&nbsp;code)*&amp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;**&amp;&nbsp;1.&nbsp;SCREEN&nbsp;0100&nbsp;(SE51)*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Attributes&nbsp;:&nbsp;Screen&nbsp;type&nbsp;=&nbsp;Normal,&nbsp;Next&nbsp;screen&nbsp;=&nbsp;0*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Element&nbsp;list&nbsp;-&gt;&nbsp;add&nbsp;a&nbsp;&#8220;Custom&nbsp;Control&#8221;&nbsp;named&nbsp;CC_0100_ALV*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(resizing:&nbsp;vertical&nbsp;+&nbsp;horizontal&nbsp;=&nbsp;X&nbsp;so&nbsp;the&nbsp;ALV&nbsp;grows)*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;OK&nbsp;code&nbsp;field&nbsp;(Element&nbsp;list&nbsp;-&gt;&nbsp;tab&nbsp;&#8220;OK&#8221;)&nbsp;=&nbsp;OK_CODE*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Flow&nbsp;logic&nbsp;:*&amp;*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS&nbsp;BEFORE&nbsp;OUTPUT.*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;status_0100.*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;display_alv_0100.*&amp;*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS&nbsp;AFTER&nbsp;INPUT.*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;exit_0100&nbsp;AT&nbsp;EXIT-COMMAND.*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODULE&nbsp;user_command_0100.*&amp;*&amp;&nbsp;2.&nbsp;GUI&nbsp;STATUS&nbsp;&#8216;ST_0100&#8217;&nbsp;(SE41)*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Function&nbsp;keys&nbsp;:&nbsp;BACK&nbsp;(F3),&nbsp;EXIT&nbsp;(Shift+F3),&nbsp;CANC&nbsp;(F12)*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Application&nbsp;toolbar&nbsp;(optional)&nbsp;:&nbsp;SAVE,&nbsp;REFRESH*&amp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211;&nbsp;Set&nbsp;BACK&nbsp;\/&nbsp;EXIT&nbsp;\/&nbsp;CANC&nbsp;as&nbsp;type&nbsp;&#8220;E&#8221;&nbsp;(Exit&nbsp;command)*&amp;*&amp;&nbsp;3.&nbsp;GUI&nbsp;TITLE&nbsp;&#8216;T_0100&#8217;&nbsp;(SE41)&nbsp;:&nbsp;e.g.&nbsp;&#8220;ALV&nbsp;Template&nbsp;&#8211;&nbsp;Maintenance&#8221;*&amp;*&amp;&nbsp;4.&nbsp;TEXT&nbsp;SYMBOL&nbsp;:&nbsp;TEXT-B01&nbsp;=&nbsp;&#8220;Selection&#8221;*&amp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/283"}],"collection":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/comments?post=283"}],"version-history":[{"count":2,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/283\/revisions"}],"predecessor-version":[{"id":285,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/283\/revisions\/285"}],"wp:attachment":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/media?parent=283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/categories?post=283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/tags?post=283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}