【轉載】SAP OO ALV 在自定義螢幕上新增ALV控制元件 一個螢幕上使用2個ALV
終於完成了 OO ALV的學習,第一個作品。 一個螢幕上放了2個ALV控制元件,上面用來顯示錶頭,下面用來顯示詳細的行專案。
業務背景:
在汽車的售後服務環節,汽車零件在質保期內損壞,維修產生的費用,整車廠會追溯到零件供應商索取。
資料模型簡介:
三包索賠單資料從銷售系統中傳入ERP系統。
對三包索賠原始資料我們設計了2張表來存放,
一張是表頭表,存放三包索賠單號及相關資訊,另一張是詳細專案表,存放詳細使用的零件專案。
表頭表和詳細專案表的關係是一對多,即一條表頭表(三包索賠單)對應多條詳細專案(結算單)。
ERP系統功能設計:
物流部門需要對三包索賠單資料管理並打印出來發給供應商協商。
1. ABAP程式需要在ERP系統中用2個ALV展示三包索賠資料和行專案,一條三包索賠資料對應多條詳細專案。
2. 選中ALV1中的一條三包索賠資料,ALV2中列出相關的詳細專案。
3.點選自定義按鈕,完成對一個三包索賠單資料的審批和列印單據。
ABAP程式碼說明:
這次我們要實現一個螢幕放入2個ALV列表控制元件,點選第一個ALV控制元件(只能單選),帶出資料放入第二個ALV控制元件中。
使用FUNCTION ALV目前看來已經不能滿足要求,需要用OO方式來控制ALV,這樣就可以在一個螢幕上畫上2個ALV。
所以建立螢幕在所難免,我們建立一個螢幕0100,放2個自定義控制元件,取名CON1,CON2.
螢幕會帶出3個模組,所有這些模組程式碼,我選擇全部放到一個源程式中,這樣使用比較方便:
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE INIT_CON.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
STATUS_0100 模組中,我們設定程式主畫面的STAUTS,STAUTS是自己準備的,也可以用標準的。
USER_COMMAND_0100 模組,就是對STAUTS上的綠,黃,紅工具條按鈕按下的效果。
INIT_CON 模組中,是初始化螢幕和ALV控制元件,第一個ALV控制元件,我們會把資料也填充到內表,然後交有ALV顯示出來。
該模組中,我們可以看到OO ALV的使用方法,即CREATE OBJECT CON1_REF連線到CON1螢幕控制元件上,CREATE OBJECT G_GRID1再建立ALV物件,然後我們給ALV物件註冊幾個事件,
1. HANDLE_TOOLBAR這個事件用於給ALV加自定義的工具條按鈕。
2. HANDLE_CLICK用於給ALV點選其中一行後的處理程式碼段。
3. HANDLE_COMMAND事件用於接收使用者按了自定義按鈕後,觸發的程式碼段。
ABAP中對於事件的使用我分為4步:
1. 定義事件方法
2. 指定事件的執行方法程式碼
3. 事件變數例項化
4. 把事件指定到ALV控制元件中(註冊事件)
*&---------------------------------------------------------------------*
*& Module INIT_CON OUTPUT
*&---------------------------------------------------------------------*
* text 控制元件初始化模組
*----------------------------------------------------------------------*
MODULE INIT_CON OUTPUT.
"---------第一個ALV控制元件-----------------
IF CON1_REF IS INITIAL.
DATA GS_LAYOUT1 TYPE LVC_S_LAYO.
GS_LAYOUT1-CWIDTH_OPT = 'X'.
GS_LAYOUT1-GRID_TITLE = '三包索賠單'.
GS_LAYOUT1-SEL_MODE = 'B'.
GS_LAYOUT1-ZEBRA = 'X'.
DATA GT_FIELDCAT TYPE LVC_T_FCAT.
DATA GS_FIELDCAT TYPE LVC_S_FCAT.
GS_FIELDCAT-COL_POS = 1. GS_FIELDCAT-FIELDNAME = 'BOX'. GS_FIELDCAT-CHECKBOX = 'X'. GS_FIELDCAT-HOTSPOT = 'X'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 2. GS_FIELDCAT-FIELDNAME = 'TZNUM'. GS_FIELDCAT-COLTEXT = '三包索賠單號'. APPEND GS_FIELDCAT TO GT_FIELDCAT. CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 3. GS_FIELDCAT-FIELDNAME = 'LIFNR'. GS_FIELDCAT-COLTEXT = '供應商程式碼'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 4. GS_FIELDCAT-FIELDNAME = 'NAME1'. GS_FIELDCAT-COLTEXT = '供應商名稱'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 5. GS_FIELDCAT-FIELDNAME = 'ERDAT'. GS_FIELDCAT-COLTEXT = '日期'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 6. GS_FIELDCAT-FIELDNAME = 'EINFR'. GS_FIELDCAT-COLTEXT = '運費'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
* GS_FIELDCAT-COL_POS = 7. GS_FIELDCAT-FIELDNAME = 'SUMME'. GS_FIELDCAT-COLTEXT = '總計'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 8. GS_FIELDCAT-FIELDNAME = 'CHUKU'. GS_FIELDCAT-COLTEXT = '出庫'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 9. GS_FIELDCAT-FIELDNAME = 'ISSHEN'. GS_FIELDCAT-COLTEXT = '審批'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 10. GS_FIELDCAT-FIELDNAME = 'ISDEL'. GS_FIELDCAT-COLTEXT = '刪除'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
CREATE OBJECT CON1_REF
EXPORTING
CONTAINER_NAME = 'CON1'.
CREATE OBJECT G_GRID1
EXPORTING
I_PARENT = CON1_REF.
"4 註冊事件控制代碼,圖示的還必須加在這裡,不然不行
CREATE OBJECT EVENT_RECEIVER2.
SET HANDLER EVENT_RECEIVER2->HANDLE_TOOLBAR FOR G_GRID1.
"4 註冊事件控制代碼
CREATE OBJECT EVENT_RECEIVER.
SET HANDLER EVENT_RECEIVER->HANDLE_CLICK FOR G_GRID1.
"4 註冊事件控制代碼
CREATE OBJECT EVENT_RECEIVER3.
SET HANDLER EVENT_RECEIVER3->HANDLE_COMMAND FOR G_GRID1.
CALL METHOD G_GRID1->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = GS_LAYOUT1
CHANGING
IT_OUTTAB = GT_ITAB_HEAD[]
IT_FIELDCATALOG = GT_FIELDCAT.
ENDIF.
ALV1在非編輯模式單選控制的實現:
使用者單擊ALV1中的CKECKBOX時,
1. 程式首選清空ALV中的全部CKECKBOX
2. 打上當前使用者選的一個CKECKBOX
3. 重新整理ALV
全部程式碼:
*&---------------------------------------------------------------------*
*& Report ZMMR0093
*& 三包索賠單審批及列印程式 濰柴(重慶)汽車
*&---------------------------------------------------------------------*
*& james_lx
*& 2015.12.10
*&---------------------------------------------------------------------*
REPORT ZMMR0093.
TYPE-POOLS: ICON.
TABLES: ZSDT029,ZSDT030.
DATA GS_ZSDT_LOG029 LIKE ZSDT_LOG029.
DATA GT_ZSDT029 LIKE TABLE OF ZSDT029 WITH HEADER LINE.
DATA GT_ZSDT030 LIKE TABLE OF ZSDT030 WITH HEADER LINE.
DATA GT_ITAB LIKE TABLE OF ZSDS045 WITH HEADER LINE.
DATA GT_ITAB_HEAD LIKE TABLE OF ZSDS045 WITH HEADER LINE.
DATA GS_ITAB_HEAD LIKE ZSDS045 .
DATA GT_PRINT LIKE TABLE OF ZSDS045 WITH HEADER LINE.
DATA GV_KNUMH LIKE A017-KNUMH.
DATA GV_KPEIN LIKE KONP-KPEIN.
DATA GV_KBETR LIKE KONP-KBETR.
DATA CON1_REF TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA CON2_REF TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA G_GRID1 TYPE REF TO CL_GUI_ALV_GRID.
DATA G_GRID2 TYPE REF TO CL_GUI_ALV_GRID.
"-------------------------------------
"-----------ALV1的HOTSPOT單擊事件------------
"-------------------------------------
"1 定義ALV1的事件
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_CLICK
FOR EVENT HOTSPOT_CLICK
OF CL_GUI_ALV_GRID
IMPORTING
E_ROW_ID
E_COLUMN_ID
ES_ROW_NO.
ENDCLASS.
"2 事件的執行方法
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_CLICK.
MESSAGE E_ROW_ID TYPE 'S'.
"清空原來的X
LOOP AT GT_ITAB_HEAD INTO GS_ITAB_HEAD.
GS_ITAB_HEAD-BOX = ''.
MODIFY GT_ITAB_HEAD FROM GS_ITAB_HEAD.
ENDLOOP.
"補上當前行的X
READ TABLE GT_ITAB_HEAD INTO GS_ITAB_HEAD INDEX E_ROW_ID. "讀取當前行
GS_ITAB_HEAD-BOX = 'X'.
MODIFY GT_ITAB_HEAD FROM GS_ITAB_HEAD INDEX E_ROW_ID.
"重新整理X
DATA: LS_STABLE TYPE LVC_S_STBL.
LS_STABLE-ROW = 'X'.
LS_STABLE-COL = 'X'.
CALL METHOD G_GRID1->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
I_SOFT_REFRESH = 'X'.
"準備和顯示第二個ALV的資料
DATA GV_TZNUM LIKE GT_ZSDT030-TZNUM.
"得到使用者選的一個數據
LOOP AT GT_ITAB_HEAD INTO GS_ITAB_HEAD.
IF GS_ITAB_HEAD-BOX = 'X'.
GV_TZNUM = GS_ITAB_HEAD-TZNUM.
ENDIF.
ENDLOOP.
IF GV_TZNUM IS NOT INITIAL.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_PRINT
FROM ZSDT029 AS A
INNER JOIN ZSDT030 AS B
ON A~TZNUM = B~TZNUM
WHERE A~TZNUM = GV_TZNUM.
"填充價格資料
LOOP AT GT_PRINT INTO GT_PRINT.
"物料號補零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = GT_PRINT-MATNR
IMPORTING
OUTPUT = GT_PRINT-MATNR.
"供應商補0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GT_PRINT-LIFNR
IMPORTING
OUTPUT = GT_PRINT-LIFNR.
SELECT SINGLE KNUMH INTO GV_KNUMH FROM A017 WHERE LIFNR = GT_PRINT-LIFNR AND MATNR = GT_PRINT-MATNR AND WERKS = '1001' AND DATBI > GT_PRINT-ERDAT AND DATAB < GT_PRINT-ERDAT.
IF SY-SUBRC = 0.
SELECT SINGLE KBETR KPEIN INTO (GV_KBETR , GV_KPEIN) FROM KONP WHERE KNUMH = GV_KNUMH.
GT_PRINT-CURR1 = GV_KBETR / GV_KPEIN.
"物料號去零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
INPUT = GT_PRINT-MATNR
IMPORTING
OUTPUT = GT_PRINT-MATNR.
"供應商去0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = GT_PRINT-LIFNR
IMPORTING
OUTPUT = GT_PRINT-LIFNR.
MODIFY GT_PRINT FROM GT_PRINT.
ENDIF.
ENDLOOP.
LOOP AT GT_PRINT INTO GT_PRINT.
"求單價(材料單價*1.4 係數)
"供應商補0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GT_PRINT-LIFNR
IMPORTING
OUTPUT = GT_PRINT-LIFNR.
SELECT SINGLE NAME4 INTO GT_PRINT-NAME4 FROM LFA1 WHERE LIFNR = GT_PRINT-LIFNR.
"供應商去0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = GT_PRINT-LIFNR
IMPORTING
OUTPUT = GT_PRINT-LIFNR.
IF SY-SUBRC = 0.
GT_PRINT-CURR2 = GT_PRINT-CURR1 * GT_PRINT-NAME4 .
ENDIF.
"材料費(單價*數量)
GT_PRINT-CURRC = GT_PRINT-CURR2 * GT_PRINT-ZMENG.
"合計
GT_PRINT-SUMME = GT_PRINT-CURRC + GT_PRINT-CURRG + GT_PRINT-CURRJ + GT_PRINT-CURRQ.
MODIFY GT_PRINT FROM GT_PRINT.
ENDLOOP.
DATA GS_LAYOUT2 TYPE LVC_S_LAYO.
GS_LAYOUT2-CWIDTH_OPT = 'X'.
GS_LAYOUT2-GRID_TITLE = '詳細專案'.
GS_LAYOUT2-SEL_MODE = 'B'.
GS_LAYOUT2-ZEBRA = 'X'.
CALL METHOD G_GRID2->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GS_LAYOUT2.
CALL METHOD G_GRID2->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
I_SOFT_REFRESH = 'X'.
ENDIF.
ENDMETHOD.
ENDCLASS.
"3 事件引用變數
DATA EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
"-------------------------------------
"-----------ALV1的加圖示事件----------
"-------------------------------------
"1 定義ALV1的事件
CLASS LCL_EVENT_RECEIVER2 DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_TOOLBAR
FOR EVENT TOOLBAR
OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT E_INTERACTIVE.
ENDCLASS.
"2 事件的執行方法
CLASS LCL_EVENT_RECEIVER2 IMPLEMENTATION.
METHOD HANDLE_TOOLBAR.
DATA LS_TOOLBAR TYPE STB_BUTTON.
CLEAR LS_TOOLBAR.
LS_TOOLBAR-BUTN_TYPE = 3.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
LS_TOOLBAR-FUNCTION = 'MYSHEN'.
LS_TOOLBAR-ICON = ICON_SET_STATE.
LS_TOOLBAR-QUICKINFO = '審批確認'.
LS_TOOLBAR-TEXT = '審批確認'.
LS_TOOLBAR-DISABLED = ''.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
LS_TOOLBAR-FUNCTION = 'MYSCAN'.
LS_TOOLBAR-ICON = ICON_STORNO.
LS_TOOLBAR-QUICKINFO = '取消審批'.
LS_TOOLBAR-TEXT = '取消審批'.
LS_TOOLBAR-DISABLED = ''.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
LS_TOOLBAR-FUNCTION = 'MYPRINT'.
LS_TOOLBAR-ICON = ICON_PRINT.
LS_TOOLBAR-QUICKINFO = '單據列印'.
LS_TOOLBAR-TEXT = '單據列印'.
LS_TOOLBAR-DISABLED = ''.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD.
ENDCLASS.
"3 事件引用變數
DATA EVENT_RECEIVER2 TYPE REF TO LCL_EVENT_RECEIVER2.
"-------------------------------------
"-----------ALV1的加按鈕響應事件------
"-------------------------------------
"1 定義ALV1的事件
CLASS LCL_EVENT_RECEIVER3 DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_COMMAND
FOR EVENT USER_COMMAND
OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.
ENDCLASS.
"2 事件的執行方法
CLASS LCL_EVENT_RECEIVER3 IMPLEMENTATION.
METHOD HANDLE_COMMAND.
CASE E_UCOMM.
WHEN 'MYSHEN'.
PERFORM SHENFORM.
WHEN 'MYSCAN'.
PERFORM SCANCELFORM .
WHEN 'MYPRINT'.
PERFORM PPPFORM .
ENDCASE.
ENDMETHOD.
ENDCLASS.
"3 事件引用變數
DATA EVENT_RECEIVER3 TYPE REF TO LCL_EVENT_RECEIVER3.
"選擇螢幕
SELECT-OPTIONS GS_TZNUM FOR ZSDT029-TZNUM. "三包索賠單號
SELECT-OPTIONS GS_JZNUM FOR ZSDT030-JZNUM. "結算單號
SELECT-OPTIONS GS_LIFNR FOR ZSDT029-LIFNR. "供應商
SELECT-OPTIONS GS_ERDAT FOR ZSDT029-ERDAT. "日期
SELECT-OPTIONS GS_MATNR FOR ZSDT030-MATNR. "配件程式碼
START-OF-SELECTION.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_ITAB
FROM ZSDT029 AS A
INNER JOIN ZSDT030 AS B
ON A~TZNUM = B~TZNUM
WHERE A~TZNUM IN GS_TZNUM
AND A~LIFNR IN GS_LIFNR
AND A~ERDAT IN GS_ERDAT
AND B~JZNUM IN GS_JZNUM
AND B~MATNR IN GS_MATNR.
"為第一個控制元件準備資料
LOOP AT GT_ITAB.
MOVE GT_ITAB-TZNUM TO GT_ITAB_HEAD-TZNUM.
MOVE GT_ITAB-LIFNR TO GT_ITAB_HEAD-LIFNR.
MOVE GT_ITAB-NAME1 TO GT_ITAB_HEAD-NAME1.
MOVE GT_ITAB-ERDAT TO GT_ITAB_HEAD-ERDAT.
MOVE GT_ITAB-EINFR TO GT_ITAB_HEAD-EINFR.
MOVE GT_ITAB-SUMME TO GT_ITAB_HEAD-SUMME.
MOVE GT_ITAB-CHUKU TO GT_ITAB_HEAD-CHUKU.
MOVE GT_ITAB-ISSHEN TO GT_ITAB_HEAD-ISSHEN.
MOVE GT_ITAB-ISDEL TO GT_ITAB_HEAD-ISDEL.
APPEND GT_ITAB_HEAD.
CLEAR GT_ITAB_HEAD.
ENDLOOP.
SORT GT_ITAB_HEAD.
DELETE ADJACENT DUPLICATES FROM GT_ITAB_HEAD.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'TOPS'.
* SET TITLEBAR 'xxx'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module INIT_CON OUTPUT
*&---------------------------------------------------------------------*
* text 控制元件初始化模組
*----------------------------------------------------------------------*
MODULE INIT_CON OUTPUT.
"---------第一個ALV控制元件-----------------
IF CON1_REF IS INITIAL.
DATA GS_LAYOUT1 TYPE LVC_S_LAYO.
GS_LAYOUT1-CWIDTH_OPT = 'X'.
GS_LAYOUT1-GRID_TITLE = '三包索賠單'.
GS_LAYOUT1-SEL_MODE = 'B'.
GS_LAYOUT1-ZEBRA = 'X'.
DATA GT_FIELDCAT TYPE LVC_T_FCAT.
DATA GS_FIELDCAT TYPE LVC_S_FCAT.
GS_FIELDCAT-COL_POS = 1. GS_FIELDCAT-FIELDNAME = 'BOX'. GS_FIELDCAT-CHECKBOX = 'X'. GS_FIELDCAT-HOTSPOT = 'X'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 2. GS_FIELDCAT-FIELDNAME = 'TZNUM'. GS_FIELDCAT-COLTEXT = '三包索賠單號'. APPEND GS_FIELDCAT TO GT_FIELDCAT. CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 3. GS_FIELDCAT-FIELDNAME = 'LIFNR'. GS_FIELDCAT-COLTEXT = '供應商程式碼'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 4. GS_FIELDCAT-FIELDNAME = 'NAME1'. GS_FIELDCAT-COLTEXT = '供應商名稱'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 5. GS_FIELDCAT-FIELDNAME = 'ERDAT'. GS_FIELDCAT-COLTEXT = '日期'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 6. GS_FIELDCAT-FIELDNAME = 'EINFR'. GS_FIELDCAT-COLTEXT = '運費'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
* GS_FIELDCAT-COL_POS = 7. GS_FIELDCAT-FIELDNAME = 'SUMME'. GS_FIELDCAT-COLTEXT = '總計'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 8. GS_FIELDCAT-FIELDNAME = 'CHUKU'. GS_FIELDCAT-COLTEXT = '出庫'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 9. GS_FIELDCAT-FIELDNAME = 'ISSHEN'. GS_FIELDCAT-COLTEXT = '審批'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 10. GS_FIELDCAT-FIELDNAME = 'ISDEL'. GS_FIELDCAT-COLTEXT = '刪除'. APPEND GS_FIELDCAT TO GT_FIELDCAT.CLEAR GS_FIELDCAT.
CREATE OBJECT CON1_REF
EXPORTING
CONTAINER_NAME = 'CON1'.
CREATE OBJECT G_GRID1
EXPORTING
I_PARENT = CON1_REF.
"4 註冊事件控制代碼,圖示的還必須加在這裡,不然不行
CREATE OBJECT EVENT_RECEIVER2.
SET HANDLER EVENT_RECEIVER2->HANDLE_TOOLBAR FOR G_GRID1.
"4 註冊事件控制代碼
CREATE OBJECT EVENT_RECEIVER.
SET HANDLER EVENT_RECEIVER->HANDLE_CLICK FOR G_GRID1.
"4 註冊事件控制代碼
CREATE OBJECT EVENT_RECEIVER3.
SET HANDLER EVENT_RECEIVER3->HANDLE_COMMAND FOR G_GRID1.
CALL METHOD G_GRID1->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = GS_LAYOUT1
CHANGING
IT_OUTTAB = GT_ITAB_HEAD[]
IT_FIELDCATALOG = GT_FIELDCAT.
ENDIF.
"---------第二個ALV控制元件-----------------
IF CON2_REF IS INITIAL.
DATA GS_LAYOUT2 TYPE LVC_S_LAYO.
GS_LAYOUT2-CWIDTH_OPT = 'X'.
GS_LAYOUT2-GRID_TITLE = '詳細專案'.
GS_LAYOUT2-SEL_MODE = 'B'.
GS_LAYOUT2-ZEBRA = 'X'.
DATA GT_FIELDCAT2 TYPE LVC_T_FCAT.
DATA GS_FIELDCAT2 TYPE LVC_S_FCAT.
GS_FIELDCAT2-COL_POS = 2. GS_FIELDCAT2-FIELDNAME = 'JZNUM'. GS_FIELDCAT2-COLTEXT = '結算單號'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2. CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 3. GS_FIELDCAT2-FIELDNAME = 'MAKTX'. GS_FIELDCAT2-COLTEXT = '配件名稱'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 4. GS_FIELDCAT2-FIELDNAME = 'MATNR'. GS_FIELDCAT2-COLTEXT = '配件程式碼'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 5. GS_FIELDCAT2-FIELDNAME = 'MEINS'. GS_FIELDCAT2-COLTEXT = '單位'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 6. GS_FIELDCAT2-FIELDNAME = 'ZMENG'. GS_FIELDCAT2-COLTEXT = '數量'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 7. GS_FIELDCAT2-FIELDNAME = 'CURR1'. GS_FIELDCAT2-COLTEXT = '材料單價'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 7. GS_FIELDCAT2-FIELDNAME = 'NAME4'. GS_FIELDCAT2-COLTEXT = '係數'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 8. GS_FIELDCAT2-FIELDNAME = 'CURR2'. GS_FIELDCAT2-COLTEXT = '單價(材料單價*1.4) '. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 9. GS_FIELDCAT2-FIELDNAME = 'CURRC'. GS_FIELDCAT2-COLTEXT = '材料費(單價*數量)'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'CURRG'. GS_FIELDCAT2-COLTEXT = '工時費'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'CURRJ'. GS_FIELDCAT2-COLTEXT = '救援費'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'CURRQ'. GS_FIELDCAT2-COLTEXT = '其它費用'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'SUMME'. GS_FIELDCAT2-COLTEXT = '合計'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'OTHER'. GS_FIELDCAT2-COLTEXT = '備註'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'TZNUM'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'LIFNR'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'NAME1'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'ERDAT'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'EINFR'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'CHUKU'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'ISSHEN'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'ISDEL'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
GS_FIELDCAT2-COL_POS = 10. GS_FIELDCAT2-FIELDNAME = 'BOX'. GS_FIELDCAT2-NO_OUT = 'X'. APPEND GS_FIELDCAT2 TO GT_FIELDCAT2.CLEAR GS_FIELDCAT2.
CREATE OBJECT CON2_REF
EXPORTING
CONTAINER_NAME = 'CON2'.
CREATE OBJECT G_GRID2
EXPORTING
I_PARENT = CON2_REF.
CALL METHOD G_GRID2->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_STRUCTURE_NAME = 'ZSDS045'
IS_LAYOUT = GS_LAYOUT2
CHANGING
IT_OUTTAB = GT_PRINT[]
IT_FIELDCATALOG = GT_FIELDCAT2.
ENDIF.
ENDMODULE. " INIT_CON OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text 這個使用者命令,是最上面的 【標準工具條】上的按鈕
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'SCAN'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
"------------取消審批的FORM--------------------
FORM SCANCELFORM .
DATA GV_ANSWER TYPE C.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
TEXT_QUESTION = '取消審批?'
DEFAULT_BUTTON = '2'
DISPLAY_CANCEL_BUTTON = ''
IMPORTING
ANSWER = GV_ANSWER.
IF GV_ANSWER <> 1.
RETURN.
ENDIF.
"處理儲存到LOG表
LOOP AT GT_ITAB_HEAD.
IF GT_ITAB_HEAD-BOX = 'X'.
GS_ITAB_HEAD = GT_ITAB_HEAD.
IF GS_ITAB_HEAD-BOX = 'X' AND GS_ITAB_HEAD-ISSHEN = 'X' AND GS_ITAB_HEAD-ISDEL <> 'X' AND GS_ITAB_HEAD-CHUKU <> 'X'.
GS_ZSDT_LOG029-USRID = SY-UNAME. "使用者名稱
GS_ZSDT_LOG029-CRDAT = SY-DATUM. "日期
GS_ZSDT_LOG029-ANUZT = SY-UZEIT. "時間
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = 'A1'
OBJECT = 'ZSDFM020'
IMPORTING
NUMBER = GS_ZSDT_LOG029-AUTONUMBER.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' "去掉前導零
EXPORTING
INPUT = GS_ZSDT_LOG029-AUTONUMBER
IMPORTING
OUTPUT = GS_ZSDT_LOG029-AUTONUMBER.
MOVE-CORRESPONDING GS_ITAB_HEAD TO GS_ZSDT_LOG029.
"寫業務資料表
UPDATE ZSDT029
SET ISSHEN = ''
WHERE TZNUM = GS_ITAB_HEAD-TZNUM.
COMMIT WORK .
IF SY-SUBRC = 0.
DATA GV_TABIX LIKE SY-TABIX.
"改一下控制元件的內表X資料
LOOP AT GT_ITAB_HEAD.
IF GT_ITAB_HEAD-BOX = 'X'.
GV_TABIX = SY-TABIX.
ENDIF.
ENDLOOP.
"補上當前行的X
READ TABLE GT_ITAB_HEAD INTO GS_ITAB_HEAD INDEX GV_TABIX. "讀取當前行
GS_ITAB_HEAD-ISSHEN = ''.
MODIFY GT_ITAB_HEAD FROM GS_ITAB_HEAD INDEX GV_TABIX.
"重新整理X
DATA: LS_STABLE TYPE LVC_S_STBL.
LS_STABLE-ROW = 'X'.
LS_STABLE-COL = 'X'.
CALL METHOD G_GRID1->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
I_SOFT_REFRESH = 'X'.
"傳給EAI
DATA GT_HEADER LIKE TABLE OF ZSDS043 WITH HEADER LINE.
DATA GT_RETURN LIKE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA RESULT LIKE TREXS_CONNECTION_CHECK_RESULT.
GT_HEADER-TZNUM = GT_ITAB_HEAD-TZNUM.
GT_HEADER-USRID = SY-UNAME.
GT_HEADER-CRDAT = SY-DATUM.
GT_HEADER-ISSHEN = ''.
APPEND GT_HEADER.
CALL FUNCTION 'TREX_RFC_CONNECT_CHECK_LOCAL'
EXPORTING
TREX_DESTINATION = 'SAPEAI'
IMPORTING
LOCAL_RESULT = RESULT
EXCEPTIONS
SYSTEM_FAILURE = 1
COMMUNICATION_FAILURE = 2
AUTHORITY_NOT_AVAILABLE = 3
SEND_ERROR = 4
OTHERS = 5.
IF RESULT-ERROR_CODE <> 0."無響應
MESSAGE '連線錯誤,請檢查EAI服務是否註冊成功' TYPE 'E'.
ELSE.
CALL FUNCTION 'ZSD_IF_FM023' DESTINATION 'SAPJCO'
TABLES
HEADER = GT_HEADER
RETURN = GT_RETURN.
IF GT_RETURN[] IS NOT INITIAL.
READ TABLE GT_RETURN INDEX 1.
IF GT_RETURN-TYPE <> 'S'.
GS_ZSDT_LOG029-MESSAGE = ' [EAI接收失敗] '.
ELSEIF GT_RETURN-TYPE = 'S'.
GS_ZSDT_LOG029-MESSAGE = ' [EAI接收成功] '.
ENDIF.
ENDIF.
CLEAR:GT_HEADER,GT_RETURN,GT_HEADER[],GT_RETURN[].
ENDIF.
GS_ZSDT_LOG029-ISSHEN = ''. "
GS_ZSDT_LOG029-ERPDO = 'X'. "ERP處理標誌
GS_ZSDT_LOG029-EDATS = SY-DATUM. "ERP處理日期
GS_ZSDT_LOG029-ETIMS = SY-UZEIT. "ERP處理時間
GS_ZSDT_LOG029-MESSAGE = GS_ZSDT_LOG029-MESSAGE && '取消審批'.
"寫日誌表
INSERT ZSDT_LOG029 FROM GS_ZSDT_LOG029.
COMMIT WORK .
CLEAR GS_ZSDT_LOG029.
ENDIF.
ELSE.
MESSAGE '操作失敗,不滿足條件!' TYPE 'E'.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM .
"------------SHENFORM的FORM--------------------
FORM SHENFORM .
DATA GV_ANSWER TYPE C.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
TEXT_QUESTION = '確認審批?'
DEFAULT_BUTTON = '2'
DISPLAY_CANCEL_BUTTON = ''
IMPORTING
ANSWER = GV_ANSWER.
IF GV_ANSWER <> 1.
RETURN.
ENDIF.
"處理儲存到LOG表
LOOP AT GT_ITAB_HEAD.
IF GT_ITAB_HEAD-BOX = 'X'.
GS_ITAB_HEAD = GT_ITAB_HEAD.
IF GS_ITAB_HEAD-BOX = 'X' AND GS_ITAB_HEAD-ISSHEN <> 'X' AND GS_ITAB_HEAD-ISDEL <> 'X' AND GS_ITAB_HEAD-CHUKU <> 'X'.
GS_ZSDT_LOG029-USRID = SY-UNAME. "使用者名稱
GS_ZSDT_LOG029-CRDAT = SY-DATUM. "日期
GS_ZSDT_LOG029-ANUZT = SY-UZEIT. "時間
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = 'A1'
OBJECT = 'ZSDFM020'
IMPORTING
NUMBER = GS_ZSDT_LOG029-AUTONUMBER.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' "去掉前導零
EXPORTING
INPUT = GS_ZSDT_LOG029-AUTONUMBER
IMPORTING
OUTPUT = GS_ZSDT_LOG029-AUTONUMBER.
MOVE-CORRESPONDING GS_ITAB_HEAD TO GS_ZSDT_LOG029.
"寫業務資料表
UPDATE ZSDT029
SET ISSHEN = 'X'
WHERE TZNUM = GS_ITAB_HEAD-TZNUM.
COMMIT WORK .
IF SY-SUBRC = 0.
DATA GV_TABIX LIKE SY-TABIX.
"改一下控制元件的內表X資料
LOOP AT GT_ITAB_HEAD.
IF GT_ITAB_HEAD-BOX = 'X'.
GV_TABIX = SY-TABIX.
ENDIF.
ENDLOOP.
"補上當前行的X
READ TABLE GT_ITAB_HEAD INTO GS_ITAB_HEAD INDEX GV_TABIX. "讀取當前行
GS_ITAB_HEAD-ISSHEN = 'X'.
MODIFY GT_ITAB_HEAD FROM GS_ITAB_HEAD INDEX GV_TABIX.
"重新整理X
DATA: LS_STABLE TYPE LVC_S_STBL.
LS_STABLE-ROW = 'X'.
LS_STABLE-COL = 'X'.
CALL METHOD G_GRID1->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
I_SOFT_REFRESH = 'X'.
"傳給EAI
DATA GT_HEADER LIKE TABLE OF ZSDS043 WITH HEADER LINE.
DATA GT_RETURN LIKE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA RESULT LIKE TREXS_CONNECTION_CHECK_RESULT.
GT_HEADER-TZNUM = GT_ITAB_HEAD-TZNUM.
GT_HEADER-USRID = SY-UNAME.
GT_HEADER-CRDAT = SY-DATUM.
GT_HEADER-ISSHEN = 'X'.
APPEND GT_HEADER.
CALL FUNCTION 'TREX_RFC_CONNECT_CHECK_LOCAL'
EXPORTING
TREX_DESTINATION = 'SAPEAI'
IMPORTING
LOCAL_RESULT = RESULT
EXCEPTIONS
SYSTEM_FAILURE = 1
COMMUNICATION_FAILURE = 2
AUTHORITY_NOT_AVAILABLE = 3
SEND_ERROR = 4
OTHERS = 5.
IF RESULT-ERROR_CODE <> 0."無響應
MESSAGE '連線錯誤,請檢查EAI服務是否註冊成功' TYPE 'E'.
ELSE.
CALL FUNCTION 'ZSD_IF_FM023' DESTINATION 'SAPJC