SAP 批量创建工单并下达(激活)(BAPI : BAPI_PRODORD_CREATE & BAPI_PRODORD_RELEASE)

上传模板
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下达失败的原因是因为在事务码 OPJK 对对应订单类型设置了检查,如果不需要,可以关掉它
在这里插入图片描述
另外还可以在 OPKP 中设置生产订单创建并下达,一步执行.
在这里插入图片描述

源代码:

*&---------------------------------------------------------------------*
*& Report ZPP044
*&---------------------------------------------------------------------*
*& 开发者 :cycle
*& 需求方 :计划
*& 程序目的 :批量创建生产订单(组件自动带出)
*& 开发时间 :20230213
*&---------------------------------------------------------------------*
REPORT zpp044.

TABLES:sscrfields,mara,marc.

"定义上载的EXCELDATA:gs_upload TYPE zalsmex_tabline,
     gt_upload TYPE TABLE OF zalsmex_tabline.

TYPES : BEGIN OF ty_data,
          zygdh  TYPE string,                "原工单号'.
          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,       "结束时间'.
          gmein  TYPE co_gmein,         "单位
          maktx  TYPE makt-maktx,       "物料描述'.
          relstt TYPE string,            "生产订单下达状态
          msgrel TYPE string,            "生产订单下达文本
          sel    TYPE c,
          icon   TYPE icon_d,
          aufnr  TYPE aufnr,
          flag   TYPE c,
          msg    TYPE string,
        END OF ty_data.

DATA:gt_list TYPE TABLE OF ty_data,
     gs_list TYPE ty_data.


*----------------------------------------------------------------------*
*                  ALV定义
*----------------------------------------------------------------------*
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:it_fieldcat TYPE lvc_t_fcat,
     wa_fieldcat LIKE LINE OF it_fieldcat,

     it_layout   TYPE TABLE OF lvc_s_layo,
     wa_layout   TYPE lvc_s_layo,

     it_events   TYPE slis_t_event,
     wa_events   LIKE LINE OF it_events.
*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
DEFINE init_fieldcat.
  CLEAR wa_fieldcat.
  wa_fieldcat-fieldname = &1.
  wa_fieldcat-coltext = &2.
  wa_fieldcat-ref_table = &3.
  wa_fieldcat-ref_field = &4.
*  wa_fieldcat-checkbox = &5.
*  wa_fieldcat-edit = &6.
*  wa_fieldcat-key = &7.
*  wa_fieldcat-emphasize = &8.
  APPEND wa_fieldcat TO it_fieldcat.
END-OF-DEFINITION.

SELECTION-SCREEN FUNCTION KEY 1.  "按钮“默认模板下载”

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:p_fn  TYPE string   MODIF ID i1 .         "路径
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  sscrfields-functxt_01 = '@EZ@导入模板'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fn.
  PERFORM frm_fn."路径搜索帮助打开

AT SELECTION-SCREEN.
  DATA: ld_str TYPE string.
  IF sy-ucomm = 'FC01'.
    CALL FUNCTION 'ZJH_DOWNLOAD_FILE_SMW0'
      EXPORTING
        im_objname      = 'ZPP044'
        im_filename_def = '生产工单批量创建模板(自动带出组件).xlsx'
      IMPORTING
        ex_fullname     = ld_str.
    IF ld_str IS NOT INITIAL.
      CONCATENATE '已经下载到' ld_str INTO ld_str SEPARATED BY space.
      MESSAGE ld_str TYPE 'I'.
    ENDIF.
  ENDIF.


START-OF-SELECTION.
  PERFORM frm_ge.  "开始导入
  PERFORM frm_process_data.  "转换到内表
  PERFORM frm_layout.
  PERFORM frm_fieldcat.
  PERFORM frm_output.

FORM frm_fn .
  CALL FUNCTION 'WS_FILENAME_GET'             "Get file name
    EXPORTING
      mask             = ',*.* ,*.*.' "',*.xls,*.xlsx.'
      mode             = '0'
      title            = TEXT-h10
    IMPORTING
      filename         = p_fn
    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_ge .
  DATA: lv_xls LIKE rlgrap-filename .
  IF p_fn IS INITIAL.
    MESSAGE '导入文件地址不能为空!' TYPE 'E'.
    STOP.
  ENDIF.
  CLEAR lv_xls.
  lv_xls = p_fn.
  "从第二行第一列开始读取
  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = lv_xls
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 8 " 读取多少列
      i_end_row               = 55555 "读取多少行
    TABLES
      intern                  = gt_upload
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc NE 0 .
    MESSAGE  '从本地文件导入到SAP失败' TYPE 'E'.
  ENDIF.
  CLEAR gs_upload.
  SORT gt_upload BY row col.
ENDFORM.

FORM frm_process_data .
  DATA num TYPE i.
  DATA s_zylqx TYPE RANGE OF zylqx.
  s_zylqx = VALUE #( sign = 'I' option = 'EQ' ( low = 'I类' )
                                           ( low =  'II类' )
                                           ( low =  'III类' )
                                            ( low =  'IIa类' )
                                             ( low =  'IIb类' )
                                             ( low =  'others' )
                                                     ).
  DATA l_index TYPE  i.
  DATA    l_type  TYPE c.
  FIELD-SYMBOLS : <fs>.
  LOOP AT gt_upload INTO gs_upload .
    MOVE gs_upload-col TO l_index.
    ASSIGN COMPONENT l_index OF STRUCTURE gs_list TO <fs>.
    DESCRIBE FIELD <fs> TYPE l_type.
    CASE l_type.
      WHEN 'C'.
        <fs> = gs_upload-value.
        CONDENSE <fs>.
      WHEN 'I'  "数字串
      OR 's'
      OR 'b'
      OR 'N'
      OR 'F'
      OR 'P'.
        CATCH SYSTEM-EXCEPTIONS  arithmetic_errors = 5
                       conversion_errors = 6
                       bcd_overflow  = 7
                       bcd_field_overflow = 8
                       .
          <fs> = gs_upload-value.
        ENDCATCH.
        IF sy-subrc <> 0.
          MESSAGE e001(00) WITH gs_upload-row  '行' gs_upload-col  '列数据转换错误'.
        ENDIF.
      WHEN OTHERS.
        <fs> = gs_upload-value.
    ENDCASE.
    AT END OF row.
      APPEND  gs_list TO  gt_list.
      CLEAR gs_list.
    ENDAT.
  ENDLOOP.

  LOOP AT gt_list INTO gs_list.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input  = gs_list-matnr
      IMPORTING
        output = gs_list-matnr.

    SELECT SINGLE * FROM mara WHERE matnr = gs_list-matnr AND lvorm = ''.
    IF sy-subrc <> 0.
      gs_list-flag = 'E'.
      gs_list-msg = '物料' && gs_list-matnr && '不存在或已删除!'.
      gs_list-icon = icon_led_red.
      MODIFY gt_list FROM gs_list.
      CONTINUE.
    ENDIF.
    SELECT SINGLE * FROM marc WHERE matnr = gs_list-matnr AND werks = gs_list-werks AND lvorm = ''.
    IF sy-subrc <> 0.
      gs_list-flag = 'E'.
      gs_list-msg = '物料' && gs_list-matnr && '在工厂' && gs_list-werks && '里不存在或已删除!'.
      gs_list-icon = icon_led_red.
      MODIFY gt_list FROM gs_list.
      CONTINUE.
    ENDIF.
    SELECT SINGLE meins INTO gs_list-gmein FROM mara WHERE matnr = gs_list-matnr.
    SELECT SINGLE maktx INTO gs_list-maktx FROM makt WHERE matnr = gs_list-matnr AND spras = sy-langu.

    MODIFY gt_list FROM gs_list.
  ENDLOOP.
  SORT gt_list BY zygdh matnr werks dauat .
ENDFORM.

FORM frm_layout .
  wa_layout-cwidth_opt = 'X'.
  wa_layout-zebra = 'X'.
  wa_layout-sel_mode = 'D'.
  wa_layout-box_fname = 'SEL'.
ENDFORM.

FORM frm_fieldcat .
  init_fieldcat 'ICON'  '指示灯' '' ''  .
  init_fieldcat 'FLAG'  'FLAG' '' ''  .
  init_fieldcat 'MSG'   '返回信息' '' ''  .
  init_fieldcat 'AUFNR' '创建的工单号' 'AUFK' 'AUFNR'  .
  init_fieldcat 'ZYGDH' '原工单号' '' ''  .
  init_fieldcat 'MATNR' '物料编码' 'AFPO' 'MATNR'  .
  init_fieldcat 'MAKTX' '物料描述' '' ''  .
  init_fieldcat 'WERKS' '生产工厂' 'MARC' 'WERKS'  .
  init_fieldcat 'DAUAT' '订单类型' 'AFPO' 'DAUAT'  .
  init_fieldcat 'GAMNG' '总数量' '' ''  .
  init_fieldcat 'TERKZ' '计划类型' '' ''  .
  init_fieldcat 'GSTRP' '开始时间' '' ''  .
  init_fieldcat 'GLTRP' '结束时间' '' ''  .
  init_fieldcat 'GMEIN' '单位' '' ''  .
  init_fieldcat 'RELSTT' '生产订单下达状态' '' ''  .
  init_fieldcat 'MSGREL' '生产订单下达文本' '' ''  .

ENDFORM.

FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'ALV_PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout_lvc            = wa_layout
      it_fieldcat_lvc          = it_fieldcat
    TABLES
      t_outtab                 = gt_list
    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.

FORM alv_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZCYCLE' 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 = wa_layout.

  wa_layout-cwidth_opt = 'X'.

  CALL METHOD lr_grid->set_frontend_layout
    EXPORTING
      is_layout = wa_layout.

  CASE p_ucomm."判断按钮代码
    WHEN 'ZCREATE'.
      READ TABLE gt_list INTO gs_list WITH KEY sel = 'X'.
      IF sy-subrc <> 0.
        MESSAGE '至少选择一行创建!' TYPE 'I'.
      ELSE.
        READ TABLE gt_list INTO gs_list WITH KEY sel = 'X' flag = 'E'.
        IF sy-subrc = 0.
          MESSAGE 'FLAGE 的项目不允许创建' TYPE 'I'.
        ELSE.
          READ TABLE gt_list INTO gs_list WITH KEY sel = 'X' flag = 'S'.
          IF sy-subrc = 0.
            MESSAGE 'FLAGS 的项目表示本次已经创建了,不需要再次创建' TYPE 'I'.
          ELSE.
            PERFORM z_create_wo.
          ENDIF.
        ENDIF.
      ENDIF.
    WHEN OTHERS.
  ENDCASE.

  i_selfield-refresh    = 'X'.  "自动刷新
  i_selfield-col_stable = 'X'.
  i_selfield-row_stable = 'X'.

ENDFORM.

FORM z_create_wo.
  "创建生产订单
  DATA:ls_orderdata TYPE bapi_pp_order_create,
       ls_return    TYPE bapiret2,
       lv_wo        TYPE bapi_order_key-order_number.
  "激活生产订单
  DATA:BEGIN OF orderlist  OCCURS 0,
         aufnr TYPE aufnr,
       END OF orderlist.

  DATA:release_return TYPE TABLE OF bapi_order_return.
  DATA:l_release_return LIKE LINE OF release_return.

  LOOP AT gt_list 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_wo.
*       ORDER_TYPE   =

      IF lv_wo IS NOT INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.

        orderlist-aufnr = lv_wo.
        APPEND orderlist.
        CLEAR orderlist.

        <fs_alv>-msg = '创建成功:' && lv_wo.
        <fs_alv>-flag = 'S'.
        <fs_alv>-icon = icon_green_light.
        <fs_alv>-aufnr = lv_wo.
        <fs_alv>-aufnr = |{ <fs_alv>-aufnr ALPHA = IN }|.
        "将原工单号写入抬头文本
        UPDATE aufk SET ltext = '1' WHERE aufnr = lv_wo.
        COMMIT WORK AND WAIT.

        PERFORM frm_create_text USING lv_wo.

      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        <fs_alv>-flag = 'E'.
        <fs_alv>-msg = '失败:' && ls_return-message.
        <fs_alv>-icon = icon_red_light.
      ENDIF.
    ENDAT.

    MODIFY gt_list FROM <fs_alv> TRANSPORTING aufnr msg icon WHERE zygdh = <fs_alv>-zygdh.

    CLEAR:ls_orderdata,
          ls_return,
          lv_wo.
  ENDLOOP.

  "等待10s 否则会有生产订单不存在的提示
  CALL FUNCTION 'AB_SLEEP'
    EXPORTING
      wait_time = 5.

  "激活生产订单
  IF NOT orderlist[] IS INITIAL.
    CALL FUNCTION 'BAPI_PRODORD_RELEASE'
      EXPORTING
        release_control = '1'
      TABLES
        orders          = orderlist
        detail_return   = release_return.

    LOOP AT gt_list INTO gs_list.
      SHIFT gs_list-aufnr LEFT DELETING LEADING '0'.
      LOOP AT release_return  INTO l_release_return WHERE message_v1 = gs_list-aufnr.
        gs_list-relstt = l_release_return-type. "WO激活下达状态
        gs_list-msgrel = l_release_return-message. "WO激活下达文本
        MODIFY gt_list FROM gs_list.
      ENDLOOP.
    ENDLOOP.

  ENDIF.

ENDFORM.

FORM frm_create_text  USING cv_wo.
  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_wo INTO lv_fname.
  lv_fobject = 'AUFK'.
  lv_text  = gs_list-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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值