SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO

选中DEMO的效果:

用户在ALV 控件最左边选中一行,然后点自定义的button, 程序知道用户选中了这一行:

内存中的数据状态其实是这样的:

一、ALV控件的工具条上加一个自定义按钮:

SE38中新建一个程序ZALV_SELECT,这个程序一开始只有代码,但是我们的ALV控件工作起来,其实有一个工具条。

而且这个工具条,需要我们自己定义一个按钮。这个工具条怎么来呢?其实拷贝来改改最方便:

1、SE80中选SLVC_FULLSCREEN函数组

2、点右键复制,目前程序填上我们的程序名ZALV_SELECT,搞定。

3、我们的程序中打开工具条,加上我们的自定义按钮,完成。最后注意工具条要激活!

二、重点说明:

1、选中的状态其实是在一个仅一个字节的字段中打一个X,保留原表的结构,加一个选中字段,注意看GT_TABLE的GS_USR21是怎么申明的。

2、ALV有2个关键的参数,FILEDCAT是字段参数、LAYOUT是布局参数。

FILEDCAT字段参数是给一张数据表,而布局参数只是一行数据结构。

注意是在LAYOUT布局参数中申明存放选中的字段:  GS_LOUT-BOX_FNAME = 'SELXXX'.

3、用户在ALV控件的行选中,对应的内存中【SELXXX】字段会被打上X。 然后用户再点一下BUTTON,程序执行到我们的回调函数:ALV_USER_COMMAND;在回调函数中,我们遍历【SELXXX】字段,找到有X的行,完成对用户选中的识别。

三、完整的DEMO代码:

*&---------------------------------------------------------------------*
*& REPORT ZALV_SELECT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALV_SELECT.

DATA: GT_FCAT TYPE LVC_T_FCAT.
DATA: GS_LOUT TYPE LVC_S_LAYO.


DATA BEGIN OF GS_USR21.
       INCLUDE STRUCTURE USR21.
DATA   SELXXX  TYPE C.  "用来记录行选择的字段
DATA END OF GS_USR21.


DATA GT_TABLE LIKE TABLE OF GS_USR21.

START-OF-SELECTION.
SELECT * INTO TABLE GT_TABLE FROM USR21.
END-OF-SELECTION.


PERFORM FM_INIT_ALV.
PERFORM FM_SHOW_ALV TABLES GT_TABLE
                          USING GT_FCAT
                                GS_LOUT.




FORM FM_INIT_ALV .

"===============FIELDCAT字段参数===================

          PERFORM ADD_FIELD_LVC TABLES GT_FCAT
                                USING 'BNAME' '' '' '' '' '编号' '' '' '' '' ''.

          PERFORM ADD_FIELD_LVC TABLES GT_FCAT
                                USING 'PERSNUMBER' '' '' '' '' '编号' '' '' '' '' ''.

"===============LAYOUT 布局参数===================

  GS_LOUT-BOX_FNAME = 'SELXXX'.
  GS_LOUT-ZEBRA = 'X'.
  GS_LOUT-CWIDTH_OPT = 'X'.
  GS_LOUT-STYLEFNAME = 'EDIT_T_STYLE'. "指定编辑状态的字段名,还需要把某列先打开为可编辑

ENDFORM.




FORM ADD_FIELD_LVC TABLES GT_FIELDCAT_LVC STRUCTURE LVC_S_FCAT
                                           USING I_FIELDNAME TYPE LVC_RFNAME
                                                 I_REF_FIELD TYPE LVC_RFNAME
                                                 I_REF_TABLE TYPE LVC_TNAME
                                                 I_KEY TYPE C
                                                 I_QFIELDNAME TYPE LVC_QFNAME
                                                 I_TEXT TYPE STRING
                                                 I_EDIT TYPE C
                                                 I_NZERO TYPE C
                                                 I_F4 TYPE C
                                                 I_BOX TYPE C
                                                 I_ICON TYPE C
                                                 .

  DATA GS_FIELDCAT_LVC TYPE LVC_S_FCAT.

  CLEAR GS_FIELDCAT_LVC.

  GS_FIELDCAT_LVC-FIELDNAME = I_FIELDNAME.
  GS_FIELDCAT_LVC-REF_FIELD = I_REF_FIELD.
  GS_FIELDCAT_LVC-REF_TABLE = I_REF_TABLE.
  GS_FIELDCAT_LVC-KEY       = I_KEY.
  GS_FIELDCAT_LVC-QFIELDNAME = I_QFIELDNAME.
  GS_FIELDCAT_LVC-COLDDICTXT = 'L'.
  GS_FIELDCAT_LVC-SCRTEXT_L = I_TEXT.
  GS_FIELDCAT_LVC-EDIT = I_EDIT.
  GS_FIELDCAT_LVC-NO_ZERO = I_NZERO.
  GS_FIELDCAT_LVC-F4AVAILABL = I_F4.
  GS_FIELDCAT_LVC-CHECKBOX      = I_BOX. "搞成CHECKBOX
  GS_FIELDCAT_LVC-ICON = I_ICON.


  "设置字段的颜色
  IF I_FIELDNAME = 'BNAME'.
      GS_FIELDCAT_LVC-EMPHASIZE = 'C700'.
  ENDIF.


  IF I_FIELDNAME = 'SELXXX'.


    "GS_FIELDCAT_LVC-CHECKBOX = 'X'.
    "GS_FIELDCAT_LVC-FIX_COLUMN = 'X'.


  ENDIF.

  APPEND GS_FIELDCAT_LVC TO GT_FIELDCAT_LVC.

ENDFORM.                       "ADD_FIELD_LVC


  FORM FM_SHOW_ALV TABLES IT_OUTTAB
                    USING IT_FIELDCAT TYPE LVC_T_FCAT
                          I_LAYOUT TYPE LVC_S_LAYO.




        DATA GS_EVENT TYPE SLIS_ALV_EVENT.
        DATA GT_EVENT TYPE SLIS_T_EVENT.
        GS_EVENT-NAME = 'PF_STATUS_SET'.
        GS_EVENT-FORM = 'ALV_STATUS_SET'.
        APPEND GS_EVENT TO GT_EVENT.



      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          I_CALLBACK_PROGRAM       = SY-CPROG
       "   I_CALLBACK_PF_STATUS_SET = I_STATUS


          IT_EVENTS               = GT_EVENT             "我们加了
          I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'   "我们加了

       "   I_CALLBACK_TOP_OF_PAGE   = I_TITLE
          IS_LAYOUT_LVC            = I_LAYOUT
          IT_FIELDCAT_LVC          = IT_FIELDCAT
          I_SAVE                   = 'A'
        TABLES
          T_OUTTAB                 = GT_TABLE
        EXCEPTIONS
          PROGRAM_ERROR            = 1
          OTHERS                   = 2.

      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

ENDFORM.                    "SUB_CALL_ALV



"------------加载STATUS的FORM--------------------
  FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
    CLEAR: PT_EXTAB[].
    SET PF-STATUS 'STANDARD_FULLSCREEN'.
  ENDFORM.



"------------点了ALV工具条的按钮--------------------
FORM ALV_USER_COMMAND USING P_UCOMM LIKE SY-UCOMM P_SELFIELD TYPE SLIS_SELFIELD.  "P_SELFIELD 用户鼠标选择的一个字段

  "应用方法将修改ALV的数据保存到内表中
    DATA LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
    DATA L_TABIX LIKE SY-TABIX.  "系统参数   行号

  "此处代码将用户输入读入内表(这一步不可少)
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "自动刷新数据
      IMPORTING
        E_GRID = LR_GRID.
    CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
    P_SELFIELD-REFRESH = 'X'. "此处代码阻止'REUSE_ALV_GRID_DISPLAY创建新的屏幕,造成屏幕多层
    P_SELFIELD-ROW_STABLE = 'X'. "保证行、列位置在自动刷新时不变
    P_SELFIELD-COL_STABLE = 'X'.

  CASE P_UCOMM.

    WHEN 'B1'.

      DATA:L_COUNT TYPE N,
       L_MSG   TYPE CHAR100.

      LOOP AT GT_TABLE TRANSPORTING NO FIELDS WHERE SELXXX = 'X'.
        L_COUNT = L_COUNT + 1.
      ENDLOOP.
      CONCATENATE 'SELECT'
                  L_COUNT
                  'ROWS'
             INTO L_MSG
         SEPARATED BY SPACE.
      MESSAGE L_MSG TYPE 'I'.

    WHEN 'B2'.


  ENDCASE.
ENDFORM.

猜你喜欢

转载自blog.csdn.net/ot512csdn/article/details/105170793