SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO详解编程语言

选中DEMO的效果:

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

SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO详解编程语言

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

SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO详解编程语言

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

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

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

1、SE80中选SLVC_FULLSCREEN函数组

SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO详解编程语言

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

SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO详解编程语言

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

SAP ABAP FUNCATION ALV控件 用户选择选中的例子DEMO详解编程语言

二、重点说明:

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.

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18267.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论