weixin_50626583 2024-04-25 16:52 采纳率: 0%
浏览 23

BAPI_PRODORD_RELEASE调用无法修改工单是否由其他方式可以代替此方式的方法?


 
FUNCTION zpp_fm_016.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_IFNO) TYPE  ZIFNO
*"     VALUE(IS_DATA) TYPE  ZPPST008
*"  EXPORTING
*"     VALUE(ES_DATA) TYPE  ZPPST008_RETURN
*"----------------------------------------------------------------------
 
  DATA: ls_header TYPE zpptb022_header, "抬头
        lt_comp   TYPE TABLE OF zpptb022_comp WITH HEADER LINE, "组件
        lt_oper   TYPE TABLE OF zpptb022_oper WITH HEADER LINE. "工序
  DATA: lv_message TYPE zppst008_return-message.
 
  DATA:lv_aufnr TYPE aufk-aufnr.
  DATA:lv_plnum TYPE plaf-plnum .
  "BAPI信息
  DATA: ls_order_create TYPE bapi_pp_order_create,
        ls_return       TYPE bapiret2,
        ls_thead        TYPE thead,
        lt_ftab         TYPE TABLE OF char_132 WITH HEADER LINE,
        lt_texts        TYPE TABLE OF tline WITH HEADER LINE,
        lt_orders       TYPE TABLE OF bapi_order_key WITH HEADER LINE.
  "修改bapi
  DATA:ls_orderdata  LIKE  bapi_pp_order_change,
       ls_orderdatax LIKE  bapi_pp_order_changex.
  "记录日志
  MOVE-CORRESPONDING is_data-header TO ls_header.
  ls_header-longtext = ls_header-ZGDWB.
  ls_header-ifno = iv_ifno.
  IF ls_header-ZDDXQ = '是'.
       ls_header-ZDDXQ = 'X'.
  ELSE.
       ls_header-ZDDXQ = ''.
  ENDIF.
  MODIFY zpptb022_header FROM ls_header.
"by margin on 2023/08/07 begin(增加 将工单 打上 删除标识  功能)
  if ls_header-TXT04 = 'DLFL'.
      CLEAR: ls_return,lt_orders,lt_orders[].
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input         = ls_header-aufnr
       IMPORTING
         OUTPUT        =  ls_header-aufnr
                .
      lt_orders-order_number = ls_header-aufnr.
      APPEND lt_orders.
      CALL FUNCTION 'BAPI_PRODORD_SET_DELETION_FLAG'
        IMPORTING
          return = ls_return
        TABLES
          orders = lt_orders[].
      IF ls_return-type CA 'EAX'.
        es_data-type1 = 'E'.
        es_data-message = es_data-message && '工单删除失败(' && ls_return-message && ').'.
      ELSE.
        es_data-type1 = 'S'.
        es_data-message = es_data-message && '工单已标记删除.'.
      ENDIF.
      es_data-aufnr = ls_header-aufnr.
 
      "返回结果
      UPDATE zpptb022_header SET aufnr = es_data-aufnr
                                 type1 = es_data-type1
                                 message = es_data-message
                             WHERE ifno = iv_ifno.
      COMMIT WORK.
      return.
  endif.
"end
 
 
  LOOP AT is_data-components INTO DATA(ls_components).
    CLEAR lt_comp.
    MOVE-CORRESPONDING ls_components TO lt_comp.
    lt_comp-ifno = iv_ifno.
    lt_comp-rowno = sy-tabix.
    APPEND lt_comp.
  ENDLOOP.
  MODIFY zpptb022_comp FROM TABLE lt_comp[].
  LOOP AT is_data-operations INTO DATA(ls_operations).
    CLEAR lt_oper.
    MOVE-CORRESPONDING ls_operations TO lt_oper.
    lt_oper-ifno = iv_ifno.
    lt_oper-rowno = sy-tabix.
    APPEND lt_oper.
  ENDLOOP.
  MODIFY zpptb022_oper FROM TABLE lt_oper[].
  COMMIT WORK AND WAIT.
 
  "数据校验
  CLEAR es_data."抬头校验
  IF ls_header-werks IS INITIAL.
    es_data-message = |{ es_data-message }工厂必填;|.
  ENDIF.
  IF ls_header-txt04 IS INITIAL.
    es_data-message = |{ es_data-message }订单状态必填;|.
  ENDIF.
  IF ls_header-auart IS INITIAL.
    es_data-message = |{ es_data-message }订单类型必填;|.
  ENDIF.
  IF ls_header-plnbez IS INITIAL.
    es_data-message = |{ es_data-message }物料编码必填;|.
  ENDIF.
  IF ls_header-gamng <= 0.
    es_data-message = |{ es_data-message }工单数量必填;|.
  ENDIF.
  IF ls_header-gmein IS INITIAL.
    es_data-message = |{ es_data-message }单位必填;|.
  ENDIF.
  IF ls_header-gstrp IS INITIAL.
    es_data-message = |{ es_data-message }开始时间必填;|.
  ENDIF.
  IF ls_header-gltrp IS INITIAL.
    es_data-message = |{ es_data-message }结束时间必填;|.
  ENDIF.
  IF ls_header-fevor IS INITIAL.
    es_data-message = |{ es_data-message }生产主管必填;|.
  ENDIF.
  IF ls_header-verid IS INITIAL.
    es_data-message = |{ es_data-message }生产版本必填;|.
  ENDIF.
*  IF LS_HEADER-STLAL IS INITIAL.
*    ES_DATA-MESSAGE = |{ ES_DATA-MESSAGE }备选BOM必填;|.
*  ENDIF.
  IF es_data-message IS NOT INITIAL.
    es_data-message = |抬头:{ es_data-message } |.
  ENDIF.
  LOOP AT lt_comp."组件校验
    CLEAR lv_message.
    IF lt_comp-werks IS INITIAL.
      lv_message = |{ lv_message }工厂必填;|.
    ENDIF.
    IF lt_comp-matnr IS INITIAL.
      lv_message = |{ lv_message }物料编码必填;|.
    ENDIF.
    IF lt_comp-postp IS INITIAL.
      lv_message = |{ lv_message }项目类别必填;|.
    ENDIF.
    IF lt_comp-bdmng <= 0.
      lv_message = |{ lv_message }需求数量必填;|.
    ENDIF.
    IF lt_comp-erfme IS INITIAL.
      lv_message = |{ lv_message }单位必填;|.
    ENDIF.
    IF lt_comp-vornr IS INITIAL.
      lv_message = |{ lv_message }工序必填;|.
    ENDIF.
    IF lv_message IS NOT INITIAL.
      es_data-message = |{ es_data-message }组件第{ lt_comp-rowno }行:{ lv_message }|.
      EXIT.
    ENDIF.
  ENDLOOP.
  LOOP AT lt_oper."工序校验
    CLEAR lv_message.
    IF lt_oper-vornr IS INITIAL.
      lv_message = |{ lv_message }工序必填;|.
    ENDIF.
    IF lt_oper-arbpl IS INITIAL.
      lv_message = |{ lv_message }工作中心必填;|.
    ENDIF.
    IF lt_oper-steus IS INITIAL.
      lv_message = |{ lv_message }控制码必填;|.
    ENDIF.
    IF lt_oper-ltxa1 IS INITIAL.
      lv_message = |{ lv_message }工序名称必填;|.
    ENDIF.
    IF lt_oper-bmsch <= 0.
      lv_message = |{ lv_message }基本数量必填;|.
    ENDIF.
    IF lt_oper-mgvrg <= 0.
      lv_message = |{ lv_message }工序数量必填;|.
    ENDIF.
    IF lv_message IS NOT INITIAL.
      es_data-message = |{ es_data-message }工序第{ lt_comp-rowno }行:{ lv_message }|.
      EXIT.
    ENDIF.
  ENDLOOP.
  IF es_data-message IS NOT INITIAL.
    "返回结果
    es_data-type1 = 'E'.
    UPDATE zpptb022_header SET type1 = es_data-type1
                               message = es_data-message
                           WHERE ifno = iv_ifno.
    COMMIT WORK.
    EXIT.
  ENDIF.
  "处理数据,创建工单
  CLEAR es_data.
*  如果APS传输AUFNR=AFKO-AUFNR,就是工单修改,如果AUFNR=PLAF-PLNUM,就是计划订单转生成订单,AUFNR=‘’就是新建工单
  IF  ls_header-aufnr  IS NOT INITIAL.
    lv_aufnr = ls_header-aufnr.
    lv_aufnr = |{ lv_aufnr ALPHA = IN }|.
    SELECT SINGLE COUNT(*) FROM afko WHERE aufnr EQ lv_aufnr.
    IF sy-subrc EQ 0. "工单修改
      CASE ls_header-auart.
        WHEN 'Z002' OR 'Z006' OR 'Z003' OR 'Z004' OR 'Z001' OR 'Z005'OR 'Z008' OR 'Z009'.
          CLEAR:  ls_orderdata, ls_orderdatax,ls_return.
*          ls_orderdata-plant            = ls_header-werks.
*          ls_orderdata-planning_plant   = ls_header-werks.
          "TJ02T-TXT04  TXT04 订单状态 新工单默认CRTD不需要修改,如果是REL则需要BAPI执行释放
*           ls_orderdata-order_type       = ls_header-auart.
*          ls_header-plnbez = |{ ls_header-plnbez ALPHA = IN WIDTH = 18 }|.
*          ls_orderdata-material         = ls_header-plnbez.
          "MAKT-MAKTX    MAKTX    物料描述 :不需要
          ls_orderdata-quantity         = ls_header-gamng.
          ls_orderdata-quantity_uom     = ls_header-gmein.
          CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
            EXPORTING
              input                = ls_orderdata-quantity_uom
*             LANGUAGE             = SY-LANGU
           IMPORTING
               OUTPUT               = ls_orderdata-quantity_uom
*           EXCEPTIONS
*             UNIT_NOT_FOUND       = 1
*             OTHERS               = 2
                    .
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.
          ls_orderdata-basic_start_date = ls_header-gstrp.
          ls_orderdata-basic_end_date   = ls_header-gltrp.
*          ls_orderdata-sales_order      = ls_header-kdauf.
*          ls_orderdata-sales_order_item = ls_header-kdpos.
          ls_orderdata-prod_version     = ls_header-verid.
          ls_orderdatax-quantity         = 'X'.
          ls_orderdatax-quantity_uom     = 'X'.
          ls_orderdatax-basic_start_date = 'X'.
          ls_orderdatax-basic_end_date   = 'X'.
          ls_orderdatax-prod_version     = 'X'.
          "AFKO-STLAL    STLAL    备选BOM :目前不需要,只是用于核对数据
          CALL FUNCTION 'BAPI_PRODORD_CHANGE'
            EXPORTING
              number     = lv_aufnr
              orderdata  = ls_orderdata
              orderdatax = ls_orderdatax
            IMPORTING
              return     = ls_return
*             ORDER_TYPE =
*             ORDER_STATUS           =
*             MASTER_DATA_READ       =
*       TABLES
*             FSH_BUNDLES            =
            .
          IF ls_return-type = 'E' OR ls_return-type = 'A'.
            es_data-type1 = 'E'.
            es_data-message = ls_return-message.
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
            es_data-aufnr = lv_aufnr.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'.
            WAIT UP TO '0.5' SECONDS.
            UPDATE aufk SET zprolin = ls_header-zprolin
                            zcomment = ls_header-zcomment
                            zkhck    = ls_header-zkhck
                            ZDDXQ    = ls_header-ZDDXQ
                            zaps     = ls_header-zaps
                            ZSH     = ls_header-LOT
                            ZXZ     = ls_header-STAGE
                            zporder  = ls_header-zporder
                            zkssk      = ls_header-zkssk
                            zissk      = ls_header-zissk
                            ZBZ1      = ls_header-ZBZ1
                            ZBZ2      = ls_header-ZBZ2
                            ZBZSJ      = ls_header-ZBZSJ
                            " 添加字段 ZZZXQSJ  后道上线日期 20231208
                            ZZZXQSJ   = ls_header-ZZZXQSJ
                    WHERE aufnr = es_data-aufnr.
             IF ls_header-zsnno IS NOT INITIAL.
              UPDATE aufk SET
                                zsnno  =   ls_header-zsnno
                      WHERE aufnr = es_data-aufnr.
            ENDIF.
            UPDATE afko SET fevor = ls_header-fevor WHERE aufnr = es_data-aufnr.
            es_data-type1 = 'S'.
            es_data-message = '工单修改成功.'.
*        "更新长文本
            IF ls_header-longtext IS NOT INITIAL.
              ls_thead-tdobject  = 'AUFK'.   "文本对象
              ls_thead-tdid      = 'KOPF'.   "文本id
              ls_thead-tdspras   = sy-langu. "语言
              CONCATENATE sy-mandt es_data-aufnr INTO ls_thead-tdname.
              CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
                EXPORTING
                  text      = ls_header-longtext
                TABLES
                  ftext_tab = lt_ftab[].
              LOOP AT lt_ftab.
                lt_texts-tdline = lt_ftab.
                APPEND lt_texts.
              ENDLOOP.
              CALL FUNCTION 'SAVE_TEXT'
                EXPORTING
                  client          = sy-mandt
                  header          = ls_thead
                  savemode_direct = 'X'
                TABLES
                  lines           = lt_texts[].
              IF sy-subrc EQ 0.
                UPDATE aufk SET ltext = '1' WHERE aufnr = es_data-aufnr.
              ELSE.
                es_data-message = es_data-message && '但长文本更新失败.'.
              ENDIF.
            ENDIF.
        "REL释放订单
            IF ls_header-txt04 = 'REL'.
              CLEAR: ls_return,lt_orders,lt_orders[].
              lt_orders-order_number = es_data-aufnr.
              APPEND lt_orders.
              CALL FUNCTION 'BAPI_PRODORD_RELEASE'
                IMPORTING
                  return = ls_return
                TABLES
                  orders = lt_orders[].
              IF ls_return-type CA 'EAX'.
                es_data-message = es_data-message && '但工单下达失败(' && ls_return-message && ').'.
              ENDIF.
            ENDIF.
 
  ""begin 增加生产工单 on 20240425 by ZHOUZQ
 
   ""end
 
 
            "组件变更、工序变更
            IF ls_header-auart = 'Z003' OR ls_header-auart = 'Z004'.
              IF lt_comp[] IS NOT INITIAL AND es_data-type1 <> 'E'."组件变更
                CALL FUNCTION 'ZPP_FM_009_COMP'
                  EXPORTING
                    iv_aufnr = es_data-aufnr
                  TABLES
                    it_comp  = lt_comp[]
                  CHANGING
                    cs_data  = es_data.
              ENDIF.
              IF lt_oper[] IS NOT INITIAL AND es_data-type1 <> 'E'."工序变更
                CALL FUNCTION 'ZPP_FM_009_OPER'
                  EXPORTING
                    iv_aufnr = es_data-aufnr
                  TABLES
                    it_oper  = lt_oper[]
                  CHANGING
                    cs_data  = es_data.
              ENDIF.
            ENDIF.
            "删除工单
            IF es_data-type1 = 'E'.
              CALL FUNCTION 'DEQUEUE_ESORDER' "解锁
                EXPORTING
                  aufnr  = es_data-aufnr
                EXCEPTIONS
                  OTHERS = 1.
              CLEAR: ls_return,lt_orders,lt_orders[].
              lt_orders-order_number = es_data-aufnr.
              APPEND lt_orders.
              CALL FUNCTION 'BAPI_PRODORD_SET_DELETION_FLAG'
                IMPORTING
                  return = ls_return
                TABLES
                  orders = lt_orders[].
              IF ls_return-type CA 'EAX'.
                es_data-message = es_data-message && '.工单删除失败(' && ls_return-message && ').'.
              ELSE.
                es_data-message = es_data-message && '.工单已标记删除.'.
              ENDIF.
            ENDIF.
          ENDIF.
        WHEN OTHERS.
          es_data-type1 = 'E'.
          es_data-message = '接口不支持该类型工单的创建.'.
      ENDCASE.
    ELSE.
      ls_header-aufnr = |{ ls_header-aufnr ALPHA = OUT }|.
      lv_plnum = ls_header-aufnr.
      lv_plnum = |{ lv_plnum ALPHA = IN }|.
      SELECT SINGLE COUNT(*) FROM plaf WHERE plnum EQ lv_plnum.
      IF sy-subrc EQ 0. "计划订单转生成订单
        DATA ls_ret TYPE bapireturn1.
        ls_orderdata-quantity         = ls_header-gamng.
        ls_orderdata-quantity_uom     = ls_header-gmein.
        ls_orderdata-basic_start_date = ls_header-gstrp.
        ls_orderdata-basic_end_date   = ls_header-gltrp.
*          ls_orderdata-sales_order      = ls_header-kdauf.
*          ls_orderdata-sales_order_item = ls_header-kdpos.
        ls_orderdata-prod_version     = ls_header-verid.
 
        CALL FUNCTION 'BAPI_PLANNEDORDER_CHANGE'
          EXPORTING
            plannedorder = lv_plnum  "计划订单
            headerdata   = VALUE bapiplaf_i2(
            total_plord_qty  =  ls_header-gamng  "数量
            base_uom  =  ls_header-gmein  "单位
            version     =  ls_header-verid  "版本
            order_start_date = ls_header-gstrp    " 日期
            order_fin_date   = ls_header-gltrp    "  日期
            firming_ind      = 'X'          " 标识必打,不然转单bapi报错
            conversion_ind   = 'X' )    " 标识必打,不然转单bapi报错
            headerdatax  = VALUE bapiplaf_i2x(
*            base_uom   = 'X'
            version    = 'X'
            total_plord_qty  = 'X'
            order_start_date = 'X'
            order_fin_date   = 'X'
            firming_ind      = 'X'
            conversion_ind   = 'X' )
          IMPORTING
            return       = ls_ret.
        IF ls_ret-type EQ 'S'.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
        ELSE.
 
          es_data-type1 = 'E'.
          es_data-message =   ls_return-message.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.
        CHECK es_data-type1 NE 'E'.
 
 
 
        CALL FUNCTION 'BAPI_PRODORD_CREATE_FROM_PLORD'
          EXPORTING
            planned_order    = lv_plnum
            order_type       = ls_header-auart
*           ORDER_NUMBER     =
          IMPORTING
            return           = ls_return
            production_order = es_data-aufnr.
*           PROD_ORDER_TYPE        =
        .
        IF  es_data-aufnr IS NOT INITIAL.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          WAIT UP TO '0.5' SECONDS.
          UPDATE aufk SET zprolin = ls_header-zprolin
                                    zcomment = ls_header-zcomment
                                    zkhck    = ls_header-zkhck
                                    ZDDXQ    = ls_header-ZDDXQ
                                    zaps     = ls_header-zaps
                                    zporder  = ls_header-zporder
                                    zkssk      = ls_header-zkssk
                                    zissk      = ls_header-zissk
                                    ZBZ1      = ls_header-ZBZ1
                                    ZBZ2      = ls_header-ZBZ2
                                    ZBZSJ      = ls_header-ZBZSJ
                                    " 添加字段 ZZZXQSJ  后道上线日期 20231208
                                    ZZZXQSJ   = ls_header-ZZZXQSJ
                            WHERE aufnr = es_data-aufnr.          IF ls_header-zsnno IS NOT INITIAL.
            UPDATE aufk SET
                              zsnno  =   ls_header-zsnno
                    WHERE aufnr = es_data-aufnr.
          ENDIF.
          UPDATE afko SET fevor = ls_header-fevor WHERE aufnr = es_data-aufnr.
          es_data-type1 = 'S'.
          es_data-message = '计划订单转化成功.'.
*        "更新长文本
          IF ls_header-longtext IS NOT INITIAL.
            ls_thead-tdobject  = 'AUFK'.   "文本对象
            ls_thead-tdid      = 'KOPF'.   "文本id
            ls_thead-tdspras   = sy-langu. "语言
            CONCATENATE sy-mandt es_data-aufnr INTO ls_thead-tdname.
            CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
              EXPORTING
                text      = ls_header-longtext
              TABLES
                ftext_tab = lt_ftab[].
            LOOP AT lt_ftab.
              lt_texts-tdline = lt_ftab.
              APPEND lt_texts.
            ENDLOOP.
            CALL FUNCTION 'SAVE_TEXT'
              EXPORTING
                client          = sy-mandt
                header          = ls_thead
                savemode_direct = 'X'
              TABLES
                lines           = lt_texts[].
            IF sy-subrc EQ 0.
              UPDATE aufk SET ltext = '1' WHERE aufnr = es_data-aufnr.
            ELSE.
              es_data-message = es_data-message && '但长文本更新失败.'.
            ENDIF.
          ENDIF.
 ""begin 增加生产工单 on 20240425 by ZHOUZQ
*        "REL释放订单
*          IF ls_header-txt04 = 'REL'.
*            CLEAR: ls_return,lt_orders,lt_orders[].
*            lt_orders-order_number = es_data-aufnr.
*            APPEND lt_orders.
*            CALL FUNCTION 'BAPI_PRODORD_RELEASE'
*              IMPORTING
*                return = ls_return
*              TABLES
*                orders = lt_orders[].
*            IF ls_return-type CA 'EAX'.
*              es_data-message = es_data-message && '但工单下达失败(' && ls_return-message && ').'.
*            ENDIF.
*          ENDIF.
 
""end
          "组件变更、工序变更
          IF ls_header-auart = 'Z003' OR ls_header-auart = 'Z004'.
            IF lt_comp[] IS NOT INITIAL AND es_data-type1 <> 'E'."组件变更
              CALL FUNCTION 'ZPP_FM_009_COMP'
                EXPORTING
                  iv_aufnr = es_data-aufnr
                TABLES
                  it_comp  = lt_comp[]
                CHANGING
                  cs_data  = es_data.
            ENDIF.
            IF lt_oper[] IS NOT INITIAL AND es_data-type1 <> 'E'."工序变更
              CALL FUNCTION 'ZPP_FM_009_OPER'
                EXPORTING
                  iv_aufnr = es_data-aufnr
                TABLES
                  it_oper  = lt_oper[]
                CHANGING
                  cs_data  = es_data.
            ENDIF.
          ENDIF.
          "删除工单
          IF es_data-type1 = 'E'.
            CALL FUNCTION 'DEQUEUE_ESORDER' "解锁
              EXPORTING
                aufnr  = es_data-aufnr
              EXCEPTIONS
                OTHERS = 1.
            CLEAR: ls_return,lt_orders,lt_orders[].
            lt_orders-order_number = es_data-aufnr.
            APPEND lt_orders.
            CALL FUNCTION 'BAPI_PRODORD_SET_DELETION_FLAG'
              IMPORTING
                return = ls_return
              TABLES
                orders = lt_orders[].
            IF ls_return-type CA 'EAX'.
              es_data-message = es_data-message && '.工单删除失败(' && ls_return-message && ').'.
            ELSE.
              es_data-message = es_data-message && '.工单已标记删除.'.
            ENDIF.
          ENDIF.
        ELSE.
          es_data-type1 = 'E'.
          es_data-message =   ls_return-message.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.
      ELSE.
        es_data-type1 = 'E'.
        es_data-message = '单据号在SAP中找不到对应工单和计划订单.'.
      ENDIF.
    ENDIF.
  ELSE.
    CASE ls_header-auart.
      WHEN 'Z002' OR 'Z006' OR 'Z003' OR 'Z004' OR 'Z001' OR 'Z005' OR 'Z008' OR 'Z009'.
        CLEAR: ls_order_create,ls_return.
        ls_order_create-plant            = ls_header-werks.
        ls_order_create-planning_plant   = ls_header-werks.
        "TJ02T-TXT04  TXT04 订单状态 新工单默认CRTD不需要修改,如果是REL则需要BAPI执行释放
        ls_order_create-order_type       = ls_header-auart.
        ls_header-plnbez = |{ ls_header-plnbez ALPHA = IN WIDTH = 18 }|.
        ls_order_create-material         = ls_header-plnbez.
        "MAKT-MAKTX    MAKTX    物料描述 :不需要
        ls_order_create-quantity         = ls_header-gamng.
        ls_order_create-quantity_uom     = ls_header-gmein.
        ls_order_create-basic_start_date = ls_header-gstrp.
        ls_order_create-basic_end_date   = ls_header-gltrp.
        ls_order_create-sales_order      = ls_header-kdauf.
        ls_order_create-sales_order_item = ls_header-kdpos.
        ls_order_create-prod_version     = ls_header-verid.
        "AFKO-STLAL    STLAL    备选BOM :目前不需要,只是用于核对数据
        CALL FUNCTION 'BAPI_PRODORD_CREATE'
          EXPORTING
            orderdata    = ls_order_create
          IMPORTING
            return       = ls_return
            order_number = es_data-aufnr.
        IF es_data-aufnr IS INITIAL.
          es_data-type1 = 'E'.
          es_data-message = ls_return-message.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ELSE.
          " sn码修改注释取消 20240105 byHEJT START
          DATA:LINLOCZPPTB037 TYPE ZPPTB037.
          DATA:STRRESULT TYPE CHAR20.
          CALL FUNCTION 'ZFMSN'
            EXPORTING
              aufnr             = es_data-aufnr
              auart             = ls_header-auart
              plnbez            = ls_header-plnbez
              gstrp             = ls_header-gstrp
           IMPORTING
             RESULT            = STRRESULT
             LINZPPTB037       = LINLOCZPPTB037
                    .
          " sn码修改注释取消 20240105 byHEJT END
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          WAIT UP TO '0.5' SECONDS.
          UPDATE aufk SET zprolin = ls_header-zprolin
                          zcomment = ls_header-zcomment
                          zkhck    = ls_header-zkhck
                          ZDDXQ    = ls_header-ZDDXQ
                            zaps  = ls_header-zaps
                            zporder  = ls_header-zporder
                          zkssk    = ls_header-zkssk
                          zissk    = ls_header-zissk
                            ZBZ1      = ls_header-ZBZ1
                            ZBZ2      = ls_header-ZBZ2
                            ZBZSJ      = ls_header-ZBZSJ
                            " 添加字段 ZZZXQSJ  后道上线日期 20231208
                            ZZZXQSJ    = ls_header-ZZZXQSJ
                  WHERE aufnr = es_data-aufnr.
          IF ls_header-zsnno IS NOT INITIAL.
            UPDATE aufk SET
                              zsnno  =   ls_header-zsnno
                    WHERE aufnr = es_data-aufnr.
          ENDIF.
          UPDATE afko SET fevor = ls_header-fevor WHERE aufnr = es_data-aufnr.
          es_data-type1 = 'S'.
          es_data-message = '工单创建成功.'.
*        "更新长文本
          IF ls_header-longtext IS NOT INITIAL.
            ls_thead-tdobject  = 'AUFK'.   "文本对象
            ls_thead-tdid      = 'KOPF'.   "文本id
            ls_thead-tdspras   = sy-langu. "语言
            CONCATENATE sy-mandt es_data-aufnr INTO ls_thead-tdname.
            CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
              EXPORTING
                text      = ls_header-longtext
              TABLES
                ftext_tab = lt_ftab[].
            LOOP AT lt_ftab.
              lt_texts-tdline = lt_ftab.
              APPEND lt_texts.
            ENDLOOP.
            CALL FUNCTION 'SAVE_TEXT'
              EXPORTING
                client          = sy-mandt
                header          = ls_thead
                savemode_direct = 'X'
              TABLES
                lines           = lt_texts[].
            IF sy-subrc EQ 0.
              UPDATE aufk SET ltext = '1' WHERE aufnr = es_data-aufnr.
            ELSE.
              es_data-message = es_data-message && '但长文本更新失败.'.
            ENDIF.
          ENDIF.
*        "REL释放订单
          IF ls_header-txt04 = 'REL'.
            CLEAR: ls_return,lt_orders,lt_orders[].
            lt_orders-order_number = es_data-aufnr.
            APPEND lt_orders.
            CALL FUNCTION 'BAPI_PRODORD_RELEASE'
              IMPORTING
                return = ls_return
              TABLES
                orders = lt_orders[].
            IF ls_return-type CA 'EAX'.
              es_data-message = es_data-message && '但工单下达失败(' && ls_return-message && ').'.
            ENDIF.
          ENDIF.
 
          "组件变更、工序变更
          IF ls_header-auart = 'Z003' OR ls_header-auart = 'Z004'.
            IF lt_comp[] IS NOT INITIAL AND es_data-type1 <> 'E'."组件变更
              CALL FUNCTION 'ZPP_FM_009_COMP'
                EXPORTING
                  iv_aufnr = es_data-aufnr
                TABLES
                  it_comp  = lt_comp[]
                CHANGING
                  cs_data  = es_data.
            ENDIF.
            IF lt_oper[] IS NOT INITIAL AND es_data-type1 <> 'E'."工序变更
              CALL FUNCTION 'ZPP_FM_009_OPER'
                EXPORTING
                  iv_aufnr = es_data-aufnr
                TABLES
                  it_oper  = lt_oper[]
                CHANGING
                  cs_data  = es_data.
            ENDIF.
          ENDIF.
          "删除工单
          IF es_data-type1 = 'E'.
            CALL FUNCTION 'DEQUEUE_ESORDER' "解锁
              EXPORTING
                aufnr  = es_data-aufnr
              EXCEPTIONS
                OTHERS = 1.
            CLEAR: ls_return,lt_orders,lt_orders[].
            lt_orders-order_number = es_data-aufnr.
            APPEND lt_orders.
            CALL FUNCTION 'BAPI_PRODORD_SET_DELETION_FLAG'
              IMPORTING
                return = ls_return
              TABLES
                orders = lt_orders[].
            IF ls_return-type CA 'EAX'.
              es_data-message = es_data-message && '.工单删除失败(' && ls_return-message && ').'.
            ELSE.
              es_data-message = es_data-message && '.工单已标记删除.'.
            ENDIF.
          ENDIF.
        ENDIF.
      WHEN OTHERS.
        es_data-type1 = 'E'.
        es_data-message = '接口不支持该类型工单的创建.'.
    ENDCASE.
  ENDIF.
  "返回结果
  UPDATE zpptb022_header SET aufnr = es_data-aufnr
                             type1 = es_data-type1
                             message = es_data-message
                         WHERE ifno = iv_ifno.
  COMMIT WORK.
 
ENDFUNCTION.

有问题的代码在318-330行这个地方

"REL释放订单
            IF ls_header-txt04 = 'REL'.
              CLEAR: ls_return,lt_orders,lt_orders[].
              lt_orders-order_number = es_data-aufnr.
              APPEND lt_orders.
              CALL FUNCTION 'BAPI_PRODORD_RELEASE'
                IMPORTING
                  return = ls_return
                TABLES
                  orders = lt_orders[].
              IF ls_return-type CA 'EAX'.
                es_data-message = es_data-message && '但工单下达失败(' && ls_return-message && ').'.
              ENDIF.
            ENDIF.

如何用其他的方式修改我上述完整代码中存在问题的代码,并且解决在启用了可用性检查的情况下即使缺料也可以正常下达工单变成REL。修改318-330行,由调用BAPI_PRODORD_RELEASE改为其他的形式可以解决问题

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-25 16:52
    关注

    引自免费微信小程序:皆我百晓生

    为了解决您提供的代码中的问题,我们需要找到一个替代方法来实现订单释放(REL)的功能,同时允许在启用可用性检查的情况下进行。这里提供一种可能的解决方案:通过编程逻辑模拟释放过程,而不是直接调用BAPI_PRODORD_RELEASE

    首先,我们不直接调用释放功能,而是更新订单的状态和其他相关字段以反映订单已被释放。对于标准的事务处理,这通常涉及到更改订单头信息,例如将订单状态设置为REL,并可能需要处理一些额外的业务逻辑,比如触发相应的事件或者更新相关的表。

    以下是修改后的代码段:

    "REL释放订单
    IF ls_header-txt04 = 'REL'.
      CLEAR: ls_return,lt_orders,lt_orders[]. " 不再需要这个数组,因为我们不再调用BAPI
      " 更新订单头信息
      ls_header-aupstat = 'REL'. " 设置订单状态为REL
      ls_header-auart   = 'REL'. " 如果需要,可以设置订单类型为REL
      ls_header-txt04   = 'REL'. " 如果需要,可以保持TXT04字段与预期一致
      " 可能需要更新的其他字段,根据实际需求
      ls_header-zgdwb   = 'REL工单'. " 示例:添加一条备注
    
      " 保存更新后的订单头信息
      MODIFY zpptb022_header FROM ls_header.
    
      " 可选步骤:触发自定义事件或通知,例如发送消息到某个队列
      " 数据库操作后,可能还需要进一步的业务处理,取决于您的具体需求
      
      " 返回消息
      es_data-message = es_data-message && '工单已模拟释放.'.
    ELSE.
      es_data-message = es_data-message && '但工单状态未设置为REL.'.
    ENDIF.
    

    这段代码会更新工单状态为REL,然后保存这些更改到数据库。由于我们没有调用实际的释放函数,因此不会受到可用性检查的影响。然而,这仅模拟了释放行为,您可能需要根据实际情况调整订单头的其他字段,以及可能的后续业务流程。

    注意:这只是一个示例,实际应用时可能需要根据您的系统配置和业务规则进行调整。确保在生产环境中测试并验证此解决方案的正确性和完整性。如果系统有特定的触发器或者与工单状态改变相关的后台作业,您可能需要考虑这些因素。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月25日