1. 程式人生 > >【轉載】SAP OO ALV 在自定義螢幕上新增ALV控制元件 一個螢幕上使用2個ALV

【轉載】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