ABAP之BOM基于EXCEL批量导入(三)

 LOOP AT GT_OUTPUT INTO GS_OUTPUT.

    IF GS_OUTPUT-IDNRK IS INITIAL."修改:判断子项目记录,添加子项目值
      LIT_BOM_SUB_ITEM-STYPE = PARENT_STYPE.
      LIT_BOM_SUB_ITEM-XLINE = PARENT_XLINE.
      LIT_BOM_SUB_ITEM-UPOSZ = GS_OUTPUT-UPOSZ.
      LIT_BOM_SUB_ITEM-EBORT = GS_OUTPUT-EBORT.
      LIT_BOM_SUB_ITEM-UPMNG = GS_OUTPUT-UPMNG.
      APPEND LIT_BOM_SUB_ITEM.
      CONTINUE.
    ENDIF.

    CLEAR:LV_MSGID,LV_MSGNO,LV_MSGTY,LV_MSGV1,LV_MSGV2,LV_MSGV3,LV_MSGV4,LV_END.

*-----header数据处理
    LWA_TEMP = GS_OUTPUT.

    AT NEW MATNR.
      READ TABLE lt_exist INTO ls_exist WITH KEY MATNR = GS_OUTPUT-MATNR.

      CLEAR:LWA_BOM_HEADER,LWA_GROUP_DATA,LIT_BOM_ITEM[],LIT_BOM_SUB_ITEM[].
      LWA_BOM_HEADER-STYPE = '1'.
      LWA_BOM_HEADER-TCODE = 'CS01'.
      LWA_BOM_HEADER-DATUV = gv_datuv.
      LWA_BOM_HEADER-MATNR = LWA_TEMP-MATNR.

      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT              = LWA_BOM_HEADER-MATNR
        IMPORTING
          OUTPUT             = LWA_BOM_HEADER-MATNR
       EXCEPTIONS
         LENGTH_ERROR       = 1
         OTHERS             = 2.

      LWA_BOM_HEADER-STLAN = LWA_TEMP-STLAN.
      LWA_BOM_HEADER-WERKS = LWA_TEMP-WERKS.
      LWA_BOM_HEADER-STLAL = LWA_TEMP-STLAL.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT         = LWA_BOM_HEADER-STLAL
        IMPORTING
          OUTPUT        = LWA_BOM_HEADER-STLAL.

      LWA_BOM_HEADER-SELAL = '1'.
      LV_FLG = 'X'.
    ENDAT.

*-----如果有重复数据则进行ALV数据处理
    IF ls_exist-FLAG = 'X'.
      CHECK LV_FLG = 'X'.

      MOVE-CORRESPONDING GS_OUTPUT TO GS_OUTPUT1.
      GS_OUTPUT1-TYPE = 'E'.
*      CONCATENATE TEXT-008 GS_OUTPUT-IDNRK INTO GS_OUTPUT1-MESSAGE.
      GS_OUTPUT1-MESSAGE = TEXT-008.
      GS_OUTPUT1-COLOR_ROW = 'C600'.
      APPEND GS_OUTPUT1 TO GT_OUTPUT1.
      CLEAR GS_OUTPUT1.
      LV_FLG = ''.
      CONTINUE.
    ENDIF.

*-----行项目数据处理
    LIT_BOM_ITEM-XLINE = '0001'."COUNTER_XLINE.
    LIT_BOM_ITEM-POSNR = GS_OUTPUT-POSNR.
    LIT_BOM_ITEM-IDNRK = GS_OUTPUT-IDNRK.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT              = LIT_BOM_ITEM-IDNRK
      IMPORTING
        OUTPUT             = LIT_BOM_ITEM-IDNRK
       EXCEPTIONS
         LENGTH_ERROR       = 1
         OTHERS             = 2
              .
*-----子项目存在标识
    IF GS_OUTPUT-IDNRK IS NOT INITIAL AND
        GS_OUTPUT-UPOSZ IS NOT INITIAL AND
        GS_OUTPUT-EBORT IS NOT INITIAL AND
        GS_OUTPUT-UPMNG IS NOT INITIAL.
      LIT_BOM_ITEM-UPSKZ = 'X'.
    ELSE.
      LIT_BOM_ITEM-UPSKZ = ' '.
    ENDIF.

    LIT_BOM_ITEM-MENGE = GS_OUTPUT-MENGE.
    LIT_BOM_ITEM-SANKA = GS_OUTPUT-SANKA.
    LIT_BOM_ITEM-POSTP = GS_OUTPUT-POSTP.
    LIT_BOM_ITEM-POTX1 = GS_OUTPUT-POTX1."修改:添加字段值
    LIT_BOM_ITEM-POTX2 = GS_OUTPUT-POTX2."修改:添加字段值
    LIT_BOM_ITEM-SORTF = GS_OUTPUT-SORTP."修改:添加字段值
    LIT_BOM_ITEM-STYPE = LWA_BOM_HEADER-STYPE."修改:添加字段值

    PARENT_STYPE = LIT_BOM_ITEM-STYPE."修改:添加字段值
    PARENT_XLINE = COUNTER_XLINE."LIT_BOM_ITEM-XLINE."修改:添加字段值
    COUNTER_XLINE = COUNTER_XLINE + 1.

    IF GS_OUTPUT-UPOSZ IS NOT INITIAL AND
        GS_OUTPUT-EBORT IS NOT INITIAL AND
        GS_OUTPUT-UPMNG IS NOT INITIAL.
      CLEAR LIT_BOM_SUB_ITEM.
      LIT_BOM_SUB_ITEM-STYPE = PARENT_STYPE.
      LIT_BOM_SUB_ITEM-XLINE = PARENT_XLINE.
      LIT_BOM_SUB_ITEM-UPOSZ = GS_OUTPUT-UPOSZ.
      LIT_BOM_SUB_ITEM-EBORT = GS_OUTPUT-EBORT.
      LIT_BOM_SUB_ITEM-UPMNG = GS_OUTPUT-UPMNG.
      APPEND LIT_BOM_SUB_ITEM.

    ENDIF.

    APPEND LIT_BOM_ITEM.

*-----如果到了header物料结束时则装载ALV数据
    AT END OF MATNR.
      LV_END = 'X'.
    ENDAT.
    IF LV_END = 'X'.
      READ TABLE LIT_MAST WITH KEY MATNR = LWA_BOM_HEADER-MATNR
                                   WERKS = LWA_BOM_HEADER-WERKS
                                   STLAN = LWA_BOM_HEADER-STLAN
                                   STLAL = LWA_BOM_HEADER-STLAL.
      IF SY-SUBRC = 0.
        CALL FUNCTION 'CSAP_MAT_BOM_DELETE'
          EXPORTING
            MATERIAL                 = LWA_BOM_HEADER-MATNR
            PLANT                    = LWA_BOM_HEADER-WERKS
            BOM_USAGE                = LWA_BOM_HEADER-STLAN
            ALTERNATIVE              = LWA_BOM_HEADER-STLAL
*           VALID_FROM               =
*           CHANGE_NO                =
*           REVISION_LEVEL           =
*           FL_NO_CHANGE_DOC         = ' '
            FL_COMMIT_AND_WAIT       = 'X'
*         IMPORTING
*           FL_WARNING               =
          EXCEPTIONS
            ERROR                    = 1
            OTHERS                   = 2
                  .
        IF SY-SUBRC <> 0.
          MOVE-CORRESPONDING GS_OUTPUT TO GS_OUTPUT1.
          GS_OUTPUT1-TYPE = 'E'.
          CONCATENATE TEXT-009 GS_OUTPUT-IDNRK INTO GS_OUTPUT1-MESSAGE.
          GS_OUTPUT1-COLOR_ROW = 'C600'.
          APPEND GS_OUTPUT1 TO GT_OUTPUT1.
          CLEAR GS_OUTPUT1.
        ENDIF.
      ENDIF.

      CALL FUNCTION 'ZCS_BI_BOM_CREATE_BATCH_INPUT1'
        EXPORTING
          BDC_FLAG     = ' '
          BOM_HEADER   = LWA_BOM_HEADER
          CLOSE_GROUP  = ' '
          COMMIT_WORK  = ' '
          GROUP_DATA   = LWA_GROUP_DATA
          NEW_GROUP    = ' '
          TCODE_MODE   = 'N'
          TCODE_UPDATE = 'S'
        IMPORTING
          MSGID        = LV_MSGID
          MSGNO        = LV_MSGNO
          MSGTY        = LV_MSGTY
          MSGV1        = LV_MSGV1
          MSGV2        = LV_MSGV2
          MSGV3        = LV_MSGV3
          MSGV4        = LV_MSGV4
        TABLES
          BOM_ITEM     = LIT_BOM_ITEM[]
          BOM_SUB_ITEM = LIT_BOM_SUB_ITEM[].

      MOVE-CORRESPONDING GS_OUTPUT TO GS_OUTPUT1.
      MESSAGE ID LV_MSGID TYPE LV_MSGTY NUMBER LV_MSGNO
         WITH LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4
         INTO GS_OUTPUT1-MESSAGE.
      GS_OUTPUT1-TYPE = LV_MSGTY.
      IF LV_MSGTY = 'E'.
        GS_OUTPUT1-COLOR_ROW = 'C600'.
      ENDIF.
      APPEND GS_OUTPUT1 TO GT_OUTPUT1.                                      "#EC *
      CLEAR GS_OUTPUT1.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " FRM_PROCESS_DATA


*&---------------------------------------------------------------------*
*&      Form  FRM_OUTLOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OUTLOG .
  GWA_LAYOUT-COLWIDTH_OPTIMIZE = 'X'."宽度自动优化
  GWA_LAYOUT-ZEBRA             = 'X'."斑马线
  GWA_LAYOUT-INFO_FIELDNAME    = 'COLOR_ROW'."行颜色控制
  GWA_LAYOUT-BOX_FIELDNAME     = 'ZSEL'.

  M_ALV_FIELDCAT:
                   'WERKS'   '' TEXT-F01 ''   '' '' '' 'X' '' , "工厂
                   'MATNR'   '' TEXT-F02 ''   '' '' '' 'X' '' , "物料
                   'STLAN'   '' TEXT-F03 ''   '' '' '' 'X' '' , "BOM用途
                   'TYPE'    '' TEXT-F04 ''   '' '' '' 'X' '' , "类型
                   'MESSAGE' '' TEXT-F05 ''   '' '' '' 'X' ''   "消息
*                   'IDNRK'   '' TEXT-F06 ''   '' '' '' 'X' '' , "组件
*                   'MENGE'   '' TEXT-F07 ''   '' '' '' 'X' '' , "数量
*                   'POSTP'   '' TEXT-F08 ''   '' '' '' 'X' '' , "项目类别
*                   'POTX1'   '' TEXT-F09 ''   '' '' '' 'X' '' , "项目文本行1
*                   'RFPNT'   '' TEXT-F10 ''   '' '' '' 'X' ''   "参考点
                   .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
      IS_LAYOUT          = GWA_LAYOUT
      IT_FIELDCAT        = GIT_FIELD
      I_DEFAULT          = 'X'
      I_SAVE             = 'A'
    TABLES
      T_OUTTAB           = GT_OUTPUT1
    EXCEPTIONS
      PROGRAM_ERROR      = 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.
ENDFORM.                    " FRM_OUTLOG


*&---------------------------------------------------------------------*
*&      Form  FRM_WRITE_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_WRITE_LOG .
  data: lv_filename type string,
        lv_fenlei type string.

  "process 文件名(示例:620_ZFI009期初凭证(总帐类)_2011.12.26_105050_ZZ0003.txt)
  lv_fenlei = 'BOM批量导入'.

  concatenate 'C:\' sy-MANDT '_' sy-tcode  lv_fenlei '_'  sy-datum+0(4) '.' sy-datum+4(2) '.' sy-datum+6(2) '_' sy-uzeit '_' sy-uname '.txt'
    into lv_filename.


  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME                        = lv_filename
      FILETYPE                        = 'ASC'
*      APPEND                          = 'X'
      WRITE_FIELD_SEPARATOR           = 'X'"tab制表符
    TABLES
      DATA_TAB                        = GT_OUTPUT1
    EXCEPTIONS
      FILE_WRITE_ERROR                = 1
      NO_BATCH                        = 2
      GUI_REFUSE_FILETRANSFER         = 3
      INVALID_TYPE                    = 4
      NO_AUTHORITY                    = 5
      UNKNOWN_ERROR                   = 6
      HEADER_NOT_ALLOWED              = 7
      SEPARATOR_NOT_ALLOWED           = 8
      FILESIZE_NOT_ALLOWED            = 9
      HEADER_TOO_LONG                 = 10
      DP_ERROR_CREATE                 = 11
      DP_ERROR_SEND                   = 12
      DP_ERROR_WRITE                  = 13
      UNKNOWN_DP_ERROR                = 14
      ACCESS_DENIED                   = 15
      DP_OUT_OF_MEMORY                = 16
      DISK_FULL                       = 17
      DP_TIMEOUT                      = 18
      FILE_NOT_FOUND                  = 19
      DATAPROVIDER_EXCEPTION          = 20
      CONTROL_FLUSH_ERROR             = 21
      OTHERS                          = 22
            .
  IF SY-SUBRC <> 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-MSGNO with sy-MSGV1 sy-MSGV2 sy-MSGV3 sy-MSGV4.
    MESSAGE I000 WITH '日志保存失败,请手工保存!'.
  else.
    MESSAGE I000 WITH '日志已经自动保存到:' lv_filename.
  ENDIF.
ENDFORM.                    " FRM_WRITE_LOG


你可能感兴趣的:(ABAP之BOM基于EXCEL批量导入(三))