SAP ABAP FUNCATION ALV控件 選中的例子DEMO

加一些DEMO吧,強化一下,ALV的用法老是忘記啊。

這個DEMO的效果,我們在ALV 控件最左邊選中一行,可以知道我們選中了:

一、ALV工具條上加一個自定義按鈕:

SE38中新建一個程序ZALV_SELECT,這個程序一開始只有代碼,但是我們的ALV控件工作起來,其實有一個工具條。

而且這個工具條,需要我們自己定義一個按鈕。這個工具條怎麼來呢?其實拷貝來改改最方便:

1、SE80中選SLVC_FULLSCREEN函數組

2、點右鍵複製,目前程序填上我們的程序名ZALV_SELECT,搞定。

3、我們的程序中打開工具條,加上我們的自定義按鈕,完成。最後注意工具條要激活!

 

二、完整的代碼和代碼重點說明:

1、選中的狀態其實是在一個僅一個字節的字段中打一個X,保留原表的結構,加一個選中字段,注意看GT_TABLE的GS_USR21是怎麼申明的。

2、ALV有2個關鍵的參數,FILEDCAT字段參數和LAYOUT佈局參數。字段參數是給一張表,而佈局參數只是一行結構。

3、在ALV_USER_COMMAND回調的FM中實現用戶自己的一些控制和操作。

 

*&---------------------------------------------------------------------*
*& 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.

 

 

 

 

 

 

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