【转载】在ALV中添加搜索帮助并返回多列值

**=====================================================================*
*& Report ZPM_RP_09
**=====================================================================*
REPORT zpm_rp_09.
*======================================================================*
*                     Modify Log History.
*----------------------------------------------------------------------*
*
*No. Modified by    Date      Transport  Description
*--- -----------    ----      ---------  -----------
*M1

*======================================================================*
*                             Tables
*======================================================================*
TABLES:zpm_rp_09.
*======================================================================*
*                             Constants
*======================================================================*

*======================================================================*
*                             Types
*======================================================================*
TYPE-POOLS : abap,slis,icon,shlp.
*======================================================================*
*                     Internal Tables/work areas
*======================================================================*
DATA:BEGIN OF gt_out OCCURS 0,
  zzjhbh LIKE zpm_rp_09-zzjhbh,     "计划编号
  zzhxmh LIKE zpm_rp_09-zzhxmh,     "行项目号
  werks LIKE zpm_rp_09-werks,       "工厂
  name1 LIKE zpm_rp_09-name1,       "工厂名称
  pspnr TYPE zpm_rp_09-pspnr,       "大修预算编号
  post1 LIKE zpm_rp_09-post1,       "大修预算名称
  sel(1) TYPE c,
  END OF gt_out.
DATA: fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA:gt_excel LIKE TABLE OF alsmex_tabline,
     gw_excel LIKE alsmex_tabline.
DATA:BEGIN OF gt_upload OCCURS 0,
  zzjhbh LIKE zpm_rp_09-zzjhbh,     "计划编号
  zzhxmh LIKE zpm_rp_09-zzhxmh,     "行项目号
  werks LIKE zpm_rp_09-werks,       "工厂
  name1 LIKE zpm_rp_09-name1,       "工厂名称
  pspnr LIKE zpm_rp_09-pspnr,       "大修预算编号
  post1 LIKE zpm_rp_09-post1,       "大修预算名称
  END OF gt_upload.
*======================================================================*
*                      Data declarations
*======================================================================*
DATA: wa_layout   TYPE lvc_s_layo,
      gt_events   TYPE slis_t_event WITH HEADER LINE,
      gs_event   LIKE LINE OF gt_events.
DATA: g_grid TYPE REF TO cl_gui_alv_grid.
DATA:gv_file TYPE rlgrap-filename.
DATA:  ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:lw_layout TYPE slis_layout_alv.
*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_modify
    FOR EVENT data_changed_finished OF cl_gui_alv_grid
    IMPORTING e_modified et_good_cells.

        METHODS:
      handle_f4
        FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname
                  es_row_no
                  er_event_data
                  et_bad_cells.
ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
    DATA stbl TYPE lvc_s_stbl.
    DATA:wa_out LIKE gt_out.
    LOOP AT gt_out INTO wa_out.
      CALL FUNCTION 'CONVERSION_EXIT_ABPSN_INPUT'
        EXPORTING
          input         = wa_out-pspnr
       IMPORTING
         output        = wa_out-pspnr.
      SELECT SINGLE post1
        INTO wa_out-post1
        FROM prps
        WHERE posid = wa_out-pspnr.
      CALL FUNCTION 'CONVERSION_EXIT_ABPSN_OUTPUT'
        EXPORTING
          input         = wa_out-pspnr
       IMPORTING
         output        = wa_out-pspnr.
        MODIFY gt_out FROM wa_out.
    ENDLOOP.
*   稳定刷新
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD ref_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "HANDLE_MODIFY
*---------------------------------------------------------------------------------------------*
      METHOD  handle_f4.
*     窗口时间参数的自定义f4检索帮助
      PERFORM f4_help_zsjcs USING e_fieldname
                                  es_row_no.
*     设置后,alv稳定刷新
      PERFORM refresh_table_alv.
  ENDMETHOD.                    "HANDLE_F4

ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .
*---------------------------------------------------------------*
*DEFINATION
*---------------------------------------------------------------*
DEFINE fill_field.
  CLEAR FIELDCAT.
  FIELDCAT-FIELDNAME     = &1.
  FIELDCAT-SCRTEXT_L     = &2.
  FIELDCAT-CFIELDNAME    = &3.
  FIELDCAT-OUTPUTLEN     = &4.
  FIELDCAT-EDIT          = &5.
  APPEND FIELDCAT.
END-OF-DEFINITION.
*======================================================================*
*                       Range declarations
*======================================================================*

*======================================================================*
*                      Input Selection Screen
*======================================================================*
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.
  PARAMETERS:p_werks LIKE zpm_rp_09-werks OBLIGATORY.                            "工厂
SELECTION-SCREEN END OF BLOCK bl1.
*======================================================================*
*                          Initialization
*======================================================================*
INITIALIZATION.

*======================================================================*
*                        At Selection Screen
*======================================================================*
AT SELECTION-SCREEN.
      PERFORM frm_authorization_check_swerk.      "对工厂进行权限检查

*======================================================================*
*                        At Selection Screen Output
*======================================================================*
AT SELECTION-SCREEN OUTPUT .

*======================================================================*
*                        AT SELECTION-SCREEN ON VALUE-REQUEST
*======================================================================*
*at selection-screen on value-request for p_ksgru.

*======================================================================*
*                        Start of Selection
*======================================================================*
START-OF-SELECTION.
PERFORM frm_get_data.
*======================================================================*
*                        End of Selection
*======================================================================*
END-OF-SELECTION.
    PERFORM frm_display_data.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  SELECT zzjhbh zzhxmh werks name1 pspnr post1
    INTO CORRESPONDING FIELDS OF TABLE gt_out
    FROM zpm_rp_09
    WHERE werks = p_werks.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_display_data .
  PERFORM frm_layout.
  PERFORM frm_fill_field.
  PERFORM frm_alv_display.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_layout .
  CLEAR: wa_layout."它用来定义ALV报表的整体属性
    wa_layout-cwidth_opt    = 'X'."优化列宽选项是否设置
    wa_layout-box_fname = 'SEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_fill_field .
  fieldcat-fieldname     = 'WERKS'.
  fieldcat-scrtext_l     = '工厂'.
  fieldcat-cfieldname    = ''.
  fieldcat-outputlen     = '20'.
  fieldcat-edit          = ''.
  fieldcat-f4availabl    = 'X'.
  APPEND fieldcat.
  CLEAR fieldcat.
  fill_field 'NAME1'   '工厂名称' '' '20' ''.
  fieldcat-fieldname     = 'ZZJHBH'.
  fieldcat-scrtext_l     = '大修计划号'.
  fieldcat-cfieldname    = ''.
  fieldcat-outputlen     = '20'.
  fieldcat-edit          = ''.
  fieldcat-f4availabl    = 'X'.
  APPEND fieldcat.
  CLEAR fieldcat.
  fieldcat-fieldname     = 'ZZHXMH'.
  fieldcat-scrtext_l     = '大修计划行项目号'.
  fieldcat-cfieldname    = ''.
  fieldcat-outputlen     = '20'.
  fieldcat-edit          = ''.
  fieldcat-f4availabl    = 'X'.
  APPEND fieldcat.
  CLEAR fieldcat.
  fieldcat-fieldname     = 'PSPNR'.
  fieldcat-scrtext_l     = '大修预算编号'.
  fieldcat-cfieldname    = ''.
  fieldcat-outputlen     = '20'.
  fieldcat-edit          = ''.
  fieldcat-f4availabl    = 'X'.
  APPEND fieldcat.
  CLEAR fieldcat.
  fill_field 'POST1'   '大修预算名称' '' '20' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_alv_display .
    gt_events-name = 'CALLER_EXIT'.   "slis_ev_caller_exit_at_start事件
    gt_events-form = 'FM_BUTTON'.
    APPEND gt_events.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_pf_status_set = 'PF_STATUS'
      is_layout_lvc            = wa_layout
      it_fieldcat_lvc          = fieldcat[]
      i_default                = 'X'
      i_save                   = 'A'
     it_events                = gt_events[]
    TABLES
      t_outtab                 = gt_out[]
    EXCEPTIONS
      OTHERS                   = 2.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.                    " FRM_ALV_DISPLAY
FORM pf_status USING lt_extab.
  SET PF-STATUS 'MENU'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->UCOMM        text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING ucomm  LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.     "#EC CALLED
  CASE ucomm.
    WHEN 'CHANGE'.
      PERFORM frm_change_function.
    WHEN 'DELETE'.
      PERFORM frm_delete_function.
    WHEN 'CREATE'.
      PERFORM frm_create_function.
    WHEN 'SAVE'.
      PERFORM frm_save_function.
    WHEN 'IMPORT'.
      PERFORM frm_import_function.
  ENDCASE.
  rs_selfield-refresh    = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  FRM_CHANGE_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_change_function .
    LOOP AT fieldcat.
      IF fieldcat-fieldname  = 'NAME1' OR fieldcat-fieldname = 'POST1' OR fieldcat-fieldname = 'WERKS' OR fieldcat-fieldname = 'ZZHXMH'.
      fieldcat-edit          = ''.
      ELSE.
      fieldcat-edit          = 'X'.
      ENDIF.
      MODIFY fieldcat TRANSPORTING edit.
    ENDLOOP.
    PERFORM frm_alv_display.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DELETE_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_delete_function .
  DATA: l_answer(1) TYPE c.
  READ TABLE gt_out WITH KEY sel = 'X'.
  IF sy-subrc <> 0.
    MESSAGE '请选择要删除的行!' TYPE 'E'.
    ELSE.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
       titlebar                    = '删除'
        text_question               = '是否要删除该内容?'
         default_button              = '2'
         display_cancel_button       = 'X'
     IMPORTING
       answer                      = l_answer
     EXCEPTIONS
       text_not_found              = 1
       OTHERS                      = 2.
    IF l_answer = '1'.
      LOOP AT gt_out WHERE sel = 'X'.
        DELETE gt_out.
        DELETE FROM zpm_rp_09 WHERE zzjhbh = gt_out-zzjhbh AND zzhxmh = gt_out-zzhxmh AND werks = gt_out-werks.
        IF sy-subrc = 0.
          MESSAGE '删除成功!' TYPE 'S'.
        ELSE.
          MESSAGE '删除失败!' TYPE 'E'.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_function .
  APPEND INITIAL LINE TO gt_out.
  LOOP AT gt_out.
  IF gt_out-werks = ''.
  SELECT SINGLE werks name1
    INTO (gt_out-werks,gt_out-name1)
    FROM t001w
    WHERE werks = p_werks.
    MODIFY gt_out.
  ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SAVE_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_save_function .
  DATA: lv_valid  TYPE char01.
  DATA:lv_mes TYPE string.
  DATA lt_save TYPE TABLE OF zpm_rp_09 WITH HEADER LINE.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.
  CALL METHOD g_grid->check_changed_data
    IMPORTING
      e_valid = lv_valid.
  IF lv_valid IS INITIAL.
    EXIT.
  ENDIF.
  REFRESH lt_save.
  LOOP AT gt_out.
      lt_save-zzjhbh = gt_out-zzjhbh.
      lt_save-zzhxmh = gt_out-zzhxmh.
      lt_save-werks = gt_out-werks.
      lt_save-name1 = gt_out-name1.
      lt_save-pspnr = gt_out-pspnr.
      lt_save-post1 = gt_out-post1.
      APPEND lt_save.
      CLEAR lt_save.
  ENDLOOP.
  MODIFY zpm_rp_09 FROM TABLE lt_save.
  COMMIT WORK.
  IF sy-subrc = 0.
    MESSAGE '保存成功!' TYPE 'S'.
  ELSE.
    MESSAGE '保存失败!' TYPE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_IMPORT_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_import_function .
  PERFORM frm_get_fiel_name.
  PERFORM frm_excel_upload.
  PERFORM frm_data_get.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FIEL_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_fiel_name .
  CALL FUNCTION 'WS_FILENAME_GET'
   EXPORTING
     mode                   = 'O'
     title                  = '选取路径'
   IMPORTING
     filename               = gv_file
    EXCEPTIONS
     inv_winsys             = 1
     no_batch               = 2
     selection_cancel       = 3
     selection_error        = 4
     OTHERS                 = 5.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_EXCEL_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_excel_upload .
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                      = gv_file
      i_begin_col                   = 1
      i_begin_row                   = 2
      i_end_col                     = 6
      i_end_row                     = 5000
    TABLES
      intern                        = gt_excel
      EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
    REFRESH gt_upload.
  SORT gt_excel BY row.
  LOOP AT gt_excel INTO gw_excel.
    CASE gw_excel-col.
      WHEN '001'.
        gt_upload-werks = gw_excel-value.
      WHEN '002'.
        gt_upload-name1 = gw_excel-value.
      WHEN '003'.
        gt_upload-zzjhbh = gw_excel-value.
      WHEN '004'.
        gt_upload-zzhxmh = gw_excel-value.
      WHEN '005'.
        gt_upload-pspnr = gw_excel-value.
      WHEN '006'.
        gt_upload-post1 = gw_excel-value.
      WHEN OTHERS.
    ENDCASE.
    AT END OF row.
      APPEND gt_upload.
      CLEAR gt_upload.
    ENDAT.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DATA_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_data_get .
  DATA:lt_import LIKE TABLE OF zpm_rp_09 WITH HEADER LINE.
  LOOP AT gt_upload.
   MOVE-CORRESPONDING gt_upload TO gt_out.
   APPEND gt_out.
   CLEAR gt_out.
  ENDLOOP.
  REFRESH lt_import.
  LOOP AT gt_out.
    MOVE-CORRESPONDING gt_out TO lt_import.
    APPEND lt_import.
    CLEAR lt_import.
  ENDLOOP.
  MODIFY zpm_rp_09 FROM TABLE lt_import.
  COMMIT WORK.
  IF sy-subrc = 0.
    MESSAGE '导入成功!' TYPE 'S'.
    ELSE.
      MESSAGE '导入失败' TYPE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  fm_button
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->E_GRID     text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  IMPORTING
    e_grid                           = ref_grid.
* 设置enter事件
  CALL METHOD ref_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CREATE OBJECT gt_event_receiver.
  SET HANDLER   gt_event_receiver->handle_modify FOR ref_grid.

  DATA: lv_event_receiver TYPE REF TO lcl_event_receiver,
        lt_f4             TYPE lvc_t_f4,
        ls_f4             TYPE lvc_s_f4.
  ls_f4-fieldname  = 'WERKS'.   "窗口时间参数(需要定义F4帮助按钮的字段)
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.
  ls_f4-fieldname  = 'PSPNR'.   "窗口时间参数(需要定义F4帮助按钮的字段)
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.
  ls_f4-fieldname  = 'ZZJHBH'.   "窗口时间参数(需要定义F4帮助按钮的字段)
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.
  ls_f4-fieldname  = 'ZZHXMH'.   "窗口时间参数(需要定义F4帮助按钮的字段)
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.
  CREATE OBJECT lv_event_receiver.
  SET HANDLER lv_event_receiver->handle_f4 FOR ref_grid.

  CALL METHOD ref_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4[].
ENDFORM.                    "FM_BUTTON
*&---------------------------------------------------------------------*
*&      Form  REFRESH_TABLE_ALV
*&---------------------------------------------------------------------*
*       设置后,alv稳定刷新
*----------------------------------------------------------------------*
FORM refresh_table_alv .
  DATA: stbl        TYPE lvc_s_stbl.
*
  stbl-row = 'X'." 基于行的稳定刷新
  stbl-col = 'X'." 基于列稳定刷新
  CALL METHOD ref_grid->refresh_table_display
    EXPORTING
      is_stable = stbl.

ENDFORM.                    " REFRESH_TABLE_ALV
*&---------------------------------------------------------------------*
*&      Form  F4_HELP_ZSJCS
*&---------------------------------------------------------------------*
*       窗口时间参数的自定义f4检索帮助
*----------------------------------------------------------------------*
FORM f4_help_zsjcs USING p_fieldname  TYPE lvc_fname
                         p_row_no     TYPE lvc_s_roid.

   DATA: lt_return   TYPE STANDARD TABLE OF ddshretval,
        ls_return   TYPE ddshretval.

DATA:BEGIN OF lt_t001w OCCURS 0,
      werks LIKE t001w-werks,
      name1 LIKE t001w-name1,
      END OF lt_t001w.
  IF p_fieldname = 'WERKS'.
    SELECT name1 werks
      INTO CORRESPONDING FIELDS OF TABLE lt_t001w
      FROM t001w.
    SORT lt_t001w BY werks.
    DELETE ADJACENT DUPLICATES FROM lt_t001w
                          COMPARING werks.
  ENDIF.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'WERKS'            "lt内表里面的字段
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'WERKS'            "画面上绑定字段
      value_org        = 'S'
      callback_program = sy-repid
    TABLES
      value_tab        = lt_t001w        "需要显示帮助的值内表
      return_tab       = lt_return          "返回值
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.
  IF sy-subrc = 0.
    READ TABLE gt_out INDEX  p_row_no-row_id.
    IF lw_layout-edit = 'X'.
    READ TABLE lt_return INTO ls_return INDEX 1.
    gt_out-werks = ls_return-fieldval.
    MODIFY gt_out INDEX p_row_no-row_id
                       TRANSPORTING werks.
    ENDIF.
  ENDIF.

DATA:BEGIN OF lt_prps OCCURS 0,                                                   "大修预算编号
      pspnr LIKE prps-pspnr,
      post1 LIKE prps-post1,
      END OF lt_prps.
  IF p_fieldname = 'PSPNR'.
    SELECT pspnr post1
      INTO CORRESPONDING FIELDS OF TABLE lt_prps
      FROM prps.
  ENDIF.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'PSPNR'            "lt内表里面的字段
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'PSPNR'            "画面上绑定字段
      value_org        = 'S'
      callback_program = sy-repid
    TABLES
      value_tab        = lt_prps            "需要显示帮助的值内表
      return_tab       = lt_return          "返回值
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.
  IF sy-subrc = 0.
    READ TABLE gt_out INDEX  p_row_no-row_id.
    IF sy-subrc = 0.
    READ TABLE lt_return INTO ls_return INDEX 1.
    IF sy-subrc = 0.
    READ TABLE fieldcat WITH KEY fieldname = ls_return-retfield.
    IF fieldcat-edit = 'X'.
    gt_out-pspnr = ls_return-fieldval.
    MODIFY gt_out INDEX p_row_no-row_id
                       TRANSPORTING pspnr.
    ENDIF.
    ENDIF.
    ENDIF.
  ENDIF.

DATA:BEGIN OF lt_zzjhbh OCCURS 0,                                                     "计划编号
      zzjhbh TYPE zzjhbh,
      zzhxmh TYPE zzhxmh,
      zzequnr TYPE zzequnr,
      zzktext TYPE zzktext,
      END OF lt_zzjhbh.
DATA:lv_index TYPE char02.
  IF p_fieldname = 'ZZJHBH'.
    READ TABLE gt_out INDEX  p_row_no-row_id.
    IF sy-subrc = 0.
    SELECT zpm001b~zzjhbh zpm001b~zzhxmh zpm001b~zzequnr zpm001b~zzktext
      INTO CORRESPONDING FIELDS OF TABLE lt_zzjhbh
      FROM zpm001a
      INNER JOIN zpm001b
      ON zpm001b~zzjhbh = zpm001a~zzjhbh
      WHERE zpm001a~zzjhjt = '02'
      AND zpm001a~zzjhlx = '03'
      AND zpm001a~zzjhdw = gt_out-werks.
    ENDIF.
  ENDIF.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'ZZJHBH'            "lt内表里面的字段
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'ZZJHBH'            "画面上绑定字段
      value_org        = 'S'
      callback_program = sy-repid
      multiple_choice  = 'X'
      callback_form = 'BO_CALLBACK_FORM'
    TABLES
      value_tab        = lt_zzjhbh            "需要显示帮助的值内表
      return_tab       = lt_return          "返回值
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.

  IF sy-subrc = 0.
    DATA:wa_out LIKE gt_out.
    lv_index = p_row_no-row_id - 1.
    LOOP AT lt_return INTO ls_return.
    READ TABLE fieldcat WITH KEY fieldname = ls_return-retfield.
    IF fieldcat-edit = 'X' AND fieldcat-fieldname = 'ZZJHBH'.
    wa_out-zzjhbh = ls_return-fieldval.
    ELSEIF fieldcat-fieldname = 'ZZHXMH'.
    wa_out-zzhxmh = ls_return-fieldval.
    ENDIF.
      IF ls_return-fieldname = 'F0002'.
      lv_index = lv_index + 1.
      ENDIF.
      IF wa_out-zzjhbh IS NOT INITIAL AND wa_out-zzhxmh IS NOT INITIAL.
      MODIFY gt_out FROM wa_out INDEX lv_index TRANSPORTING zzjhbh zzhxmh.
      CLEAR wa_out.
      ENDIF.
    ENDLOOP.
  ENDIF.

DATA:BEGIN OF lt_zzhxmh OCCURS 0,                                                   "行项目号
      zzjhbh LIKE zpm001b-zzjhbh,
      zzhxmh LIKE zpm001b-zzhxmh,
      END OF lt_zzhxmh.
  IF p_fieldname = 'ZZHXMH'.
     READ TABLE gt_out INDEX  p_row_no-row_id.
    IF sy-subrc = 0.
    SELECT zzhxmh zzjhbh
      INTO CORRESPONDING FIELDS OF TABLE lt_zzhxmh
      FROM zpm001b
      WHERE zzjhbh = gt_out-zzjhbh.
    ENDIF.
  ENDIF.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'ZZHXMH'            "lt内表里面的字段
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'ZZHXMH'            "画面上绑定字段
      value_org        = 'S'
      callback_program = sy-repid
    TABLES
      value_tab        = lt_zzhxmh            "需要显示帮助的值内表
      return_tab       = lt_return          "返回值
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.
  IF sy-subrc = 0.
    READ TABLE gt_out INDEX  p_row_no-row_id.
    IF sy-subrc = 0.
    READ TABLE lt_return INTO ls_return INDEX 1.
    IF sy-subrc = 0.
    READ TABLE fieldcat WITH KEY fieldname = ls_return-retfield.
    IF fieldcat-edit = 'X'.
    gt_out-zzhxmh = ls_return-fieldval.
    MODIFY gt_out INDEX p_row_no-row_id
                       TRANSPORTING zzhxmh.
    ENDIF.
    ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " F4_HELP_
FORM bo_callback_form
TABLES record_tab STRUCTURE seahlpres
CHANGING shlp TYPE shlp_descr_t
callcontrol LIKE ddshf4ctrl.
DATA: interface LIKE LINE OF shlp-interface,
fp LIKE LINE OF shlp-fieldprop.
CLEAR interface.
CLEAR fp.

 fp-shlpoutput = 'X'.
 MODIFY shlp-fieldprop FROM fp TRANSPORTING shlpoutput
 WHERE shlpoutput = space.
READ TABLE shlp-interface INTO interface INDEX 1.
interface-shlpfield+4(1) = '1'. "第一个位置。调用F4函数本身就已经有内容,所以会造成选择后面的语言或者是物料描述的时候,物料代码无法更改,所以此处用MODIFY 就可以解决这个问题
interface-valfield = 'ZZJHBH'.
 APPEND interface TO shlp-interface.
MODIFY shlp-interface FROM interface INDEX 1.
interface-shlpfield+4(1) = '2'. "这里的数字 代表F4搜索帮助弹出的ALV对话框,字段的位置,比如此行是显示F4弹出的alv第二列的内容
interface-valfield = 'ZZHXMH'.
APPEND interface TO shlp-interface.
ENDFORM. "bo_callback_form
*&---------------------------------------------------------------------*
*&      Form  FRM_AUTHORIZATION_CHECK_SWERK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_authorization_check_swerk .
  DATA:lv_message TYPE char50.
  DATA:BEGIN OF lt_werks OCCURS 0,
    werks LIKE t001w-werks,
    END OF lt_werks.
  SELECT werks
    INTO CORRESPONDING FIELDS OF TABLE lt_werks
    FROM t001w
    WHERE werks = p_werks.
    LOOP AT lt_werks.
AUTHORITY-CHECK OBJECT 'I_IWERK'
         ID 'TCD' DUMMY
         ID 'IWERK' FIELD lt_werks-werks.
IF sy-subrc <> 0.
  CLEAR lv_message.
  CONCATENATE '你没有该工厂' lt_werks-werks '的权限!' INTO lv_message.
  MESSAGE lv_message TYPE 'E'.
  CLEAR lt_werks.
ENDIF.
   ENDLOOP.
ENDFORM.
--------------------- 
作者:鹏翼丶 
来源:CSDN 
原文:https://blog.csdn.net/liupengpeng1109/article/details/50409551 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 ABAP FUNCTION ALV 添加状态栏下拉框按钮,可以使用函数模块 `REUSE_ALV_HIERSEQ_LIST_DISPLAY`。该函数模块可以在状态栏添加下拉框按钮,用于切换不同的层次结构。 以下是添加下拉框按钮的代码示例: ``` REPORT ztest. DATA: it_list TYPE STANDARD TABLE OF sflight, wa_list TYPE sflight. DATA: it_fieldcat TYPE slis_t_fieldcat_alv. FIELD-SYMBOLS: <fs_fieldcat> TYPE slis_fieldcat_alv. * 初始化 ALV 数据 SELECT * FROM sflight INTO TABLE it_list. * 初始化字段目录 CLEAR: it_fieldcat. wa_fieldcat-fieldname = 'CARRID'. wa_fieldcat-ref_table = 'SCARR'. wa_fieldcat-ref_field = 'CARRID'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'CONNID'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'FLDATE'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'SEATSMAX'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'SEATSOCC'. APPEND wa_fieldcat TO it_fieldcat. CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'PF_STATUS' is_layout = VALUE #( ( hierarchy_seq = 'CARRID' ) ) TABLES t_fieldcat = it_fieldcat t_outtab = it_list. * 定义层次结构下拉框的集合 DATA: it_hier TYPE STANDARD TABLE OF lvc_s_layo WITH HEADER LINE. it_hier-fieldname = 'HIERARCHY_SEQ'. it_hier-seltext_l = '层次结构'. it_hier-selopt = 'O'. it_hier-no_out = 'X'. APPEND it_hier. it_hier-fieldname = 'CARRID'. it_hier-seltext_l = '按航空公司'. it_hier-selopt = 'C'. it_hier-no_out = ' '. APPEND it_hier. it_hier-fieldname = 'FLDATE'. it_hier-seltext_l = '按航班日期'. it_hier-selopt = 'D'. it_hier-no_out = ' '. APPEND it_hier. it_hier-fieldname = 'SEATSMAX'. it_hier-seltext_l = '按最大座位数'. it_hier-selopt = 'S'. it_hier-no_out = ' '. APPEND it_hier. it_hier-fieldname = 'SEATSOCC'. it_hier-seltext_l = '按已占用座位数'. it_hier-selopt = 'O'. it_hier-no_out = ' '. APPEND it_hier. * 设置层次结构下拉框 SET PF-STATUS 'PF_STATUS' EXCLUDING it_hier. * PF-STATUS 事件处理程序 MODULE pf_status OUTPUT. SET PF-STATUS 'PF_STATUS'. SET TITLEBAR 'TITLE'. ENDMODULE. * AT SELECTION-SCREEN 事件处理程序 AT SELECTION-SCREEN ON HIERARCHY_SEQ. LOOP AT it_hier ASSIGNING FIELD-SYMBOL(<fs_hier>). IF <fs_hier>-fieldname = 'HIERARCHY_SEQ'. CONTINUE. ENDIF. IF <fs_hier>-selopt = 'X'. CLEAR: it_list. SELECT * FROM sflight INTO TABLE it_list ORDER BY carrid. ELSE. CLEAR: it_list. SELECT * FROM sflight INTO TABLE it_list ORDER BY ( <fs_hier>-fieldname ). ENDIF. CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'PF_STATUS' is_layout = VALUE #( ( hierarchy_seq = <fs_hier>-fieldname ) ) TABLES t_fieldcat = it_fieldcat t_hierarchy = it_list. ENDLOOP. ``` 在代码,使用了 `REUSE_ALV_HIERSEQ_LIST_DISPLAY` 函数模块来显示 ALV 报表,并在 `is_layout` 参数指定默认的层次结构。在 `pf_status` 事件处理程序设置状态栏的标题,并在 `AT SELECTION-SCREEN` 事件处理程序根据用户选择的层次结构重新查询数据并刷新 ALV 报表。 通过在 `it_hier` 定义层次结构下拉框的集合,并在 `SET PF-STATUS` 语句排除该集合,即可在状态栏添加下拉框按钮。在 `AT SELECTION-SCREEN` 事件处理程序,根据用户选择的层次结构重新查询数据,并使用 `REUSE_ALV_HIERSEQ_LIST_DISPLAY` 函数模块刷新 ALV 报表显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值