SAP-PP生产计划导入

  1. 程序说明

2.1程序说明

    1. 计划订单导入前需要将选择物料期间内的计划订单清除。
    2. 生产计划以计划订单的形式导入系统。
    3. 计划订单类型为LA。
    4. 计划开始日期写入订单开始日期,计划完成日期写入订单完成日期。
    5. 当数据中有销售订单时,在分配栏中的科目分配类别选择M。
    6. 版本号写入生产版本。
    7. 工作中心写入详细计划栏中,当工作中心为1001001时,批量更新工作中心为1001开头的工序(根据工作中心前四位的编码)
    8. 需要在计划订单中增强一个文本字段(100个字符),备注写入此增强字段中。

举例:如果工序0010,0020,0030的工作中心是1001002,工序0040的工作中心是1002001,现在导入文件中的工作中心是1001001,那更新0010,0020,0030的工序中的工作中心。

 程序实现
2.2.1 选择下载模板,则下载模板

        "---下载模板
      WHEN P_DOWN.
        PERFORM SUB_DOWNLOAD_TEMPLATE.

2.2.2"导出模板的名称

  DATA:TEMPFILE TYPE STRING.
  CONCATENATE '计划工单' '_'  SY-DATUM+6(2) '_' SY-DATUM+4(2) '_'  SY-DATUM(4) '_' SY-UZEIT '.xls' INTO TEMPFILE.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      DEF_FILENAME     = TEMPFILE
      DEF_PATH         = G_FILE
      MASK             = ',*.xls,*.*.'
      MODE             = '0'
      TITLE            = 'Save path'
    IMPORTING
      FILENAME         = G_FILE
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 08
      SELECTION_CANCEL = 12
      SELECTION_ERROR  = 16.
  IF SY-SUBRC NE 0.
    EXIT.
  ENDIF.

  
2.2.3"调用OLE,将模板导出导Excel

  IF G_FILE IS NOT INITIAL.
* start Excel
    IF H_EXCEL-HEADER = SPACE OR H_EXCEL-HANDLE = -1.
      CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
    ENDIF.

*--- get list of workbooks, initially empty
    CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
    SET PROPERTY OF H_EXCEL 'Visible'       = 0.
    CALL METHOD OF H_MAPL 'Add' = H_MAP.

    PERFORM SET_FIRST_SHEET.

    LINE = 1.
    L_RC = 0.
    ROW = 19.

    PERFORM FILL_RANGE  USING LINE  1 '工厂'.
    PERFORM FILL_RANGE  USING LINE  2 '销售订单号'.
    PERFORM FILL_RANGE  USING LINE  3 '行项目'.
    PERFORM FILL_RANGE  USING LINE  4 '客户名称'.
    PERFORM FILL_RANGE  USING LINE  5 '物料编号'.
    PERFORM FILL_RANGE  USING LINE  6 '物料描述'.
    PERFORM FILL_RANGE  USING LINE  7 ''.
    PERFORM FILL_RANGE  USING LINE  8 ''.
    PERFORM FILL_RANGE  USING LINE  9 '订单数量'.
    PERFORM FILL_RANGE  USING LINE  10  '销售订单交期'.
    PERFORM FILL_RANGE  USING LINE  11  '计划开始日期'.
    PERFORM FILL_RANGE  USING LINE  12 '计划完成日期'.
    PERFORM FILL_RANGE  USING LINE  13 '工作中心'.
    PERFORM FILL_RANGE  USING LINE  14 '版本号'.
    PERFORM FILL_RANGE  USING LINE  15  '备注'.
    PERFORM FILL_RANGE  USING LINE  16  '计划生产数'.
    LINE = LINE + 1.

    PERFORM FILL_RANGE  USING LINE  10 'YYYYMMDD'.

    PERFORM FRM_COLFORMART USING 1.
    PERFORM FRM_COLFORMART USING 2.
    PERFORM FRM_COLFORMART USING 3.
    PERFORM FRM_COLFORMART USING 5.
    PERFORM FRM_COLFORMART USING 11.
    PERFORM FRM_COLFORMART USING 12.
    PERFORM FRM_COLFORMART USING 13.
    PERFORM FRM_COLFORMART USING 14.


    CALL METHOD OF H_MAP 'SAVEAS'
      EXPORTING
        #1 = G_FILE.

    CALL METHOD OF H_EXCEL 'QUIT'.

    FREE OBJECT: COLUMNS,
                  H_MAPL,
                 H_MAP,
                 H_EXCEL.

    MESSAGE '模板下载完成' TYPE 'S'.
  
2.2.4      "如果选择查询信息,则根据选择条件获取查询信息

      WHEN P_QUERY OR P_DELE.
        PERFORM SUB_GET_DATA TABLES G_IT_UPLOAD_DATA[].
        PERFORM SUB_DISPLAY_ALV TABLES G_IT_UPLOAD_DATA[] .
  
  2.2.5"获取LA及KD的计划订单

  SELECT *
     INTO CORRESPONDING FIELDS OF TABLE L_IT_UPLOAD_DATA
     FROM PLAF
     WHERE PWWRK = P_WERKS
       AND MATNR IN S_MATNR
       AND PSTTR IN S_ERDAT
       AND AUFFX IN S_AUFFX
  AND PAART IN ('LA','KD').

  
  2.2.6"处理唯一物料号

  LOOP AT L_IT_UPLOAD_DATA  ASSIGNING <F_UPLOAD_DATA>.
    L_IT_MATNR-MATNR = <F_UPLOAD_DATA>-MATNR.
    COLLECT L_IT_MATNR.
  ENDLOOP.

  SORT L_IT_MATNR BY MATNR.

 
  2.2.7--取物料名称

  SELECT MATNR MAKTX
      INTO CORRESPONDING FIELDS OF TABLE L_IT_MAKT
      FROM MAKT
      FOR ALL ENTRIES IN L_IT_MATNR
      WHERE SPRAS = SY-LANGU
  AND MATNR = L_IT_MATNR-MATNR.
  SORT L_IT_MAKT BY MATNR.

  SORT L_IT_MARA BY MATNR.

   
  2.2.8"获取物料描述

  SELECT MATNR MTART
    INTO CORRESPONDING FIELDS OF TABLE WA_MTAR
    FROM MARA
    FOR ALL ENTRIES IN L_IT_MATNR
  WHERE MATNR = L_IT_MATNR-MATNR.

  SORT WA_MTAR BY MATNR.

   
  2.2.9"获取MRP数据

  SELECT
    WERKS
    MATNR
    EKGRP
    PLIFZ
    DZEIT
    SHZET
    FEVOR AS PLGRP
    DISPO
    SBDKZ
    INTO CORRESPONDING FIELDS OF TABLE L_IT_MARC
    FROM MARC
    FOR ALL ENTRIES IN L_IT_UPLOAD_DATA
    WHERE WERKS = L_IT_UPLOAD_DATA-PLWRK
      AND MATNR = L_IT_UPLOAD_DATA-MATNR
  AND DISPO IN S_DISPO.

  SORT L_IT_MARC BY MATNR WERKS.

   
  2.2.10"整理数据以输出

  LOOP AT L_IT_UPLOAD_DATA ASSIGNING <F_UPLOAD_DATA> .

    L_TBIX = SY-TABIX.
    <F_UPLOAD_DATA>-LIGHT = C_YELLOW_LIGHT.

    "---取物料描述
    READ TABLE L_IT_MAKT WITH KEY MATNR = <F_UPLOAD_DATA>-MATNR
                                  BINARY SEARCH.
    IF SY-SUBRC = 0.
      <F_UPLOAD_DATA>-MAKTX = L_IT_MAKT-MAKTX.
    ELSE.
      "--------添加错误信息
      CONCATENATE '物料:' <F_UPLOAD_DATA>-MATNR ' 不存在!' INTO  WA_MESSAGE-MESSAGE.
      PERFORM SUB_ADD_MESSAGE USING 'E'
                                <F_UPLOAD_DATA>-ROWS
                                WA_MESSAGE-MESSAGE
                                'X'.
    ENDIF.

    <F_UPLOAD_DATA>-PWWRK =  <F_UPLOAD_DATA>-PLWRK.

    READ TABLE L_IT_MARC WITH KEY MATNR = <F_UPLOAD_DATA>-MATNR
                                   WERKS = <F_UPLOAD_DATA>-PWWRK.
    IF SY-SUBRC = 0.
      CLEAR:WA_MTAR.
      READ TABLE WA_MTAR WITH KEY MATNR = <F_UPLOAD_DATA>-MATNR BINARY SEARCH.
      IF WA_MTAR-MTART = 'ND01' AND <F_UPLOAD_DATA>-MATNR+0(8) <> '00000019' AND L_IT_MARC-SBDKZ <> '1'.
        <F_UPLOAD_DATA>-CHECKS = 'X'.
      ENDIF.

      <F_UPLOAD_DATA>-PLGRP = L_IT_MARC-PLGRP."
      "<F_UPLOAD_DATA>-EKGRP = L_IT_MARC-EKGRP.
      <F_UPLOAD_DATA>-DISPO = L_IT_MARC-DISPO.
       
  2.2.11"如果销售订单不为空,则获取客户信息

      IF <F_UPLOAD_DATA>-KDAUF <> ''.
        SELECT SINGLE VDATU KUNNR INTO (<F_UPLOAD_DATA>-VDATU,<F_UPLOAD_DATA>-KUNNR)
          FROM VBAK
        WHERE VBELN = <F_UPLOAD_DATA>-KDAUF.
        IF SY-SUBRC = 0.
          SELECT SINGLE NAME1 INTO <F_UPLOAD_DATA>-NAME1
            FROM KNA1
          WHERE KUNNR = <F_UPLOAD_DATA>-KUNNR.
          SELECT SINGLE KWMENG CUOBJ INTO (<F_UPLOAD_DATA>-KWMENG,<F_UPLOAD_DATA>-CUOBJ)
            FROM VBAP
            WHERE VBELN =  <F_UPLOAD_DATA>-KDAUF
          AND POSNR = <F_UPLOAD_DATA>-KDPOS.
        ENDIF.

      ENDIF.

      CLEAR:L_ZZDCDY.
       
  2.2.11"获取特性值

      SELECT SINGLE ZZDCDY ZZDCZR INTO (L_ZZDCDY,<F_UPLOAD_DATA>-ATWTB_ZR)
        FROM MARA
        WHERE MATNR = <F_UPLOAD_DATA>-MATNR
      AND MTART = 'ND01'.
      <F_UPLOAD_DATA>-ATWTB_DY = L_ZZDCDY.

      IF SY-SUBRC <> 0 AND <F_UPLOAD_DATA>-CUOBJ IS NOT INITIAL.
        REFRESH:CONFIGURATION.

        CALL FUNCTION 'VC_I_GET_CONFIGURATION_IBASE'
          EXPORTING
            INSTANCE           = <F_UPLOAD_DATA>-CUOBJ
*           BUSINESS_OBJECT    =
*           LANGUAGE           = SY-LANGU
*           IV_INVALID_POSSIBLE       = ' '
*           IV_NEUTRAL         = ' '
          TABLES
            CONFIGURATION      = CONFIGURATION
*           ET_CONF_WITH_AUTHOR       =
          EXCEPTIONS
            INSTANCE_NOT_FOUND = 1
            OTHERS             = 2.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.
        LOOP AT CONFIGURATION.
*        CASE:CONFIGURATION-ATNAM.
*          WHEN 'ZCTND01_CP_VOLTAGE'.
*            <F_UPLOAD_DATA>-ATWTB_DY = CONFIGURATION-ATWTB.
*          WHEN 'ZCTND01_DC_FLAME'.
*            <F_UPLOAD_DATA>-ATWTB_ZR = CONFIGURATION-ATWTB.
*        ENDCASE.
          CASE:CONFIGURATION-ATBEZ.
            WHEN '成品系统电压'.
              <F_UPLOAD_DATA>-ATWTB_DY = CONFIGURATION-ATWTB.
            WHEN '电池阻燃'.
              <F_UPLOAD_DATA>-ATWTB_ZR = CONFIGURATION-ATWTB.
          ENDCASE.


          CLEAR:CONFIGURATION.
        ENDLOOP.
      ENDIF.


      IF <F_UPLOAD_DATA>-ATWTB_ZR = 'Z01'.
        <F_UPLOAD_DATA>-ATWTB_ZR = '阻燃'.
      ELSEIF <F_UPLOAD_DATA>-ATWTB_ZR = 'Z02'.
        <F_UPLOAD_DATA>-ATWTB_ZR = '非阻燃'.
      ENDIF.

      IF <F_UPLOAD_DATA>-ZZVBE IS NOT INITIAL.
        <F_UPLOAD_DATA>-KDAUF = <F_UPLOAD_DATA>-ZZVBE.
        <F_UPLOAD_DATA>-KDPOS = <F_UPLOAD_DATA>-ZZPOS.
      ENDIF.

      IF <F_UPLOAD_DATA>-KDAUF IS NOT INITIAL.
        CLEAR:ID,LANGUAGE,NAME,OBJECT.
        REFRESH:LINES .
         
  2.2.12"获取销售订单文本信息

        ID = 'Z002'.
        OBJECT = 'VBBP'.
        CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
*           CLIENT                  = SY-MANDT
            ID                      = ID
            LANGUAGE                = SY-LANGU
            NAME                    = NAME
            OBJECT                  = OBJECT
          TABLES
            LINES                   = LINES
          EXCEPTIONS
            ID                      = 1
            LANGUAGE                = 2
            NAME                    = 3
            NOT_FOUND               = 4
            OBJECT                  = 5
            REFERENCE_CHECK         = 6
            WRONG_ACCESS_TO_ARCHIVE = 7
            OTHERS                  = 8.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.

        LOOP AT LINES.
          CONCATENATE <F_UPLOAD_DATA>-ZBZFS LINES-TDLINE INTO <F_UPLOAD_DATA>-ZBZFS.
          CLEAR:LINES.
        ENDLOOP.

        CLEAR:ID,LANGUAGE,NAME,OBJECT.
        REFRESH:LINES .

        ID = 'Z003'.
        OBJECT = 'VBBP'.
        CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
*           CLIENT                  = SY-MANDT
            ID                      = ID
            LANGUAGE                = SY-LANGU
            NAME                    = NAME
            OBJECT                  = OBJECT
          TABLES
            LINES                   = LINES
          EXCEPTIONS
            ID                      = 1
            LANGUAGE                = 2
            NAME                    = 3
            NOT_FOUND               = 4
            OBJECT                  = 5
            REFERENCE_CHECK         = 6
            WRONG_ACCESS_TO_ARCHIVE = 7
            OTHERS                  = 8.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.

        LOOP AT LINES.
          CONCATENATE <F_UPLOAD_DATA>-ZAZFS LINES-TDLINE INTO <F_UPLOAD_DATA>-ZAZFS.
          CLEAR:LINES.
        ENDLOOP.

        CLEAR:ID,LANGUAGE,NAME,OBJECT.
        REFRESH:LINES .

        ID = 'Z007'.
        OBJECT = 'VBBP'.
        CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
*           CLIENT                  = SY-MANDT
            ID                      = ID
            LANGUAGE                = SY-LANGU
            NAME                    = NAME
            OBJECT                  = OBJECT
          TABLES
            LINES                   = LINES
          EXCEPTIONS
            ID                      = 1
            LANGUAGE                = 2
            NAME                    = 3
            NOT_FOUND               = 4
            OBJECT                  = 5
            REFERENCE_CHECK         = 6
            WRONG_ACCESS_TO_ARCHIVE = 7
            OTHERS                  = 8.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.

        LOOP AT LINES.
          CONCATENATE <F_UPLOAD_DATA>-ZGCXX LINES-TDLINE INTO <F_UPLOAD_DATA>-ZGCXX.
          CLEAR:LINES.
        ENDLOOP.

        CLEAR:ID,LANGUAGE,NAME,OBJECT.
        REFRESH:LINES .

        ID = 'Z005'.
        OBJECT = 'VBBP'.
        CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
*           CLIENT                  = SY-MANDT
            ID                      = ID
            LANGUAGE                = SY-LANGU
            NAME                    = NAME
            OBJECT                  = OBJECT
          TABLES
            LINES                   = LINES
          EXCEPTIONS
            ID                      = 1
            LANGUAGE                = 2
            NAME                    = 3
            NOT_FOUND               = 4
            OBJECT                  = 5
            REFERENCE_CHECK         = 6
            WRONG_ACCESS_TO_ARCHIVE = 7
            OTHERS                  = 8.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.

        LOOP AT LINES.
          CONCATENATE <F_UPLOAD_DATA>-ZSBWB LINES-TDLINE INTO <F_UPLOAD_DATA>-ZSBWB.
          CLEAR:LINES.
        ENDLOOP.

        CLEAR:ID,LANGUAGE,NAME,OBJECT.
        REFRESH:LINES .

        ID = 'Z006'.
        OBJECT = 'VBBP'.
        CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
*           CLIENT                  = SY-MANDT
            ID                      = ID
            LANGUAGE                = SY-LANGU
            NAME                    = NAME
            OBJECT                  = OBJECT
          TABLES
            LINES                   = LINES
          EXCEPTIONS
            ID                      = 1
            LANGUAGE                = 2
            NAME                    = 3
            NOT_FOUND               = 4
            OBJECT                  = 5
            REFERENCE_CHECK         = 6
            WRONG_ACCESS_TO_ARCHIVE = 7
            OTHERS                  = 8.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.

        LOOP AT LINES.
          CONCATENATE <F_UPLOAD_DATA>-ZPJYQ LINES-TDLINE INTO <F_UPLOAD_DATA>-ZPJYQ.
          CLEAR:LINES.
        ENDLOOP.
      ENDIF.
    ELSE.
      DELETE L_IT_UPLOAD_DATA INDEX L_TBIX.
    ENDIF.
  ENDLOOP.
 
  2.2.13"显示查询数据
FORM SUB_DISPLAY_ALV TABLES TABLE .
  DATA: L_IT_FIELDCAT   TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
        L_LT_EVENT_EXIT TYPE SLIS_T_EVENT_EXIT,
        L_GS_LAYOUT     TYPE SLIS_LAYOUT_ALV.

  PERFORM SUB_BUILD_FIELDCAT TABLES L_IT_FIELDCAT.
  PERFORM SUB_BUILD_LAYOUT USING L_GS_LAYOUT."设置ALV样式
  PERFORM SUB_BUILD_EVENTEXIT TABLES L_LT_EVENT_EXIT. "设置事件

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'ALV_USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
      IT_FIELDCAT              = L_IT_FIELDCAT[]
*     it_events                = l_it_events[]
      I_SAVE                   = 'A'
      IS_LAYOUT                = L_GS_LAYOUT
    TABLES
      T_OUTTAB                 = TABLE
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
ENDFORM. "sub_display_alv

  M_FIELDCAT  'X'    'PLWRK' '工厂'           ''  ''  ''  '4'.
  M_FIELDCAT  ''    'KDAUF' '销售订单号'           ''  ''  '' '10'.
  M_FIELDCAT  ''    'KDPOS' '行项目'           ''  ''  '' '6'.
  M_FIELDCAT  ''    'NAME1' '客户名称'           ''  ''  '' '25'.

  M_FIELDCAT  ''    'MATNR' '物料编号'           ''  ''  '' '18'.
  M_FIELDCAT  ''    'MAKTX' '物料描述'           ''  ''  '' '40'.

  M_FIELDCAT  ''    'ATWTB_ZR' '特性'           ''  ''  '' '6'.
  M_FIELDCAT  ''    'ATWTB_DY' '电压'           ''  ''  '' '6'.
  M_FIELDCAT  ''    'KWMENG' '订单数量'           ''  ''  '' '17'.
  M_FIELDCAT  ''    'VDATU' '销售订单交期'           ''  ''  '' '10'.

  M_FIELDCAT  ''    'PSTTR' '计划开始日期'           ''  ''  '' '10'.
  M_FIELDCAT  ''    'PEDTR' '计划完成日期'           ''  ''  '' '10'.
  M_FIELDCAT  ''    'ARBPL' '工作中心'            ''  ''  '' '10'.

  M_FIELDCAT  ''    'VERID' '版本号'            ''  ''  '' '4'.

  M_FIELDCAT  ''    'ZZBEIZ' '备注'            ''  ''  '' '20'.
  M_FIELDCAT  ''    'GSMNG' '计划生产数'           ''  ''  '' '17'.
  M_FIELDCAT  ''    'PLNUM' '计划订单'            ''  ''  '' '10'.

  M_FIELDCAT  ''    'DISPO' 'MRP控制者'            ''  ''  '' '4'.

  M_FIELDCAT  ''    'ZBZFS' '包装方式'            ''  ''  '' '200'.
  M_FIELDCAT  ''    'ZAZFS' '安装方式'            ''  ''  '' '200'.
  M_FIELDCAT  ''    'ZGCXX' '挑选要求'            ''  ''  '' '200'.
  M_FIELDCAT  ''    'ZSBWB' '商标'            ''  ''  '' '200'.
  M_FIELDCAT  ''    'ZPJYQ' '配件要求'            ''  ''  '' '200'.

  IF P_IMPORT = 'X'.
    M_FIELDCAT  ''    'LIGHT' '状态'           ''  ''  '' '4'.
    M_FIELDCAT  ''    'ROWS' '序列'           ''  ''  '' '4'.
    M_FIELDCAT  ''    'MESSAGE' '信息'           ''  ''  '' '20'.
  ENDIF.

 
  2.2.14选择导入路径

      WHEN P_IMPORT.
        IF P_FILE IS INITIAL.
          CALL FUNCTION 'WS_FILENAME_GET'
            EXPORTING
              DEF_FILENAME     = '*.xls'
              DEF_PATH         = ''
              MASK             = ',Excel Files,All Files,*.*.'
              MODE             = 'O'
              TITLE            = '选择导入文件'
            IMPORTING
              FILENAME         = P_FILE
            EXCEPTIONS
              INV_WINSYS       = 1
              NO_BATCH         = 2
              SELECTION_CANCEL = 3
              SELECTION_ERROR  = 4
              OTHERS           = 5.
        ENDIF.

          
  2.2.15 "上传文件

          PERFORM SUB_UPLOAD_FILE TABLES G_IT_UPLOAD_DATA.

DATA: L_IT_XLSDATA  TYPE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE."表内容
  REFRESH:L_IT_UPLOAD_DATA,
           L_IT_XLSDATA.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      PERCENTAGE = 10
      TEXT       = '正在导入数据......'.


 
  2.2.16*"----导入EXCEL数据到内表



  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME    = P_FILE
      I_BEGIN_COL = '1'
      I_BEGIN_ROW = '2'
      I_END_COL   = '16'
      I_END_ROW   = '99999'
    TABLES
      INTERN      = L_IT_XLSDATA.
  SORT L_IT_XLSDATA BY ROW COL.

  "----格式化导入数据到内表
  PERFORM SUB_FORMAT_UPLOAD TABLES  L_IT_UPLOAD_DATA
                                      L_IT_XLSDATA.

  
  2.2.17"----分析导入数据

  LOOP AT L_IT_XLSDATA.
    AT NEW ROW.
      CLEAR:L_IT_UPLOAD_DATA.

      CONCATENATE '正在处理第' L_IT_XLSDATA-ROW '行数据,请稍后...' INTO L_V_MSG.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          PERCENTAGE = 20
          TEXT       = L_V_MSG.
      L_V_ROWS = L_V_ROWS + 1.
      L_IT_UPLOAD_DATA-ROWS = L_V_ROWS.
    ENDAT.
    CONDENSE L_IT_XLSDATA-VALUE.

    CASE L_IT_XLSDATA-COL.
      WHEN 1."工厂
        TRANSLATE L_IT_XLSDATA-VALUE TO UPPER CASE.
        L_IT_UPLOAD_DATA-PLWRK = L_IT_XLSDATA-VALUE.
      WHEN 2."销售订单号
        L_IT_UPLOAD_DATA-KDAUF = L_IT_XLSDATA-VALUE.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = L_IT_UPLOAD_DATA-KDAUF
          IMPORTING
            OUTPUT = L_IT_UPLOAD_DATA-KDAUF.
      WHEN 3."行项目
        L_IT_UPLOAD_DATA-KDPOS = L_IT_XLSDATA-VALUE.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = L_IT_UPLOAD_DATA-KDPOS
          IMPORTING
            OUTPUT = L_IT_UPLOAD_DATA-KDPOS.
      WHEN 4.
      WHEN 5. "物料
        L_IT_UPLOAD_DATA-MATNR = L_IT_XLSDATA-VALUE.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = L_IT_UPLOAD_DATA-MATNR
          IMPORTING
            OUTPUT = L_IT_UPLOAD_DATA-MATNR.
      WHEN 6.

      WHEN 7.
      WHEN 8.
      WHEN 9.
      WHEN 10.
      WHEN 11. "开始日期
        L_V_DATE = L_IT_XLSDATA-VALUE.
        CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
          EXPORTING
            DATE                      = L_V_DATE
          EXCEPTIONS
            PLAUSIBILITY_CHECK_FAILED = 1
            OTHERS                    = 2.
        "如果是日期型时就直接赋值
        IF SY-SUBRC EQ 0 .
          L_IT_UPLOAD_DATA-PSTTR = L_V_DATE.
        ELSE.
          CONCATENATE '行号:' L_IT_XLSDATA-COL ' 开始日期不是日期类型'  INTO  WA_MESSAGE-MESSAGE.
          PERFORM SUB_ADD_MESSAGE1 USING 'E'
                                 L_V_ROWS
                                 WA_MESSAGE-MESSAGE
                                 L_IT_UPLOAD_DATA.
        ENDIF.
      WHEN 12."完成日期
        L_V_DATE = L_IT_XLSDATA-VALUE.
        CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
          EXPORTING
            DATE                      = L_V_DATE
          EXCEPTIONS
            PLAUSIBILITY_CHECK_FAILED = 1
            OTHERS                    = 2.
        "如果是日期型时就直接赋值
        IF SY-SUBRC EQ 0 .
          L_IT_UPLOAD_DATA-PEDTR = L_V_DATE.
        ELSE.
          CONCATENATE '行号:' L_IT_XLSDATA-COL ' 开始日期不是日期类型'  INTO  WA_MESSAGE-MESSAGE.
          PERFORM SUB_ADD_MESSAGE1 USING 'E'
                                 L_V_ROWS
                                 WA_MESSAGE-MESSAGE
                                 L_IT_UPLOAD_DATA.
        ENDIF.
      WHEN 13. "工作中心
        L_IT_UPLOAD_DATA-ARBPL = L_IT_XLSDATA-VALUE.
      WHEN 14."版本
        L_IT_UPLOAD_DATA-VERID = L_IT_XLSDATA-VALUE.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = L_IT_UPLOAD_DATA-VERID
          IMPORTING
            OUTPUT = L_IT_UPLOAD_DATA-VERID.
      WHEN 15."备注
        L_IT_UPLOAD_DATA-ZZBEIZ = L_IT_XLSDATA-VALUE.
      WHEN 16."数量
        TRY.
            L_IT_UPLOAD_DATA-GSMNG = L_IT_XLSDATA-VALUE * 1.
          CATCH CX_SY_CONVERSION_NO_NUMBER.
            CONCATENATE '行' '数量不是数值类型' ''  INTO  WA_MESSAGE-MESSAGE.
            PERFORM SUB_ADD_MESSAGE1 USING 'E'
                                   L_V_ROWS
                                   WA_MESSAGE-MESSAGE
                                   L_IT_UPLOAD_DATA.
        ENDTRY.
    ENDCASE.
    AT END OF ROW.
      APPEND L_IT_UPLOAD_DATA.
    ENDAT.
  ENDLOOP.
 
  2.2.18将数据整理后输出

  SELECT *
   APPENDING CORRESPONDING FIELDS OF TABLE L_IT_UPLOAD_DATA
   FROM PLAF
    FOR ALL ENTRIES IN L_IT_UPLOAD_DATA
   WHERE PWWRK = P_WERKS
   AND MATNR = L_IT_UPLOAD_DATA-MATNR
     AND MATNR IN S_MATNR
     AND PSTTR IN S_ERDAT
  AND PAART IN ('LA','KD').
  IF SY-SUBRC = 0.
    G_DELE = 'X'.
  ENDIF.

 
  2.2.19输出导入数据

  DATA: L_IT_FIELDCAT   TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
        L_LT_EVENT_EXIT TYPE SLIS_T_EVENT_EXIT,
        L_GS_LAYOUT     TYPE SLIS_LAYOUT_ALV.

  PERFORM SUB_BUILD_FIELDCAT TABLES L_IT_FIELDCAT.
  PERFORM SUB_BUILD_LAYOUT USING L_GS_LAYOUT."设置ALV样式
  PERFORM SUB_BUILD_EVENTEXIT TABLES L_LT_EVENT_EXIT. "设置事件

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'ALV_USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
      IT_FIELDCAT              = L_IT_FIELDCAT[]
*     it_events                = l_it_events[]
      I_SAVE                   = 'A'
      IS_LAYOUT                = L_GS_LAYOUT
    TABLES
      T_OUTTAB                 = TABLE
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

 
  2.2.20"删除相同物料的其它计划订单


  LOOP AT L_IT_UPLOAD_DATA WHERE PLNUM IS NOT INITIAL.
    CALL FUNCTION 'BAPI_PLANNEDORDER_DELETE'
      EXPORTING
        PLANNEDORDER = L_IT_UPLOAD_DATA-PLNUM
      IMPORTING
        RETURN       = L_WA_BAPIRETURN1.

    IF L_WA_BAPIRETURN1-TYPE = 'E'."更新错误
      PERFORM SUB_ADD_MESSAGE USING 'E'
                                    0
                                    L_WA_BAPIRETURN1-MESSAGE
                                     'X'.
    ELSE.
      "---提交bapi
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      UPDATE ZTPPLO SET AEDAT = SY-DATUM
                             AEZEIT =  SY-UZEIT
                             AENAM = SY-UNAME
                             ELOEK = 'X'
                         WHERE PLNUM = L_IT_UPLOAD_DATA-PLNUM.
      COMMIT WORK AND WAIT.
      DELETE L_IT_UPLOAD_DATA.

    ENDIF.
    CLEAR:L_IT_UPLOAD_DATA.
  ENDLOOP.

 
  2.2.21"------创建计划订单

  LOOP AT L_IT_UPLOAD_DATA ASSIGNING <F_UPLOAD_DATA> WHERE PLNUM IS INITIAL .
    "调用锁对象,查询物料是否被锁定
    CALL FUNCTION 'ENQUEUE_EZMARC'
      EXPORTING
        MODE_MARC      = 'E'
        MANDT          = SY-MANDT
        MATNR          = <F_UPLOAD_DATA>-MATNR
        WERKS          = <F_UPLOAD_DATA>-PWWRK
*       X_MATNR        = ' '
*       X_WERKS        = ' '
*       _SCOPE         = '2'
*       _WAIT          = ' '
*       _COLLECT       = ' '
      EXCEPTIONS
        FOREIGN_LOCK   = 1
        SYSTEM_FAILURE = 2
        OTHERS         = 3.

    IF SY-SUBRC <> 0.
      <F_UPLOAD_DATA>-LIGHT = C_RED_LIGHT."提示图
      <F_UPLOAD_DATA>-MESSAGE = '该物料已被锁定'.
      PERFORM SUB_ADD_MESSAGE USING 'E'
                          <F_UPLOAD_DATA>-ROWS
                          <F_UPLOAD_DATA>-MESSAGE
                          'X'.
* Implement suitable error handling here
    ELSE.


      CLEAR:L_WA_HEADERDATA.
       
  2.2.22"添加创建计划订单所需数据

      CLEAR:L_V_PLNUM,L_WA_HEADERDATA,L_WA_PLOLOG,L_WA_BAPIRETURN1.
      REFRESH:L_COMPONENTSDATA,L_CREATEDCOMPONENTSDATA,L_CAPACITYDATA1,L_CAPACITYDATA2,L_CAPACITYDATA3.

      CLEAR:L_HEADERDATA,L_HEADERDATAX.

      REFRESH:LT_PLPO,LT_PLAS.

      L_WA_HEADERDATA-PLDORD_PROFILE = 'LA'.
      L_WA_HEADERDATA-MATERIAL = <F_UPLOAD_DATA>-MATNR.
      L_WA_HEADERDATA-PLAN_PLANT = <F_UPLOAD_DATA>-PWWRK.
      L_WA_HEADERDATA-PROD_PLANT = <F_UPLOAD_DATA>-PWWRK.
      L_WA_HEADERDATA-TOTAL_PLORD_QTY = <F_UPLOAD_DATA>-GSMNG.
      L_WA_HEADERDATA-ORDER_START_DATE = <F_UPLOAD_DATA>-PSTTR.
      L_WA_HEADERDATA-ORDER_FIN_DATE = <F_UPLOAD_DATA>-PEDTR.
      L_WA_HEADERDATA-FIRMING_IND = 'X'.
      "   L_WA_HEADERDATA-USE_COLL_UPD = 'X'.
      L_WA_HEADERDATA-DET_SCHEDULE = 'X'.
      "    L_WA_HEADERDATA-LAST_ORDER = 'X'.
      " L_WA_HEADERDATA-STGE_LOC = <F_UPLOAD_DATA>-LGORT.
      " L_WA_HEADERDATA-MRP_AREA = <F_UPLOAD_DATA>-BERID.
       
  2.2.23"如果销售订单不为空,则创建KD类型的计划订单

      L_WA_HEADERDATA-VERSION = <F_UPLOAD_DATA>-VERID.
      IF <F_UPLOAD_DATA>-KDAUF IS NOT INITIAL AND <F_UPLOAD_DATA>-CHECKS = ''.
        L_WA_HEADERDATA-PLDORD_PROFILE = 'KD'.
        L_WA_HEADERDATA-ACCTASSCAT = 'M'.
        L_WA_HEADERDATA-SALES_ORD = <F_UPLOAD_DATA>-KDAUF.
        L_WA_HEADERDATA-S_ORD_ITEM = <F_UPLOAD_DATA>-KDPOS.
      ENDIF.
*    L_WA_HEADERDATA-BASE_UOM = 'PC'.
*    L_WA_HEADERDATA-BASE_UOM_ISO = 'PC'.

      
  2.2.24 "调用Bapi创建计划订单

      CALL FUNCTION 'BAPI_PLANNEDORDER_CREATE'
        EXPORTING
          HEADERDATA            = L_WA_HEADERDATA
        IMPORTING
          RETURN                = L_WA_BAPIRETURN1
          PLANNEDORDER          = L_V_PLNUM
        TABLES
          COMPONENTSDATA        = L_COMPONENTSDATA
          CREATEDCOMPONENTSDATA = L_CREATEDCOMPONENTSDATA
          CAPACITYDATA1         = L_CAPACITYDATA1
          CAPACITYDATA2         = L_CAPACITYDATA2
          CAPACITYDATA3         = L_CAPACITYDATA3.
      .
      IF L_WA_BAPIRETURN1-TYPE = 'E'."更新错误
        <F_UPLOAD_DATA>-LIGHT = C_RED_LIGHT."提示图
        <F_UPLOAD_DATA>-MESSAGE = L_WA_BAPIRETURN1-MESSAGE.
        PERFORM SUB_ADD_MESSAGE USING 'E'
                            <F_UPLOAD_DATA>-ROWS
                            <F_UPLOAD_DATA>-MESSAGE
                            'X'.
      ELSE.
        "---提交bapi
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
        <F_UPLOAD_DATA>-PLNUM = L_V_PLNUM.
        <F_UPLOAD_DATA>-LIGHT = C_GREEN_LIGHT."提示图
        CLEAR: <F_UPLOAD_DATA>-MESSAGE,
                 L_WA_PLOLOG.
        MOVE-CORRESPONDING <F_UPLOAD_DATA> TO L_WA_PLOLOG.
        L_WA_PLOLOG-BERID = <F_UPLOAD_DATA>-BERID.
        L_WA_PLOLOG-ERNAM = SY-UNAME.
        L_WA_PLOLOG-ERDAT = SY-DATUM.
        L_WA_PLOLOG-CPUTM = SY-UZEIT.
        MODIFY ZTPPLO FROM L_WA_PLOLOG.
        COMMIT WORK AND WAIT.
         
  2.2.25"如果工作中心有导入,则更新计划订单的工作中心

        IF <F_UPLOAD_DATA>-ARBPL IS NOT INITIAL.
          CLEAR:L_ARBPL.
          CONCATENATE <F_UPLOAD_DATA>-ARBPL+0(4) '%' INTO L_ARBPL.

          CLEAR:MKAL.
           
  2.2.26"获取工艺路线信息

          IF <F_UPLOAD_DATA>-VERID IS NOT INITIAL.
            SELECT SINGLE * INTO MKAL
              FROM MKAL
              WHERE MATNR = <F_UPLOAD_DATA>-MATNR
              AND WERKS = <F_UPLOAD_DATA>-PWWRK
            AND VERID = <F_UPLOAD_DATA>-VERID.

            SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_PLPO
              FROM PLAS AS PS INNER JOIN PLPO AS PO
              ON PS~PLNTY = PO~PLNTY AND PS~PLNNR = PO~PLNNR
              AND PS~PLNKN = PO~PLNKN AND PS~ZAEHL = PO~ZAEHL
              WHERE PS~PLNTY = MKAL-PLNTY
              AND PS~PLNNR = MKAL-PLNNR
              AND PS~PLNAL = MKAL-ALNAL
            AND PS~LOEKZ = ''.
          ELSE.
            SELECT SINGLE PLNTY PLNNR PLNAL AS ALNAL INTO CORRESPONDING FIELDS OF MKAL
              FROM MAPL
              WHERE MATNR = <F_UPLOAD_DATA>-MATNR
              AND WERKS = <F_UPLOAD_DATA>-PWWRK
              AND LOEKZ = ''.

            SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_PLPO
              FROM PLAS AS PS INNER JOIN PLPO AS PO
              ON PS~PLNTY = PO~PLNTY AND PS~PLNNR = PO~PLNNR
              AND PS~PLNKN = PO~PLNKN AND PS~ZAEHL = PO~ZAEHL
              WHERE PS~PLNTY = MKAL-PLNTY
              AND PS~PLNNR = MKAL-PLNNR
              AND PS~PLNAL = MKAL-ALNAL
              AND PS~LOEKZ = ''.
          ENDIF.
          IF MKAL-PLNNR IS NOT INITIAL.
            REFRESH:T_TASK,T_ITEM,T_RETURN.
             
  2.2.27"将需要更新工作中心的工艺路线信息写到行项目

            LOOP AT LT_PLPO.
              CLEAR:T_TASK.
              T_TASK-MATERIAL = <F_UPLOAD_DATA>-MATNR.
              T_TASK-PLANT = <F_UPLOAD_DATA>-PWWRK.
              T_TASK-ZMARK = 'U'.
              T_TASK-TASK_LIST_GROUP = LT_PLPO-PLNNR.
              T_TASK-GROUP_COUNTER = LT_PLPO-PLNAL.
              COLLECT T_TASK.

              CLEAR:T_ITEM.
              T_ITEM-MATERIAL = <F_UPLOAD_DATA>-MATNR.
              T_ITEM-PLANT_H = <F_UPLOAD_DATA>-PWWRK.
              T_ITEM-ZMARK = 'U'.
              T_ITEM-TASK_LIST_GROUP = LT_PLPO-PLNNR.
              T_ITEM-GROUP_COUNTER = LT_PLPO-PLNAL.
              T_ITEM-ACTIVITY = LT_PLPO-VORNR.

              SELECT SINGLE ARBPL INTO T_ITEM-WORK_CNTR
                FROM CRHD
                WHERE OBJTY = 'A'
                AND OBJID = LT_PLPO-ARBID
              AND ARBPL LIKE L_ARBPL.

              IF SY-SUBRC = 0.
                T_ITEM-WORK_CNTR = <F_UPLOAD_DATA>-ARBPL.
                APPEND T_ITEM.
              ENDIF.

              CLEAR:LT_PLPO.
            ENDLOOP.
             
  2.2.28"调用function,修改工艺路线的工作中心

            CALL FUNCTION 'ZMM_CHANGEROUTING'
              TABLES
                T_TASK   = T_TASK
                T_ITEM   = T_ITEM
                T_RETURN = T_RETURN.

            WAIT UP TO 1 SECONDS.
          ENDIF.


          L_HEADERDATA-DET_SCHEDULE = 'X'.
          L_HEADERDATAX-DET_SCHEDULE = 'X'.
           
  2.2.29"修改计划订单的工作中心

          CALL FUNCTION 'BAPI_PLANNEDORDER_CHANGE'
            EXPORTING
              PLANNEDORDER  = L_V_PLNUM
              HEADERDATA    = L_HEADERDATA
              HEADERDATAX   = L_HEADERDATAX
            IMPORTING
              RETURN        = L_WA_BAPIRETURN1
*             CHANGEDHEADERDATA         =
*             CAPACITYHEADERDATA1       =
*             CAPACITYHEADERDATA2       =
*             CAPACITYHEADERDATA3       =
            TABLES
*             COMPONENTSDATA            =
              CAPACITYDATA1 = L_CAPACITYDATA1
              CAPACITYDATA2 = L_CAPACITYDATA2
              CAPACITYDATA3 = L_CAPACITYDATA3.
          .

          "---提交bapi
          IF L_WA_BAPIRETURN1-TYPE = 'E'."更新错误
            <F_UPLOAD_DATA>-LIGHT = C_RED_LIGHT."提示图
            <F_UPLOAD_DATA>-MESSAGE = L_WA_BAPIRETURN1-MESSAGE.
            PERFORM SUB_ADD_MESSAGE USING 'E'
                                <F_UPLOAD_DATA>-ROWS
                                <F_UPLOAD_DATA>-MESSAGE
                                'X'.
          ELSE.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                WAIT = 'X'.
          ENDIF.

          IF MKAL-PLNNR IS NOT INITIAL.
            REFRESH:T_TASK,T_ITEM,T_RETURN.

            LOOP AT LT_PLPO.
              CLEAR:T_TASK.
              T_TASK-MATERIAL = <F_UPLOAD_DATA>-MATNR.
              T_TASK-PLANT = <F_UPLOAD_DATA>-PWWRK.
              T_TASK-ZMARK = 'U'.
              T_TASK-TASK_LIST_GROUP = LT_PLPO-PLNNR.
              T_TASK-GROUP_COUNTER = LT_PLPO-PLNAL.
              COLLECT T_TASK.

              CLEAR:T_ITEM.
              T_ITEM-MATERIAL = <F_UPLOAD_DATA>-MATNR.
              T_ITEM-PLANT_H = <F_UPLOAD_DATA>-PWWRK.
              T_ITEM-ZMARK = 'U'.
              T_ITEM-TASK_LIST_GROUP = LT_PLPO-PLNNR.
              T_ITEM-GROUP_COUNTER = LT_PLPO-PLNAL.
              T_ITEM-ACTIVITY = LT_PLPO-VORNR.

              SELECT SINGLE ARBPL INTO T_ITEM-WORK_CNTR
                FROM CRHD
                WHERE OBJTY = 'A'
              AND OBJID = LT_PLPO-ARBID.

              APPEND T_ITEM.

              CLEAR:LT_PLPO.
            ENDLOOP.

            CALL FUNCTION 'ZMM_CHANGEROUTING'
              TABLES
                T_TASK   = T_TASK
                T_ITEM   = T_ITEM
                T_RETURN = T_RETURN.


          ENDIF.
        ENDIF.

        UPDATE PLAF SET ZZBEIZ = <F_UPLOAD_DATA>-ZZBEIZ
        WHERE PLNUM = L_V_PLNUM.

        IF <F_UPLOAD_DATA>-CHECKS = 'X'.
          UPDATE PLAF SET ZZVBE = <F_UPLOAD_DATA>-KDAUF
              ZZPOS = <F_UPLOAD_DATA>-KDPOS
            WHERE PLNUM = L_V_PLNUM.
        ENDIF.
      ENDIF.

       
  2.2.30"解除物料的锁对象

      CALL FUNCTION 'DEQUEUE_EZMARC'
        EXPORTING
          MODE_MARC = 'E'
          MANDT     = SY-MANDT
          MATNR     = <F_UPLOAD_DATA>-MATNR
          WERKS     = <F_UPLOAD_DATA>-PWWRK
*         X_MATNR   = ' '
*         X_WERKS   = ' '
*         _SCOPE    = '3'
*         _SYNCHRON = ' '
*         _COLLECT  = ' '
        .


    ENDIF.
  ENDLOOP.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值