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.

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章