Monday 18 March 2019

Editable ALV with F4 Help on cell

Report: Z_R_ALV
REPORT z_r_alv.
CLASS gcl_event_handler DEFINITION DEFERRED.

"Data Declaration
INCLUDE z_r_alv_top.

"Class Declaration
INCLUDE z_r_alv_cl.

"Screen Module Declaration
INCLUDE z_r_alv_mod.

"Subroutines Declaraion
INCLUDE z_r_alv_sub.

START-OF-SELECTION.
  CALL SCREEN 1100.


Include: Z_R_ALV_TOP
*&---------------------------------------------------------------------*
*&  Include           Z_R_ALV_TOP
*&---------------------------------------------------------------------*

  TYPES: BEGIN OF gty_extract,
           call_req_id    TYPE  zzcall_req_id,
           object         TYPE  zzobjname,
           serviceid      TYPE  zzcall_sys_id,
           servicekey     TYPE  zzcall_sys_key,
           batch_size     TYPE  zzbsize,
           compression    TYPE  zzkdpcompress,
           mdata          TYPE  zzkdpchar1,
           format         TYPE  zzkdpformat,
           projections    TYPE  string,
           selections     TYPE  string,
           numb_of_lines  TYPE  zzkdpnolines,
           from_date      TYPE  zztimestamp,
           to_date        TYPE  zztimestamp,
           extract_mode   TYPE  zzkdpchar1,
           execution_mode TYPE  zzkdpchar1,
           response_mode  TYPE  zzkdpchar1,
           celltab        TYPE lvc_t_styl,
         END OF gty_extract,
         gtt_extract TYPE STANDARD TABLE OF gty_extract,
         gtt_t_f4    TYPE STANDARD TABLE OF lvc_s_f4.

  DATA: gt_extract          TYPE STANDARD TABLE OF gty_extract,
        go_container        TYPE scrfname VALUE 'CONT1',
        go_grid1            TYPE REF TO cl_gui_alv_grid,
        go_custom_container TYPE REF TO cl_gui_docking_container,
        gs_layout           TYPE lvc_s_layo,
        gv_max              TYPE i VALUE 100.
Include: Z_R_ALV_CL
*&---------------------------------------------------------------------*
*&  Include           Z_R_ALV_CL
*&---------------------------------------------------------------------*
*************************************************************************************************
*LOCAL CLASS DEFINITION
*************************************************************************************************
*Class definition to handle the ONF4 event
CLASS gcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS: on_f4 FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING sender
                  e_fieldname
                  e_fieldvalue
                  es_row_no
                  er_event_data
                  et_bad_cells
                  e_display.
ENDCLASS.                    "lcl_event_handler DEFINITION
*************************************************************************************************
*LOCAL CLASS IMPLEMENTATION
*************************************************************************************************
*Class implementation to handle the ONF4 event
CLASS gcl_event_handler IMPLEMENTATION.
  METHOD on_f4.
    TYPES:  BEGIN OF lty_exe_mode,
              mode TYPE zzkdpchar1,
            END OF lty_exe_mode.
    DATA: lt_data   TYPE STANDARD TABLE OF lty_exe_mode,
          lt_ret    TYPE STANDARD TABLE OF ddshretval,
          ls_data   LIKE LINE OF lt_data,
          ls_sel    LIKE LINE OF lt_ret,
          ls_modi   TYPE lvc_s_modi,
          ls_stable TYPE lvc_s_stbl.

    FIELD-SYMBOLS: <lfs_extract> TYPE gty_extract.
    CASE e_fieldname.
      WHEN 'EXECUTION_MODE'.
        "Add the custom F4 values; here we are adding 2 values 'Uncertain' and 'Relevant' for the field STATE
        IF lt_data[] IS INITIAL.
          ls_data-mode = 'B'.
          APPEND ls_data TO lt_data.
          CLEAR ls_data.
          ls_data-mode = 'R'.
          APPEND ls_data TO lt_data.
        ENDIF.
        "Call the function module to display the custom F4 values
        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield        = 'MODE'
            window_title    = 'Execution Mode'
            value_org       = 'S'
          TABLES
            value_tab       = lt_data[]
            return_tab      = lt_ret[]
          EXCEPTIONS
            parameter_error = 1
            no_values_found = 2
            OTHERS          = 3.

        IF sy-subrc = 0.
          READ TABLE lt_ret INTO ls_sel INDEX 1.
          IF sy-subrc EQ 0.
            READ TABLE gt_extract INDEX es_row_no-row_id ASSIGNING <lfs_extract>.
            IF sy-subrc EQ 0.
              <lfs_extract>-execution_mode = ls_sel-fieldval.
              IF go_grid1 IS BOUND.
                ls_stable-row = abap_true.
                ls_stable-col = abap_true.
                CALL METHOD go_grid1->refresh_table_display
                  EXPORTING
                    is_stable = ls_stable
                  EXCEPTIONS
                    finished  = 1
                    OTHERS    = 2.
                IF sy-subrc <> 0.
*             Implement suitable error handling here
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.

      WHEN 'PROJECTIONS'.
        "Write the code for the other columns
      WHEN OTHERS.
    ENDCASE.
    er_event_data->m_event_handled = abap_true. "(to inform grid that f4 was handled manually)
  ENDMETHOD.
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION
Include: Z_R_ALV_MOD
*&---------------------------------------------------------------------*
*&  Include           Z_R_ALV_MOD
*&---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* MODULE PBO OUTPUT *
*---------------------------------------------------------------------*
MODULE status_1100 OUTPUT.
  SET PF-STATUS 'PF_STATUS'.
  "Preapre the ALV
  PERFORM prepare_alv.
ENDMODULE.                    "pbo OUTPUT
*---------------------------------------------------------------------*
* MODULE PAI INPUT *
*---------------------------------------------------------------------*
MODULE user_command_1100 INPUT.
*  save_ok = ok_code.
*  CLEAR ok_code.
  CASE sy-ucomm.
    WHEN '&EXE'.
      CALL METHOD go_grid1->check_changed_data.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.                    "pai INPUT
Include: Z_R_ALV_SUB
*&---------------------------------------------------------------------*
*&  Include           Z_R_ALV_SUB
*&---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* PREPARE_ALV *
*---------------------------------------------------------------------*
FORM prepare_alv.
  DATA: lt_fieldcatalog TYPE lvc_t_fcat,
        lt_f4           TYPE lvc_t_f4,
        lt_f4_tmp       TYPE gtt_t_f4,
        lo_event_obj    TYPE REF TO gcl_event_handler.

  IF go_custom_container IS INITIAL.
    CREATE OBJECT go_custom_container
      EXPORTING
        repid                       = sy-repid
        dynnr                       = '1100'
        ratio                       = '90'
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    CREATE OBJECT go_grid1
      EXPORTING
        i_parent = go_custom_container.

    "Build Field Catalog
    PERFORM populate_fcat USING '1' 'CALL_REQ_ID' 'Call Req ID' CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '2' 'OBJECT' 'Object'           CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '3' 'SERVICEID' 'Service ID'    CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '4' 'SERVICEKEY' 'Service Key'  CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '5' 'BATCH_SIZE' 'Batch Size'   CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '6' 'COMPRESSION' 'Compression' CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '7' 'MDATA' 'MDATA'             CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '8' 'FORMAT' 'Format'           CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '9' 'PROJECTIONS' 'Projection'  CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '10' 'SELECTIONS' 'Selection'   CHANGING lt_fieldcatalog.

    PERFORM populate_fcat USING '11' 'NUMB_OF_LINES' 'Number of lines'  CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '12' 'FROM_DATE' 'From Date'            CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '13' 'TO_DATE' 'To Date'                CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '14' 'EXTRACT_MODE' 'Extract Mode'      CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '15' 'EXECUTION_MODE' 'Execution Mode'  CHANGING lt_fieldcatalog.
    PERFORM populate_fcat USING '16' 'RESPONSE_MODE' 'Response Mode'    CHANGING lt_fieldcatalog.

    "Prepare F4 help
    PERFORM prepare_f4 USING 'PROJECTIONS' CHANGING lt_f4_tmp.
    PERFORM prepare_f4 USING 'EXECUTION_MODE' CHANGING lt_f4_tmp.

    "Register for F4
    lt_f4[] = lt_f4_tmp[].
    CREATE OBJECT lo_event_obj.
    SET HANDLER lo_event_obj->on_f4 FOR go_grid1.
    CALL METHOD go_grid1->register_f4_for_fields
      EXPORTING
        it_f4 = lt_f4.

    "enable for input
    PERFORM enable_input_cell CHANGING gt_extract.

    "add new entry
    PERFORM add_new_entry CHANGING gt_extract.
    PERFORM add_new_entry CHANGING gt_extract.

    CALL METHOD go_grid1->set_table_for_first_display
      EXPORTING
        i_structure_name = 'GTY_EXTRACT'
        is_layout        = gs_layout
      CHANGING
        it_fieldcatalog  = lt_fieldcatalog
        it_outtab        = gt_extract[].
  ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
* PREPARE_F4 *
*---------------------------------------------------------------------*
FORM prepare_f4 USING pv_fieldname TYPE lvc_fname
             CHANGING ct_f4        TYPE gtt_t_f4.
  DATA: ls_f4 LIKE LINE OF ct_f4.
  ls_f4-fieldname  = pv_fieldname.
  ls_f4-register   = abap_true.
  ls_f4-getbefore  = space.
  ls_f4-chngeafter = space.
  APPEND ls_f4 TO ct_f4.
ENDFORM.
*---------------------------------------------------------------------*
* ADD_NEW_ENTRY *
*---------------------------------------------------------------------*
FORM add_new_entry CHANGING ct_extract TYPE gtt_extract.
  FIELD-SYMBOLS: <lfs_extract> LIKE LINE OF ct_extract.
  APPEND INITIAL LINE TO gt_extract ASSIGNING <lfs_extract>.
  <lfs_extract>-serviceid = '1001'.
  <lfs_extract>-batch_size = '2000'.
  <lfs_extract>-compression = 'GZIP'.
  <lfs_extract>-format = 'JSON'.
  <lfs_extract>-extract_mode = 'F'.
  <lfs_extract>-execution_mode = 'B'.
  <lfs_extract>-response_mode = 'H'.
ENDFORM.
*---------------------------------------------------------------------*
* ENABLE_INPUT_CELL *
*---------------------------------------------------------------------*
FORM enable_input_cell CHANGING ct_extract TYPE gtt_extract.
  DATA: lt_celltab TYPE lvc_t_styl,
        l_mode     TYPE raw4,
        lv_index   TYPE i.
  FIELD-SYMBOLS: <lfs_extract> LIKE LINE OF ct_extract,
                 <lfs_celltab> LIKE LINE OF lt_celltab.

  l_mode = cl_gui_alv_grid=>mc_style_enabled.

  LOOP AT ct_extract ASSIGNING <lfs_extract>.
    lv_index = sy-tabix.
    CLEAR: lt_celltab[].

    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'CALL_REQ_ID'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'OBJECT'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'SERVICEID'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'SERVICEKEY'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'BATCH_SIZE'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'COMPRESSION'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'MDATA'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'FORMAT'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'PROJECTIONS'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'SELECTIONS'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'NUMB_OF_LINES'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'FROM_DATE'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'TO_DATE'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'EXTRACT_MODE'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'EXECUTION_MODE'.
    <lfs_celltab>-style = l_mode.
    APPEND INITIAL LINE TO lt_celltab ASSIGNING <lfs_celltab>.
    <lfs_celltab>-fieldname = 'RESPONSE_MODE'.
    <lfs_celltab>-style = l_mode.

    <lfs_extract>-celltab[] = lt_celltab[].
    CLEAR: lt_celltab[].
  ENDLOOP.

  "set edit enabled cells ready for input
  CALL METHOD go_grid1->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.
ENDFORM.
*---------------------------------------------------------------------*
* FORM EXIT_PROGRAM *
*---------------------------------------------------------------------*
FORM exit_program.
  LEAVE PROGRAM.
ENDFORM.                    "exit_program
*---------------------------------------------------------------------*
* FORM POPULATE_FCAT *
*---------------------------------------------------------------------*
FORM populate_fcat USING pv_col_pos   TYPE lvc_colpos
                         pv_fieldname TYPE lvc_fname
                         pv_scrtext_m TYPE scrtext_m
                CHANGING ct_fcat TYPE lvc_t_fcat.
  FIELD-SYMBOLS: <lfs_fieldcatalog> LIKE LINE OF ct_fcat.
  APPEND INITIAL LINE TO ct_fcat ASSIGNING <lfs_fieldcatalog>.
  <lfs_fieldcatalog>-col_pos   = pv_col_pos.
  <lfs_fieldcatalog>-edit      = abap_true.
  <lfs_fieldcatalog>-fieldname = pv_fieldname.
  <lfs_fieldcatalog>-scrtext_m = pv_scrtext_m.

  IF pv_fieldname = 'EXECUTION_MODE' OR  pv_fieldname = 'PROJECTIONS'.
    <lfs_fieldcatalog>-f4availabl  = abap_true.
  ENDIF.
ENDFORM.                    "populate_fcat


1 comment:

Report to find CDS view of Standard Table

A small change has been made to the original program ( SAP YARD Article ) so that it can also display the common CDS used by multiple table...