alv

来源:互联网 发布:中国人工智能公司排名 编辑:程序博客网 时间:2024/04/30 09:03
*&---------------------------------------------------------------------*
*& REPORT  ZMMR238
*&
*&---------------------------------------------------------------------*
*& 需求描述:設備進機明細系統化
*& 需求單號:HB17050029
*& 開發人員:ZXK
*& 開發日期:20170919
*&
*&---------------------------------------------------------------------*
*----------DRAGON BE HERE!----------/
*    ┏┓   ┏┓
*   ┏┛┻━━━┛┻┓
*   ┃       ┃
*   ┃   ━   ┃
*   ┃ ┳┛ ┗┳ ┃
*   ┃       ┃
*   ┃   ┻   ┃
*   ┃       ┃
*   ┗━┓   ┏━┛
*     ┃   ┃神兽保佑
*     ┃   ┃代码无BUG!
*     ┃   ┗━━━┓
*     ┃       ┣┓
*     ┃       ┏┛
*     ┗┓┓┏━┳┓┏┛
*      ┃┫┫ ┃┫┫
*      ┗┻┛ ┗┻┛
* ━━━━━━神兽出没━━━━━━

REPORT  ZMMR238.

TABLES :MARA,EKPO,EBAN,T023,EKKO,ZMMT190.

CLASS LCL_ALV_EVENT_HANDLER DEFINITION.
  PUBLIC SECTION.
    METHODS :HANDLE_DATA_CHANGED
    FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
    IMPORTING ER_DATA_CHANGED.

ENDCLASS.

DATA: CON_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
      ALV_TABLES TYPE REF TO CL_GUI_ALV_GRID,
      CON_ALV_TABLES TYPE REF TO CL_GUI_CONTAINER,
      ALV_DATA_CHAGNED TYPE REF TO LCL_ALV_EVENT_HANDLER.

DATA:  GT_FIELDCAT   TYPE LVC_T_FCAT,
       GS_FIELDCAT   TYPE LVC_S_FCAT,
       GS_LAYOUT     TYPE LVC_S_LAYO,
       GT_EXCLUDE    TYPE UI_FUNCTIONS.

DATA: WA_EQUIP LIKE ZMMT190,
      GT_EQUIP LIKE ZMMT190 OCCURS WITH HEADER LINE,
      GT_EQUIP_A LIKE ZMMT190 OCCURS WITH HEADER LINE,
      GT_EQUIP_X LIKE ZMMT190 OCCURS WITH HEADER LINE,
      GT_MBLNR LIKE ZMMT190 OCCURS WITH HEADER LINE,
      GT_ENMBLNR LIKE ZMMT190 OCCURS WITH HEADER LINE.

DATA:BEGIN OF GT_ANLC OCCURS 0,
     KANSW LIKE ANLC-KANSW,
     KNAFA LIKE ANLC-KNAFA,
     NAFAG LIKE ANLC-NAFAG,
     ANSWL LIKE ANLC-ANSWL,
     NAFAV LIKE ANLC-NAFAV,
     NAFAL LIKE ANLC-NAFAL,
     GJAHR LIKE ANLC-GJAHR,
  END OF GT_ANLC.


DATA: G_LINES(4) TYPE ,
      G_ANSWER TYPE C,
      G_INDATE(15) TYPE C,
      G_INDATE2 LIKE SY-DATUM,
      G_DAYS_OUT(5) TYPE I.

DATA: PROXY TYPE REF TO ZMMCO_BO_REAT,
      PROXY2 TYPE REF TO ZMMCO_BO_REAT_ITEM,
      LSERROR TYPE STRING ,
      CLOREF TYPE REF TO CX_ROOT.

DATA: WS_INPUT_REAT TYPE ZMMFIND_REAT_BY_PAPER_NUMS,
      WS_PAPER_NUM TYPE ZMMQUERY_FILTER_TAB WITH HEADER LINE,
      WS_OUTPUT_REAT TYPE ZMMFIND_REAT_BY_PAPER_NUMS_RES,
      WS_OUTPUT TYPE ZMMBO_REAT_TAB WITH HEADER LINE,
      WS_INPUT_REAT_ITEM TYPE ZMMFIND_REAT_ITEM_BY_SER_NOS,
      WS_SER_NO TYPE ZMMQUERY_FILTER_TAB1 WITH HEADER LINE,
      WS_OUTPUT_REAT_ITEM TYPE ZMMFIND_REAT_ITEM_BY_SER_NOS_R,
      WS_OUTPUT_ITEM TYPE ZMMBO_REAT_ITEM_TAB WITH HEADER LINE.

DEFINE: ADD_FIELD.
  CLEAR:GS_FIELDCAT.
  GS_FIELDCAT-FIELDNAME = &1.
  GS_FIELDCAT-COLTEXT = &2.
  GS_FIELDCAT-REF_TABLE = 'ZMMT190'"ALV編輯時長度受限,需要參照字段
  GS_FIELDCAT-REF_FIELD = &1.
  IF SY-TCODE = 'ZMM321E'.
    IF &1 = 'ANTAG' OR &1 = 'ANTBG' OR &1 = 'EBELN_TW' OR &1 = 'LIFNR_TW' OR &1 = 'NAME1_TW' OR
        &1 = 'RUDAT' OR &1 = 'CABIN' OR &1 = 'PERSO' OR &1 = 'CONTA' OR &1 = 'POSIT' OR &1 = 'SPARE' .
      GS_FIELDCAT-EDIT = 'X'.
    ENDIF.
  ENDIF.
  APPEND GS_FIELDCAT TO GT_FIELDCAT.
END-OF-DEFINITION.


CLASS LCL_ALV_EVENT_HANDLER IMPLEMENTATION.
  METHOD HANDLE_DATA_CHANGED.
    PERFORM HANDLE_DATA_CHANGED USING ER_DATA_CHANGED.
  ENDMETHOD.
ENDCLASS.

SELECTION-SCREEN BEGIN OF BLOCK T1 WITH FRAME .
SELECT-OPTIONS: S_EBELN FOR EKPO-EBELN,
                S_BANFN FOR EBAN-BANFN,
                S_MATKL FOR MARA-MATKL,
                S_AEDAT FOR EKKO-AEDAT,
                S_ERNAM FOR EKKO-ERNAM,
                S_BUKRS FOR EKKO-BUKRS,
                S_RUDAT FOR ZMMT190-RUDAT,
                S_ANTAG FOR ZMMT190-ANTAG.
SELECTION-SCREEN END OF BLOCK T1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MATKL-LOW.
  PERFORM F4_MATKL.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MATKL-HIGH.
  PERFORM F4_MATKL.

AT SELECTION-SCREEN OUTPUT.
*  LOOP AT SCREEN.
*    IF SCREEN-NAME EQ 'S_ANTAG-LOW' OR SCREEN-NAME EQ 'S_ANTAG-HIGH' OR SCREEN-NAME EQ '%_S_ANTAG_%_APP_%-TEXT' OR SCREEN-NAME EQ '%_S_ANTAG_%_APP_%-VALU_PUSH'.
*      SCREEN-ACTIVE = 0.
*    ENDIF.
*    MODIFY SCREEN.
*  ENDLOOP.

START-OF-SELECTION.

  PERFORM GET_AND_PROCESS_DATA.
  CALL SCREEN 2000.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      MODULE  STATUS_2000  OUTPUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
MODULE STATUS_2000 OUTPUT.
  SET PF-STATUS 'PS_2000'.
*  SET TITLEBAR 'XXX'.

  PERFORM SET_ALV_FIELDS.
  PERFORM SET_ALV_LAYOUT CHANGING GS_LAYOUT.
  IF SY-TCODE = 'ZMM321E'.
    PERFORM ALV_PREPARE_TOOLBAR TABLES GT_EXCLUDE.
  ENDIF.



  CHECK CON_SPLITTER IS INITIAL.
  "創建容器
  CREATE OBJECT CON_SPLITTER
    EXPORTING
      PARENT  = CL_GUI_CONTAINER=>SCREEN0
      ROWS    1
      COLUMNS = 1.
  "創建ALV控件
  CON_ALV_TABLES = CON_SPLITTER->GET_CONTAINER( ROW = COLUMN = ).
  CREATE OBJECT ALV_TABLES
    EXPORTING
      I_PARENT = CON_ALV_TABLES.

  "事件响应
  CREATE OBJECT ALV_DATA_CHAGNED .

  SET HANDLER ALV_DATA_CHAGNED->HANDLE_DATA_CHANGED FOR ALV_TABLES.

  CALL METHOD ALV_TABLES->REGISTER_EDIT_EVENT( EXPORTING I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED ).



  CALL METHOD ALV_TABLES->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
*     I_BUFFER_ACTIVE               =
*     I_BYPASSING_BUFFER            =
*     I_CONSISTENCY_CHECK           =
*     I_STRUCTURE_NAME              =
*     IS_VARIANT                    =
      I_SAVE                        = 'X'
*     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_EQUIP_A[]
      IT_FIELDCATALOG               = GT_FIELDCAT
*     IT_SORT                       =
*     IT_FILTER                     =
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        4.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


  IF LSERROR IS  NOT INITIAL .
    MESSAGE W000(ZMM03) WITH  '連接錯誤,無法取得進機天數及驗收狀態'  LSERROR .
  ENDIF.


ENDMODULE.                 " STATUS_2000  OUTPUT
*&---------------------------------------------------------------------*
*&      MODULE  USER_EXIT  INPUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
MODULE USER_EXIT INPUT.
  CASE SY-UCOMM.
    WHEN 'EXIT' OR 'BACK' .
      LEAVE TO SCREEN 0.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " USER_EXIT  INPUT
*&---------------------------------------------------------------------*
*&      FORM  GET_AND_PROCESS_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM GET_AND_PROCESS_DATA .
  IF S_MATKL[] IS INITIAL.
    S_MATKL-SIGN = 'I'.
    S_MATKL-OPTION = 'BT'.
    S_MATKL-LOW = 'A001'.
    S_MATKL-HIGH = 'A007'.
    APPEND S_MATKL.
  ENDIF.

  SELECT *
  INTO CORRESPONDING FIELDS OF TABLE GT_EQUIP
  FROM ZMMT190 AS T1
  JOIN EKKO AS T2
  ON T1~EBELN = T2~EBELN
    WHERE T1~EBELN IN S_EBELN
    AND T1~BANFN IN S_BANFN
    AND T2~ERNAM IN S_ERNAM
    AND T2~AEDAT IN S_AEDAT
    AND T2~BUKRS IN S_BUKRS
    AND T1~RUDAT IN S_RUDAT
    AND T1~ANTAG IN S_ANTAG
    .
  IF S_RUDAT[] IS INITIAL AND S_ANTAG[] IS INITIAL.
    SELECT T1~BANFN T1~BNFPO T1~EBELN T1~EBELP T1~TXZ01 T1~MENGE T1~MEINS T3~ANLN1 T4~KOSTL AS KOSTL_REQ
    INTO CORRESPONDING FIELDS OF TABLE GT_EQUIP_X
    FROM EKPO AS T1
    JOIN EBAN AS T2
    ON T1~BANFN = T2~BANFN
    AND T1~BNFPO = T2~BNFPO
    JOIN EKKN AS T3
    ON T1~EBELN = T3~EBELN
    AND T1~EBELP = T3~EBELP
    JOIN ANLZ AS T4
    ON T4~ANLN1 = T3~ANLN1
    AND T4~BUKRS = T1~BUKRS
    JOIN EKKO AS T5
    ON T1~EBELN = T5~EBELN
    WHERE T1~EBELN IN S_EBELN
      AND T2~BANFN IN S_BANFN
      AND T1~MATKL IN S_MATKL
      AND T5~ERNAM IN S_ERNAM
      AND T5~AEDAT IN S_AEDAT
      AND T5~BUKRS IN S_BUKRS.

    LOOP AT GT_EQUIP_X.
      SELECT SINGLE KTEXT
        INTO GT_EQUIP_X-KTEXT_REQ
      FROM CSKT
        WHERE KOSTL = GT_EQUIP_X-KOSTL_REQ
          AND SPRAS = 'M'.

      SELECT SINGLE LIFNR
        INTO GT_EQUIP_X-LIFNR
      FROM EKKO
        WHERE EBELN = GT_EQUIP_X-EBELN.

      SELECT SINGLE EBELN
        INTO GT_EQUIP_X-EBELN_TW
      FROM EKPO
        WHERE BEDNR = GT_EQUIP_X-BANFN.

      SELECT SINGLE LIFNR
       INTO GT_EQUIP_X-LIFNR_TW
     FROM EKKO
       WHERE EBELN = GT_EQUIP_X-EBELN_TW.

      SELECT SINGLE NAME1
        INTO GT_EQUIP_X-NAME1
      FROM LFA1
        WHERE LIFNR = GT_EQUIP_X-LIFNR.

      SELECT SINGLE NAME1
        INTO GT_EQUIP_X-NAME1_TW
      FROM LFA1
        WHERE LIFNR = GT_EQUIP_X-LIFNR_TW.

      MODIFY GT_EQUIP_X.
    ENDLOOP.

    IF GT_EQUIP_X[] IS NOT INITIAL.
      SORT GT_EQUIP_X BY BANFN BNFPO EBELN EBELP.
      LOOP AT GT_EQUIP_X INTO WA_EQUIP.

        READ TABLE GT_EQUIP WITH KEY EBELN = WA_EQUIP-EBELN
                                     EBELP = WA_EQUIP-EBELP
                                     BANFN = WA_EQUIP-BANFN
                                     BNFPO = WA_EQUIP-BNFPO.
        IF SY-SUBRC NE 0.
          APPEND WA_EQUIP TO GT_EQUIP.
          CLEAR:WA_EQUIP.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.

  LOOP AT GT_EQUIP.
    SELECT SINGLE ENMBLNR MBLNR BPM_STATUS
    INTO (GT_EQUIP-ENMBLNR,GT_EQUIP-MBLNR,GT_EQUIP-BPM_STATUS)
  FROM EKBE AS T1
  JOIN ZMMT006 AS T2
    ON T1~BELNR = T2~MBLNR
    AND T1~GJAHR = T2~MJAHR
WHERE T1~EBELN = GT_EQUIP-EBELN
    AND T1~EBELP = GT_EQUIP-EBELP
    AND ( T2~BPM_STATUS <> '' AND T2~BPM_STATUS <> '40' ).
    MODIFY GT_EQUIP.
  ENDLOOP.
*---------WEBSERVICE 進機日期
  LOOP AT GT_EQUIP.
    IF GT_EQUIP-MBLNR IS NOT  INITIAL.
      GT_MBLNR-MBLNR = GT_EQUIP-MBLNR.
      APPEND GT_MBLNR.
    ENDIF.
    IF GT_EQUIP-ENMBLNR IS NOT  INITIAL.
      GT_ENMBLNR-ENMBLNR = GT_EQUIP-ENMBLNR.
      APPEND GT_ENMBLNR.
    ENDIF.
  ENDLOOP.


  TRY.
      CREATE OBJECT PROXY
        EXPORTING
          LOGICAL_PORT_NAME = 'ZMMCO_BO_REAT'.

      CREATE OBJECT PROXY2
        EXPORTING
          LOGICAL_PORT_NAME = 'ZMMCO_BO_REAT_ITEM'.
    CATCH CX_AI_SYSTEM_FAULT .
  ENDTRY.


  LOOP AT GT_MBLNR.
    WS_PAPER_NUM-VALUE = GT_MBLNR-MBLNR.
    WS_PAPER_NUM-CONDITION = 'EQ'.
    APPEND WS_PAPER_NUM.
    WS_SER_NO-VALUE = GT_ENMBLNR-ENMBLNR.
    WS_SER_NO-CONDITION = 'EQ'.
    APPEND WS_SER_NO.
  ENDLOOP.
  WS_INPUT_REAT-PAPER_NUM = WS_PAPER_NUM[].
  WS_INPUT_REAT_ITEM-SER_NO = WS_SER_NO[].

  TRY.
      CALL METHOD PROXY->FIND_REAT_BY_PAPER_NUMS
        EXPORTING
          INPUT  = WS_INPUT_REAT
        IMPORTING
          OUTPUT = WS_OUTPUT_REAT.
      CALL METHOD PROXY2->FIND_REAT_ITEM_BY_SER_NOS
        EXPORTING
          INPUT  = WS_INPUT_REAT_ITEM
        IMPORTING
          OUTPUT = WS_OUTPUT_REAT_ITEM.

    CATCH CX_AI_SYSTEM_FAULT INTO CLOREF.
      CALL METHOD CLOREF->IF_MESSAGE~GET_TEXT
        RECEIVING
          RESULT = LSERROR.
    CATCH ZMMCX_CAFFIND_EXCEPTION INTO CLOREF.
      CALL METHOD CLOREF->IF_MESSAGE~GET_TEXT
        RECEIVING
          RESULT = LSERROR.
    CATCH CX_AI_APPLICATION_FAULT INTO CLOREF.
      CALL METHOD CLOREF->IF_MESSAGE~GET_TEXT
        RECEIVING
          RESULT = LSERROR.
  ENDTRY.

  WS_OUTPUT[] = WS_OUTPUT_REAT-OUTPUT.
  WS_OUTPUT_ITEM[] = WS_OUTPUT_REAT_ITEM-OUTPUT.
  SORT WS_OUTPUT BY PAPER_NUM VERSION DESCENDING.

  LOOP AT GT_EQUIP.
    IF GT_EQUIP-MBLNR IS NOT INITIAL AND GT_EQUIP-IN_DATE EQ 0.
      READ TABLE WS_OUTPUT WITH KEY PAPER_NUM = GT_EQUIP-MBLNR.
      IF SY-SUBRC = 0.
        CLEAR: G_INDATE,G_INDATE2.
        G_INDATE = WS_OUTPUT-IN_DATE.
        G_INDATE = G_INDATE+0(8).
        G_INDATE2 = G_INDATE.
        CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
          EXPORTING
            BEGDA = G_INDATE2
            ENDDA = SY-DATUM
          IMPORTING
            DAYS  = G_DAYS_OUT.
        GT_EQUIP-IN_DATE = G_DAYS_OUT.
      ENDIF.
    ENDIF.
    IF GT_EQUIP-ENMBLNR IS NOT INITIAL AND GT_EQUIP-DEPTTYPE IS INITIAL.
      LOOP AT WS_OUTPUT_ITEM WHERE SER_NO = GT_EQUIP-ENMBLNR.
        CONCATENATE GT_EQUIP-DEPTTYPE WS_OUTPUT_ITEM-DEPT_TYPE INTO GT_EQUIP-DEPTTYPE SEPARATED BY '-'.
      ENDLOOP.
    ENDIF.
    SELECT SINGLE LOEKZ
      INTO GT_EQUIP-LOEKZ
    FROM EKPO
      WHERE EBELN = GT_EQUIP-EBELN
      AND EBELP = GT_EQUIP-EBELP.

    MODIFY GT_EQUIP.
  ENDLOOP.



  LOOP AT GT_EQUIP INTO WA_EQUIP.
    IF WA_EQUIP-ACTID EQ 0.
      DO WA_EQUIP-MENGE TIMES.
        WA_EQUIP-MENGE = 1.
        WA_EQUIP-ACTID = WA_EQUIP-ACTID + 1.
        APPEND WA_EQUIP TO GT_EQUIP_A.
      ENDDO.
      CLEAR:WA_EQUIP.
    ELSE.
      APPEND WA_EQUIP TO GT_EQUIP_A.
      CLEAR:WA_EQUIP.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " GET_AND_PROCESS_DATA
*&---------------------------------------------------------------------*
*&      FORM  SET_ALV_FIELDS
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM SET_ALV_FIELDS .
  ADD_FIELD 'BANFN' '請購單'.
  ADD_FIELD 'BNFPO' '請購單項次'.
  ADD_FIELD 'EBELN' '訂單'.
  ADD_FIELD 'EBELP' '訂單項次'.
  ADD_FIELD 'LOEKZ' '刪除標記'.
  ADD_FIELD 'ACTID' '拆分編號'.
  ADD_FIELD 'ANLN1' '待驗資產編碼'.
  ADD_FIELD 'ANTAG' '財產標籤-主資產'.
  ADD_FIELD 'ANTBG' '財產標籤-子資產'.
  ADD_FIELD 'TXZ01' '設備品名'.
  ADD_FIELD 'MENGE' '數量'.
  ADD_FIELD 'MEINS' '單位'.
  ADD_FIELD 'KOSTL' '現行成本中心'.
  ADD_FIELD 'KTEXT' '成本中心名稱'.
  ADD_FIELD 'KOSTL_REQ' '訂單成本中心'.
  ADD_FIELD 'KTEXT_REQ' '訂單成本中心名稱'.
  ADD_FIELD 'CBZMJ' '財報帳面淨值'.
  ADD_FIELD 'SBZMJ' '稅報帳面淨值'.
  ADD_FIELD 'AKTIV' '資本化日期'.
  ADD_FIELD 'LIFNR' '廠商'.
  ADD_FIELD 'NAME1' '廠商名稱'.
  ADD_FIELD 'EBELN_TW' '台灣訂單'.
  ADD_FIELD 'LIFNR_TW' '原始廠商'.
  ADD_FIELD 'NAME1_TW' '原始廠商代碼'.
  ADD_FIELD 'CUSTNO' '報關單號'.
  ADD_FIELD 'IMDAT' '進口日期'.
  ADD_FIELD 'JGDAT' '海關監管到期日'.
  ADD_FIELD 'RUDAT' '入廠時間'.
  ADD_FIELD 'CABIN' '柜量/柜型'.
  ADD_FIELD 'PERSO' '接機人'.
  ADD_FIELD 'CONTA' '聯繫方式'.
  ADD_FIELD 'POSIT' '搬運定位需求'.
  ADD_FIELD 'SPARE' '備品'.
  ADD_FIELD 'INDETERMINATE1' '裝機完成時間'.
  ADD_FIELD 'IN_DATE' '進機天數'.
  ADD_FIELD 'DEPTTYPE' '驗收狀態'.
  ADD_FIELD 'ENMBLNR' 'BPM單號'.
  ADD_FIELD 'MBLNR' '驗收單號'.
  ADD_FIELD 'BPM_STATUS' '單據狀態'.


ENDFORM.                    " SET_ALV_FIELDS
*&---------------------------------------------------------------------*
*&      FORM  SET_ALV_LAYOUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      <--P_GS_LAYOUT  TEXT
*----------------------------------------------------------------------*
FORM SET_ALV_LAYOUT  CHANGING P_GS_LAYOUT TYPE LVC_S_LAYO.
  P_GS_LAYOUT-ZEBRA = 'X'.
  P_GS_LAYOUT-SMALLTITLE = 'X'.
  P_GS_LAYOUT-SEL_MODE = 'A'.
  P_GS_LAYOUT-GRID_TITLE = '進機明細'.
  P_GS_LAYOUT-CWIDTH_OPT = 'X'.
ENDFORM.                    " SET_ALV_LAYOUT
*&---------------------------------------------------------------------*
*&      FORM  ALV_PREPARE_TOOLBAR
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->P_GT_EXCLUDE  TEXT
*----------------------------------------------------------------------*
FORM ALV_PREPARE_TOOLBAR  TABLES   PT_EXCLUDE TYPE UI_FUNCTIONS.
  REFRESH: PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_MAXIMUM TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_MINIMUM TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_SUBTOT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_SUM TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_AVERAGE TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_SUM TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_SUBTOT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_SORT_ASC TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_SORT_DSC TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_FIND TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_FILTER TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT_PREV TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_EXPORT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_GRAPH TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_EXPORT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_VIEW TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_DETAIL TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_HELP TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_INFO TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_VARIANT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_REFRESH TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_CHECK TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_COPY TO PT_EXCLUDE.
  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW TO PT_EXCLUDE.
  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW TO PT_EXCLUDE.
  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW TO PT_EXCLUDE.
  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_FC_LOC_CUT TO PT_EXCLUDE.
*  APPEND CL_GUI_ALV_GRID=>MC_MB_PASTE TO PT_EXCLUDE.

ENDFORM.                    " ALV_PREPARE_TOOLBAR
*&---------------------------------------------------------------------*
*&      FORM  F4_MATKL
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM F4_MATKL .
  DATA BEGIN OF LT_MATKL OCCURS 0  ,
  MATKL LIKE MARA-MATKL,
  WGBEZ LIKE T023T-WGBEZ,
END OF LT_MATKL.
  SELECT MATKL WGBEZ
    INTO CORRESPONDING FIELDS OF TABLE LT_MATKL
  FROM T023T
  WHERE ( MATKL = 'A001' OR MATKL = 'A002'OR  MATKL = 'A003' OR
     MATKL = 'A004' OR   MATKL = 'A005' OR   MATKL = 'A006' OR MATKL = 'A007' )
    AND SPRAS = 'M'.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'MATKL'        "  大写,可选值内表的字段名
      VALUE_ORG       = 'S'           "          就写'S'
      DYNPPROG        = SY-REPID      "  返回的输入框所在的MAIN PROGRAM
      DYNPNR          = SY-DYNNR        "   返回的输入框所在屏幕
      DYNPROFIELD     = 'S_MATKL'  "  返回的输入框名
                                                                                                              "   CALLBACK_PROGRAM = SY-REPID
                                                                                                               "   CALLBACK_FORM    =  "F4 帶出多個值到頁面上
    TABLES
      VALUE_TAB       = LT_MATKL    "   可选值的内表
                                                                                                                "  RETURN_TAB       = LT_RETURN
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          3.
  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.                                                    " F4_MATKL
*&---------------------------------------------------------------------*
*&      MODULE  USER_COMMAND_2000  INPUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
MODULE USER_COMMAND_2000 INPUT.


  CASE SY-UCOMM.
    WHEN 'SAVE'.
      IF SY-TCODE = 'ZMM321E'.
        CALL METHOD ALV_TABLES->CHECK_CHANGED_DATA( ). "此方法將畫面上更改的數據更新至內表中去,貌似CHECK_CHANGED_DATA會自動調用我修改後的DATA_CHAGNED EVENT事件
        "  CALL METHOD ALV_DATA_CHAGNED->HANDLE_DATA_CHANGED.
        PERFORM SAVE_DATA .
      ENDIF.
    WHEN OTHERS.
*           CALL METHOD CL_GUI_CFW=>DISPATCH.
*
** FORCE ALV TO COPY THE DATA FROM GRID TO THE INTERNAL TABLE
**(EVENTS DATA_CHANGED AND DATA_CHANGED_FINISHED)
*   CALL METHOD ALV_TABLES->CHECK_CHANGED_DATA.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_2000  INPUT
*&---------------------------------------------------------------------*
*&      FORM  HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->P_ER_DATA_CHANGED  TEXT
*----------------------------------------------------------------------*
FORM HANDLE_DATA_CHANGED  USING  DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
  DATA:MOD_DATA TYPE LVC_T_MODI ,
       MOD_DATA_WA TYPE LVC_S_MODI.

  DATA:G_KANSW LIKE ANLC-KANSW,
       G_KNAFA LIKE ANLC-KNAFA,
       G_NAFAG LIKE ANLC-NAFAG,
       G_ANSWL LIKE ANLC-ANSWL,
       G_NAFAV LIKE ANLC-NAFAV,
       G_NAFAL LIKE ANLC-NAFAL,
       G_BUKRS LIKE EKKO-BUKRS,
       G_ANTAG LIKE ZMMT190-ANTAG,
       G_ANTBG LIKE ZMMT190-ANTBG,
       G_AKTIV LIKE ZMMT190-AKTIV.

  MOD_DATA = DATA_CHANGED->MT_MOD_CELLS.
  DESCRIBE TABLE MOD_DATA LINES G_LINES.

  LOOP AT MOD_DATA INTO MOD_DATA_WA.
    CLEAR:G_ANTAG,G_ANTBG.
    IF MOD_DATA_WA-FIELDNAME = 'ANTAG' OR MOD_DATA_WA-FIELDNAME = 'ANTBG' .
      IF MOD_DATA_WA-FIELDNAME = 'ANTAG'.
        G_ANTAG = MOD_DATA_WA-VALUE.
        G_ANTBG = 0000.
      ELSEIF MOD_DATA_WA-FIELDNAME = 'ANTBG'.
        READ TABLE GT_EQUIP_A INDEX MOD_DATA_WA-ROW_ID.
        IF SY-SUBRC = 0.
          G_ANTAG = GT_EQUIP_A-ANTAG.
        ENDIF.
        G_ANTBG = MOD_DATA_WA-VALUE.
      ENDIF.



      READ TABLE GT_EQUIP_A INDEX MOD_DATA_WA-ROW_ID.
      IF SY-SUBRC = 0.
        SELECT SINGLE CUSTNO IMDAT JGDAT
          INTO (GT_EQUIP_A-CUSTNO,GT_EQUIP_A-IMDAT,GT_EQUIP_A-JGDAT)
        FROM ZMMT064
        WHERE ANLN1 = G_ANTAG.
        IF GT_EQUIP_A-CUSTNO IS INITIAL.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              INPUT  = G_ANTAG
            IMPORTING
              OUTPUT = G_ANTAG.

          SELECT SINGLE CUSTNO IMDAT JGDAT
          INTO (GT_EQUIP_A-CUSTNO,GT_EQUIP_A-IMDAT,GT_EQUIP_A-JGDAT)
        FROM ZMMT064
        WHERE ANLN1 = G_ANTAG.
        ENDIF.

        CLEAR:G_BUKRS.
        SELECT SINGLE BUKRS
          INTO G_BUKRS
        FROM EKKO
          WHERE EBELN = GT_EQUIP_A-EBELN.
      ENDIF.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = G_ANTAG
        IMPORTING
          OUTPUT = G_ANTAG.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = G_ANTBG
        IMPORTING
          OUTPUT = G_ANTBG.

*-----財報

      CLEAR:GT_ANLC,GT_ANLC[].
      SELECT  KANSW KNAFA NAFAG ANSWL NAFAV NAFAL GJAHR
        INTO CORRESPONDING FIELDS OF TABLE GT_ANLC
      FROM ANLC
      WHERE ANLN1 = G_ANTAG
        AND ANLN2 = G_ANTBG
        AND BUKRS = G_BUKRS
        AND AFABE = 1.
      SORT GT_ANLC BY GJAHR DESCENDING.
      READ TABLE GT_ANLC INDEX 1.
      GT_EQUIP_A-CBZMJ = GT_ANLC-KANSW + GT_ANLC-KNAFA + GT_ANLC-NAFAG + GT_ANLC-ANSWL + GT_ANLC-NAFAV + GT_ANLC-NAFAL.
*-----稅報
      CLEAR:GT_ANLC,GT_ANLC[].
      SELECT  KANSW KNAFA NAFAG ANSWL NAFAV NAFAL GJAHR
        INTO CORRESPONDING FIELDS OF TABLE GT_ANLC
      FROM ANLC
      WHERE ANLN1 = G_ANTAG
        AND ANLN2 = G_ANTBG
        AND BUKRS = G_BUKRS
        AND AFABE = 20.
      SORT GT_ANLC BY GJAHR DESCENDING.
      READ TABLE GT_ANLC INDEX 1.
      GT_EQUIP_A-SBZMJ =  GT_ANLC-KANSW + GT_ANLC-KNAFA + GT_ANLC-NAFAG + GT_ANLC-ANSWL + GT_ANLC-NAFAV + GT_ANLC-NAFAL.
*-----資本化日期
      CLEAR:G_AKTIV.
      SELECT SINGLE AKTIV
        INTO G_AKTIV
      FROM ANLA
      WHERE ANLN1 = G_ANTAG
        AND ANLN2 = G_ANTBG
        AND BUKRS = G_BUKRS.

      GT_EQUIP_A-AKTIV = G_AKTIV.

*-----现行成本中心
      SELECT SINGLE KOSTL
        INTO GT_EQUIP_A-KOSTL
      FROM ANLZ
        WHERE BUKRS = G_BUKRS
        AND ANLN1 = G_ANTAG
        AND ANLN2 = G_ANTBG
        AND BDATU >= SY-DATUM.

      SELECT SINGLE KTEXT
            INTO GT_EQUIP_A-KTEXT
          FROM CSKT
            WHERE KOSTL = GT_EQUIP_A-KOSTL
              AND SPRAS = 'M'.

      MODIFY GT_EQUIP_A INDEX MOD_DATA_WA-ROW_ID.
    ENDIF.
    CALL METHOD ALV_TABLES->REFRESH_TABLE_DISPLAY
*     EXPORTING
*       IS_STABLE      =
*       I_SOFT_REFRESH =
*     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.






  ENDLOOP.
ENDFORM.                    " HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*&      FORM  SAVE_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM SAVE_DATA .


  IF G_LINES NE 0.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        TITLEBAR              'SAVE'
        TEXT_QUESTION         = '是否儲存'
        TEXT_BUTTON_1         = 'YES'
        ICON_BUTTON_1         = 'ICON_OKAY'
        TEXT_BUTTON_2         = 'NO'
        ICON_BUTTON_2         = 'ICON_CANCEL'
        DEFAULT_BUTTON        = '1'
        DISPLAY_CANCEL_BUTTON = ''
        START_COLUMN          = 25
        START_ROW             = 8
        POPUP_TYPE            = 'ICON_MESSAGE_WARNING'
      IMPORTING
        ANSWER                = G_ANSWER. " 1= YES, 2= NO, A= CANCEL
    IF G_ANSWER = 1.
      MODIFY ZMMT190 FROM TABLE GT_EQUIP_A.
      IF SY-SUBRC NE 0.
        ROLLBACK WORK.
        MESSAGE E000(ZMM03) WITH '儲存資料發生失敗'.
      ELSE.
        COMMIT WORK AND WAIT.
        MESSAGE S000(ZMM03) WITH '儲存資料成功!'.
      ENDIF.
    ENDIF.
  ELSE.
    MESSAGE S000(ZMM03) WITH '無修改數據'.
  ENDIF.
ENDFORM.                    " SAVE_DATA