1功能說明
需要開發一個報表,分為上下兩個部分,下邊需要再分割為左右兩個部分,點擊上邊部分的行,下邊兩個報表信息發生變化。
效果如下:
2代碼實現
1、數據查詢
分別查詢MARA、MARC、MAKT三張表,存放在三個內表中,分別放在1、2、3界面,並調用9000屏幕
9000屏幕中邏輯流
2、創建容器
FRM_CREATE_CONTAINER_9000
創建容器對象方法:
3、分割容器
將創建的容器分割為兩行一列
獲得拆分后的上半部分(第一行,第一列),並設置寬度
獲得拆分后的下半部分(第二行,第一列),將其再次拆分為一行兩列,即左右兩個部分
同樣獲取拆分后的左半部分(第一行第一列),設置寬度,同理設置右半部分
創建ALV對象
其他邏輯與創建普通OOALV一致,在最終顯示時,分別調用三個ALV對象的SET_TABLE_FOR_FIRST_DISPLAY方法即可。
4、雙擊事件
點擊一行時,查詢這行物料對應的MARC和MAKT表中的數據,並展示在2、3區域內
5、方法說明
在實現容器時,常用兩種實現方式,一種是在屏幕中畫區域,一種是只創建屏幕。
① 需要畫區域時,定義容器為:
創建對象方法:
② 不需要畫區域時,定義容器為:
創建容器對象方法:
當分割屏幕是,把容器對象作為參數傳入
此處傳入的容器參數PARENT參照CL_GUI_CONTAINER類,所以傳入的容器對象可以是G_CONTAINER_9000,也可以是G_CONTAINER_9001,因為CL_GUI_CUSTOM_CONTAINER和CL_GUI_DOCKING_CONTAINER都是繼承了CL_GUI_CONTAINER類。
個人傾向於不畫區域的方法,最終展示的效果也會比較美觀,文檔源代碼展示的是不畫區域的做法
3源代碼
*&---------------------------------------------------------------------* REPORT ZTEST001. *----------------------------------------------------------------------* * 數據庫表聲明/Database table declaration *----------------------------------------------------------------------* TABLES:MARA. *--------------------------------------------------------------------* *內表定義 *--------------------------------------------------------------------* TYPES: BEGIN OF TY_ALV, MATNR TYPE MARA-MATNR, "物料號 MTART TYPE MARA-MTART, "物料類型 MATKL TYPE MARA-MATKL, "物料組 MEINS TYPE MARA-MEINS, "基本計量單位 ZCHECK TYPE C, ICON TYPE CHAR4, MSG TYPE CHAR50, END OF TY_ALV. TYPES:BEGIN OF TY_MARC, MATNR TYPE MARC-MATNR, "物料號 WERKS TYPE MARC-WERKS, "工廠 BWTTY TYPE MARC-BWTTY, "評估類別 ZCHECK TYPE C, END OF TY_MARC. TYPES:BEGIN OF TY_MAKT, MATNR TYPE MAKT-MATNR, "物料號 SPRAS TYPE MAKT-SPRAS, "語言代碼 MAKTX TYPE MAKT-MAKTX, "物料描述 ZCHECK TYPE C, END OF TY_MAKT. *----------------------------------------------------------------------* * 全局變量定義/Global variable definition *----------------------------------------------------------------------* DATA:GT_ALV1 TYPE STANDARD TABLE OF TY_ALV, GS_ALV1 TYPE TY_ALV, GT_MAKT TYPE STANDARD TABLE OF TY_MAKT, GS_MAKT TYPE TY_MAKT, GT_MARC TYPE STANDARD TABLE OF TY_MARC, GS_MARC TYPE TY_MARC, LT_ALV2 TYPE STANDARD TABLE OF TY_MARC, LS_ALV2 TYPE TY_MARC, LT_ALV3 TYPE STANDARD TABLE OF TY_MAKT, LS_ALV3 TYPE TY_MAKT. "創建ALV屏幕 DATA: G_GRID_T TYPE REF TO CL_GUI_ALV_GRID, "頂部 G_GRID_L TYPE REF TO CL_GUI_ALV_GRID, "底部——左部 G_GRID_R TYPE REF TO CL_GUI_ALV_GRID, "底部——右部 G_CONTAINER_9000 TYPE REF TO CL_GUI_DOCKING_CONTAINER, "ALV容器 不用畫屏幕容器 cl_gui_custom_container, "ALV container容器 需要畫屏幕容器 G_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER, G_SPLITTER1 TYPE REF TO CL_GUI_SPLITTER_CONTAINER, G_CONTAINER_T TYPE REF TO CL_GUI_CONTAINER, "頂部 G_CONTAINER_B TYPE REF TO CL_GUI_CONTAINER, "底部 G_CONTAINER_L TYPE REF TO CL_GUI_CONTAINER, "底部——左部 G_CONTAINER_R TYPE REF TO CL_GUI_CONTAINER, "底部——右部 GT_EXCLUDE_9000 TYPE UI_FUNCTIONS, " 用於去掉不要的菜單欄 GT_FIELDCAT_T TYPE LVC_T_FCAT, "頂部字段 GT_FIELDCAT_L TYPE LVC_T_FCAT, "底部——左部字段 GT_FIELDCAT_R TYPE LVC_T_FCAT, "底部——右部字段 GS_LAYOUT_L TYPE LVC_S_LAYO, "底部——左部布局 GS_LAYOUT_R TYPE LVC_S_LAYO, "底部——右部布局 GS_VARIANT_T TYPE DISVARIANT, GS_VARIANT_L TYPE DISVARIANT, GS_VARIANT_R TYPE DISVARIANT, GT_SORT TYPE LVC_T_SORT, "用於排序 GS_SORT TYPE LVC_S_SORT, "用於排序 GT_FILT TYPE LVC_T_FILT. DATA:GV_9000 TYPE SCRFNAME VALUE 'Z9000', "GV_TABLE 是屏幕中定義的控件 R_UCOMM LIKE SY-UCOMM, OK_CODE TYPE SY-UCOMM, SAVE_CODE TYPE SY-UCOMM. *&---------------------------------------------------------------------* *& 字段串定義/Field-symbols * *&---------------------------------------------------------------------* FIELD-SYMBOLS:<FS_ALV1> TYPE TY_ALV. *--------------------------------------------------------------------* *ALV參數聲明 *--------------------------------------------------------------------* DATA: GT_FIELDCAT TYPE LVC_T_FCAT, "字段目錄內表 GS_FIELDCAT TYPE LVC_S_FCAT, "字段目錄工作區 GS_LAYOUT TYPE LVC_S_LAYO. "用於定義ALV表單的相關格式、屬性 *--------------------------------------------------------------------* *定義選擇屏幕參數 *--------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK BLK0 WITH FRAME. SELECT-OPTIONS: S_MATNR FOR MARA-MATNR. "物料 SELECT-OPTIONS: S_ERSDA FOR MARA-ERSDA DEFAULT '20190801' TO '20190831'. "創建日期 SELECTION-SCREEN END OF BLOCK BLK0. *&---------------------------------------------------------------------* *& INITIALIZATION/選擇屏幕前初始化 * *&---------------------------------------------------------------------* INITIALIZATION. CLASS ALV_EVENT_9000 DEFINITION DEFERRED." CLASS ALV_EVENT_9000 DEFINITION. PUBLIC SECTION. METHODS HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID"雙擊事件 IMPORTING E_ROW E_COLUMN ES_ROW_NO. METHODS HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID"用戶按鈕事件 IMPORTING E_UCOMM. METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID"工具條事件 IMPORTING E_OBJECT E_INTERACTIVE. ENDCLASS. "alv_event_9000 DEFINITION *----------------------------------------------------------------------* * CLASS BELOW_ALV_EVENT IMPLEMENTATION 定義的事件類對應的事件響應模塊 *----------------------------------------------------------------------* CLASS ALV_EVENT_9000 IMPLEMENTATION. METHOD HANDLE_DOUBLE_CLICK . "雙擊事件 PERFORM FRM_DOUBLE_CLICK USING E_ROW E_COLUMN ES_ROW_NO. ENDMETHOD. "HANDLE_USER_COMMAND METHOD HANDLE_USER_COMMAND. "用戶按鈕事件 PERFORM FRM_HANDLE_USER_COMMAND9000 USING E_UCOMM. ENDMETHOD. "handle_hotspot_click METHOD HANDLE_TOOLBAR. "工具條事件 PERFORM FRM_HANDLE_TOOLBAR9000 USING E_OBJECT E_INTERACTIVE."設置工具條圖標 ENDMETHOD. "HANDLE_DOUBLE_CLICK ENDCLASS. "alv_event_9000 IMPLEMENTATION AT SELECTION-SCREEN. *&---------------------------------------------------------------------* *& Start-of-selection/開始選擇屏幕 * *&---------------------------------------------------------------------* START-OF-SELECTION. "獲取數據 PERFORM FRM_GET_DATA. *&---------------------------------------------------------------------* *& Form FRM_LAYOUT *&---------------------------------------------------------------------* FORM FRM_LAYOUT. CLEAR:GS_LAYOUT,GS_LAYOUT_L,GS_LAYOUT_R. GS_LAYOUT-GRID_TITLE = '第1個界面'. "標題 GS_LAYOUT-CWIDTH_OPT = 'A'. "優化列寬 GS_LAYOUT-ZEBRA = 'X'. "斑馬線 GS_LAYOUT-SEL_MODE = 'A'. "設置行模式" GS_LAYOUT-BOX_FNAME = 'ZCHECK'."選擇行控制 GS_LAYOUT_L = GS_LAYOUT_R = GS_LAYOUT. GS_LAYOUT_L-GRID_TITLE = '第2個界面'. "標題 GS_LAYOUT_R-GRID_TITLE = '第3個界面'. "標題 ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA3 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_GET_DATA. SELECT MATNR"物料號 MTART"物料類型 MATKL"物料組 MEINS"基本計量單位 FROM MARA INTO TABLE GT_ALV1 WHERE MATNR IN S_MATNR AND ERSDA IN S_ERSDA. IF GT_ALV1 IS NOT INITIAL. SELECT MATNR"物料號 WERKS"工廠 BWTTY"評估類別 FROM MARC INTO TABLE GT_MARC FOR ALL ENTRIES IN GT_ALV1 WHERE MATNR = GT_ALV1-MATNR. SELECT MATNR"物料號 SPRAS"語言代碼 MAKTX"物料描述 FROM MAKT INTO TABLE GT_MAKT FOR ALL ENTRIES IN GT_ALV1 WHERE MATNR = GT_ALV1-MATNR. ENDIF. IF GT_ALV1 IS INITIAL. MESSAGE '系統中無相關數據' TYPE 'S' DISPLAY LIKE 'E'. STOP. ELSE. CALL SCREEN 9000. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_FIELDCAT3 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_FIELDCAT4. *&---alv 表頭宏 DEFINE INIT_FIELDCAT. CLEAR gs_fieldcat. gs_fieldcat-fieldname = &1. " 字段技術名稱 gs_fieldcat-coltext = &2. " 顯示名稱 gs_fieldcat-ref_table = &3. " 參照表,標准功能實現例如搜索幫助 gs_fieldcat-ref_field = &4. " 參照表字段,標准功能實現例如搜索幫助 gs_fieldcat-no_init_ch = &5. gs_fieldcat-EDIT = &6. " 是否可以編輯 gs_fieldcat-KEY = &7. " gs_fieldcat-HOTSPOT = &8. " gs_fieldcat-outputlen = &9. " APPEND gs_fieldcat TO gt_fieldcat. END-OF-DEFINITION. REFRESH:GT_FIELDCAT. INIT_FIELDCAT 'MATNR' '物料號' '' '' '' '' '' '' '' . INIT_FIELDCAT 'MTART' '物料類型' '' '' '' '' '' '' '' . INIT_FIELDCAT 'MATKL' '物料組' '' '' '' '' '' '' '' . INIT_FIELDCAT 'MEINS' '基本計量單位' '' '' '' '' '' '' '' . GT_FIELDCAT_T = GT_FIELDCAT. REFRESH:GT_FIELDCAT. INIT_FIELDCAT 'MATNR' '物料號' '' '' '' '' '' '' '' . INIT_FIELDCAT 'WERKS' '工廠' '' '' '' '' '' '' '' . INIT_FIELDCAT 'BWTTY' '評估類別' '' '' '' '' '' '' '' . GT_FIELDCAT_L = GT_FIELDCAT. REFRESH:GT_FIELDCAT. INIT_FIELDCAT 'MATNR' '物料號' '' '' '' '' '' '' '' . INIT_FIELDCAT 'SPRAS' '語言代碼' '' '' '' '' '' '' '' . INIT_FIELDCAT 'MAKTX' '物料描述' '' '' '' '' '' '' '' . GT_FIELDCAT_R = GT_FIELDCAT. ENDFORM. FORM FRM_ENTER_DATA. MESSAGE '調用方法成功' TYPE 'S'. ENDFORM. MODULE STATUS_9000 OUTPUT. SET PF-STATUS 'STANDARD'. ENDMODULE. MODULE DISPLAY_ALV_9000 OUTPUT. IF G_CONTAINER_9000 IS NOT BOUND. PERFORM FRM_CREATE_CONTAINER_9000. * PERFORM FRM_ALV_SORT_9000. PERFORM FRM_FIELDCAT4. PERFORM FRM_LAYOUT. PERFORM FRM_ALV_BTN_EXCLUDE_9000. PERFORM FRM_ALV_EVENT_9000. PERFORM FRM_ALV_DISPLAY_9000. ELSE. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_L. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_R. ENDIF. ENDMODULE. MODULE USER_COMMAND_9000 INPUT. DATA: LT_ROW TYPE LVC_T_ROW, LT_ROID TYPE LVC_T_ROID, LS_ROW TYPE LVC_S_ROW. SAVE_CODE = OK_CODE. CLEAR OK_CODE. CASE SAVE_CODE. WHEN '&BACK'."設置功能鍵返回按鈕單擊事件 LEAVE TO SCREEN 0. WHEN '&EXIT'. LEAVE PROGRAM. ENDCASE. ENDMODULE. *&---------------------------------------------------------------------* *& Form FRM_CREATE_CONTAINER_9000 *& 創建容器 *&---------------------------------------------------------------------* FORM FRM_CREATE_CONTAINER_9000. * 創建 容器 CREATE OBJECT G_CONTAINER_9000 EXPORTING REPID = SY-REPID DYNNR = '9000' * side = cl_gui_docking_container=>dock_at_right ”ALV貼屏幕右邊,從屏幕右邊開始算寬度 SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_TOP "ALV貼屏幕左邊,從左邊算屏幕寬度, EXTENSION = 1000 "屏幕寬度 * ratio = 95 "屏幕比例 小於5大於95會報cntl_error異常 STYLE = CL_GUI_CONTROL=>WS_CHILD "可選參數,設置ALV是否可用手動拖動大小 EXCEPTIONS CNTL_ERROR = 1 CNTL_SYSTEM_ERROR = 2 CREATE_ERROR = 3 LIFETIME_ERROR = 4 LIFETIME_DYNPRO_DYNPRO_LINK = 5 OTHERS = 6. IF SY-SUBRC <> 0. MESSAGE S001(00) WITH '屏幕初始化失敗'. LEAVE LIST-PROCESSING. ENDIF. "拆分成2行1列部分 CREATE OBJECT G_SPLITTER EXPORTING PARENT = G_CONTAINER_9000 ROWS = 2 COLUMNS = 1. "一行一列 CALL METHOD G_SPLITTER->GET_CONTAINER EXPORTING ROW = 1 COLUMN = 1 RECEIVING CONTAINER = G_CONTAINER_T. CALL METHOD G_SPLITTER->SET_COLUMN_WIDTH EXPORTING ID = 1 WIDTH = 100. "二行一列* CALL METHOD G_SPLITTER->GET_CONTAINER EXPORTING ROW = 2 COLUMN = 1 RECEIVING CONTAINER = G_CONTAINER_B. "拆分成一行二列部分* CREATE OBJECT G_SPLITTER1 EXPORTING PARENT = G_CONTAINER_B ROWS = 1 COLUMNS = 2. "一行一列* CALL METHOD G_SPLITTER1->GET_CONTAINER EXPORTING ROW = 1 COLUMN = 1 RECEIVING CONTAINER = G_CONTAINER_L. CALL METHOD G_SPLITTER1->SET_COLUMN_WIDTH EXPORTING ID = 2 WIDTH = 50. "*一行二列* CALL METHOD G_SPLITTER1->GET_CONTAINER EXPORTING ROW = 1 COLUMN = 2 RECEIVING CONTAINER = G_CONTAINER_R. CALL METHOD G_SPLITTER1->SET_COLUMN_WIDTH EXPORTING ID = 3 WIDTH = 50. CREATE OBJECT G_GRID_T"上半部分 EXPORTING I_PARENT = G_CONTAINER_T. CREATE OBJECT G_GRID_L"左半部分 EXPORTING I_PARENT = G_CONTAINER_L. CREATE OBJECT G_GRID_R"右半部分 EXPORTING I_PARENT = G_CONTAINER_R. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV_BTN_EXCLUDE_9000 *& 排除不用的按鈕 *&---------------------------------------------------------------------* FORM FRM_ALV_BTN_EXCLUDE_9000. DATA: LS_EXCLUDE TYPE UI_FUNC. REFRESH GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_DETAIL. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CHECK. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. CLEAR LS_EXCLUDE. LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_REFRESH. APPEND LS_EXCLUDE TO GT_EXCLUDE_9000. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV_EVENT_9000 *&---------------------------------------------------------------------* FORM FRM_ALV_EVENT_9000. DATA: LR_EVENT_HANDLER TYPE REF TO ALV_EVENT_9000. * CALL METHOD G_GRID_T->register_edit_event "注冊回車事件 * EXPORTING * i_event_id = cl_gui_alv_grid=>mc_evt_enter. * * CALL METHOD g_grid_9000->register_edit_event "注冊失去鼠標事件 * EXPORTING * i_event_id = cl_gui_alv_grid=>mc_evt_modified. IF LR_EVENT_HANDLER IS INITIAL. CREATE OBJECT LR_EVENT_HANDLER. ENDIF. * SET HANDLER LR_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR G_GRID_9000. "數據改動事件 SET HANDLER LR_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR G_GRID_T. * SET HANDLER LR_EVENT_HANDLER->HANDLE_ON_F4 FOR G_GRID_9000. * SET HANDLER LR_EVENT_HANDLER->HANDLE_HOTSPOT_CLICK FOR G_GRID_9000 . SET HANDLER LR_EVENT_HANDLER->HANDLE_TOOLBAR FOR G_GRID_T. "工具欄事件 SET HANDLER LR_EVENT_HANDLER->HANDLE_USER_COMMAND FOR G_GRID_T. "用戶命令事件 ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV_DISPLAY_9000 *&---------------------------------------------------------------------* FORM FRM_ALV_DISPLAY_9000. CALL METHOD G_GRID_T->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING * I_CONSISTENCY_CHECK = 'X' IS_VARIANT = GS_VARIANT_T IT_TOOLBAR_EXCLUDING = GT_EXCLUDE_9000 I_SAVE = 'A' I_DEFAULT = 'X' "允許定義默認布局 IS_LAYOUT = GS_LAYOUT CHANGING IT_OUTTAB = GT_ALV1 IT_FIELDCATALOG = GT_FIELDCAT_T EXCEPTIONS INVALID_PARAMETER_COMBINATION = 1 PROGRAM_ERROR = 2 TOO_MANY_LINES = 3 OTHERS = 4. IF SY-SUBRC <> 0. ENDIF. CALL METHOD G_GRID_L->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING * I_CONSISTENCY_CHECK = 'X' IS_VARIANT = GS_VARIANT_L IT_TOOLBAR_EXCLUDING = GT_EXCLUDE_9000 I_SAVE = 'A' I_DEFAULT = 'X' "允許定義默認布局 IS_LAYOUT = GS_LAYOUT_L * IS_PRINT = GS_PRINT_H CHANGING IT_OUTTAB = LT_ALV2 IT_FIELDCATALOG = GT_FIELDCAT_L EXCEPTIONS INVALID_PARAMETER_COMBINATION = 1 PROGRAM_ERROR = 2 TOO_MANY_LINES = 3 OTHERS = 4. IF SY-SUBRC <> 0. ENDIF. CALL METHOD G_GRID_R->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING * I_CONSISTENCY_CHECK = 'X' IS_VARIANT = GS_VARIANT_R IT_TOOLBAR_EXCLUDING = GT_EXCLUDE_9000 I_SAVE = 'A' I_DEFAULT = 'X' "允許定義默認布局 IS_LAYOUT = GS_LAYOUT_R * IS_PRINT = GS_PRINT_H CHANGING IT_OUTTAB = LT_ALV3 IT_FIELDCATALOG = GT_FIELDCAT_R EXCEPTIONS INVALID_PARAMETER_COMBINATION = 1 PROGRAM_ERROR = 2 TOO_MANY_LINES = 3 OTHERS = 4. IF SY-SUBRC <> 0. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOUBLE_CLICK *&---------------------------------------------------------------------* FORM FRM_DOUBLE_CLICK USING P_E_ROW_ID TYPE LVC_S_ROW P_E_COLUMN_ID TYPE LVC_S_COL P_ES_ROW_NO TYPE LVC_S_ROID. READ TABLE GT_ALV1 INTO GS_ALV1 INDEX P_ES_ROW_NO-ROW_ID."得到點擊的行 IF SY-SUBRC EQ 0. REFRESH:LT_ALV2,LT_ALV3. LOOP AT GT_MARC INTO GS_MARC WHERE MATNR = GS_ALV1-MATNR. CLEAR:LS_ALV2. MOVE-CORRESPONDING GS_MARC TO LS_ALV2. APPEND LS_ALV2 TO LT_ALV2. CLEAR:GS_MARC. ENDLOOP. LOOP AT GT_MAKT INTO GS_MAKT WHERE MATNR = GS_ALV1-MATNR. CLEAR:LS_ALV3. MOVE-CORRESPONDING GS_MAKT TO LS_ALV3. APPEND LS_ALV3 TO LT_ALV3. CLEAR:GS_MAKT. ENDLOOP. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_L. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_R. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_HANDLE_USER_COMMAND *&---------------------------------------------------------------------* FORM FRM_HANDLE_USER_COMMAND9000 USING PV_UCOMM. CALL METHOD G_GRID_T->GET_SELECTED_ROWS IMPORTING ET_INDEX_ROWS = LT_ROW ET_ROW_NO = LT_ROID. FIELD-SYMBOLS:<FS_ZCHECK>. * 因為OOALV中側邊欄選擇框不起作用,但是需要使用,就將選中的行的側邊欄的值修改一下 LOOP AT GT_ALV1 ASSIGNING <FS_ALV1>. <FS_ALV1>-ZCHECK = ''. ENDLOOP. IF LT_ROW IS NOT INITIAL. LOOP AT LT_ROW INTO LS_ROW. LOOP AT GT_ALV1 ASSIGNING <FS_ALV1>. IF SY-TABIX = LS_ROW-INDEX. <FS_ALV1>-ZCHECK = 'X'. ENDIF. ENDLOOP. CLEAR:LS_ROW. ENDLOOP. ELSE. MESSAGE '請選擇數據' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. CASE PV_UCOMM. WHEN '&ENTER'."審批通過 PERFORM FRM_ENTER_DATA. WHEN OTHERS. ENDCASE. PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_HANDLE_TOOLBAR *&---------------------------------------------------------------------* FORM FRM_HANDLE_TOOLBAR9000 USING P_OBJECT P_INTERACTIVE. PERFORM FRM_HANDLE_TOOLBAR_PRO USING P_OBJECT '&ENTER' '@0V@' '確認'. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_HANDLE_TOOLBAR_PRO *&---------------------------------------------------------------------* FORM FRM_HANDLE_TOOLBAR_PRO USING P_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET P_FUNCTION TYPE STB_BUTTON-FUNCTION P_ICON TYPE STB_BUTTON-ICON P_TEXT TYPE STB_BUTTON-TEXT. DATA: LS_TOOLBAR TYPE STB_BUTTON, LV_QUICKINFO TYPE STB_BUTTON-QUICKINFO. CLEAR LS_TOOLBAR. MOVE 3 TO LS_TOOLBAR-BUTN_TYPE. " 分隔符 APPEND LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR. CLEAR LS_TOOLBAR. MOVE 0 TO LS_TOOLBAR-BUTN_TYPE. " 按鈕(正常) MOVE P_FUNCTION TO LS_TOOLBAR-FUNCTION. "功能碼 MOVE P_ICON TO LS_TOOLBAR-ICON. "圖標 MOVE P_TEXT TO LS_TOOLBAR-TEXT. "顯示文本 LV_QUICKINFO = P_TEXT. MOVE LV_QUICKINFO TO LS_TOOLBAR-QUICKINFO. APPEND LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_REFRESH_ALV_9000 *&---------------------------------------------------------------------* FORM FRM_REFRESH_ALV_9000 USING PV_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA: LT_CELLTAB TYPE LVC_T_STYL, LS_CELLTAB TYPE LVC_S_STYL, LS_STABLE TYPE LVC_S_STBL. LS_STABLE-ROW = 'X'. "固定行 LS_STABLE-COL = 'X'. "固定列 CHECK PV_GRID IS NOT INITIAL. CALL METHOD PV_GRID->REFRESH_TABLE_DISPLAY EXPORTING IS_STABLE = LS_STABLE * I_SOFT_REFRESH = 'X' EXCEPTIONS FINISHED = 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. CALL METHOD CL_GUI_CFW=>FLUSH. ENDFORM.