ABAP - cl_gui_alv_grid & cl_salv_table的各种处理

这篇文章主要是记录一下cl_gui_alv_grid 和 cl_salv_table 两种方式的ALV的字段,事件等的处理

举例,下面这个是用一个screen,显示2个ALV;上面这一个是用alv grid的;下面那一个是用salv去实现的

alv grid 主要涉及:自定义事件(toolbar),下拉列表的值,ALV显示和编辑模式的切换; 字段的显示隐藏等

salv主要涉及:自定义事件(add function); checkbox的处理; 还有当点"Previous Result“这个按钮时,跳出的第3个alv,也是salv的形式,会涉及到怎么用icon表示处理的

第一个screen里的两个ALV

screen的定义:

第三个ALV:

废话不多说,下面直接代码展示:

三个ALV的事件的声明和定义:

解释下这里面的一些参数:

以input结尾的是第一个alv,以contract结尾的是第2个alv,以result结尾的是第3个alv

事件的处理:

事件处理的相关代码:



FORM on_double_click_contract USING row TYPE salv_de_row
                                 column TYPE salv_de_column.

  DATA lv_row TYPE i.

  lv_row = row.
  READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<data>) INDEX lv_row.
  IF <data> IS ASSIGNED.
    SET PARAMETER ID 'RECNNR' FIELD <data>-recnnr.
    SET PARAMETER ID 'BUK'    FIELD gc_bukrs_1000.
    CALL TRANSACTION 'RECN' AND SKIP FIRST SCREEN.
  ENDIF.

ENDFORM.

FORM on_double_click_result USING row TYPE salv_de_row
                                 column TYPE salv_de_column.

  DATA lv_row TYPE i.

  lv_row = row.
  READ TABLE gt_result ASSIGNING FIELD-SYMBOL(<result>) INDEX lv_row.
  IF <result> IS ASSIGNED.
    SET PARAMETER ID 'RECNNR' FIELD <result>-recnnr.
    SET PARAMETER ID 'BUK'    FIELD gc_bukrs_1000.
    CALL TRANSACTION 'RECN' AND SKIP FIRST SCREEN.
  ENDIF.

ENDFORM.

FORM on_link_click_contract USING row TYPE salv_de_row
                               column TYPE salv_de_column.

  DATA lv_row TYPE i.

  lv_row = row.
  READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<data>) INDEX lv_row.
  CHECK sy-subrc = 0.

  IF <data>-selected IS INITIAL.
    <data>-selected = 'X'.
  ELSE.
    CLEAR <data>-selected.
  ENDIF.

  go_salv_contract->refresh( ).

ENDFORM.

FORM on_user_command_contract USING e_salv_function TYPE salv_de_function.

  DATA: lr_selections TYPE REF TO cl_salv_selections,
        lt_rows       TYPE salv_t_row.

  CASE e_salv_function.
    WHEN 'SEL_ALL'.
      LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<data>).
        APPEND sy-tabix TO lt_rows.
        <data>-selected = abap_true.
      ENDLOOP.

      lr_selections = go_salv_contract->get_selections( ).
      lr_selections->set_selected_rows( lt_rows ).
      go_salv_contract->refresh( ).

    WHEN 'DESEL_ALL'.
      LOOP AT gt_data ASSIGNING <data>.
        <data>-selected = ''.
      ENDLOOP.

      CLEAR lt_rows.
      lr_selections = go_salv_contract->get_selections( ).
      lr_selections->set_selected_rows( lt_rows ).
      go_salv_contract->refresh( ).

    WHEN 'CONFIRM'.
      PERFORM on_confirm.
      IF gv_error <> abap_true.
        PERFORM build_alv_200.
      ENDIF.

    WHEN 'SHOW_RES'.
      IF gt_result IS NOT INITIAL.
        PERFORM build_alv_200.
      ELSE.
        CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
          EXPORTING
            titel        = 'Info!'
            textline1    = 'No previous result list existed'
            start_column = 40
            start_row    = 15.
      ENDIF.

    WHEN OTHERS.
  ENDCASE.

ENDFORM.

FORM on_confirm.

  DATA: lt_selected  TYPE tty_data,
        ls_result    TYPE ty_alv_result,
        lv_conv_date TYPE string,
        lv_year      TYPE string,
        lv_validto   TYPE string,
        ls_add_cond  TYPE ty_add_cond,
        lt_add_cond  TYPE TABLE OF ty_add_cond,
        lt_tmp_cond  TYPE TABLE OF ty_add_cond,
        ls_bapi_cond TYPE bapi_re_condition_datc,
        lt_return     TYPE STANDARD TABLE OF bapiret2,
        lv_errmsg    TYPE string.

  CLEAR gv_error.
  CLEAR: gt_result, gt_add_condition.

  "get selected rows
  lt_selected = gt_data.
  DELETE lt_selected WHERE selected <> abap_true.

  IF lt_selected IS INITIAL.
    gv_error = abap_true.
    CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
      EXPORTING
        titel        = 'Error Occurred!!!'
        textline1    = 'No entry selected!'
        start_column = 20
        start_row    = 5.
    EXIT.
  ENDIF.

**********************************************************************

  LOOP AT gt_alv_input ASSIGNING FIELD-SYMBOL(<input>).

    LOOP AT lt_selected ASSIGNING FIELD-SYMBOL(<sel>)
      WHERE sgenr = <input>-sgenr
        AND condvalidfrom LE <input>-condvalidfrom
        AND condvalidto GE <input>-condvalidfrom.

      CLEAR: ls_result, ls_add_cond.
      MOVE-CORRESPONDING <sel>   TO ls_result.
      MOVE-CORRESPONDING <input> TO ls_result.

      IF <sel>-calcrule <> <input>-calcrule.
        "Calculation Rule Text
        READ TABLE gt_calcrule_txt ASSIGNING FIELD-SYMBOL(<txt>)
          WITH KEY calcruleext = <input>-calcrule BINARY SEARCH.
        IF sy-subrc = 0.
          CONCATENATE <input>-calcrule '-' <txt>-xmcalcrule INTO ls_result-calcrule_txt.
        ENDIF.
      ENDIF.

      "set Valid To
      CLEAR: lv_conv_date, lv_year, lv_validto.
      lv_conv_date = <input>-condvalidfrom.
      lv_year      = lv_conv_date+0(4) + 1.
      CONDENSE lv_year.
      CONCATENATE lv_year '0331' INTO lv_validto.
      ls_result-condvalidto = lv_validto.
      IF ls_result-condvalidto > <sel>-condvalidto.
        ls_result-condvalidto = <sel>-condvalidto.
      ENDIF.

**********************************************************************

      ls_add_cond-recnnr                   = ls_result-recnnr.
      ls_add_cond-distribution_object_type = 'IM'.
      ls_add_cond-calculation_object_type  = 'IM'.
      ls_add_cond-valid_from               = ls_result-condvalidfrom.
      ls_add_cond-valid_to                 = ls_result-condvalidto.
      ls_add_cond-calculation_object_id    = ls_result-rental_object.
      ls_add_cond-distribution_object_id   = ls_result-rental_object.
      ls_add_cond-currency                 = ls_result-condcurr.
      ls_add_cond-condition_type           = ls_result-condtype.
      ls_add_cond-unit_price               = ls_result-unitprice.
      ls_add_cond-calc_rule                = ls_result-calcrule.
      ls_add_cond-external_purpose         = <sel>-condpurposeext.

      IF ls_add_cond-calc_rule = 'D'.
        ls_add_cond-calc_rule_parameter1     = <sel>-calcrulepara1. "measure type
        ls_add_cond-calc_rule_parameter2     = <sel>-calcrulepara2. "measure unit
      ENDIF.
      ls_add_cond-dist_rule                = <sel>-distrule.
      ls_add_cond-dist_rule_parameter1     = <sel>-distrulepara1.
      ls_add_cond-dist_rule_parameter2     = <sel>-distrulepara2.

      APPEND ls_result   TO gt_result.
      APPEND ls_add_cond TO lt_add_cond.

    ENDLOOP.
  ENDLOOP.

  CHECK lt_add_cond IS NOT INITIAL.

  "handle data on Contract level
  SORT lt_add_cond BY recnnr.
  lt_tmp_cond = lt_add_cond.
  DELETE ADJACENT DUPLICATES FROM lt_tmp_cond COMPARING recnnr.

  "add Conditions to Contract
  LOOP AT lt_tmp_cond ASSIGNING FIELD-SYMBOL(<tmp>).

    CLEAR: gt_add_condition, lt_return, gv_error, lv_errmsg.
    LOOP AT lt_add_cond ASSIGNING FIELD-SYMBOL(<add_cond>) WHERE recnnr = <tmp>-recnnr.
      MOVE-CORRESPONDING <add_cond> TO ls_bapi_cond.
      ls_bapi_cond-change_indicator = 'I'. "Insert
      APPEND ls_bapi_cond TO gt_add_condition.
    ENDLOOP.

    CALL FUNCTION 'BAPI_RE_CN_CHANGE'
      EXPORTING
        compcode       = gc_bukrs_1000
        contractnumber = <tmp>-recnnr
      TABLES
        condition      = gt_add_condition
        return         = lt_return.

    "get error
    SORT lt_return BY message.
    DELETE ADJACENT DUPLICATES FROM lt_return COMPARING message.
    LOOP AT lt_return ASSIGNING FIELD-SYMBOL(<return>) WHERE type = 'E' OR type = 'A'.
      gv_error = abap_true.
      IF lv_errmsg IS NOT INITIAL.
        CONCATENATE lv_errmsg ';' <return>-message INTO lv_errmsg.
      ELSE.
        lv_errmsg = <return>-message.
      ENDIF.
    ENDLOOP.

    IF gv_error <> abap_true.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
      LOOP AT gt_result ASSIGNING FIELD-SYMBOL(<result>) WHERE recnnr = <tmp>-recnnr.
        <result>-status = icon_green_light.
      ENDLOOP.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      LOOP AT gt_result ASSIGNING <result> WHERE recnnr = <tmp>-recnnr.
        <result>-status = icon_red_light.
        <result>-msg    = lv_errmsg.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

  CLEAR gv_error.

ENDFORM.

FORM on_user_command_input USING e_ucomm TYPE sy-ucomm.

  CASE e_ucomm.
    WHEN 'TOOGLE_EDIT'.
      PERFORM toogle_edit_input.

    WHEN 'EXTRACT'.
      PERFORM check_alv_input.
      PERFORM toogle_edit_input.
      PERFORM select_data.
      PERFORM display_alv_contract.

    WHEN OTHERS.
  ENDCASE.

ENDFORM.


FORM on_toolbar_input USING i_object TYPE REF TO cl_alv_event_toolbar_set
                            i_interactive TYPE char01.

  DATA ls_toolbar TYPE stb_button.

  DELETE i_object->mt_toolbar WHERE function = '&DETAIL'
                                 OR function = '&&SEP00'
                                 OR function = '&CHECK'
                                 OR function = '&REFRESH'
                                 OR function = '&&SEP01'
                                 OR function = '&LOCAL&APPEND'
                                 OR function = '&SORT_ASC'
                                 OR function = '&SORT_DSC'
                                 OR function = '&FIND'
                                 OR function = '&FIND_MORE'
                                 OR function = '&MB_FILTER'
                                 OR function = '&&SEP04'
                                 OR function = '&MB_SUM'
                                 OR function = '&MB_SUBTOT'
                                 OR function = '&&SEP05'
                                 OR function = '&PRINT_BACK'
                                 OR function = '&MB_VIEW'
                                 OR function = '&COL0'
                                 OR function = '&&SEP06'
                                 OR function = '&&SEP07'
                                 OR function = '&INFO'.

  APPEND VALUE #( butn_type = 3 function = '&&SEP00' ) TO i_object->mt_toolbar.
  APPEND VALUE #( butn_type = 0 quickinfo = 'Display/Edit' icon = '@0Z@' "ICON_CHANGE'
                  text = 'Display / Edit' function = 'TOOGLE_EDIT') TO i_object->mt_toolbar.

  APPEND VALUE #( butn_type = 3 function = '&&SEP01' ) TO i_object->mt_toolbar.
  APPEND VALUE #( butn_type = 0 quickinfo = 'Extract' icon = '@41@' "ICON_RETRIEVE
                  text = 'Extract Contracts' function = 'EXTRACT') TO i_object->mt_toolbar.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  gv_okcode = ok_code.
  CLEAR ok_code.
  CASE gv_okcode.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      PERFORM init_variables.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

**&---------------------------------------------------------------------*
**&      Module  USER_COMMAND_0200  INPUT
**&---------------------------------------------------------------------*
*MODULE user_command_0200 INPUT.
*  gv_okcode = ok_code.
*  CLEAR ok_code.
*  CASE gv_okcode.
*    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
*      LEAVE TO SCREEN 100.
*    WHEN OTHERS.
*  ENDCASE.
*ENDMODULE.

显示/编辑的切换的处理:

第1个第2个ALV的构建,和事件注册

第3个ALV的构建和事件注册,以及字段处理

这里的STATUS字段,是以icon形式显示的,我只用了两个,一个红,一个绿

第一个ALV的字段处理:

dropdown list的值的处理:

这里引用了宏,因为不想重复写太多代码,所以把宏都给封装到一个INCLUDE里了:

*&---------------------------------------------------------------------*
*& Include ZBC_ALV_FIELDCAT_MACRO
*&---------------------------------------------------------------------*

"隐藏列
DEFINE alv_no_out.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-no_out = abap_true.
  ENDIF.
END-OF-DEFINITION.

"列不可编辑
DEFINE alv_no_edit.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    CLEAR <fs_fieldcat>-edit.
  ENDIF.
END-OF-DEFINITION.

"列可编辑
DEFINE alv_editable.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-edit = abap_true.
  ENDIF.
END-OF-DEFINITION.


DEFINE alv_outputlen.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-outputlen = &2.
  ENDIF.
END-OF-DEFINITION.

DEFINE alv_fix_column.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-fix_column = abap_true.
  ENDIF.
END-OF-DEFINITION.

DEFINE alv_alignment.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-just = &2.
  ENDIF.
END-OF-DEFINITION.


DEFINE alv_do_sum.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-do_sum = abap_true.
  ENDIF.
END-OF-DEFINITION.

DEFINE alv_col_text.

  lv_s = &2.
  lv_m = &2.
  lv_l = &2.

  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-coltext   = <fs_fieldcat>-scrtext_l = lv_l.
    <fs_fieldcat>-scrtext_m = lv_m.
    <fs_fieldcat>-scrtext_s = lv_s.
  ENDIF.

END-OF-DEFINITION.

*数值字段没有小数点
DEFINE alv_no_decimals.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-datatype   = 'DEC'.
    <fs_fieldcat>-decimals   = '0'.
    <fs_fieldcat>-decimals_o = '0'.
  ENDIF.
END-OF-DEFINITION.


DEFINE alv_set_dropdown.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-drdn_hndl = &2.
  ENDIF.
END-OF-DEFINITION.


*在第几列输出
DEFINE alv_pos.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-col_pos = &2.
  ENDIF.
END-OF-DEFINITION.


DEFINE alv_no_domain_check.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-valexi = '!'.
  ENDIF.
END-OF-DEFINITION.


DEFINE alv_emphasize.
  READ TABLE ct_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = &1.
  IF <fs_fieldcat> IS ASSIGNED.
    <fs_fieldcat>-emphasize = &2.
  ENDIF.
END-OF-DEFINITION.

第2个ALV的字段 处理

代码如下:


FORM init_alv_input.

  IF gt_alv_input IS INITIAL.
    DO 3 TIMES.
      APPEND INITIAL LINE TO gt_alv_input.
    ENDDO.
  ENDIF.

ENDFORM.

FORM toogle_edit_input.

  CHECK gv_error <> abap_true.

  IF gv_alv_editable = abap_true.
    gv_alv_editable      = abap_false.
    gs_layout_input-edit = abap_false.
  ELSE.
    gv_alv_editable      = abap_true.
    gs_layout_input-edit = abap_true.
  ENDIF.

  "refresh ALV table
  IF go_alvgrid_input IS BOUND.
    CALL METHOD go_alvgrid_input->set_table_for_first_display(
      EXPORTING
        is_layout       = gs_layout_input
      CHANGING
        it_outtab       = gt_alv_input
        it_fieldcatalog = gt_fieldcat_input ).
    go_alvgrid_input->refresh_table_display( ).
  ENDIF.

ENDFORM.
 
FORM build_alv_100.

  IF go_cont IS NOT BOUND.

    "Get Container
    CREATE OBJECT go_cont
      EXPORTING
        container_name = 'CONT_100'.

    "Create Splitter
    CREATE OBJECT go_spliter
      EXPORTING
        parent  = go_cont
        rows    = 2
        columns = 1.

**********************************************************************

    "Create Entry Input ALV
    CALL METHOD go_spliter->set_row_height
      EXPORTING
        id     = 1
        height = 11.

    CALL METHOD go_spliter->get_container
      EXPORTING
        row       = 1
        column    = 1
      RECEIVING
        container = go_cont_input.

    CREATE OBJECT go_alvgrid_input
      EXPORTING
        i_parent = go_cont_input.

    "Register Event Handler
    CREATE OBJECT go_handler_input.
    SET HANDLER go_handler_input->on_toolbar_input FOR go_alvgrid_input.
    SET HANDLER go_handler_input->on_user_command_input FOR go_alvgrid_input.

    "set default editable
    gv_alv_editable      = abap_true.
    gs_layout_input-edit = abap_true.
    PERFORM set_dropdown_4_calcrule.
    PERFORM build_fieldcat_input CHANGING gt_fieldcat_input.
    CALL METHOD go_alvgrid_input->set_table_for_first_display(
      EXPORTING
        is_layout       = gs_layout_input
      CHANGING
        it_outtab       = gt_alv_input
        it_fieldcatalog = gt_fieldcat_input ).

**********************************************************************

    "Create Contract List ALV
    CALL METHOD go_spliter->get_container
      EXPORTING
        row       = 2
        column    = 1
      RECEIVING
        container = go_cont_contract.

    TRY.
        CALL METHOD cl_salv_table=>factory(
          EXPORTING
            r_container  = go_cont_contract
          IMPORTING
            r_salv_table = go_salv_contract
          CHANGING
            t_table      = gt_data ).
*            t_table      = gt_contract ).

        "Register Event Handler
        go_salv_events_table = go_salv_contract->get_event( ).
        go_salv_events       = go_salv_contract->get_event( ).
        CREATE OBJECT go_handler_contract.
        SET HANDLER go_handler_contract->on_double_click_contract FOR go_salv_events_table.
        SET HANDLER go_handler_contract->on_link_click_contract   FOR go_salv_events_table.
        SET HANDLER go_handler_contract->on_user_command_contract FOR go_salv_events.
        go_salv_selection = go_salv_contract->get_selections( ).
        go_salv_selection->set_selection_mode( 2 ). "Multiple
        PERFORM build_fieldcat_contract.

      CATCH cx_salv_msg INTO DATA(lo_ex).
    ENDTRY.

  ELSE.
    "refresh ALV table
    IF go_alvgrid_input IS BOUND.
      go_alvgrid_input->refresh_table_display( ).
    ENDIF.
    IF go_salv_contract IS BOUND.
      go_salv_contract->display( ).
    ENDIF.
  ENDIF.

ENDFORM.

FORM build_alv_200.

  DATA lo_functions            TYPE REF TO cl_salv_functions_list.
  DATA lo_functional_settings  TYPE REF TO cl_salv_functional_settings.
  DATA lo_tooltips             TYPE REF TO cl_salv_tooltips.
  DATA lv_value                TYPE lvc_value.
  DATA lo_columns              TYPE REF TO cl_salv_columns.
  DATA lo_column               TYPE REF TO cl_salv_column_table.
  DATA lo_col                  TYPE REF TO cl_salv_column.

  DEFINE hide_field.
    lo_col = lo_columns->get_column( &1 ).
    lo_col->set_visible( if_salv_c_bool_sap=>false ).
  END-OF-DEFINITION.

  DEFINE set_len.
    lo_col = lo_columns->get_column( &1 ).
    lo_col->set_output_length( &2 ).
  END-OF-DEFINITION.

  DEFINE set_medium_txt.
    lo_col = lo_columns->get_column( &1 ).
    lo_col->set_medium_text( &2 ).
  END-OF-DEFINITION.

**********************************************************************
  IF go_salv_result IS NOT BOUND.
    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table = go_salv_result
          CHANGING
            t_table      = gt_result ).

        "Register Event Handler
        go_salv_events_table_res = go_salv_result->get_event( ).
        CREATE OBJECT go_handler_result.
        SET HANDLER go_handler_result->on_double_click_result FOR go_salv_events_table_res.

      CATCH cx_salv_msg.                                "#EC NO_HANDLER
    ENDTRY.

    "enable default toolbar
    go_salv_result->get_functions( )->set_all( ).

    TRY.
        "set to display as Icon
        lo_columns = go_salv_result->get_columns( ).
        lo_column ?= lo_columns->get_column( 'STATUS' ).
        lo_column->set_icon( if_salv_c_bool_sap=>true ).

        lo_column->set_long_text( 'Status' ).
        lo_column->set_alignment( if_salv_c_alignment=>centered ).
        lo_column->set_output_length( 10 ).

        hide_field     'CALCRULE'.
        hide_field     'RENTAL_OBJECT'.
        set_len        'XMETXT'         20.
        set_len        'MSG'            50.
        set_len        'UNITPRICE'      16.
        set_len        'CALCRULE_TXT'   25.
        set_medium_txt 'CALCRULE_TXT'   'Formula'.
        set_medium_txt 'MSG'            'Error Message'.

      CATCH cx_salv_not_found.                          "#EC NO_HANDLER
    ENDTRY.

*...Tooltips,
    lo_functional_settings = go_salv_result->get_functional_settings( ).
    lo_tooltips            = lo_functional_settings->get_tooltips( ).

    TRY.
        "when Green
        lv_value = icon_green_light.
        lo_tooltips->add_tooltip(
          type    = cl_salv_tooltip=>c_type_icon
          value   = lv_value
          tooltip = 'Successful' ).                         "#EC NOTEXT

        "when Red
        lv_value = icon_red_light.
        lo_tooltips->add_tooltip(
          type    = cl_salv_tooltip=>c_type_icon
          value   = lv_value
          tooltip = 'Error' ).                              "#EC NOTEXT
      CATCH cx_salv_existing.                           "#EC NO_HANDLER
    ENDTRY.
  ENDIF.

  IF go_salv_result IS BOUND.
    go_salv_result->display( ).
  ENDIF.

ENDFORM.

FORM build_fieldcat_contract.

  DATA lr_columns      TYPE REF TO cl_salv_columns_table.
  DATA lr_col          TYPE REF TO cl_salv_column.
  DATA lo_col_list     TYPE REF TO cl_salv_column_list.
  DATA lv_medium_txt   TYPE scrtext_m.
  DATA lr_ex_notfound  TYPE REF TO cx_salv_not_found.

  DATA: lo_functional_settings TYPE REF TO cl_salv_functional_settings,
        lo_specific_groups     TYPE REF TO cl_salv_specific_groups,
        lv_text                TYPE cl_salv_specific_groups=>y_text.

  DEFINE hide_field.
    lr_col = lr_columns->get_column( &1 ).
    lr_col->set_visible( if_salv_c_bool_sap=>false ).
  END-OF-DEFINITION.

  DEFINE set_len.
    lr_col = lr_columns->get_column( &1 ).
    lr_col->set_output_length( &2 ).
  END-OF-DEFINITION.

  DEFINE set_medium_txt.
    lr_col = lr_columns->get_column( &1 ).
    lr_col->set_medium_text( &2 ).
  END-OF-DEFINITION.

  DEFINE add_function.
    go_salv_contract->get_functions( )->add_function(
        EXPORTING
          name     = &1
          icon     = &3
          text     = &2
          tooltip  = &2
          position = if_salv_c_function_position=>right_of_salv_functions ).
  END-OF-DEFINITION.

**********************************************************************
  TRY.
      lr_columns = go_salv_contract->get_columns( ).
      go_salv_contract->get_functions( )->set_all( ).

      lo_functional_settings = go_salv_contract->get_functional_settings( ).
      lo_specific_groups = lo_functional_settings->get_specific_groups( ).

**********************************************************************
* Group for column which start with HSL, as group ID GRP1
      lv_text = 'Contract'.
      lo_specific_groups->add_specific_group( id = 'GRP1' text = lv_text ).

**********************************************************************
      "add custom function
      add_function 'SEL_ALL'   'Select All'      '@4B@'. "ICON_SELECT_ALL
      add_function 'DESEL_ALL' 'Deselect All'    '@4D@'. "ICON_DESELECT_ALL
      add_function 'CONFIRM'   'Confirm to Add'  '@5Y@'. "ICON_RELEASE
      add_function 'SHOW_RES'  'Previous Result' '@10@'. "ICON_DISPLAY

**********************************************************************
      "add selection field as checkbox
      lo_col_list ?= lr_columns->get_column( 'SELECTED' ).
      lo_col_list->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).

      "Group Column
      lo_col_list ?= lr_columns->get_column( 'RECNNR' ).
      lo_col_list->set_specific_group( id = 'GRP1' ).
      lo_col_list ?= lr_columns->get_column( 'RECNBEG' ).
      lo_col_list->set_specific_group( id = 'GRP1' ).
      lo_col_list ?= lr_columns->get_column( 'RECNENDABS' ).
      lo_col_list->set_specific_group( id = 'GRP1' ).

**********************************************************************
      hide_field 'INTRENO'.
      hide_field 'OBJNRDIST'.
      hide_field 'RENTAL_OBJECT'.
      hide_field 'CALCRULE'.
      hide_field 'RECNTXT'.
      hide_field 'CALCRULEPARA1'.
      hide_field 'CALCRULEPARA2'.
      hide_field 'DISTRULE'.
      hide_field 'DISTRULEPARA1'.
      hide_field 'DISTRULEPARA2'.
      hide_field 'CONDPURPOSEEXT'.

**********************************************************************

      set_len 'RECNNR'         10.
      set_len 'SELECTED'       8.
      set_len 'XMETXT'         20.
      set_len 'UNITPRICE'      13.
      set_len 'CONDTYPE'       6.
      set_len 'CALCRULE_TXT'   22.

**********************************************************************
      set_medium_txt 'SELECTED'      'Selected'.
      set_medium_txt 'RECNENDABS'    'Contract End'.
      set_medium_txt 'XMETXT'        'RO Name'.
      set_medium_txt 'PARTNER'       'Customer'.
      set_medium_txt 'CUSTOMER_NAME' 'Customer Name'.
      set_medium_txt 'CALCRULE_TXT'  'Formula'.

    CATCH cx_salv_wrong_call cx_salv_existing INTO DATA(lo_ex).
    CATCH cx_salv_not_found INTO lr_ex_notfound.
  ENDTRY.

ENDFORM.

FORM set_dropdown_4_calcrule.

  DATA lt_dral      TYPE lvc_t_dral.
  DATA lt_drop_down TYPE lvc_t_drop.

  CHECK go_alvgrid_input IS BOUND.

*  lt_dral = CORRESPONDING #( gt_calcrule_txt MAPPING int_value = xmcalcrule value = calcruleext ).
*  LOOP AT lt_dral ASSIGNING FIELD-SYMBOL(<dral>).
*    <dral>-handle = 1.
*  ENDLOOP.

  lt_drop_down = CORRESPONDING #( gt_calcrule_txt MAPPING value = calcruleext ).
  LOOP AT lt_drop_down ASSIGNING FIELD-SYMBOL(<drop>).
    <drop>-handle = '1'.
  ENDLOOP.

  CALL METHOD go_alvgrid_input->set_drop_down_table
    EXPORTING
*     it_drop_down_alias = lt_dral.
      it_drop_down = lt_drop_down.

ENDFORM.

FORM build_fieldcat_input CHANGING ct_fieldcat TYPE lvc_t_fcat.

  DATA: lv_s TYPE scrtext_s,
        lv_m TYPE scrtext_m,
        lv_l TYPE scrtext_l.

  FIELD-SYMBOLS <fs_fieldcat> TYPE lvc_s_fcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'ZSRE_ZFI012R_ALV_INPUT'
      i_client_never_display = 'X'
    CHANGING
      ct_fieldcat            = ct_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  alv_set_dropdown 'CALCRULE' '1'.

  alv_outputlen 'CONDTYPE'        16.
  alv_outputlen 'SGENR'           16.
  alv_outputlen 'CONDVALIDFROM'   22.
  alv_outputlen 'UNITPRICE'       17.
  alv_outputlen 'CALCRULE'        30.

  alv_col_text 'SGENR'                'Building'.
  alv_col_text 'CONDVALIDFROM'        'Condition Start Date'.
  alv_col_text 'UNITPRICE'            'Amount'.
  alv_col_text 'CALCRULE'             'Fixed or by Object Management'.

ENDFORM.

FORM display_alv_contract.

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
*&---------------------------------------------------------------------* *& Report YTEST31 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT YTEST31. DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. TABLES SPFLI. DATA LS_SPFLI TYPE SPFLI. DATA WA_SPFLI TYPE TABLE OF SPFLI. DATA WADEL_SPFLI TYPE TABLE OF SPFLI. SELECT * INTO TABLE WA_SPFLI FROM SPFLI. DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'ALVDATA', ALV_GRID TYPE REF TO CL_GUI_ALV_GRID, WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER. DATA WA_LAYOUT TYPE LVC_S_LAYO. WA_LAYOUT-EDIT = 'X'. CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED. DATA EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER. ************************************************************************ * CLASS LCL_EVENT_RECEIVER DEFINITION * * * ************************************************************************ CLASS LCL_EVENT_RECEIVER DEFINITION. PUBLIC SECTION. TYPES: DEL_ROWS TYPE STANDARD TABLE OF SPFLI. DATA: DDEL_ROWS TYPE STANDARD TABLE OF SPFLI. METHODS: HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID IMPORTING ER_DATA_CHANGED. METHODS: UPDATE_DELTA_TABLES IMPORTING PR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL. METHODS: GET_DELETED_ROWS EXPORTING DELETED_ROWS TYPE DEL_ROWS. ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION *&-------------------------------------------------------------------------- *& CLASS LCL_EVENT_RECEIVER IMPLENTMENTATION *& *&-------------------------------------------------------------------------- CLASS LCL_EVENT_RECEIVER IMPLEMENTATION. METHOD HANDLE_DATA_CHANGED. CALL METHOD UPDATE_DELTA_TABLES( ER_DATA_CHANGED ). ENDMETHOD. "HANDLE_DATA_CHANGED METHOD UPDATE_DELTA_TABLES. "HANDLE_DATA_CHANGED DATA: L_DEL_ROW TYPE LVC_S_MOCE. LOOP AT PR_DATA_CHANGED->MT_DELETED_ROWS INTO L_DEL_ROW. READ TABLE WA_SPFLI INTO LS_SPFLI INDEX L_DEL_ROW-ROW_ID. IF SY-SUBRC NE 0. MESSAGE E208(00) WITH '?理??'. ELSE. APPEND LS_SPFLI TO DDEL_ROWS. ENDIF. ENDLOOP. ENDMETHOD. "UPDATE_DELTA_TABLES METHOD GET_DELETED_ROWS. "update_delta_tables DELETED_ROWS = ME->DDEL_ROWS. ENDMETHOD. "GET_DELETED_ROWS ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION START-OF-SELECTION. CALL SCREEN 100. WRITE / '?除的内表??'. "get_deleted_rows WRITE / '______________'. "LCL_EVENT_RECEIVER DEFINITION CALL METHOD EVENT_RECEIVER->GET_DELETED_ROWS IMPORTING DELETED_ROWS = WADEL_SPFLI. LOOP AT WADEL_SPFLI INTO SPFLI. WRITE: / SPFLI-CARRID,SPFLI-CONNID,SPFLI-CITYFROM. ENDLOOP. WRITE: / '更新后的内表??:'. WRITE: / '__________________'. LOOP AT WA_SPFLI INTO SPFLI. WRITE : / SPFLI-CARRID,SPFLI-CONNID,SPFLI-CITYFROM. ENDLOOP. *此?是更新到数据?的操作 *WHEN 'SAVE'. * MODIFY SPFLI FORM TABLE WA_SPFLI. * IF SY-SUBRC NE 0. *MESSAGE I005(YMESS) WITH '更新数据??!'. EXIT. * ELSE. * MESSAGE I005(YMESS) WITH '更新数据OK!'. * ENDIF. * DELETE SPFLI FROM TABLE DELA_SPFLI. * IF SY-SUBRC NE 0. * MESSAGE I005(YMESS) WITH '更新数据??!'. * ELSE. * MESSAGE I005(YMESS) WITH '更新数据OK!'. * ENDIF. END-OF-SELECTION. INCLUDE YTEST31_STATUS_100. INCLUDE YTEST31_USER_COMMAND_100.
cl_salv_form_layout_grid是SAP ABAP中的一个类,用于在ALVABAP List Viewer)中创建网格布局。 首先,我们需要实例化CL_SALV_FORM_LAYOUT_GRID类来使用它的方法和属性。在实例化之后,可以使用以下方法设置网格布局的属性和样式: 1. SET_COLUMNS:设置网格布局的列数,可以指定每列的大小和比例。 2. SET_ROWS:设置网格布局的行数,可以指定每行的大小和比例。 3. SET_MARGIN:设置网格布局的边距,可以指定上、下、左、右的边距大小。 4. SET_PADDING:设置网格布局的内边距,可以指定上、下、左、右的内边距大小。 5. SET_CELL_CONTENT:设置网格布局中单元格的内容,可以指定单元格的行、列和显示的控件或文本。 6. SET_CELL_SIZE:设置网格布局中单元格的大小,可以指定单元格的行、列和大小。 7. SET_CELL_SPAN:设置网格布局中单元格的跨度,可以指定单元格的行、列和跨度。 通过这些方法,我们可以自定义网格布局的外观和行为,以满足具体的业务需求。网格布局可以用于创建复杂的表格、窗体、对话框等界面,并在ALV中进行展示。使用CL_SALV_FORM_LAYOUT_GRID类可以简化布局的创建和管理过程,提高开发效率。同时,该类还提供了其他一些方法来处理布局的事件和行为。 总结起来,CL_SALV_FORM_LAYOUT_GRID是SAP ABAP中用于创建网格布局的类,通过设置不同的属性和样式,可以实现各种复杂的界面布局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值