1. 程式人生 > 其它 >工藝路線批導程式開發

工藝路線批導程式開發

技術標籤:ABAP開發學習

可直接拿過來使用

*&---------------------------------------------------------------------*
*& Report ZRPP_001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZRPP_001.

INCLUDE ZRPP_001TOP.
INCLUDE ZRPP_001F01.

INITIALIZATION.
  PERFORM FRM_INIT.

AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FRM_DOWNLOAD_TEMP.
    WHEN 'FC02'.
      G_STATUS = '0'.
    WHEN 'FC03'.
      G_STATUS = '1'.
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM FRM_GET_EXCEL.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF G_STATUS EQ '0'.
      IF SCREEN-GROUP1 EQ 'MD1'.
        SCREEN-ACTIVE = '1'.
      ELSEIF SCREEN-GROUP1 EQ 'MD2'.
        SCREEN-ACTIVE = '0'.
      ENDIF.
    ELSE.
      IF SCREEN-GROUP1 EQ 'MD2'.
        SCREEN-ACTIVE = '1'."顯示
      ELSEIF SCREEN-GROUP1 EQ 'MD1'.
        SCREEN-ACTIVE = '0'."隱藏
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

START-OF-SELECTION.
  PERFORM FRM_GET_DATA.

END-OF-SELECTION .
  CHECK G_STATUS EQ '1'.
  IF GT_DATA IS NOT INITIAL.
    PERFORM FRM_DISPLAY_ALV.
  ELSE.
    MESSAGE '未查到業務資料!' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
*&---------------------------------------------------------------------*
*& 包含               ZRPP_001TOP
*&---------------------------------------------------------------------*
TABLES SSCRFIELDS.
*定義結構型別
TYPES:BEGIN OF TY_EXCEL,
        COL01 TYPE STRING,
        COL02 TYPE STRING,
        COL03 TYPE STRING,
        COL06 TYPE STRING,
        COL07 TYPE STRING,
        COL08 TYPE STRING,
        COL09 TYPE STRING,
        COL10 TYPE STRING,
        COL11 TYPE STRING,
        COL12 TYPE STRING,
        COL13 TYPE STRING,
        COL14 TYPE STRING,
        COL15 TYPE STRING,
        COL16 TYPE STRING,
        COL17 TYPE STRING,
        COL18 TYPE STRING,
        COL19 TYPE STRING,
        COL20 TYPE STRING,
        COL21 TYPE STRING,
        COL22 TYPE STRING,
        COL23 TYPE STRING,
        COL24 TYPE STRING,
        COL25 TYPE STRING,
        COL26 TYPE STRING,
      END OF TY_EXCEL,
      BEGIN OF TY_DATA,
        MATNR TYPE MATNR,     "物料號
        WERKS TYPE WERKS_D,   "工廠
        KTEXT TYPE PLANTEXT,  "工藝描述
        CNJX  TYPE CHAR40,    "廠內機型
        BRAND TYPE CHAR40,    "品牌
        VERWE TYPE VERWE,     "用途
        STATU TYPE STATU,     "狀態
        PLNME TYPE PLNME,     "單位
        VORNR TYPE VORNR,     "工序號碼
        ARBPL TYPE ARBPL,     "工作中心
        STEUS TYPE STEUS,     "控制碼
        LTXA1 TYPE LTXA1,     "工序描述
        BMSCH TYPE BMSCH,     "工序數量
        SFFG  TYPE CHAR1,     "是否分割
        FGS   TYPE CHAR6,     "分割數
        VGE01 TYPE VGWRTEH,   "人工工時單位
        VGW01 TYPE VGWRT,     "人工工時
        LAR01 TYPE LSTAR,     "人工作業型別
        VGE02 TYPE VGWRTEH,   "機器工時單位
        VGW02 TYPE VGWRT,     "機器工時
        LAR02 TYPE LSTAR,     "機器作業型別
        VGE03 TYPE VGWRTEH,   "制費工時單位
        VGW03 TYPE VGWRT,     "制費工時
        LAR03 TYPE LSTAR,     "制費作業型別
        SEL   TYPE ABAP_BOOL,
      END OF TY_DATA.
*定義工作區
DATA: GS_EXCEL    TYPE TY_EXCEL,
      GS_DATA     TYPE TY_DATA,
      GS_FUNCTXT  TYPE SMP_DYNTXT,
      GS_LAYOUT   TYPE SLIS_LAYOUT_ALV,
      GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
*定義內表
DATA: GT_EXCEL    TYPE TABLE OF TY_EXCEL,
      GT_DATA     TYPE TABLE OF TY_DATA,
      GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
*定義欄位符號
FIELD-SYMBOLS: <FS_EXCEL> TYPE TY_EXCEL,
               <FS_DATA>  TYPE TY_DATA.
*定義全域性變數
DATA: G_STATUS TYPE CHAR1,
      G_TITLE  TYPE LVC_TITLE.
*選擇介面
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN FUNCTION KEY 3.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
  PARAMETERS P_FILE TYPE RLGRAP-FILENAME MODIF ID MD1.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
  PARAMETERS: CB_1 AS CHECKBOX DEFAULT 'X' MODIF ID MD1.
SELECTION-SCREEN END OF BLOCK B2.

SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-003.
  SELECT-OPTIONS: S_WERKS FOR GS_DATA-WERKS MODIF ID MD2 OBLIGATORY  DEFAULT 'GX10',
                  S_MATNR FOR GS_DATA-MATNR MODIF ID MD2.
SELECTION-SCREEN END OF BLOCK B3.
*&---------------------------------------------------------------------*
*& 包含               ZRPP_001F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_INIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_INIT .
  G_STATUS = 0.

  CLEAR GS_FUNCTXT.
  GS_FUNCTXT-ICON_ID    = ICON_EXPORT.
  GS_FUNCTXT-ICON_TEXT  = '下載模板'.
  GS_FUNCTXT-QUICKINFO  = '下載模板'.
  SSCRFIELDS-FUNCTXT_01 = GS_FUNCTXT.

  CLEAR GS_FUNCTXT.
  GS_FUNCTXT-ICON_ID    = ICON_IMPORT.
  GS_FUNCTXT-QUICKINFO  = '匯入'.
  GS_FUNCTXT-ICON_TEXT  = '匯入'.
  SSCRFIELDS-FUNCTXT_02 = GS_FUNCTXT.

  CLEAR GS_FUNCTXT.
  GS_FUNCTXT-ICON_ID    =  ICON_START_VIEWER.
  GS_FUNCTXT-QUICKINFO  = '檢視'.
  GS_FUNCTXT-ICON_TEXT  = '檢視'.
  SSCRFIELDS-FUNCTXT_03 = GS_FUNCTXT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_TEMP
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMP .
  DATA: L_FNAME    TYPE STRING,
        L_FILENAME TYPE STRING,
        L_PATH     TYPE STRING,
        L_FULLPATH TYPE STRING,
        LS_WWWDATA TYPE WWWDATATAB.

  CONCATENATE '工藝路線批導模板-' SY-DATUM SY-UZEIT INTO L_FNAME.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
*     WINDOW_TITLE              =
      DEFAULT_EXTENSION         = 'XLS'
      DEFAULT_FILE_NAME         = L_FNAME
*     WITH_ENCODING             =
      FILE_FILTER               = 'Microsoft Excel 檔案 (*.XLS)'
*     INITIAL_DIRECTORY         =
*     PROMPT_ON_OVERWRITE       = 'X'
    CHANGING
      FILENAME                  = L_FILENAME
      PATH                      = L_PATH
      FULLPATH                  = L_FULLPATH
*     USER_ACTION               =
*     FILE_ENCODING             =
    EXCEPTIONS
      CNTL_ERROR                = 1
      ERROR_NO_GUI              = 2
      NOT_SUPPORTED_BY_GUI      = 3
      INVALID_DEFAULT_FILE_NAME = 4
      OTHERS                    = 5.
  IF L_FULLPATH IS NOT INITIAL.
    SELECT SINGLE * INTO CORRESPONDING FIELDS OF LS_WWWDATA FROM WWWDATA WHERE OBJID EQ 'ZPP001'.
    IF SY-SUBRC EQ 0 .
      P_FILE = L_FULLPATH.

      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          KEY         = LS_WWWDATA
          DESTINATION = P_FILE.
* IMPORTING
*     RC  =
* CHANGING
*     TEMP              =
    ELSE .
      MESSAGE '模板檔案:ZPP001.XLS不存在,請用TCODE:SMW0進行載入' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.
  ELSE.
    MESSAGE '取消選擇!'  TYPE 'S' DISPLAY LIKE 'E' .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_EXCEL .
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '
*     DEF_PATH         = ' '
      MASK             = ',Microsoft Excel 檔案 (*.XLS;),*.XLS;'
      MODE             = 'O'
      TITLE            = '選擇檔案'
    IMPORTING
      FILENAME         = P_FILE
*     RC               =
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
  IF SY-SUBRC EQ 3 .
    MESSAGE '取消選擇!' TYPE 'S' DISPLAY LIKE 'E' .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
  IF G_STATUS EQ '0'.
    PERFORM FRM_IMPORT_DATA.
  ELSE.
    PERFORM FRM_SEARCH_DATA.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
  PERFORM FRM_SET_FIELDCAT.
  PERFORM FRM_SET_LAYOUT.
  PERFORM FRM_SET_TITLE.
  PERFORM FRM_SET_ALV.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
  DEFINE %%FILL_FIELDCAT.
    CLEAR GS_FIELDCAT.
    GS_FIELDCAT-FIELDNAME = &1.
    GS_FIELDCAT-SELTEXT_M = &2.
    GS_FIELDCAT-OUTPUTLEN = &3.
    IF &1 EQ 'PLNME'.
      GS_FIELDCAT-EDIT_MASK = '==CUNIT'.
    ELSEIF &1 EQ 'MATNR' OR &1 EQ 'WERKS' OR &1 EQ 'VORNR'.
      GS_FIELDCAT-KEY = 'X'.
    ENDIF.
    APPEND GS_FIELDCAT TO GT_FIELDCAT.
  END-OF-DEFINITION.

  %%FILL_FIELDCAT 'MATNR'       '物料號'       40.
  %%FILL_FIELDCAT 'WERKS'       '工廠'         4.
  %%FILL_FIELDCAT 'VORNR'       '工序號碼'     6.
  %%FILL_FIELDCAT 'KTEXT'       '工藝描述'     40.
  %%FILL_FIELDCAT 'VERWE'       '用途'         3.
  %%FILL_FIELDCAT 'STATU'       '狀態'         3.
  %%FILL_FIELDCAT 'PLNME'       '單位'         3.
  %%FILL_FIELDCAT 'ARBPL'       '工作中心'     8.
  %%FILL_FIELDCAT 'STEUS'       '控制碼'       4.
  %%FILL_FIELDCAT 'LTXA1'       '工序描述'     20.
  %%FILL_FIELDCAT 'BMSCH'       '工序數量'     8.
  %%FILL_FIELDCAT 'SFFG'        '是否分割'     3.
  %%FILL_FIELDCAT 'FGS'         '分割數'       3.
  %%FILL_FIELDCAT 'VGW01'       '人工工時單位' 5.
  %%FILL_FIELDCAT 'VGE01'       '人工工時'     5.
  %%FILL_FIELDCAT 'LAR01'       '人工作業型別' 5.
  %%FILL_FIELDCAT 'VGW02'       '機器工時單位' 5.
  %%FILL_FIELDCAT 'VGE02'       '機器工時'     5.
  %%FILL_FIELDCAT 'LAR02'       '機器作業型別' 5.
  %%FILL_FIELDCAT 'VGW03'       '制費工時單位' 5.
  %%FILL_FIELDCAT 'VGE03'       '制費工時'     5.
  %%FILL_FIELDCAT 'LAR03'       '制費作業型別' 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
  CLEAR GS_LAYOUT.
  GS_LAYOUT-ZEBRA             = 'X'.
  GS_LAYOUT-BOX_FIELDNAME     = 'SEL'.
  GS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_TITLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_TITLE .
  DATA L_LINE TYPE NUMC5 .
  DESCRIBE TABLE GT_DATA LINES L_LINE .
  SHIFT L_LINE LEFT DELETING LEADING '0'.
  CONCATENATE '總計' L_LINE '行' INTO G_TITLE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_ALV .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       = ' '
*     I_BUFFER_ACTIVE          = ' '
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
*     I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE   = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
      I_GRID_TITLE             = G_TITLE
*     I_GRID_SETTINGS          =
      IS_LAYOUT                = GS_LAYOUT
      IT_FIELDCAT              = GT_FIELDCAT
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS        =
*     IT_SORT                  =
*     IT_FILTER                =
*     IS_SEL_HIDE              =
*     I_DEFAULT                = 'X'
      I_SAVE                   = 'A'
*     IS_VARIANT               =
*     IT_EVENTS                =
*     IT_EVENT_EXIT            =
*     IS_PRINT                 =
*     IS_REPREP_ID             =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        = 0
*     I_HTML_HEIGHT_END        = 0
*     IT_ALV_GRAPHICS          =
*     IT_HYPERLINK             =
*     IT_ADD_FIELDCAT          =
*     IT_EXCEPT_QINFO          =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      T_OUTTAB                 = GT_DATA
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  DATA LS_EXTAB TYPE SLIS_EXTAB.
  LS_EXTAB-FCODE = 'PRINT'.
  APPEND LS_EXTAB TO RT_EXTAB.
  SET PF-STATUS 'ALV_STANDARD' EXCLUDING RT_EXTAB.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_MARA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_DATA>_MATNR
*&      <-- L_FLAG
*&---------------------------------------------------------------------*
FORM FRM_CHECK_MARA  USING    P_MATNR
                     CHANGING P_FLAG.
  SELECT COUNT(*) FROM MARA WHERE MATNR EQ P_MATNR AND LVORM EQ SPACE.
  IF SY-SUBRC NE 0.
    P_FLAG = 'X'.
  ELSE.
    CLEAR P_FLAG.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_MARC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_DATA>_MATNR
*&      <-- L_FLAG
*&---------------------------------------------------------------------*
FORM FRM_CHECK_MARC  USING    P_MATNR P_WERKS
                     CHANGING P_FLAG.

  SELECT COUNT(*) FROM MARC WHERE MATNR EQ P_MATNR AND WERKS EQ P_WERKS AND LVORM EQ SPACE.
  IF SY-SUBRC NE 0.
    P_FLAG = 'X'.
  ELSE.
    CLEAR P_FLAG.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_MEINS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_DATA>_MATNR
*&      --> <FS_DATA>_PLNME
*&      <-- L_FLAG
*&---------------------------------------------------------------------*
FORM FRM_CHECK_MEINS  USING    P_MATNR P_PLNME
                      CHANGING P_FLAG.

  SELECT COUNT(*) FROM MARA WHERE MATNR EQ P_MATNR AND MEINS EQ P_PLNME AND LVORM EQ SPACE.
  IF SY-SUBRC NE 0.
    P_FLAG = 'X'.
  ELSE.
    CLEAR P_FLAG.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_ARBPL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_DATA>_ARBPL
*&      <-- L_FLAG
*&---------------------------------------------------------------------*
FORM FRM_CHECK_ARBPL  USING    P_ARBPL
                      CHANGING P_FLAG.

  SELECT COUNT(*) FROM CRHD WHERE ARBPL EQ P_ARBPL AND LVORM EQ SPACE.
  IF SY-SUBRC NE 0.
    P_FLAG = 'X'.
  ELSE.
    CLEAR P_FLAG.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_MAPL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_DATA>_MATNR
*&      --> GS_DATA_WERKS
*&      <-- L_FLAG
*&---------------------------------------------------------------------*
FORM FRM_CHECK_MAPL  USING    P_MATNR
                              P_WERKS
                     CHANGING P_FLAG.
  SELECT COUNT(*) FROM MAPL WHERE MATNR EQ P_MATNR AND WERKS EQ P_WERKS AND LOEKZ NE 'X'.
  IF SY-SUBRC EQ 0.
    P_FLAG = 'X'.
  ELSE.
    CLEAR P_FLAG.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_MES
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_ERRORMSG
*&      --> L_ZEILE
*&      --> LT_RETURN_TYPE
*&      --> LT_RETURN_ID
*&      --> LT_RETURN_NUMBER
*&      --> LT_RETURN_MESSAGE_V1
*&      --> LT_RETURN_MESSAGE_V2
*&      --> LT_RETURN_MESSAGE_V3
*&      --> LT_RETURN_MESSAGE_V4
*&---------------------------------------------------------------------*
FORM FRM_ADD_MES  TABLES PT_ERRORMSG STRUCTURE SMESG
                   USING P_ZEILE
                         P_TYPE
                         P_ID
                         P_NUMBER
                         P_MESSAGE_V1
                         P_MESSAGE_V2
                         P_MESSAGE_V3
                         P_MESSAGE_V4.
  DATA LS_ERRORMSG TYPE SMESG.
  LS_ERRORMSG-ZEILE = P_ZEILE + 1.
  LS_ERRORMSG-MSGTY = P_TYPE.
  LS_ERRORMSG-ARBGB = P_ID.
  LS_ERRORMSG-TXTNR = P_NUMBER.
  LS_ERRORMSG-MSGV1 = P_MESSAGE_V1.
  LS_ERRORMSG-MSGV2 = P_MESSAGE_V2.
  LS_ERRORMSG-MSGV3 = P_MESSAGE_V3.
  LS_ERRORMSG-MSGV4 = P_MESSAGE_V4.
  APPEND LS_ERRORMSG TO PT_ERRORMSG.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_IMPORT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_IMPORT_DATA .
  DATA LT_RDATA TYPE TRUXS_T_TEXT_DATA.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      I_TAB_RAW_DATA       = LT_RDATA
      I_FILENAME           = P_FILE
    TABLES
      I_TAB_CONVERTED_DATA = GT_EXCEL
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.
  IF SY-SUBRC NE 0.
    MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  LOOP AT GT_EXCEL ASSIGNING <FS_EXCEL> FROM 4.
    CLEAR GS_DATA.

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT            = <FS_EXCEL>-COL01
      IMPORTING
        OUTPUT           = GS_DATA-MATNR
      EXCEPTIONS
        NUMBER_NOT_FOUND = 0
        LENGTH_ERROR     = 0
        OTHERS           = 0.

    GS_DATA-WERKS   = <FS_EXCEL>-COL02.
    GS_DATA-KTEXT   = <FS_EXCEL>-COL03.
    GS_DATA-CNJX    = <FS_EXCEL>-COL06.
    GS_DATA-BRAND   = <FS_EXCEL>-COL07.
    GS_DATA-VERWE   = <FS_EXCEL>-COL08.
    GS_DATA-STATU   = <FS_EXCEL>-COL09.

    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        INPUT          = <FS_EXCEL>-COL10
        LANGUAGE       = SY-LANGU
      IMPORTING
        OUTPUT         = GS_DATA-PLNME
      EXCEPTIONS
        UNIT_NOT_FOUND = 1
        OTHERS         = 2.

    GS_DATA-VORNR   = <FS_EXCEL>-COL11.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = <FS_EXCEL>-COL11
      IMPORTING
        OUTPUT = GS_DATA-VORNR.

    GS_DATA-ARBPL   = <FS_EXCEL>-COL12.
    GS_DATA-STEUS   = <FS_EXCEL>-COL13.
    GS_DATA-LTXA1   = <FS_EXCEL>-COL14.
    GS_DATA-BMSCH   = <FS_EXCEL>-COL15.
    GS_DATA-SFFG    = <FS_EXCEL>-COL16.
    GS_DATA-FGS     = <FS_EXCEL>-COL17.
    GS_DATA-VGE01   = <FS_EXCEL>-COL18.
    GS_DATA-VGW01   = <FS_EXCEL>-COL19.
    GS_DATA-LAR01   = <FS_EXCEL>-COL20.
    GS_DATA-VGE02   = <FS_EXCEL>-COL21.
    GS_DATA-VGW02   = <FS_EXCEL>-COL22.
    GS_DATA-LAR02   = <FS_EXCEL>-COL23.
    GS_DATA-VGE03   = <FS_EXCEL>-COL24.
    GS_DATA-VGW03   = <FS_EXCEL>-COL25.
    GS_DATA-LAR03   = <FS_EXCEL>-COL26.

    APPEND GS_DATA TO GT_DATA.
  ENDLOOP.

  SORT GT_DATA BY MATNR WERKS VORNR.

  DATA: L_FLAG    TYPE ABAP_BOOL,
        L_ZEILE   TYPE SMESG-ZEILE,
        L_LEN     TYPE NUMC5,
        L_MATNR   TYPE MATNR,
        L_TESTRUN TYPE BAPIFLAG,
        L_PLNNR   TYPE PLNNR, "任務清單組鍵值
        L_PLNAL   TYPE PLNAL. "組計數器

  DATA:LT_TSK      TYPE TABLE OF BAPI1012_TSK_C WITH HEADER LINE, "任務清單頭資料
       LT_MTK      TYPE TABLE OF BAPI1012_MTK_C WITH HEADER LINE, "物料任務清單分配
       LT_OPR      TYPE TABLE OF BAPI1012_OPR_C WITH HEADER LINE, "工序
       LT_TMP      TYPE TABLE OF BAPI1012_OPR_C WITH HEADER LINE, "工序
       LT_RETURN   TYPE TABLE OF BAPIRET2 WITH HEADER LINE, "返回引數
       LT_ZPPT001  TYPE TABLE OF ZPPT001 WITH HEADER LINE,
       LT_ERRORMSG TYPE TABLE OF SMESG.

  L_TESTRUN = CB_1.

  LOOP AT GT_DATA ASSIGNING <FS_DATA>.
    DESCRIBE TABLE LT_ERRORMSG LINES L_LEN.
    SHIFT L_LEN LEFT DELETING LEADING '0'.
    L_ZEILE = L_LEN.

    CLEAR L_FLAG.
    PERFORM FRM_CHECK_MARA USING <FS_DATA>-MATNR CHANGING L_FLAG.
    IF L_FLAG EQ 'X'.
      PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE 'E' '00' '001' <FS_DATA>-MATNR '物料不存在!' '' ''.
      CONTINUE.
    ENDIF.

    CLEAR L_FLAG.
    PERFORM FRM_CHECK_MARC USING <FS_DATA>-MATNR <FS_DATA>-WERKS CHANGING L_FLAG.
    IF L_FLAG EQ 'X'.
      PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE 'E' '00' '001' <FS_DATA>-MATNR '物料不存在' <FS_DATA>-WERKS '工廠資料!'.
      CONTINUE.
    ENDIF.

    CLEAR L_FLAG.
    PERFORM FRM_CHECK_MEINS USING <FS_DATA>-MATNR <FS_DATA>-PLNME CHANGING L_FLAG.
    IF L_FLAG EQ 'X'.
      PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE 'E' '00' '001' <FS_DATA>-MATNR '物料單位' <FS_DATA>-PLNME '與基本單位不一致!'.
      CONTINUE.
    ENDIF.

    CLEAR L_FLAG.
    PERFORM FRM_CHECK_ARBPL USING <FS_DATA>-ARBPL CHANGING L_FLAG.
    IF L_FLAG EQ 'X'.
      PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE 'E' '00' '001' <FS_DATA>-ARBPL '工作中心不存在!' '' ''.
      CONTINUE.
    ENDIF.

    CLEAR L_FLAG.
    PERFORM FRM_CHECK_MAPL USING <FS_DATA>-MATNR GS_DATA-WERKS CHANGING L_FLAG.
    IF L_FLAG EQ 'X'.
      PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE 'E' '00' '001' <FS_DATA>-MATNR '已存在工藝路線!' '' ''.
      CONTINUE.
    ENDIF.

    CLEAR: GS_DATA,L_MATNR.
    MOVE <FS_DATA> TO GS_DATA.
    L_MATNR = <FS_DATA>-MATNR.

    AT NEW MATNR.
      REFRESH: LT_TSK,LT_MTK,LT_OPR,LT_RETURN.
      CLEAR: L_PLNNR,LT_TSK,LT_MTK.

      SELECT SINGLE PLNNR FROM MAPL INTO L_PLNNR WHERE WERKS EQ  GS_DATA-WERKS AND MATNR EQ  GS_DATA-MATNR AND PLNTY EQ  'N' AND LOEKZ NE 'X'.

      IF SY-SUBRC EQ 0.
        LT_TSK-TASK_LIST_GROUP   = L_PLNNR."任務清單組碼
      ENDIF.

      LT_TSK-PLANT             = GS_DATA-WERKS .  "工廠
      LT_TSK-TASK_LIST_USAGE   = GS_DATA-VERWE.   "用途
      LT_TSK-TASK_LIST_STATUS  = GS_DATA-STATU.   "狀態
      LT_TSK-VALID_FROM        = SY-DATUM.        "有效起始日期
      LT_TSK-VALID_TO_DATE     = '99991231'.      "有效截止日期
      LT_TSK-LOT_SIZE_FROM     = '00000000'.      "從批量
      LT_TSK-LOT_SIZE_TO       = '99999999'.      "至批量
      LT_TSK-DESCRIPTION       = GS_DATA-KTEXT.   "工藝描述
      LT_TSK-TASK_MEASURE_UNIT = GS_DATA-PLNME.   "計量單位
      APPEND LT_TSK.

      LT_MTK-PLANT              = GS_DATA-WERKS.    "工廠
      LT_MTK-MATERIAL           = GS_DATA-MATNR.    "產品編號
      LT_MTK-MATERIAL_EXTERNAL  = GS_DATA-MATNR.    "產品編號
      LT_MTK-VALID_FROM         = SY-DATUM.         "有效起始日期
      LT_MTK-VALID_TO_DATE      = '99991231'.       "有效截止日期
      APPEND LT_MTK.
    ENDAT.

    " 工序
    CLEAR LT_OPR.
    LT_OPR-SEQUENCE_NO       = '000000'.      "序列
    LT_OPR-ACTIVITY          = <FS_DATA>-VORNR. "工序編碼
    LT_OPR-CONTROL_KEY       = <FS_DATA>-STEUS. "控制碼
    LT_OPR-WORK_CNTR         = <FS_DATA>-ARBPL. "工作中心
    LT_OPR-PLANT             = <FS_DATA>-WERKS. "工廠
    LT_OPR-DESCRIPTION       = <FS_DATA>-LTXA1. "工序描述
    LT_OPR-BASE_QUANTITY     = <FS_DATA>-BMSCH. "基礎數量
    LT_OPR-COST_RELEVANT     = 'X'.             "與成本核算相關標誌
    LT_OPR-OPERATION_MEASURE_UNIT = <FS_DATA>-PLNME. "計量單位
    LT_OPR-STD_UNIT_01       = <FS_DATA>-VGE01."人工工時單位
    LT_OPR-STD_VALUE_01      = <FS_DATA>-VGW01."人工工時
    LT_OPR-STD_UNIT_02       = <FS_DATA>-VGE02."機器工時單位
    LT_OPR-STD_VALUE_02      = <FS_DATA>-VGW02."機器工時
    LT_OPR-STD_UNIT_03       = <FS_DATA>-VGE03."制費工時單位
    LT_OPR-STD_VALUE_03      = <FS_DATA>-VGW03."制費工時
    LT_OPR-VALID_FROM        = SY-DATUM.  "有效起始日期
    LT_OPR-VALID_TO_DATE     = '99991231'."有效截止日期
    LT_OPR-DENOMINATOR       = 1.
    LT_OPR-NOMINATOR         = 1.
*    LT_OPR-IND_SPLITTING_REQRD = 'X'.    "是否拆分
*    LT_OPR-MAX_NO_OF_SPLITS = 999.       "最大拆分數
    APPEND LT_OPR.

    AT END OF MATNR.
      MOVE LT_OPR[] TO LT_TMP[].

      CALL FUNCTION 'BAPI_ROUTING_CREATE'
        EXPORTING
          TESTRUN                = L_TESTRUN
        IMPORTING
          GROUP                  = L_PLNNR
          GROUPCOUNTER           = L_PLNAL
        TABLES
          TASK                   = LT_TSK
          MATERIALTASKALLOCATION = LT_MTK
          OPERATION              = LT_OPR
          RETURN                 = LT_RETURN.

      LOOP AT LT_RETURN WHERE TYPE EQ 'E' OR TYPE EQ 'A'.
        EXIT.
      ENDLOOP.

      IF SY-SUBRC EQ 0.
        IF CB_1 NE 'X'.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.

        LOOP AT LT_RETURN WHERE TYPE EQ 'E' OR TYPE EQ 'A'.
          DESCRIBE TABLE LT_ERRORMSG LINES L_LEN.
          SHIFT L_LEN LEFT DELETING LEADING '0'.
          L_ZEILE = L_LEN.

          PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE
                                                       LT_RETURN-TYPE
                                                       LT_RETURN-ID
                                                       LT_RETURN-NUMBER
                                                       LT_RETURN-MESSAGE_V1
                                                       LT_RETURN-MESSAGE_V2
                                                       LT_RETURN-MESSAGE_V3
                                                       LT_RETURN-MESSAGE_V4.
        ENDLOOP.
      ELSE.
        IF CB_1 NE 'X'.
          LOOP AT LT_TMP.
            READ TABLE GT_DATA INTO GS_DATA WITH KEY MATNR = L_MATNR WERKS = LT_TMP-PLANT VORNR = LT_OPR-ACTIVITY BINARY SEARCH.
            IF SY-SUBRC EQ 0.
              MOVE-CORRESPONDING GS_DATA TO LT_ZPPT001.
              LT_ZPPT001-CNAME = SY-UNAME.
              LT_ZPPT001-CDATE = SY-DATUM.
              LT_ZPPT001-CTIME = SY-UZEIT.
              APPEND LT_ZPPT001.
            ENDIF.
          ENDLOOP.

          MODIFY ZPPT001 FROM TABLE LT_ZPPT001.

          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              WAIT = 'X'.
        ENDIF.

        LOOP AT LT_RETURN WHERE TYPE EQ 'S' OR TYPE EQ 'W'.
          DESCRIBE TABLE LT_ERRORMSG LINES L_LEN.
          SHIFT L_LEN LEFT DELETING LEADING '0'.
          L_ZEILE = L_LEN.

          PERFORM FRM_ADD_MES TABLES LT_ERRORMSG USING L_ZEILE
                                                       LT_RETURN-TYPE
                                                       LT_RETURN-ID
                                                       LT_RETURN-NUMBER
                                                       LT_RETURN-MESSAGE_V1
                                                       LT_RETURN-MESSAGE_V2
                                                       LT_RETURN-MESSAGE_V3
                                                       LT_RETURN-MESSAGE_V4.
        ENDLOOP.
      ENDIF.
    ENDAT.
  ENDLOOP.

  IF LT_ERRORMSG[] IS NOT INITIAL.
    CALL FUNCTION 'FB_MESSAGES_DISPLAY_POPUP'
      EXPORTING
        IT_SMESG        = LT_ERRORMSG[]
*       ID_SEND_IF_ONE  = 'X'
      EXCEPTIONS
        NO_MESSAGES     = 1
        POPUP_CANCELLED = 2
        OTHERS          = 3.
  ELSE.
    MESSAGE '暫未發現錯誤,可直接匯入資料!' TYPE 'S'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SEARCH_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SEARCH_DATA .

  SELECT
    MAPL~MATNR
    MAPL~WERKS
    PLKO~KTEXT
    PLKO~VERWE
    PLKO~STATU
    PLKO~PLNME
    PLPO~VORNR
    CRHD~ARBPL
    PLPO~STEUS
    PLPO~LTXA1
    PLPO~BMSCH
    PLPO~VGE01
    PLPO~VGW01
    PLPO~LAR01
    PLPO~VGE02
    PLPO~VGW02
    PLPO~LAR02
    PLPO~VGE03
    PLPO~VGW03
    PLPO~LAR03
    INTO CORRESPONDING FIELDS OF TABLE GT_DATA
    FROM MAPL INNER JOIN PLKO ON MAPL~PLNTY EQ PLKO~PLNTY AND MAPL~PLNNR EQ PLKO~PLNNR AND MAPL~PLNAL EQ PLKO~PLNAL AND MAPL~ZAEHL EQ PLKO~ZAEHL
              INNER JOIN PLPO ON PLKO~PLNTY EQ PLPO~PLNTY AND PLKO~PLNNR EQ PLPO~PLNNR AND PLKO~ZAEHL EQ PLPO~ZAEHL
              INNER JOIN CRHD ON PLPO~ARBID EQ CRHD~OBJID
    WHERE MAPL~LOEKZ NE 'X'
      AND MAPL~MATNR IN S_MATNR
      AND MAPL~WERKS IN S_WERKS.
  SORT GT_DATA BY MATNR WERKS VORNR.
ENDFORM.

模板格式
在這裡插入圖片描述