1.創建屏幕.
2.屏幕繪製容器(CUSTOMER CONTROL)
3.定義變量
TYPES: BEGIN OF TY_01.
INCLUDE STRUCTURE ZGROUP_2.
TYPES:
FIELD_COLOR TYPE LVC_T_SCOL, "下載嵌套內表錯誤,存儲顏色信息
FIELD_MODIFY TYPE LVC_T_STYL, "存儲編輯信息
END OF TY_01.
DATA GT_GROUP TYPE TABLE OF TY_01.
DATA GS_GROUP TYPE TY_01.
DATA GS_ALV TYPE REF TO CL_GUI_ALV_GRID . "參照CL_GUI_ALV_GRID 創建對象 GS_ALV
DATA GS_PARENT TYPE REF TO CL_GUI_CUSTOM_CONTAINER . "參照CL_GUI_CUSTOM_CONTAINER創建對象
DATA IT_FIFLDCAT TYPE LVC_T_FCAT."定義列結構
DATA IS_FIFLDCAT TYPE LVC_S_FCAT."定義列結構 - 工作區
DATA GS_LAYOUT TYPE LVC_S_LAYO. "存儲LAYOUT 佈局信息
DATA GS_STABLE TYPE LVC_S_STBL. " ALV刷新參數
4.創建ALV 對象
"創建容器對象GS_PARENT,將ALV放在容器中
FORM CREATE_ALV .
CREATE OBJECT GS_PARENT
EXPORTING
CONTAINER_NAME = 'CON1'.
CREATE OBJECT GS_ALV
EXPORTING
I_PARENT = GS_PARENT.
ENDFORM.
4.1爲ALV定義列結構,採用宏定義的方法
DEFINE %%ADD_FIFLDCAT.
CLEAR IS_FIFLDCAT .
GV_POS = GV_POS + 1 . " 列數自動加一
IS_FIFLDCAT-COL_POS = GV_POS.
IS_FIFLDCAT-FIELDNAME = &1. "字段名
IS_FIFLDCAT-SCRTEXT_S = &2. "字段描述
IS_FIFLDCAT-OUTPUTLEN = &3. "輸出長度
CASE &1.
WHEN 'MAKTX'.
* IS_FIFLDCAT-EMPHASIZE = 'C310'. "設置單元格顏色
IS_FIFLDCAT-EDIT = 'X'. "是否可編輯
WHEN 'MATKL'.
IS_FIFLDCAT-EDIT = 'X'.
ENDCASE.
APPEND IS_FIFLDCAT TO IT_FIFLDCAT .
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form BUILD_FIFLDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_FIFLDCAT .
%%ADD_FIFLDCAT:
'MANDT' '集團' '5',
'MATNR' '物料編號' '10',
'MAKTX' '物料描述' '10',
'MATKL' '物料組' '5',
'MEINS' '基本計量單位' '5',
'ERSDA' '創建日期' '10',
'ERNAM' '創建人員名稱' '10',
'CBOX' 'SHENGPI' '3'.
ENDFORM.
4.2 爲ALV設置LAYOUT
FORM BUILD_LAYOUT .
GS_LAYOUT-CWIDTH_OPT = 'X'. "優化列寬
GS_LAYOUT-ZEBRA = 'X'. "斑馬紋
GS_LAYOUT-CTAB_FNAME = 'FIELD_COLOR' . "單元格顏色設置
* GS_LAYOUT-EDIT = 'X'.
GS_LAYOUT-STYLEFNAME = 'FIELD_MODIFY'. "單元格可編輯
ENDFORM.
5.顯示ALV,GS_ALV對象調用SET_TABLE_FOR_FIRST_DISPLAY方法
*&---------------------------------------------------------------------*
*& Form BUILD_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_ALV .
CALL METHOD GS_ALV->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_BUFFER_ACTIVE =
* I_BYPASSING_BUFFER =
* I_CONSISTENCY_CHECK =
* I_STRUCTURE_NAME =
* IS_VARIANT =
* I_SAVE =
* I_DEFAULT = 'X'
IS_LAYOUT = GS_LAYOUT
* IS_PRINT =
* IT_SPECIAL_GROUPS =
IT_TOOLBAR_EXCLUDING = GT_EXCLUDE ”隱藏按鈕
* IT_HYPERLINK =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO =
* IR_SALV_ADAPTER =
CHANGING
IT_OUTTAB = GT_GROUP
IT_FIELDCATALOG = IT_FIFLDCAT
* IT_SORT =
* IT_FILTER =
* EXCEPTIONS
* INVALID_PARAMETER_COMBINATION = 1
* PROGRAM_ERROR = 2
* TOO_MANY_LINES = 3
* OTHERS = 4
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
6.ALV的刷新
*&---------------------------------------------------------------------*
*& Form REFRESH_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM REFRESH_ALV .
GS_STABLE-ROW = 'X'.
GS_STABLE-COL = 'X'.
CALL METHOD GS_ALV->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = GS_STABLE
* I_SOFT_REFRESH =
EXCEPTIONS
FINISHED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
6.1 REFRESH_TABLE_DISPLAY參數信息參照
7. AlV 單元格顏色,單元格可編輯
執行步驟: 顏色 1)在相關內表中增加相關字段 (本例: FIELD_COLOR)
2)給輸出內表獲取數據時,給COLOR賦值
3)設置LAYOUT,給相關字段賦值
可編輯: 1)在相關內表中增加相關字段 (本例:FIELD_MODIFY )
2)STYLE,可修改屬性 可修改: CL_GUI_ALV_GRID=>MC_STYLE_ENALBED
不可修改: CL_GUI_ALV_GRID=>MC_STYLE_DISALBED
3)設置LAYOUT,給相關字段賦值
FORM GET_DATA .
DATA LS_SCOL LIKE LINE OF GS_GROUP-FIELD_COLOR.
DATA LS_STYL TYPE LVC_S_STYL.
SELECT *
FROM ZGROUP_2
INTO CORRESPONDING FIELDS OF TABLE GT_GROUP
WHERE MATNR IN S_MATNR.
LOOP AT GT_GROUP INTO GS_GROUP.
* CLEAR: GS_GROUP-FIELD_MODIFY,GS_GROUP.
"單元格顏色設置
IF GS_GROUP-MATNR IS NOT INITIAL .
LS_SCOL-FNAME = 'MATNR'.
LS_SCOL-COLOR-COL = '3'.
APPEND LS_SCOL TO GS_GROUP-FIELD_COLOR.
ENDIF.
"單元格可編輯
IF GS_GROUP-MAKTX EQ 'SAP_GJX1'.
LS_STYL-FIELDNAME = 'MAKTX'.
* LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
INSERT LS_STYL INTO TABLE GS_GROUP-FIELD_MODIFY.
ENDIF.
"單元格可編輯 MATKL
LS_STYL-FIELDNAME = 'MATKL'.
* LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
INSERT LS_STYL INTO TABLE GS_GROUP-FIELD_MODIFY.
MODIFY GT_GROUP FROM GS_GROUP.
ENDLOOP.
ENDFORM.
8 TOOLBAR,USER_COMMAND,DATA_CHANGED, DOUBLE_CLICK 事件
事件執行步驟:1.ALV實現相關變量定義
2)創建本地類聲明實現
3)創建界面,實例化container,以及ALV格式化
4)註冊相關事件 (1.爲類聲明事件對象SET HANDLER 事件對象->方法 FOR ALV.)
5) 執行ALV顯示
CLASS LCL_COMPT DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR
OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT .
METHODS HANDLER_USER_COMMAND FOR EVENT USER_COMMAND
OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.
METHODS HANDLE_DOUBLE FOR EVENT DOUBLE_CLICK
OF CL_GUI_ALV_GRID
IMPORTING E_ROW
E_COLUMN.
METHODS HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED
OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED .
ENDCLASS.
CLASS LCL_COMPT IMPLEMENTATION.
* ANDLE_TOOLBAR.
METHOD HANDLE_TOOLBAR.
PERFORM CL_HANDLE_TOOLBAR USING E_OBJECT.
ENDMETHOD.
* HANDLER_USER_COMMAND.
METHOD HANDLER_USER_COMMAND.
PERFORM FM_USER_COMMAND USING E_UCOMM .
ENDMETHOD.
* HANDLE_DOUBLE
METHOD HANDLE_DOUBLE .
PERFORM CL_HANDLE_DOUBLE USING E_ROW
E_COLUMN.
ENDMETHOD .
* HANDLE_DATA_CHANGED .
METHOD HANDLE_DATA_CHANGED .
PERFORM FM_HANDLE_DATA_CHANGED USING ER_DATA_CHANGED->MT_MOD_CELLS.
ENDMETHOD.
ENDCLASS.
" 事件註冊
" 1.聲明事件對象
CLASS LCL_COMPT DEFINITION DEFERRED .
DATA EVENT_HANDLER TYPE REF TO LCL_COMPT .
" 2.開始相關注冊
FORM SET_HANDLER .
CREATE OBJECT EVENT_HANDLER.
SET HANDLER EVENT_HANDLER->HANDLE_TOOLBAR FOR GS_ALV.
SET HANDLER EVENT_HANDLER->HANDLER_USER_COMMAND FOR GS_ALV.
SET HANDLER EVENT_HANDLER->HANDLE_DOUBLE FOR GS_ALV.
"HANDLE_DATA_CHANGED 事件註冊分兩步
SET HANDLER EVENT_HANDLER->HANDLE_DATA_CHANGED FOR GS_ALV.
* DATA CHANGED 事件觸發
CALL METHOD GS_ALV->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
”DATA_CHANGED 事件
FORM FM_HANDLE_DATA_CHANGED using PT_CELLS TYPE LVC_T_MODI.
DATA PS_CELL TYPE LVC_S_MODI.
LOOP AT PT_CELLS INTO PS_CELL.
READ TABLE GT_GROUP INTO GS_GROUP INDEX PS_CELL-ROW_ID.
IF SY-SUBRC = 0.
CASE PS_CELL-FIELDNAME.
WHEN 'MAKTX'.
GS_GROUP-MAKTX = PS_CELL-VALUE.
ENDCASE.
ENDIF.
MODIFY GT_GROUP FROM GS_GROUP INDEX PS_CELL-ROW_ID .
ENDLOOP.
ENDFORM.
9.表單下載
相關函數:1)'WS_FILENAME_GET' 2)'GUI_DOWNLOAD'
FORM DOWNLOAD_FILE .
DATA LV_FILENAME TYPE STRING .
*1. 獲取文件名
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = '物料信息表 '
* DEF_PATH = ' '
MASK = ',EXCEL,*.XLS. '
MODE = 'S'
TITLE = '整個表單保存 '
IMPORTING
FILENAME = LV_FILENAME
* RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
EXIT.
* Implement suitable error handling here
ENDIF.
*2. 表單下載
CHECK LV_FILENAME IS NOT INITIAL .
*2.1 下載內表的轉換,設置表頭
IF GT_FIELDNAME IS INITIAL .
GT_FIELDNAME-FIELDNAME = '集團'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '物料編號'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '物料描述'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '物料組' .
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '基本計量單位'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '創建日期'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '創建人員名稱'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '審批狀態'.
APPEND GT_FIELDNAME .
ENDIF.
REFRESH GT_DOWNLOAD.
LOOP AT GT_GROUP INTO GS_GROUP .
CLEAR GS_DOWNLOAD.
MOVE-CORRESPONDING GS_GROUP TO GS_DOWNLOAD .
APPEND GS_DOWNLOAD TO GT_DOWNLOAD .
ENDLOOP.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
FILENAME = LV_FILENAME
* FILETYPE = 'ASC'
* APPEND = ' '
WRITE_FIELD_SEPARATOR = 'X'
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* VIRUS_SCAN_PROFILE = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = GT_DOWNLOAD
FIELDNAMES = GT_FIELDNAME[]
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.