ABAP 实现工单和工单组件的批量创建(BAPI BAPI_PRODORD_CREATE 和 CO_XT_COMPONENT_ADD)

程序实现功能:根据上传模板批量生成工单和组件(不在上传文件里的组件全部删除)
工单我就不多说了,直接上图
模板(原工单号是我司的特定要求,参考时摘取有用的信息即可):
在这里插入图片描述
程序选择界面:
在这里插入图片描述
源代码:

REPORT ZPP011.


TYPE-POOLS:SLIS.

TABLES:SSCRFIELDS.
"内表定义

TYPES:BEGIN OF TY_LIST,                   "
        ZYGDH(20) TYPE C,                "原工单号'.
        MATNR     TYPE MARA-MATNR,       "物料号'.
        MAKTX     TYPE MAKT-MAKTX,       "物料描述'.
        WERKS     TYPE WERKS_D,          "生产工厂'.
        DAUAT     TYPE AFPO-DAUAT,       "订单类型'.
        GAMNG     TYPE AFKO-GAMNG,       "总数量'.
        TERKZ     TYPE AFKO-TERKZ,       "计划类型'.
        GSTRP     TYPE AFKO-GSTRP,       "开始时间'.
        GLTRP     TYPE AFKO-GLTRP,       "结束时间'.
        POSNR     TYPE RESBD-POSNR,      "项目号'.
        MATNR1    TYPE MARA-MATNR,       "组件料号'.
        MAKTX1    TYPE MAKT-MAKTX,       "组件描述'.
        MENGE     TYPE MENGE_D,          "需求数量'.
        MEINS     TYPE MARA-MEINS,       "单位'.
        POSTP     TYPE POSTP,            "项目类别'.
        VORNR     TYPE VORNR,            "工序'.
        LGORT     TYPE LGORT_D,          "库存地点'.

        GMEIN     TYPE CO_GMEIN,
        SEL       TYPE C,
        ICON      TYPE ICON_D,
        AUFNR     TYPE AUFNR,
        MSG(200)  TYPE C,
      END OF TY_LIST.

TYPES:BEGIN OF TY_ALV,                   "
        ZYGDH(20) TYPE C,                "原工单号'.
        MATNR     TYPE MARA-MATNR,       "物料号'.
        WERKS     TYPE WERKS_D,          "生产工厂'.
        DAUAT     TYPE AFPO-DAUAT,       "订单类型'.
        GAMNG     TYPE AFKO-GAMNG,       "总数量'.
        TERKZ     TYPE AFKO-TERKZ,       "计划类型'.
        GSTRP     TYPE AFKO-GSTRP,       "开始时间'.
        GLTRP     TYPE AFKO-GLTRP,       "结束时间'.
        POSNR     TYPE RESBD-POSNR,      "项目号'.
        MATNR1    TYPE MARA-MATNR,       "组件料号'.
        MAKTX1    TYPE MAKT-MAKTX,       "组件描述'.
        MENGE     TYPE MENGE_D,          "需求数量'.
        MEINS     TYPE MARA-MEINS,       "单位'.
        POSTP     TYPE POSTP,            "项目类别'.
        VORNR     TYPE VORNR,            "工序'.
        LGORT     TYPE LGORT_D,          "库存地点'.
        MAKTX     TYPE MAKT-MAKTX,       "物料描述'.
        GMEIN     TYPE CO_GMEIN,
        SEL       TYPE C,
        ICON      TYPE ICON_D,
        AUFNR     TYPE AUFNR,
        MSG(200)  TYPE C,
      END OF TY_ALV.

DATA:GT_ALV TYPE TABLE OF TY_ALV,
     GS_ALV TYPE TY_ALV.

*-----定义上载的EXCELDATA:GS_UPLOAD TYPE ZALSMEX_TABLINE,
     GT_UPLOAD TYPE TABLE OF ZALSMEX_TABLINE.

DATA:GS_LIST TYPE TY_LIST,
     GT_LIST TYPE TABLE OF TY_LIST.

DATA:GV_FLAG TYPE C.

*&---------------------------------------------------------------------*
*& ALV相关定义
*&---------------------------------------------------------------------*
DATA: GS_LAYOUT   TYPE LVC_S_LAYO.
DATA: GT_FIELDCAT  TYPE LVC_T_FCAT WITH HEADER LINE.
*----------------------------------------------------------------------*
* 选择屏幕参数
*----------------------------------------------------------------------*
SELECTION-SCREEN FUNCTION KEY 1.  "按钮“默认模板下载"

SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.

  PARAMETERS:P_DRRJ TYPE STRING MODIF ID I1.             "上传文件

SELECTION-SCREEN: END OF BLOCK B1.

*----------------------------------------------------------------------*
*INITIALIZATION.
*----------------------------------------------------------------------*
INITIALIZATION.

  SSCRFIELDS-FUNCTXT_01 = '@48@模板下载'(t01).
*----------------------------------------------------------*
*AT SELECTION-SCREEN ON VALUE-REQUEST.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DRRJ.
*------------获取文件

  PERFORM FRM_DRRJ."路径搜索帮助打开

*----------------------------------------------------------------------*
*AT SELECTION-SCREEN.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.

  PERFORM FRM_FILE_SMW0.

*----------------------------------------------------------------------*
*AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

*----------------------------------------------------------------------*
*START-OF-SELECTION.
*----------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM FRM_UPLOAD_DATA.  "将上传数据转换到内表

  "------------数据转换到内表
  PERFORM FRM_PROCESS_DATA.

END-OF-SELECTION.
  PERFORM FRM_DISPALY_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_DRRJ
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DRRJ .
  CALL FUNCTION 'WS_FILENAME_GET'             "Get file name
    EXPORTING
      MASK             = ',*.* ,*.*.'
      MODE             = '0'
      TITLE            = TEXT-H10
    IMPORTING
      FILENAME         = P_DRRJ
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
  IF SY-SUBRC <> 0.
*            MESSAGE E016 WITH I_PATH.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILE_SMW0
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_FILE_SMW0 .
*!!! 默认文件名必须带扩展名,IM_OBJNAME 对象带扩展名,
*   之后更新为系统判定扩展名

  DATA: LV_FULLPATH         TYPE STRING,
        LD_FILENAME_DEFAULT TYPE STRING.                       "默认文件名
  DATA: LS_OBJDATA          TYPE WWWDATATAB.

  DATA:IM_OBJNAME      TYPE WWWDATA-OBJID VALUE 'ZPP011',
       IM_FILENAME_DEF TYPE STRING VALUE '未清生产订单导入模板.xlsx'.

  DATA: LV_RC  LIKE SY-SUBRC,
        LV_DES TYPE RLGRAP-FILENAME.

  DATA:EX_FULLNAME TYPE STRING.

  IF SY-UCOMM = 'FC01'.

*------------SAP服务器中下载Excel模板
    SELECT SINGLE RELID
                  OBJID
           FROM WWWDATA                                        "存对象模板的表
           INTO CORRESPONDING FIELDS OF LS_OBJDATA
           WHERE SRTF2 = 0
             AND RELID = 'MI'                                  "有三种类型 HT MI IT
             AND OBJID = IM_OBJNAME.

    IF SY-SUBRC <> 0 OR LS_OBJDATA-OBJID = SPACE.
      MESSAGE 'Excel 模板不存在,请用TCODESMW0进行加载' TYPE 'E'.
      RETURN. "--->>> RETURN
    ENDIF.

    CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
      EXPORTING
        WINDOW_TITLE         = '请选择目录'
        INITIAL_FOLDER       = 'C:\'
      CHANGING
        SELECTED_FOLDER      = LV_FULLPATH
      EXCEPTIONS
        CNTL_ERROR           = 1
        ERROR_NO_GUI         = 2
        NOT_SUPPORTED_BY_GUI = 3.

    IF LV_FULLPATH IS INITIAL.
      MESSAGE '请选择保存目录' TYPE 'S'.
      RETURN.   "--->>> RETURN
    ENDIF.

*------------默认文件名
    IF IM_FILENAME_DEF IS INITIAL.
      LD_FILENAME_DEFAULT = IM_OBJNAME.
    ELSE.
      LD_FILENAME_DEFAULT = IM_FILENAME_DEF.
    ENDIF.

    CONCATENATE LV_FULLPATH '\' LD_FILENAME_DEFAULT INTO LV_FULLPATH.
    LV_DES = LV_FULLPATH.

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = LS_OBJDATA
        DESTINATION = LV_DES
      IMPORTING
        RC          = LV_RC
      EXCEPTIONS
        OTHERS      = 1.
    IF LV_RC <> 0.
      MESSAGE '下载Excel模板出错' TYPE 'E'.
      RETURN.   "--->>> RETURN
    ENDIF.

    EX_FULLNAME = LV_FULLPATH.    "返回值

    IF EX_FULLNAME IS NOT INITIAL.
      CONCATENATE '已经下载到' EX_FULLNAME INTO EX_FULLNAME SEPARATED BY SPACE.
      MESSAGE EX_FULLNAME TYPE 'I'.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
  DATA:LV_XLS LIKE RLGRAP-FILENAME.

  IF P_DRRJ IS INITIAL .
    MESSAGE '导入文件地址不能为空!' TYPE 'S' DISPLAY LIKE 'E'..
    LEAVE LIST-PROCESSING.
  ENDIF.
  CLEAR LV_XLS.
  LV_XLS = P_DRRJ .
  "从第2行第1列开始读取数据
  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = LV_XLS
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 2
      I_END_COL               = 17     "读取多少列
      I_END_ROW               = 9999  "读取多少行
    TABLES
      INTERN                  = GT_UPLOAD
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC NE 0 .
    MESSAGE  '从本地文件导入到SAP失败' TYPE 'E'.
  ENDIF.
  SORT GT_UPLOAD BY ROW COL.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
  DATA:LV_INDEX TYPE  I.
  FIELD-SYMBOLS : <FS>.

  LOOP AT GT_UPLOAD INTO GS_UPLOAD WHERE VALUE <> ''.

    MOVE GS_UPLOAD-COL TO LV_INDEX.
    ASSIGN COMPONENT LV_INDEX OF STRUCTURE GS_LIST TO <FS>.

    <FS> = GS_UPLOAD-VALUE.

    AT END OF ROW.
*---物料补前导零
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT        = GS_LIST-MATNR
        IMPORTING
          OUTPUT       = GS_LIST-MATNR
        EXCEPTIONS
          LENGTH_ERROR = 1
          OTHERS       = 2.
      IF SY-SUBRC <> 0.
*   implement suitable error handling here
      ENDIF.

      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT        = GS_LIST-MATNR1
        IMPORTING
          OUTPUT       = GS_LIST-MATNR1
        EXCEPTIONS
          LENGTH_ERROR = 1
          OTHERS       = 2.
      IF SY-SUBRC <> 0.
*   implement suitable error handling here
      ENDIF.

      GS_LIST-MEINS = |{ GS_LIST-MEINS ALPHA = IN }|.
      APPEND GS_LIST TO GT_LIST.
      MOVE-CORRESPONDING GS_LIST TO GS_ALV.
*      GS_ALV = GS_LIST.

      APPEND GS_ALV TO GT_ALV.
      CLEAR: GS_LIST,GS_ALV.
    ENDAT.
  ENDLOOP.

  SELECT MATNR,MEINS AS GMEIN
    FROM MARA
    INTO TABLE @DATA(LT_MARA)
    FOR ALL ENTRIES IN @GT_ALV
    WHERE MATNR = @GT_ALV-MATNR.

  SORT LT_MARA BY MATNR.

  LOOP AT GT_ALV INTO GS_ALV.
    READ TABLE LT_MARA INTO DATA(LS_MARA) WITH KEY MATNR = GS_ALV-MATNR.
    IF SY-SUBRC = 0.
      GS_ALV-GMEIN = LS_MARA-GMEIN.
    ENDIF.
    GS_ALV-ICON = ICON_LIGHT_OUT.
    MODIFY GT_ALV FROM GS_ALV.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPALY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPALY_DATA .
  DEFINE FILL_FIELD.
    CLEAR gt_fieldcat.
    gt_fieldcat-fieldname     = &1.
    gt_fieldcat-colddictxt    = &2.
    gt_fieldcat-no_zero       = &3.
    gt_fieldcat-ref_table     = &4.
    gt_fieldcat-ref_field     = &5.
    gt_fieldcat-scrtext_l     = &6.
    APPEND gt_fieldcat.
  END-OF-DEFINITION.

  REFRESH GT_FIELDCAT.
  PERFORM FRM_FILL_FIELD.

  CLEAR: GS_LAYOUT.
  GS_LAYOUT-CWIDTH_OPT   = 'X'.          "优化列宽选项是否设置
  GS_LAYOUT-ZEBRA        = 'X'..             "
  GS_LAYOUT-BOX_FNAME    = 'SEL'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'SET_ALV_STATUS'
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT[]
*     i_default                = 'X'
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = GT_ALV
    EXCEPTIONS
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.
FORM SET_ALV_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB .
  SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB.
ENDFORM.
FORM USER_COMMAND USING P_UCOMM TYPE SY-UCOMM
                       I_SELFIELD TYPE SLIS_SELFIELD.
  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.

  "对于输出字段优化列宽
  CALL METHOD LR_GRID->GET_FRONTEND_LAYOUT
    IMPORTING
      ES_LAYOUT = GS_LAYOUT.

  GS_LAYOUT-CWIDTH_OPT = 'X'.

  CALL METHOD LR_GRID->SET_FRONTEND_LAYOUT
    EXPORTING
      IS_LAYOUT = GS_LAYOUT.

  CASE P_UCOMM."判断按钮代码
    WHEN 'ZIN'.  "工单创建

      PERFORM FRM_CREATE_PO.

    WHEN OTHERS.
  ENDCASE.

  I_SELFIELD-REFRESH    = 'X'.  "自动刷新
  I_SELFIELD-COL_STABLE = 'X'.
  I_SELFIELD-ROW_STABLE = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_FILL_FIELD .

  FILL_FIELD:'ICON'     'L' ''  ''      ''      '指示灯'.
  FILL_FIELD:'MSG'     'L' ''  ''      ''      '消息'.
  FILL_FIELD:'ZYGDH'    'L' 'X' ''      ''      '原工单号'.
  FILL_FIELD:'MATNR'    'L' 'X' 'MARA'  'MATNR' '物料号'.
  FILL_FIELD:'MAKTX'    'L' ''  ''      ''      '物料描述'.
  FILL_FIELD:'WERKS'    'L' ''  ''      ''      '生产工厂'.
  FILL_FIELD:'DAUAT'    'L' ''  ''      ''      '订单类型'.
  FILL_FIELD:'GAMNG'    'L' ''  ''      ''      '总数量'.
  FILL_FIELD:'TERKZ'    'L' ''  ''      ''      '计划类型'.
  FILL_FIELD:'GSTRP'    'L' ''  ''      ''      '开始时间'.
  FILL_FIELD:'GLTRP'    'L' ''  ''      ''      '结束时间'.
  FILL_FIELD:'POSNR'    'L' ''  ''      ''      '项目号'.
  FILL_FIELD:'MATNR1'   'L' ''  'MARA'  'MATNR' '组件料号'.
  FILL_FIELD:'MAKTX1'   'L' ''  ''      ''      '组件描述'.
  FILL_FIELD:'MENGE'    'L' ''  ''      ''      '需求数量'.
  FILL_FIELD:'MEINS'    'L' ''  ''      ''      '单位'.
  FILL_FIELD:'POSTP'    'L' ''  ''      ''      '项目类别'.
  FILL_FIELD:'VORNR'    'L' ''  ''      ''      '工序'.
  FILL_FIELD:'LGORT'    'L' ''  ''      ''      '库存地点'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_PO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CREATE_PO .

  "创建生产订单
  DATA:LS_ORDERDATA TYPE BAPI_PP_ORDER_CREATE,
       LS_RETURN    TYPE BAPIRET2,
       LV_PO        TYPE BAPI_ORDER_KEY-ORDER_NUMBER.

  "获取组件
  DATA:LT_COMPONENTS_DETAIL TYPE TABLE OF BAPI_NETWORK_COMP_DETAIL WITH HEADER LINE.
  "移除组件
  DATA:LS_REMOVE  TYPE BAPI_NETWORK_COMP_ID,
       LT_REMOVE  TYPE TABLE OF BAPI_NETWORK_COMP_ID,
       LS_MSG_TAB TYPE BAPI_METH_MESSAGE,
       LT_MSG_TAB TYPE TABLE OF BAPI_METH_MESSAGE.

*  "创建组件
  DATA:LS_RET TYPE BAPIRET2,
       LS_ADD TYPE BAPI_NETWORK_COMP_ADD,
       LT_ADD TYPE TABLE OF BAPI_NETWORK_COMP_ADD,
       LS_MSG TYPE BAPI_METH_MESSAGE,
       LT_MSG TYPE TABLE OF BAPI_METH_MESSAGE.

  DATA:IS_ORDER_KEY         TYPE COXT_ORD_KEY,
       I_MATERIAL           TYPE COXT_MATERIAL,
       IS_STORAGE_LOCATION  TYPE COXT_S_STORAGE_LOCATION,
       IS_STORAGE_LOCATIONX TYPE COXT_S_STORAGE_LOCATIONX,
       IS_REQU_QUAN         TYPE COXT_S_QUANTITY,
       I_OPERATION          TYPE AFVC-APLZL,
       I_POSNO              TYPE CIF_R3RES-POSITIONNO,
       LS_RETURN2           TYPE COXT_BAPIRETURN,
       LV_ERROR             TYPE C.
  DATA:
    LV_MATNR1 TYPE MARA-MATNR,
    LV_AUFNR  TYPE AFPO-AUFNR,
    LV_SORTF  TYPE RESB-SORTF,
    LV_SORTFX TYPE C,
    LV_POSNR  TYPE CHAR4.

  TYPES: BEGIN OF TY_RESB_BT.
           INCLUDE TYPE RESBB.
  TYPES:   INDOLD TYPE SYST_TABIX.
  TYPES: NO_REQ_UPD TYPE SYST_DATAR.
  TYPES: END OF TY_RESB_BT.

  TYPES TT_RESB_BT TYPE TABLE OF TY_RESB_BT.

  FIELD-SYMBOLS: <FT_RESB_BT> TYPE TT_RESB_BT,
                 <FS_RESB_BT> TYPE TY_RESB_BT.

  DATA:BEGIN OF LT_AUFNR OCCURS 0,
         AUFNR TYPE AFPO-AUFNR,
       END OF LT_AUFNR.

  REFRESH LT_AUFNR.

  DATA:LV_NUMBER TYPE BAPI_NETWORK_LIST-NETWORK.

  SORT GT_ALV BY ZYGDH MATNR WERKS DAUAT .

  LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<FS_ALV>) .
    AT NEW DAUAT.
      LS_ORDERDATA-MATERIAL   = <FS_ALV>-MATNR.  "物料
      LS_ORDERDATA-PLANT      = <FS_ALV>-WERKS.  "工厂
      LS_ORDERDATA-ORDER_TYPE = <FS_ALV>-DAUAT.  "订单类型
      LS_ORDERDATA-BASIC_START_DATE = <FS_ALV>-GSTRP.  "开始时间
      LS_ORDERDATA-BASIC_END_DATE   = <FS_ALV>-GLTRP.  "结束时间
      LS_ORDERDATA-QUANTITY         = <FS_ALV>-GAMNG.  "总数量
      LS_ORDERDATA-QUANTITY_UOM     = <FS_ALV>-GMEIN.  "单位

      "创建生产订单
      CALL FUNCTION 'BAPI_PRODORD_CREATE'
        EXPORTING
          ORDERDATA    = LS_ORDERDATA
*         FSH_PRODORD_SEASON       =
        IMPORTING
          RETURN       = LS_RETURN
          ORDER_NUMBER = LV_PO.
*       ORDER_TYPE   =

      IF LV_PO IS NOT INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
        "WAIT UP TO 1 SECONDS.
        WAIT UP TO '0.01' SECONDS.
        <FS_ALV>-MSG = '创建成功:' && LV_PO.
        <FS_ALV>-ICON = ICON_GREEN_LIGHT.
        <FS_ALV>-AUFNR = LV_PO.
        <FS_ALV>-AUFNR = |{ <FS_ALV>-AUFNR ALPHA = IN }|.
        "将原工单号写入抬头文本
        UPDATE AUFK SET LTEXT = '1' WHERE AUFNR = LV_PO.
        COMMIT WORK AND WAIT.

        PERFORM FRM_CREATE_TEXT USING LV_PO.

      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        <FS_ALV>-MSG = '失败:' && LS_RETURN-MESSAGE.
        <FS_ALV>-ICON = ICON_RED_LIGHT.
      ENDIF.
    ENDAT.

    MODIFY GT_ALV FROM <FS_ALV> TRANSPORTING AUFNR MSG ICON WHERE ZYGDH = <FS_ALV>-ZYGDH.

    CLEAR:LS_ORDERDATA,
          LS_RETURN,
          LV_PO.
  ENDLOOP.

  "创建组件:首先删除之前存在的组件,再用导入的组件创建新组件
  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE AUFNR <> ''.

*    LS_ADD-ACTIVITY    = <FS_ALV>-VORNR.       "工序
*    LS_ADD-ITEM_NUMBER = <FS_ALV>-POSNR.       "组件行项目
*    LS_ADD-MATERIAL    = <FS_ALV>-MATNR1.      "组件物料
*    LS_ADD-ITEM_TEXT   = <FS_ALV>-MAKTX1.      "组件描述
*    LS_ADD-PLANT       = <FS_ALV>-WERKS.       "工厂
*    LS_ADD-ENTRY_QUANTITY = <FS_ALV>-MENGE.    "需求数量
*    LS_ADD-BASE_UOM = <FS_ALV>-MEINS.          "单位
*    LS_ADD-ITEM_CAT = 'L'.                     "项目类别
*    LS_ADD-STGE_LOC = <FS_ALV>-LGORT.          "库存地点
*    APPEND LS_ADD TO LT_ADD.
*    CLEAR:LS_ADD.

*    AT END OF AUFNR .
* -----下面删除组件有点问题,每一行组件导入的时候都删除一次所有组件,导致最后只有一条组件信息,应该同一笔工单只有第一次才要删除之前的组件,请注意!
    "获取工单的组件信息
    LV_NUMBER  = <FS_ALV>-AUFNR.
    CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
      EXPORTING
        NUMBER              = LV_NUMBER
      TABLES
        E_COMPONENTS_DETAIL = LT_COMPONENTS_DETAIL[].
    COMMIT WORK AND WAIT.

    IF LT_COMPONENTS_DETAIL[] IS NOT INITIAL.
      LOOP AT LT_COMPONENTS_DETAIL INTO DATA(LS_COMPONENTS_DETAIL).
        READ TABLE GT_ALV INTO GS_ALV WITH KEY MATNR1 = LS_COMPONENTS_DETAIL-MATERIAL POSNR = LS_COMPONENTS_DETAIL-ITEM_NUMBER .
        IF SY-SUBRC <> 0.
          LS_REMOVE-COMPONENT = LS_COMPONENTS_DETAIL-COMPONENT.
          APPEND LS_REMOVE TO LT_REMOVE.
          CLEAR:LS_REMOVE.
        ENDIF.
      ENDLOOP.
      "移除组件
      LV_NUMBER  = <FS_ALV>-AUFNR.
      CALL FUNCTION 'BAPI_NETWORK_COMP_REMOVE'
        EXPORTING
          NUMBER              = LV_NUMBER
        TABLES
          I_COMPONENTS_REMOVE = LT_REMOVE
          E_MESSAGE_TABLE     = LT_MSG_TAB.
    ENDIF.
    "对于组件移除成功的工单,用导入的组件重新创建;若没有组件则直接创建
    LOOP AT LT_MSG_TAB INTO LS_MSG_TAB WHERE MESSAGE_TYPE CA 'E'.

    ENDLOOP.

    IF SY-SUBRC <> 0.

      CLEAR:LV_MATNR1,
            LV_AUFNR,LV_POSNR,IS_REQU_QUAN,IS_STORAGE_LOCATION,IS_STORAGE_LOCATIONX,
            LS_RETURN,LV_ERROR,LV_SORTF,LV_SORTFX.

      UNASSIGN:<FT_RESB_BT>,<FS_RESB_BT>.

      LV_AUFNR = <FS_ALV>-AUFNR.
      LV_MATNR1 = <FS_ALV>-MATNR1.

      IS_ORDER_KEY = LV_AUFNR.
      I_MATERIAL = LV_MATNR1.

      IS_REQU_QUAN-QUANTITY = <FS_ALV>-MENGE.
      IS_REQU_QUAN-UOM = <FS_ALV>-MEINS.

      IS_STORAGE_LOCATION-WERKS = <FS_ALV>-WERKS.
      IS_STORAGE_LOCATIONX-WERKS =  'X'.

      IF <FS_ALV>-LGORT IS NOT INITIAL.
        IS_STORAGE_LOCATION-LGORT = <FS_ALV>-LGORT.
        IS_STORAGE_LOCATIONX-LGORT =  'X'.
      ENDIF.
      CLEAR:LS_RETURN,
            LV_ERROR.
      CALL FUNCTION 'CO_XT_COMPONENT_ADD'
        EXPORTING
          IS_ORDER_KEY         = IS_ORDER_KEY
          I_MATERIAL           = I_MATERIAL
          IS_REQU_QUAN         = IS_REQU_QUAN
          I_OPERATION          = I_OPERATION
          IS_STORAGE_LOCATION  = IS_STORAGE_LOCATION
          IS_STORAGE_LOCATIONX = IS_STORAGE_LOCATIONX
          I_POSTP              = 'L'
          I_POSNO              = I_POSNO
        IMPORTING
          ES_BAPIRETURN        = LS_RETURN
          E_ERROR_OCCURRED     = LV_ERROR.

      IF LV_ERROR IS INITIAL.

        ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <FT_RESB_BT>.

        DATA(LV_LINE) = LINES( <FT_RESB_BT> ).

        LOOP AT <FT_RESB_BT> ASSIGNING <FS_RESB_BT>.

          "新增行数据处理
          IF SY-TABIX = LV_LINE.

            IF <FS_ALV>-POSNR IS NOT INITIAL.
              <FS_RESB_BT>-POSNR = <FS_ALV>-POSNR.
            ELSE.

              SELECT SINGLE MAX( POSNR )
              INTO <FS_RESB_BT>-POSNR
              FROM RESB
              WHERE AUFNR EQ LV_AUFNR.

              <FS_RESB_BT>-POSNR = <FS_RESB_BT>-POSNR + 1.
              LV_POSNR = <FS_RESB_BT>-POSNR.
            ENDIF.

            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
              EXPORTING
                INPUT  = <FS_RESB_BT>-POSNR
              IMPORTING
                OUTPUT = <FS_RESB_BT>-POSNR.

            IF <FS_ALV>-VORNR IS NOT INITIAL.
              <FS_RESB_BT>-VORNR = <FS_ALV>-VORNR.
            ENDIF.

            IF <FS_ALV>-MEINS IS NOT INITIAL.
              <FS_RESB_BT>-MEINS = <FS_ALV>-MEINS.
            ENDIF.

            IF <FS_RESB_BT>-XWAOK IS INITIAL.
              <FS_RESB_BT>-XWAOK = 'X'.
            ENDIF.

          ENDIF.
        ENDLOOP.
        CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT'
          IMPORTING
            ES_BAPIRETURN    = LS_RETURN
            E_ERROR_OCCURRED = LV_ERROR.


        IF ( LS_RETURN-TYPE = 'S' OR LS_RETURN-TYPE = 'W' OR LS_RETURN-TYPE = 'I' )
            OR LS_RETURN IS INITIAL.

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

          CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.

          <FS_ALV>-MSG = '订单' && <FS_ALV>-aufnr && '组件新增成功'.
          <FS_ALV>-ICON = ICON_LED_GREEN.

        ELSE.

          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
           CLEAR:<FS_ALV>-MSG.
          <FS_ALV>-MSG = LS_RETURN-MESSAGE.
          <FS_ALV>-ICON = ICON_LED_RED.

        ENDIF.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
         CLEAR:<FS_ALV>-MSG.
        <FS_ALV>-MSG = LS_RETURN-MESSAGE.
        <FS_ALV>-ICON = ICON_LED_RED.
      ENDIF.

      "WAIT UP TO 1 SECONDS.

*      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*        EXPORTING
*          WAIT = 'X'.
*
*      "创建组件
*      CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
*      LV_NUMBER  = <FS_ALV>-AUFNR.
*      CALL FUNCTION 'BAPI_NETWORK_COMP_ADD'
*        EXPORTING
*          NUMBER           = LV_NUMBER
*        TABLES
*          I_COMPONENTS_ADD = LT_ADD
*          E_MESSAGE_TABLE  = LT_MSG.
*
*      LOOP AT LT_MSG INTO LS_MSG WHERE MESSAGE_TYPE CA 'E'.
*      ENDLOOP.
*      IF SY-SUBRC <> 0.
*
*        COMMIT WORK AND WAIT.
*
*        <FS_ALV>-MSG = '创建成功:' && <FS_ALV>-AUFNR.
*        <FS_ALV>-ICON = ICON_GREEN_LIGHT.
*      ELSE.
*        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*        <FS_ALV>-MSG = '工单' && <FS_ALV>-AUFNR && '组件创建失败:' && LS_MSG-MESSAGE_TEXT .
*        <FS_ALV>-ICON = ICON_RED_LIGHT.
*      ENDIF.

    ENDIF.
    CLEAR:LT_REMOVE,
          LT_REMOVE[],
          LT_MSG_TAB,
          LT_MSG_TAB[],
          LT_ADD,
          LT_ADD[],
          LT_MSG,
          LT_MSG[],
          LV_NUMBER.
*    ENDAT.

*    MODIFY GT_ALV FROM <FS_ALV> TRANSPORTING AUFNR MSG ICON WHERE ZYGDH = <FS_ALV>-ZYGDH.

  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_TEXT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_PO
*&---------------------------------------------------------------------*
FORM FRM_CREATE_TEXT  USING CV_PO.
  DATA:LV_FID     LIKE  THEAD-TDID,
       LV_FNAME   LIKE  THEAD-TDNAME,
       LV_FOBJECT LIKE  THEAD-TDOBJECT,
       LV_TEXT    TYPE  STRING.

  DATA : LT_FLINES    LIKE TABLE OF TLINE  WITH HEADER LINE .

  "将原工单号写入抬头文本
  LV_FID    = 'KOPF'.
  CONCATENATE SY-MANDT CV_PO INTO LV_FNAME.
  LV_FOBJECT = 'AUFK'.
  LV_TEXT  = GS_ALV-ZYGDH.

  LT_FLINES-TDLINE  = LV_TEXT.
  APPEND LT_FLINES .
  CLEAR:LT_FLINES .

  CALL FUNCTION 'CREATE_TEXT'
    EXPORTING
      FID       = LV_FID
      FLANGUAGE = SY-LANGU
      FNAME     = LV_FNAME
      FOBJECT   = LV_FOBJECT
    TABLES
      FLINES    = LT_FLINES
    EXCEPTIONS
      NO_INIT   = 1
      NO_SAVE   = 2
      OTHERS    = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  CLEAR:LV_FID,
        LV_FNAME,
        LV_FOBJECT,
        LT_FLINES,
        LT_FLINES[].





ENDFORM.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BAPI_PRODORD_CREATESAP系统中的一个标准的BAPI函数模块,用于创建生产订单。在调用这个BAPI函数模块之前,你需要先准备好一些数据,包括: 1. 订单类型 2. 生产版本 3. 生产工厂 4. 产品编号 5. 订单数量 6. 计划开始日期和结束日期 7. 工作中心 调用BAPI_PRODORD_CREATE的具体步骤如下: 1. 使用Function Module 'BAPI_TRANSACTION_COMMIT'开启事务处理。 2. 创建一个Function Module对象。 3. 设置Function Module的输入参数。 4. 调用Function Module执行BAPI_PRODORD_CREATE。 5. 使用Function Module 'BAPI_TRANSACTION_COMMIT'提交事务。 下面是一个简单的ABAP代码示例,演示如何调用BAPI_PRODORD_CREATE。 ``` DATA: lv_order_type TYPE AUFART, lv_production_version TYPE VERID, lv_plant TYPE WERKS_D, lv_material TYPE MATNR, lv_quantity TYPE MENG07, lv_planned_start_date TYPE D, lv_planned_finish_date TYPE D, lv_work_center TYPE ARBPL. *设置输入参数 lv_order_type = 'PP01'. lv_production_version = '0001'. lv_plant = '1000'. lv_material = 'M-01'. lv_quantity = 100. lv_planned_start_date = '20210801'. lv_planned_finish_date = '20210831'. lv_work_center = 'WC-01'. *创建一个Function Module对象 CALL FUNCTION 'BAPI_PRODORD_CREATE' EXPORTING order_type = lv_order_type production_version = lv_production_version plant = lv_plant material = lv_material quantity = lv_quantity planned_start_date = lv_planned_start_date planned_finish_date = lv_planned_finish_date work_center = lv_work_center IMPORTING order_number = lv_order_number EXCEPTIONS OTHERS = 1. *提交事务处理 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ``` 以上示例代码仅供参考,具体实现方式可能因SAP系统版本和业务需求而异。如果你需要更加详细的帮助,请参考SAP官方文档或者咨询SAP开发专家。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值