{"id":286,"date":"2026-08-02T12:11:05","date_gmt":"2026-08-02T12:11:05","guid":{"rendered":"https:\/\/sapabap.dwimansolution.com\/?p=286"},"modified":"2026-08-02T12:11:06","modified_gmt":"2026-08-02T12:11:06","slug":"sap-abap-alv-with-dock-header-and-footer","status":"publish","type":"post","link":"https:\/\/sapabap.dwimansolution.com\/index.php\/2026\/08\/02\/sap-abap-alv-with-dock-header-and-footer\/","title":{"rendered":"SAP ABAP &#8211; ALV with Dock Header and Footer"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>*&amp;---------------------------------------------------------------------*\n*&amp; Report  ZALV_DOCK_APPROVE\n*&amp;---------------------------------------------------------------------*\n*&amp; Docking container + 3-row splitter layout:\n*&amp;   Row 1 (fixed px) : Title \/ selection parameters \/ record count\n*&amp;   Row 2 (rest)     : ALV grid (display only, row-selectable)\n*&amp;   Row 3 (fixed px) : Signature block\n*&amp;\n*&amp; Buttons SUBMIT \/ APPROVE are added to the ALV toolbar (no SE41 work\n*&amp; required for them). Screen 100 still needs a small GUI status for\n*&amp; BACK \/ EXIT \/ CANCEL - see notes at the bottom of this file.\n*&amp;\n*&amp; Written in classic syntax (7.02-safe). No inline declarations.\n*&amp;---------------------------------------------------------------------*\nREPORT zalv_dock_approve.\n\nTYPE-POOLS: icon.\n\nTABLES: sflight.\n\n*----------------------------------------------------------------------*\n* Types\n*----------------------------------------------------------------------*\nTYPES: BEGIN OF ty_out,\n         icon     TYPE icon_d,\n         carrid   TYPE sflight-carrid,\n         connid   TYPE sflight-connid,\n         fldate   TYPE sflight-fldate,\n         price    TYPE sflight-price,\n         currency TYPE sflight-currency,\n         seatsocc TYPE sflight-seatsocc,\n         zstatus  TYPE char12,\n       END OF ty_out.\n\n*----------------------------------------------------------------------*\n* Globals\n*----------------------------------------------------------------------*\nDATA: gt_out TYPE STANDARD TABLE OF ty_out,\n      gs_out TYPE ty_out.\n\nDATA: go_dock      TYPE REF TO cl_gui_docking_container,\n      go_split     TYPE REF TO cl_gui_splitter_container,\n      go_cont_top  TYPE REF TO cl_gui_container,\n      go_cont_grid TYPE REF TO cl_gui_container,\n      go_cont_bot  TYPE REF TO cl_gui_container,\n      go_grid      TYPE REF TO cl_gui_alv_grid,\n      go_dd_top    TYPE REF TO cl_dd_document,\n      go_dd_bot    TYPE REF TO cl_dd_document.\n\nDATA: gv_ok_code    TYPE sy-ucomm,\n      gv_top_shown  TYPE abap_bool,\n      gv_bot_shown  TYPE abap_bool,\n      gv_cnt_total  TYPE i,\n      gv_cnt_subm   TYPE i,\n      gv_cnt_appr   TYPE i.\n\n* Header \/ footer heights in PIXELS (splitter runs in absolute mode)\nCONSTANTS: gc_top_height TYPE i VALUE 95,\n           gc_bot_height TYPE i VALUE 80.\n\n*----------------------------------------------------------------------*\n* Event handler for the ALV grid\n*----------------------------------------------------------------------*\nCLASS lcl_event_handler DEFINITION.\n  PUBLIC SECTION.\n    METHODS:\n      on_toolbar\n        FOR EVENT toolbar OF cl_gui_alv_grid\n        IMPORTING e_object e_interactive,\n      on_user_command\n        FOR EVENT user_command OF cl_gui_alv_grid\n        IMPORTING e_ucomm,\n      on_print_top_of_page\n        FOR EVENT print_top_of_page OF cl_gui_alv_grid,\n      on_print_end_of_list\n        FOR EVENT print_end_of_list OF cl_gui_alv_grid.\nENDCLASS.\n\nDATA: go_handler TYPE REF TO lcl_event_handler.\n\n*----------------------------------------------------------------------*\n* Selection screen\n*----------------------------------------------------------------------*\nSELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-b01.\nSELECT-OPTIONS: s_carrid FOR sflight-carrid,\n                s_fldate FOR sflight-fldate.\nPARAMETERS:     p_maxrow TYPE i DEFAULT 500.\nSELECTION-SCREEN END OF BLOCK b1.\n\n*----------------------------------------------------------------------*\nSTART-OF-SELECTION.\n*----------------------------------------------------------------------*\n  PERFORM get_data.\n\n  IF gt_out IS INITIAL.\n    MESSAGE 'No data found for the given selection' TYPE 'S'\n            DISPLAY LIKE 'W'.\n    RETURN.\n  ENDIF.\n\n  CALL SCREEN 0100.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form GET_DATA\n*&amp;---------------------------------------------------------------------*\nFORM get_data.\n\n  DATA: lt_flight TYPE STANDARD TABLE OF sflight,\n        ls_flight TYPE sflight.\n\n  CLEAR: gt_out.\n\n  SELECT carrid connid fldate price currency seatsocc\n    FROM sflight\n    INTO CORRESPONDING FIELDS OF TABLE lt_flight\n    UP TO p_maxrow ROWS\n   WHERE carrid IN s_carrid\n     AND fldate IN s_fldate.\n\n  LOOP AT lt_flight INTO ls_flight.\n    CLEAR gs_out.\n    MOVE-CORRESPONDING ls_flight TO gs_out.\n\n*   Replace this with the real status read from your Z-table.\n    gs_out-zstatus = 'NEW'.\n    PERFORM set_status_icon CHANGING gs_out.\n\n    APPEND gs_out TO gt_out.\n  ENDLOOP.\n\n  PERFORM count_records.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form SET_STATUS_ICON\n*&amp;---------------------------------------------------------------------*\nFORM set_status_icon CHANGING cs_out TYPE ty_out.\n\n  CASE cs_out-zstatus.\n    WHEN 'APPROVED'.\n      cs_out-icon = icon_green_light.\n    WHEN 'SUBMITTED'.\n      cs_out-icon = icon_yellow_light.\n    WHEN OTHERS.\n      cs_out-icon = icon_light_out.\n  ENDCASE.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form COUNT_RECORDS\n*&amp;---------------------------------------------------------------------*\nFORM count_records.\n\n  DATA: ls_out TYPE ty_out.\n\n  CLEAR: gv_cnt_total, gv_cnt_subm, gv_cnt_appr.\n\n  DESCRIBE TABLE gt_out LINES gv_cnt_total.\n\n  LOOP AT gt_out INTO ls_out.\n    CASE ls_out-zstatus.\n      WHEN 'SUBMITTED'. gv_cnt_subm = gv_cnt_subm + 1.\n      WHEN 'APPROVED'.  gv_cnt_appr = gv_cnt_appr + 1.\n    ENDCASE.\n  ENDLOOP.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Module STATUS_0100 OUTPUT\n*&amp;---------------------------------------------------------------------*\nMODULE status_0100 OUTPUT.\n\n  SET PF-STATUS 'ST100'.\n  SET TITLEBAR  'TB100'.\n\n  IF go_dock IS INITIAL.\n    PERFORM build_containers.\n    PERFORM build_header.\n    PERFORM build_footer.\n    PERFORM build_alv.\n  ENDIF.\n\nENDMODULE.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form BUILD_CONTAINERS\n*&amp;---------------------------------------------------------------------*\nFORM build_containers.\n\n* One docking container attached to the left edge with an extension\n* larger than any screen width -> it fills the whole dynpro area.\n  CREATE OBJECT go_dock\n    EXPORTING\n      repid                       = sy-repid\n      dynnr                       = sy-dynnr\n      side                        = cl_gui_docking_container=>dock_at_left\n      extension                   = 2000\n      no_autodef_progid_dynnr     = abap_true\n    EXCEPTIONS\n      cntl_error                  = 1\n      cntl_system_error           = 2\n      create_error                = 3\n      lifetime_error              = 4\n      lifetime_dynpro_dynpro_link = 5\n      OTHERS                      = 6.\n  IF sy-subrc &lt;> 0.\n    MESSAGE 'Could not create docking container' TYPE 'E'.\n  ENDIF.\n\n* 3 rows x 1 column\n  CREATE OBJECT go_split\n    EXPORTING\n      parent  = go_dock\n      rows    = 3\n      columns = 1.\n\n* Absolute mode -> row heights are given in PIXELS, not percent.\n* Row 2 (the grid) automatically takes whatever is left over.\n  CALL METHOD go_split->set_row_mode\n    EXPORTING\n      mode = cl_gui_splitter_container=>mode_absolute.\n\n  CALL METHOD go_split->set_row_height\n    EXPORTING\n      id     = 1\n      height = gc_top_height.\n\n  CALL METHOD go_split->set_row_height\n    EXPORTING\n      id     = 3\n      height = gc_bot_height.\n\n* Lock both sashes so the user cannot drag the header\/footer away\n  PERFORM lock_sash USING 1.\n  PERFORM lock_sash USING 2.\n\n  go_cont_top  = go_split->get_container( row = 1 column = 1 ).\n  go_cont_grid = go_split->get_container( row = 2 column = 1 ).\n  go_cont_bot  = go_split->get_container( row = 3 column = 1 ).\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form LOCK_SASH\n*&amp;---------------------------------------------------------------------*\nFORM lock_sash USING iv_id TYPE i.\n\n  CALL METHOD go_split->set_row_sash\n    EXPORTING\n      id    = iv_id\n      type  = cl_gui_splitter_container=>type_movable\n      value = cl_gui_splitter_container=>false.\n\n  CALL METHOD go_split->set_row_sash\n    EXPORTING\n      id    = iv_id\n      type  = cl_gui_splitter_container=>type_sashvisible\n      value = cl_gui_splitter_container=>false.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form BUILD_HEADER\n*&amp;---------------------------------------------------------------------*\nFORM build_header.\n\n  DATA: lv_text TYPE sdydo_text_element,\n        lv_sel  TYPE string,\n        lv_num  TYPE char10.\n\n  IF go_dd_top IS INITIAL.\n    CREATE OBJECT go_dd_top\n      EXPORTING\n        style = 'ALV_GRID'.\n  ENDIF.\n\n  CALL METHOD go_dd_top->initialize_document.\n\n* ---- Line 1 : title\n  lv_text = 'Flight Approval Report'.\n  CALL METHOD go_dd_top->add_text\n    EXPORTING\n      text         = lv_text\n      sap_style    = cl_dd_document=>heading\n      sap_emphasis = cl_dd_document=>strong.\n\n  CALL METHOD go_dd_top->new_line.\n\n* ---- Line 2 : selection parameters\n  PERFORM build_sel_text CHANGING lv_sel.\n  lv_text = lv_sel.\n  CALL METHOD go_dd_top->add_text\n    EXPORTING\n      text      = lv_text\n      sap_style = cl_dd_document=>small.\n\n  CALL METHOD go_dd_top->new_line.\n\n* ---- Line 3 : counters\n  CLEAR lv_text.\n  WRITE gv_cnt_total TO lv_num LEFT-JUSTIFIED.\n  CONCATENATE 'Records:' lv_num INTO lv_text SEPARATED BY space.\n  CALL METHOD go_dd_top->add_text\n    EXPORTING\n      text         = lv_text\n      sap_emphasis = cl_dd_document=>strong.\n\n  CALL METHOD go_dd_top->add_gap EXPORTING width = 20.\n\n  CLEAR lv_text.\n  WRITE gv_cnt_subm TO lv_num LEFT-JUSTIFIED.\n  CONCATENATE 'Submitted:' lv_num INTO lv_text SEPARATED BY space.\n  CALL METHOD go_dd_top->add_text\n    EXPORTING\n      text = lv_text.\n\n  CALL METHOD go_dd_top->add_gap EXPORTING width = 20.\n\n  CLEAR lv_text.\n  WRITE gv_cnt_appr TO lv_num LEFT-JUSTIFIED.\n  CONCATENATE 'Approved:' lv_num INTO lv_text SEPARATED BY space.\n  CALL METHOD go_dd_top->add_text\n    EXPORTING\n      text = lv_text.\n\n  CALL METHOD go_dd_top->merge_document.\n\n  IF gv_top_shown = abap_false.\n    CALL METHOD go_dd_top->display_document\n      EXPORTING\n        parent = go_cont_top\n      EXCEPTIONS\n        OTHERS = 1.\n    gv_top_shown = abap_true.\n  ELSE.\n*   reuse_control = 'X' repaints the existing HTML control in place\n    CALL METHOD go_dd_top->display_document\n      EXPORTING\n        reuse_control = abap_true\n        parent        = go_cont_top\n      EXCEPTIONS\n        OTHERS        = 1.\n  ENDIF.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form BUILD_SEL_TEXT\n*&amp;---------------------------------------------------------------------*\nFORM build_sel_text CHANGING cv_text TYPE string.\n\n  DATA: lv_carr TYPE string,\n        lv_date TYPE string,\n        lv_lo   TYPE char20,\n        lv_hi   TYPE char20.\n\n  IF s_carrid&#91;] IS INITIAL.\n    lv_carr = 'All'.\n  ELSE.\n    READ TABLE s_carrid INDEX 1.\n    lv_lo = s_carrid-low.\n    lv_hi = s_carrid-high.\n    IF s_carrid-high IS INITIAL.\n      lv_carr = lv_lo.\n    ELSE.\n      CONCATENATE lv_lo '-' lv_hi INTO lv_carr SEPARATED BY space.\n    ENDIF.\n  ENDIF.\n\n  IF s_fldate&#91;] IS INITIAL.\n    lv_date = 'All'.\n  ELSE.\n    READ TABLE s_fldate INDEX 1.\n    WRITE s_fldate-low TO lv_lo.\n    IF s_fldate-high IS INITIAL.\n      lv_date = lv_lo.\n    ELSE.\n      WRITE s_fldate-high TO lv_hi.\n      CONCATENATE lv_lo '-' lv_hi INTO lv_date SEPARATED BY space.\n    ENDIF.\n  ENDIF.\n\n  CONCATENATE 'Carrier:' lv_carr '|' 'Flight date:' lv_date\n         INTO cv_text SEPARATED BY space.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form BUILD_FOOTER\n*&amp;---------------------------------------------------------------------*\nFORM build_footer.\n\n  DATA: lo_table TYPE REF TO cl_dd_table_element,\n        lo_col1  TYPE REF TO cl_dd_area,\n        lo_col2  TYPE REF TO cl_dd_area,\n        lo_col3  TYPE REF TO cl_dd_area,\n        lv_text  TYPE sdydo_text_element,\n        lv_line  TYPE sdydo_text_element.\n\n  lv_line = '______________________'.\n\n  IF go_dd_bot IS INITIAL.\n    CREATE OBJECT go_dd_bot\n      EXPORTING\n        style = 'ALV_GRID'.\n  ENDIF.\n\n  CALL METHOD go_dd_bot->initialize_document.\n\n  CALL METHOD go_dd_bot->add_table\n    EXPORTING\n      no_of_columns               = 3\n      border                      = '0'\n      width                       = '100%'\n      cell_background_transparent = abap_true\n    IMPORTING\n      table                       = lo_table.\n\n  CALL METHOD lo_table->add_column\n    EXPORTING width = '33%' IMPORTING column = lo_col1.\n  CALL METHOD lo_table->add_column\n    EXPORTING width = '33%' IMPORTING column = lo_col2.\n  CALL METHOD lo_table->add_column\n    EXPORTING width = '34%' IMPORTING column = lo_col3.\n\n* ---- Row 1 : signature lines\n  CALL METHOD lo_col1->add_text EXPORTING text = lv_line.\n  CALL METHOD lo_col2->add_text EXPORTING text = lv_line.\n  CALL METHOD lo_col3->add_text EXPORTING text = lv_line.\n\n  CALL METHOD lo_table->new_row.\n\n* ---- Row 2 : roles\n  lv_text = 'Prepared by'.\n  CALL METHOD lo_col1->add_text\n    EXPORTING text = lv_text sap_style = cl_dd_document=>small.\n\n  lv_text = 'Checked by'.\n  CALL METHOD lo_col2->add_text\n    EXPORTING text = lv_text sap_style = cl_dd_document=>small.\n\n  lv_text = 'Approved by'.\n  CALL METHOD lo_col3->add_text\n    EXPORTING text = lv_text sap_style = cl_dd_document=>small.\n\n  CALL METHOD go_dd_bot->merge_document.\n\n  IF gv_bot_shown = abap_false.\n    CALL METHOD go_dd_bot->display_document\n      EXPORTING parent = go_cont_bot\n      EXCEPTIONS OTHERS = 1.\n    gv_bot_shown = abap_true.\n  ELSE.\n    CALL METHOD go_dd_bot->display_document\n      EXPORTING reuse_control = abap_true\n                parent        = go_cont_bot\n      EXCEPTIONS OTHERS = 1.\n  ENDIF.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form BUILD_ALV\n*&amp;---------------------------------------------------------------------*\nFORM build_alv.\n\n  DATA: lt_fcat TYPE lvc_t_fcat,\n        ls_fcat TYPE lvc_s_fcat,\n        ls_layo TYPE lvc_s_layo,\n        ls_vari TYPE disvariant.\n\n  CREATE OBJECT go_grid\n    EXPORTING\n      i_parent = go_cont_grid.\n\n* ---- register events BEFORE first display\n  CREATE OBJECT go_handler.\n  SET HANDLER go_handler->on_toolbar           FOR go_grid.\n  SET HANDLER go_handler->on_user_command      FOR go_grid.\n  SET HANDLER go_handler->on_print_top_of_page FOR go_grid.\n  SET HANDLER go_handler->on_print_end_of_list FOR go_grid.\n\n  PERFORM build_fieldcat CHANGING lt_fcat.\n\n* ---- layout\n* sel_mode = 'A' : multiple row selection, NO editable cells needed\n  ls_layo-sel_mode   = 'A'.\n  ls_layo-zebra      = abap_true.\n  ls_layo-cwidth_opt = abap_true.\n  ls_layo-no_rowmark = abap_false.\n\n  ls_vari-report = sy-repid.\n  ls_vari-handle = 'MAIN'.\n\n  CALL METHOD go_grid->set_table_for_first_display\n    EXPORTING\n      is_variant      = ls_vari\n      i_save          = 'A'\n      is_layout       = ls_layo\n    CHANGING\n      it_fieldcatalog = lt_fcat\n      it_outtab       = gt_out.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form BUILD_FIELDCAT\n*&amp;---------------------------------------------------------------------*\nFORM build_fieldcat CHANGING ct_fcat TYPE lvc_t_fcat.\n\n  DATA: ls_fcat TYPE lvc_s_fcat,\n        lv_pos  TYPE i.\n\n  DEFINE add_field.\n    lv_pos = lv_pos + 1.\n    CLEAR ls_fcat.\n    ls_fcat-col_pos   = lv_pos.\n    ls_fcat-fieldname = &amp;1.\n    ls_fcat-scrtext_l = &amp;2.\n    ls_fcat-scrtext_m = &amp;2.\n    ls_fcat-scrtext_s = &amp;2.\n    ls_fcat-coltext   = &amp;2.\n    ls_fcat-outputlen = &amp;3.\n    APPEND ls_fcat TO ct_fcat.\n  END-OF-DEFINITION.\n\n  add_field 'ICON'     ''             4.\n  add_field 'CARRID'   'Carrier'      8.\n  add_field 'CONNID'   'Connection'  10.\n  add_field 'FLDATE'   'Flight Date' 12.\n  add_field 'PRICE'    'Price'       15.\n  add_field 'CURRENCY' 'Curr.'        5.\n  add_field 'SEATSOCC' 'Occupied'    10.\n  add_field 'ZSTATUS'  'Status'      12.\n\n* icon column needs the ICON flag\n  READ TABLE ct_fcat INTO ls_fcat WITH KEY fieldname = 'ICON'.\n  IF sy-subrc = 0.\n    ls_fcat-icon     = abap_true.\n    ls_fcat-just     = 'C'.\n    MODIFY ct_fcat FROM ls_fcat INDEX sy-tabix.\n  ENDIF.\n\n* currency reference for PRICE\n  READ TABLE ct_fcat INTO ls_fcat WITH KEY fieldname = 'PRICE'.\n  IF sy-subrc = 0.\n    ls_fcat-cfieldname = 'CURRENCY'.\n    MODIFY ct_fcat FROM ls_fcat INDEX sy-tabix.\n  ENDIF.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form PROCESS_ACTION\n*&amp;---------------------------------------------------------------------*\nFORM process_action USING iv_new_status TYPE char12.\n\n  DATA: lt_rows   TYPE lvc_t_row,\n        ls_row    TYPE lvc_s_row,\n        ls_stable TYPE lvc_s_stbl,\n        lv_ok     TYPE i,\n        lv_skip   TYPE i,\n        lv_msg    TYPE string,\n        lv_num1   TYPE char10,\n        lv_num2   TYPE char10.\n\n  FIELD-SYMBOLS: &lt;ls_out> TYPE ty_out.\n\n  CALL METHOD go_grid->get_selected_rows\n    IMPORTING\n      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  LOOP AT lt_rows INTO ls_row.\n\n    READ TABLE gt_out ASSIGNING &lt;ls_out> INDEX ls_row-index.\n    IF sy-subrc &lt;> 0.\n      CONTINUE.\n    ENDIF.\n\n*   ---- status transition rules\n    IF iv_new_status = 'SUBMITTED' AND &lt;ls_out>-zstatus &lt;> 'NEW'.\n      lv_skip = lv_skip + 1.\n      CONTINUE.\n    ENDIF.\n    IF iv_new_status = 'APPROVED' AND &lt;ls_out>-zstatus &lt;> 'SUBMITTED'.\n      lv_skip = lv_skip + 1.\n      CONTINUE.\n    ENDIF.\n\n*   ------------------------------------------------------------------\n*   TODO: replace this block with the real persistence layer\n*\n*   CALL FUNCTION 'ENQUEUE_EZ&lt;your_lock_object>'\n*     EXPORTING carrid = &lt;ls_out>-carrid\n*               connid = &lt;ls_out>-connid\n*               fldate = &lt;ls_out>-fldate\n*     EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3.\n*   IF sy-subrc &lt;> 0.  lv_skip = lv_skip + 1.  CONTINUE.  ENDIF.\n*\n*   Re-read the CURRENT status from the database here. The grid holds\n*   a snapshot taken at selection time and may be stale.\n*\n*   UPDATE z_approval SET zstatus  = iv_new_status\n*                         approver = sy-uname\n*                         appdate  = sy-datum\n*                   WHERE ...\n*\n*   CALL FUNCTION 'DEQUEUE_EZ&lt;your_lock_object>' ...\n*   ------------------------------------------------------------------\n\n    &lt;ls_out>-zstatus = iv_new_status.\n    PERFORM set_status_icon CHANGING &lt;ls_out>.\n    lv_ok = lv_ok + 1.\n\n  ENDLOOP.\n\n  IF lv_ok > 0.\n    COMMIT WORK AND WAIT.\n  ENDIF.\n\n  PERFORM count_records.\n  PERFORM build_header.          \" refresh the counters in the header\n\n  ls_stable-row = abap_true.\n  ls_stable-col = abap_true.\n  CALL METHOD go_grid->refresh_table_display\n    EXPORTING\n      is_stable = ls_stable.\n\n  WRITE lv_ok   TO lv_num1 LEFT-JUSTIFIED.\n  WRITE lv_skip TO lv_num2 LEFT-JUSTIFIED.\n  CONCATENATE lv_num1 'row(s) processed,' lv_num2 'skipped'\n         INTO lv_msg SEPARATED BY space.\n  MESSAGE lv_msg TYPE 'S'.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Module USER_COMMAND_0100 INPUT\n*&amp;---------------------------------------------------------------------*\nMODULE user_command_0100 INPUT.\n\n  DATA: lv_ucomm TYPE sy-ucomm.\n\n  lv_ucomm = gv_ok_code.\n  CLEAR gv_ok_code.\n\n  CASE lv_ucomm.\n    WHEN 'BACK' OR 'EXIT' OR 'CANC'.\n      PERFORM free_controls.\n      LEAVE TO SCREEN 0.\n    WHEN OTHERS.\n  ENDCASE.\n\nENDMODULE.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form FREE_CONTROLS\n*&amp;---------------------------------------------------------------------*\nFORM free_controls.\n\n  IF go_grid IS NOT INITIAL.\n    CALL METHOD go_grid->free.\n    CLEAR go_grid.\n  ENDIF.\n\n  IF go_split IS NOT INITIAL.\n    CALL METHOD go_split->free.\n    CLEAR go_split.\n  ENDIF.\n\n  IF go_dock IS NOT INITIAL.\n    CALL METHOD go_dock->free.\n    CLEAR go_dock.\n  ENDIF.\n\n  CLEAR: go_cont_top, go_cont_grid, go_cont_bot,\n         go_dd_top, go_dd_bot,\n         gv_top_shown, gv_bot_shown.\n\n  CALL METHOD cl_gui_cfw=>flush.\n\nENDFORM.\n\n*&amp;---------------------------------------------------------------------*\n*&amp; CLASS lcl_event_handler IMPLEMENTATION\n*&amp;---------------------------------------------------------------------*\nCLASS lcl_event_handler IMPLEMENTATION.\n\n  METHOD on_toolbar.\n\n    DATA: ls_btn TYPE stb_button.\n\n*   separator\n    CLEAR ls_btn.\n    ls_btn-butn_type = 3.\n    APPEND ls_btn TO e_object->mt_toolbar.\n\n*   SUBMIT\n    CLEAR ls_btn.\n    ls_btn-function  = 'SUBMIT'.\n    ls_btn-icon      = icon_system_save.\n    ls_btn-text      = 'Submit'.\n    ls_btn-quickinfo = 'Submit the selected rows'.\n    ls_btn-butn_type = 0.\n    APPEND ls_btn TO e_object->mt_toolbar.\n\n*   APPROVE\n    CLEAR ls_btn.\n    ls_btn-function  = 'APPROVE'.\n    ls_btn-icon      = icon_okay.\n    ls_btn-text      = 'Approve'.\n    ls_btn-quickinfo = 'Approve the selected rows'.\n    ls_btn-butn_type = 0.\n    APPEND ls_btn TO e_object->mt_toolbar.\n\n  ENDMETHOD.\n\n  METHOD on_user_command.\n\n    CASE e_ucomm.\n      WHEN 'SUBMIT'.\n        PERFORM process_action USING 'SUBMITTED'.\n      WHEN 'APPROVE'.\n        PERFORM process_action USING 'APPROVED'.\n    ENDCASE.\n\n  ENDMETHOD.\n\n* --------------------------------------------------------------------\n* PRINT events: the splitter header\/footer above are SCREEN ONLY.\n* These two handlers put the same information on the printout.\n* --------------------------------------------------------------------\n  METHOD on_print_top_of_page.\n\n    DATA: lv_sel TYPE string.\n\n    PERFORM build_sel_text CHANGING lv_sel.\n\n    WRITE: \/ 'Flight Approval Report'.\n    WRITE: \/ lv_sel.\n    WRITE: \/ 'Records:', gv_cnt_total,\n             'Submitted:', gv_cnt_subm,\n             'Approved:', gv_cnt_appr.\n    ULINE.\n\n  ENDMETHOD.\n\n  METHOD on_print_end_of_list.\n\n    SKIP 3.\n    WRITE: \/5  '______________________',\n            45 '______________________',\n            85 '______________________'.\n    WRITE: \/5  'Prepared by',\n            45 'Checked by',\n            85 'Approved by'.\n    WRITE: \/5  sy-uname,\n            85 'Date: ______________'.\n\n  ENDMETHOD.\n\nENDCLASS.\n\n*&amp;---------------------------------------------------------------------*\n* WHAT YOU STILL HAVE TO CREATE MANUALLY\n*&amp;---------------------------------------------------------------------*\n* 1) Screen 0100 (SE51 \/ SE80, type \"Normal\", leave the layout EMPTY -\n*    the docking container covers the whole dynpro):\n*\n*      PROCESS BEFORE OUTPUT.\n*        MODULE status_0100.\n*\n*      PROCESS AFTER INPUT.\n*        MODULE user_command_0100.\n*\n*    In the screen element list add one field:\n*      Name = GV_OK_CODE, Type = OK, Length = 20\n*\n* 2) GUI status 'ST100' (SE41) with function codes BACK, EXIT, CANC\n*    on F3 \/ Shift-F3 \/ F12. Nothing else is needed - SUBMIT and\n*    APPROVE live in the ALV toolbar.\n*\n* 3) Title 'TB100'.\n*\n* 4) Text symbol text-b01 = 'Selection'.\n*&amp;---------------------------------------------------------------------*\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","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\/286"}],"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=286"}],"version-history":[{"count":1,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/286\/revisions"}],"predecessor-version":[{"id":287,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/286\/revisions\/287"}],"wp:attachment":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/media?parent=286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/categories?post=286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/tags?post=286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}