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

*&---------------------------------------------------------------------*
*&      Form  FRM_RETRIVE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_RETRIVE_DATA .
  DATA: LIT_RAW_DATA TYPE TRUXS_T_TEXT_DATA.
  DATA:LV_INDEX TYPE SY-INDEX.
  IF P_FILE IS INITIAL.
    MESSAGE TEXT-004 TYPE 'S'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*---提示消息:读取数据中.....
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT = TEXT-005.

*---将EXCEL中的文件导入内表
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR          =
*     I_LINE_HEADER              =
      I_TAB_RAW_DATA             = LIT_RAW_DATA
      I_FILENAME                 = P_FILE
    TABLES
      I_TAB_CONVERTED_DATA       = GT_EXCEL
   EXCEPTIONS
     CONVERSION_FAILED          = 1
     OTHERS                     = 2
            .
  IF SY-SUBRC <> 0.
    "提示消息:文件导入失败
    MESSAGE TEXT-006 TYPE 'S'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*---判断是否存在相应的选择数据
  DELETE GT_EXCEL INDEX 1.
  IF GT_EXCEL IS INITIAL.
    MESSAGE TEXT-007 TYPE 'S'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*  CLEAR :LV_INDEX.

  LOOP AT GT_EXCEL INTO GS_EXCEL.
*    LV_INDEX = LV_INDEX + 1.
*    GS_OUTPUT-INDEX = LV_INDEX.
    MOVE-CORRESPONDING GS_EXCEL TO GS_OUTPUT.
    GS_OUTPUT-POSTP = 'L'.
    APPEND GS_OUTPUT TO GT_OUTPUT.
  ENDLOOP.
*  CLEAR GT_EXCEL.
ENDFORM.                    " FRM_RETRIVE_DATA


*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
  DATA:LWA_BOM_HEADER TYPE BICSK,
       LWA_GROUP_DATA TYPE BGR00,
       LIT_BOM_ITEM TYPE TABLE OF BICSP WITH HEADER LINE,
       LIT_BOM_SUB_ITEM TYPE TABLE OF BICSU WITH HEADER LINE,
       LV_MSGID TYPE T100-ARBGB,
       LV_MSGNO TYPE T100-MSGNR,
       LV_MSGTY TYPE SY-MSGTY,
       LV_MSGV1 TYPE  SY-MSGV1,
       LV_MSGV2 TYPE  SY-MSGV2,
       LV_MSGV3 TYPE  SY-MSGV3,
       LV_MSGV4 TYPE  SY-MSGV4.

  DATA:LWA_BAPIRET2 TYPE BAPIRET2.

  TYPES: BEGIN OF TY_MAST,
           MATNR(18),"物料号
           STLAN(1),"用途
           WERKS(4),"工厂
           STLAL(2),
        END OF TY_MAST.
  DATA:LIT_MAST TYPE TABLE OF TY_MAST WITH HEADER LINE.

  DATA:LWA_TEMP TYPE TY_OUTPUT.
  DATA:LV_FLG TYPE CHAR1.
  DATA:LV_END TYPE CHAR1.

*-----用来判断物料是否重复,如果重复则FLAG=‘X’.
  TYPES: BEGIN OF ty_check_exist,
    MATNR(18),"物料号
    FLAG(1) TYPE C,"是否已存在(重复)
  END OF ty_check_exist.
  DATA: ls_exist TYPE ty_check_exist,
        lt_exist TYPE TABLE OF ty_check_exist,
        lv_flag(1) TYPE C.

  CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
   EXPORTING
     DATE_INTERNAL                  = s_datuv-low
   IMPORTING
     DATE_EXTERNAL                  = gv_datuv
   EXCEPTIONS
     DATE_INTERNAL_IS_INVALID       = 1
     OTHERS                         = 2
            .
  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.

*-----先将数据按照工厂,用途,物料,组件进行排序,并删除重复数据,然后再按照工厂,用途,物料,项目号进行排序
*  SORT GT_OUTPUT BY WERKS STLAN MATNR IDNRK.
*  DELETE ADJACENT DUPLICATES FROM  GT_OUTPUT.
*  SORT GT_OUTPUT BY WERKS STLAN MATNR POSNR.
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    TRANSLATE GS_OUTPUT-SANKA TO UPPER CASE.
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
  ENDLOOP.

*-----判断物料是否重复,重复则设置FLAG=‘X’,无重复则为‘’。
  LOOP AT  GT_OUTPUT INTO GS_OUTPUT WHERE MATNR IS NOT INITIAL."修改:添加where条件,不判断子项目记录
    AT NEW MATNR.
      IF lt_exist IS INITIAL.
        ls_exist-MATNR = GS_OUTPUT-MATNR.
        ls_exist-FLAG = ''.
        APPEND ls_exist TO lt_exist.
      ELSE.
        lv_flag = ''.
        LOOP AT lt_exist INTO ls_exist.
          IF ls_exist-MATNR = GS_OUTPUT-MATNR.
            lv_flag = 'X'.
            EXIT.
          ENDIF.
        ENDLOOP.
        IF lv_flag = 'X'.
          ls_exist-MATNR = GS_OUTPUT-MATNR.
          ls_exist-FLAG = 'X'.
          MODIFY lt_exist FROM ls_exist TRANSPORTING FLAG WHERE MATNR = ls_exist-MATNR.
        ELSE.
          ls_exist-MATNR = GS_OUTPUT-MATNR.
          ls_exist-FLAG = ''.
          APPEND ls_exist TO lt_exist.
        ENDIF.
      ENDIF.
    ENDAT.
  ENDLOOP.

*-----判断是否已经有该物料的BOM存在,如果存在的话则删除。
  SELECT MATNR STLAN WERKS STLAL
    FROM MAST
    INTO CORRESPONDING FIELDS OF TABLE LIT_MAST
    FOR ALL ENTRIES IN GT_OUTPUT
    WHERE MATNR = GT_OUTPUT-MATNR AND WERKS = GT_OUTPUT-WERKS AND STLAN = GT_OUTPUT-STLAN.


  DATA PARENT_STYPE TYPE BICSP-STYPE."修改:添加该变量,记录当前结点,为写子项目记录做标记
  DATA PARENT_XLINE TYPE BICSP-XLINE."修改:添加该变量,记录当前结点,为写子项目记录做标记
  DATA PARENT_MATNR TYPE string."修改:添加该变量,记录当前结点,物料号
  DATA PARENT_STLAN TYPE string."修改:添加该变量,记录当前结点,用途
  DATA PARENT_WERKS TYPE string."修改:添加该变量,记录当前结点,工厂
  DATA PARENT_STLAL TYPE string."修改:添加该变量,记录当前结点,可选BOM
  DATA COUNTER_XLINE TYPE I.

  COUNTER_XLINE = '0001'.

  CLEAR GS_OUTPUT.
  LOOP AT GT_OUTPUT INTO GS_OUTPUT."修改:将子物料的BOM表头信息添加上去。
    IF GS_OUTPUT-MATNR IS NOT INITIAL.
      PARENT_MATNR = GS_OUTPUT-MATNR.
      PARENT_STLAN = GS_OUTPUT-STLAN.
      PARENT_WERKS = GS_OUTPUT-WERKS.
      PARENT_STLAL = GS_OUTPUT-STLAL.
      CONTINUE.
    ENDIF.
    IF PARENT_MATNR IS NOT INITIAL AND
           PARENT_STLAN IS NOT INITIAL AND
           PARENT_WERKS IS NOT INITIAL AND
           PARENT_STLAL IS NOT INITIAL.
       GS_OUTPUT-MATNR = PARENT_MATNR.
       GS_OUTPUT-STLAN = PARENT_STLAN.
       GS_OUTPUT-WERKS = PARENT_WERKS.
       GS_OUTPUT-STLAL = PARENT_STLAL.
       MODIFY GT_OUTPUT FROM GS_OUTPUT.
    ENDIF.
  ENDLOOP.


转载于:https://my.oschina.net/lanzp/blog/188349

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值