Skip to content

工艺路线

示例代码
*----------------------------------------------------------------------*
***INCLUDE LZGRP_PP_021D01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&       Class lcl_bapi_proxy
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_routing_create_proxy DEFINITION.
  PUBLIC SECTION.
    METHODS:
      "! 初始化参数
      init,
      "! 按接口参数类型填充数据
      "! @parameter head |
      "! @parameter items |
      fill_data_by_type1
        IMPORTING
          head  TYPE zspp_0029_head
          items TYPE zttpp_0029_item,
      "! 测试运行
      "! @parameter result |
      testrun
        RETURNING
          VALUE(result) TYPE xflag,
      "! 创建工艺路线
      execute,
      "! 获取检查/创建/其他处理消息
      "! @parameter type |
      "! @parameter message |
      get_message
        EXPORTING
          type    TYPE bapi_mtype
          message TYPE bapi_msg,
      "! 使用BAPI_ROUTING_EXISTENCE_CHECK检查工艺路线是否存在
      "! @parameter group |
      "! @parameter groupcounter |
      "! @parameter validfrom |
      "! @parameter validtodate |
      "! @parameter result |
      check_exists
        IMPORTING
          group         TYPE bapi1012_tsk_c-task_list_group
          groupcounter  TYPE bapi1012_tsk_c-group_counter
          validfrom     TYPE bapi1012_tsk_c-valid_from
          validtodate   TYPE bapi1012_tsk_c-valid_to_date OPTIONAL
        RETURNING
          VALUE(result) TYPE xflag,
      "! 根据工厂/物料/产线检查工艺路线是否存在
      "! @parameter werks |
      "! @parameter matnr |
      "! @parameter plnnr_alt |
      "! @parameter result |
      check_exist_by_mapl
        IMPORTING
          werks         TYPE werks_d
          matnr         TYPE matnr
          plnnr_alt     TYPE cp_plnnr_a
        RETURNING
          VALUE(result) TYPE xflag,
      "! 重复物料与工厂的工艺路线下最新的计数
      "! @parameter matnr |
      "! @parameter werks |
      "! @parameter countor |
      next_counter
        IMPORTING
          werks   TYPE werks_d
          matnr   TYPE matnr
        EXPORTING
          group   TYPE bapi1012_tsk_c-task_list_group
          counter TYPE bapi1012_tsk_c-group_counter.

  PRIVATE SECTION.
    DATA ms_group TYPE bapi1012_tsk_c.
    DATA mt_task TYPE STANDARD TABLE OF bapi1012_tsk_c WITH EMPTY KEY.
    DATA mt_mat_task TYPE STANDARD TABLE OF bapi1012_mtk_c WITH EMPTY KEY.
    DATA mt_operation TYPE STANDARD TABLE OF bapi1012_opr_c WITH EMPTY KEY.
    DATA mt_return TYPE STANDARD TABLE OF bapiret2 WITH EMPTY KEY.
ENDCLASS.               "lcl_bapi_proxy
*&---------------------------------------------------------------------*
*&       Class lcl_bapi_proxy
*&---------------------------------------------------------------------*
CLASS lcl_routing_create_proxy IMPLEMENTATION.
  " 测试运行
  METHOD testrun.
    DATA l_testrun TYPE bapiflag.
    l_testrun-bapiflag = 'X'.
    CALL FUNCTION 'BAPI_ROUTING_CREATE'
      EXPORTING
        testrun                = l_testrun
      IMPORTING
        group                  = ms_group-task_list_group
        groupcounter           = ms_group-group_counter
      TABLES
        task                   = mt_task
        materialtaskallocation = mt_mat_task
        operation              = mt_operation
        return                 = mt_return.
    READ TABLE mt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      RETURN.
    ENDIF.
    result = 'X'.
  ENDMETHOD.

  " 运行
  METHOD execute.
    " 创建工艺路线
    CLEAR mt_return.
    CALL FUNCTION 'BAPI_ROUTING_CREATE'
      IMPORTING
        group                  = ms_group-task_list_group
        groupcounter           = ms_group-group_counter
      TABLES
        task                   = mt_task
        materialtaskallocation = mt_mat_task
        operation              = mt_operation
        return                 = mt_return.
    READ TABLE mt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      RETURN.
    ENDIF.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDMETHOD.

  " 获取消息
  METHOD get_message.
    READ TABLE mt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      type = 'E'.
      LOOP AT mt_return REFERENCE INTO DATA(lr_return).
        MESSAGE ID lr_return->id TYPE lr_return->type
        NUMBER lr_return->number
        WITH lr_return->message_v1 lr_return->message_v2
             lr_return->message_v3 lr_return->message_v4
        INTO DATA(l_message).
        message = |{ message }{ l_message };|.
      ENDLOOP.
    ELSE.
      type = 'S'.
      message = |工艺路线被保存于组{ ms_group-task_list_group }|.
    ENDIF.
  ENDMETHOD.

  " 根据接口参数填充数据
  METHOD fill_data_by_type1.
    " 抬头
    APPEND INITIAL LINE TO mt_task REFERENCE INTO DATA(lr_task).
    lr_task->plant = head-werks. " 工厂
    " 对于重复物料和工厂,不是新建一条工艺路线,而是在原有组下新增计数
    next_counter( EXPORTING matnr = head-matnr
                            werks = head-werks
                  IMPORTING group = lr_task->task_list_group
                            counter = lr_task->group_counter ).
    lr_task->old_number_of_task_list = head-plnnr_alt. " 产线
    lr_task->description = head-ktext. " 工艺路线描述
    lr_task->task_list_usage = '1'. " 用途,默认值
    lr_task->task_list_status = '4'. " 状态,默认值
    lr_task->task_measure_unit = 'PCS'.
    lr_task->task_measure_unit_iso = 'PCS'.
    lr_task->lot_size_from = head-losvn. " 批量下限
    lr_task->lot_size_to = head-losbs. " 批量上限
    lr_task->valid_from = head-datuv. " 有效起始日期
    lr_task->valid_to_date = '99991231'. " 有效结束日期
    " 物料指派
    APPEND INITIAL LINE TO mt_mat_task REFERENCE INTO DATA(lr_mat_task).
    lr_mat_task->material = head-matnr. " 成品编码
    lr_mat_task->plant = head-werks. " 工厂
    lr_mat_task->valid_from = head-datuv. " 有效起始日期
    lr_mat_task->valid_to_date = '99991231'. " 有效结束日期

    " 工序
    LOOP AT items REFERENCE INTO DATA(lr_item).
      APPEND INITIAL LINE TO mt_operation REFERENCE INTO DATA(lr_operation).
      lr_operation->activity = lr_item->vornr. " 工序编号
      lr_operation->description = lr_item->ltxa1. " 工序短文本
      lr_operation->standard_text_key = lr_item->vlsch. " 标准文本码
      lr_operation->plant = head-werks.
      lr_operation->work_cntr = lr_item->arbpl. " 工作中心
      lr_operation->control_key = lr_item->steus. " 控制码
      lr_operation->base_quantity = lr_item->bmsch. " 工序基本数量
      lr_operation->valid_from = head-datuv. " 有效起始日期
      lr_operation->valid_to_date = '99991231'. " 有效结束日期
      lr_operation->denominator = '1'.
      lr_operation->nominator = '1'.

      " 计量单位
      lr_operation->operation_measure_unit = lr_item->meinh.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          input  = lr_operation->operation_measure_unit
        IMPORTING
          output = lr_operation->operation_measure_unit.

      " 计量单位
      lr_operation->operation_measure_unit_iso = lr_item->meinh.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          input  = lr_operation->operation_measure_unit_iso
        IMPORTING
          output = lr_operation->operation_measure_unit_iso.

      lr_operation->no_of_employee = lr_item->anzma. " 雇员数量
      lr_operation->valid_from = head-datuv. " 有效起始日期
      lr_operation->valid_to_date = '99991231'. " 有效结束日期

      " 重复代码
      DEFINE _set_acti.
        lr_operation->std_unit_0&1 = lr_item->vge0&1.
        lr_operation->std_unit_0&1_iso = lr_item->vge0&1.
        lr_operation->std_value_0&1 = lr_item->vgw0&1.
      END-OF-DEFINITION.
      _set_acti 1. " 折旧摊销
      _set_acti 2. " 直接人工
      _set_acti 3. " 间接人工
      _set_acti 4. " 动力费
      _set_acti 5. " 生产耗材
      _set_acti 6. " 维修保养
    ENDLOOP.
  ENDMETHOD.

  " 初始化参数
  METHOD init.
    CLEAR ms_group.
    CLEAR mt_task.
    CLEAR mt_mat_task.
    CLEAR mt_operation.
    CLEAR mt_return.
  ENDMETHOD.

  " 检查工序是否已经存在
  METHOD check_exists.
    DATA lt_return TYPE STANDARD TABLE OF bapiret2.
    CALL FUNCTION 'BAPI_ROUTING_EXISTENCE_CHECK'
      EXPORTING
        group        = group
        groupcounter = groupcounter
        validfrom    = validfrom
        validtodate  = validtodate
      TABLES
        return       = lt_return.
    READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      result = 'X'.
    ENDIF.
  ENDMETHOD.

  " 检查工艺路线是否存在
  METHOD check_exist_by_mapl.
    DATA l_plnnr_alt TYPE plko-plnnr_alt.
    SELECT SINGLE plnnr_alt INTO @l_plnnr_alt
    FROM mapl
    LEFT JOIN plko ON plko~plnty = mapl~plnty
                  AND plko~plnnr = mapl~plnnr
                  AND plko~plnal = mapl~plnal
                  AND plko~zaehl = mapl~zaehl
    WHERE mapl~werks = @werks
      AND mapl~matnr = @matnr
      AND plko~plnnr_alt = @plnnr_alt.
    IF sy-subrc = 0.
      result = 'X'.
    ENDIF.
  ENDMETHOD.

  " 重复物料与工厂下最新的计数
  METHOD next_counter.
    SELECT SINGLE plnnr
      INTO @group
      FROM mapl
      WHERE matnr = @matnr
        AND werks = @werks
        AND plnty = 'N'.
    IF sy-subrc = 0.
      SELECT SINGLE MAX( plnal ) INTO @counter
        FROM plko
        WHERE plko~plnty = 'N'
          AND plko~plnnr = @group.
      counter = counter + 1.
    ENDIF.
  ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*&       Class lcl_routing_change_proxy
*&---------------------------------------------------------------------*
CLASS lcl_routing_change_proxy DEFINITION.
  PUBLIC SECTION.
    METHODS:
      init,
      fill_data_by_type1
        IMPORTING
          head  TYPE zspp_0029_head
          items TYPE zttpp_0029_item,
      execute,
      get_message
        EXPORTING
          type    TYPE bapi_mtype
          message TYPE bapi_msg.

  PRIVATE SECTION.
    DATA ms_maint_hdr TYPE cps_task_list_maint_hdr.
    DATA ms_task TYPE cps_task_list_maint_tsk.
    DATA ms_taskx TYPE cps_task_list_maint_tsk_x.
    DATA mt_mat_task TYPE STANDARD TABLE OF cps_task_list_maint_mtk.
    DATA mt_mat_taskx TYPE STANDARD TABLE OF cps_task_list_maint_mtk_x.
    DATA mt_operation TYPE STANDARD TABLE OF cps_task_list_maint_opr.
    DATA mt_operationx TYPE STANDARD TABLE OF cps_task_list_maint_opr_x.
    DATA mt_return TYPE bapiret2_t.

ENDCLASS.               "lcl_bapi_proxy
*&---------------------------------------------------------------------*
*&       Class lcl_routing_change_proxy
*&---------------------------------------------------------------------*
CLASS lcl_routing_change_proxy IMPLEMENTATION.
  " 运行
  METHOD execute.
    " 修改工艺路线
    CALL FUNCTION 'CPCC_S_TASK_LIST_MAINTAIN'
      EXPORTING
        change_no          = ms_maint_hdr-change_no
        key_date           = ms_maint_hdr-key_date
        task_list_type     = ms_maint_hdr-task_list_type
        task_list_group    = ms_maint_hdr-task_list_group
        group_counter      = ms_maint_hdr-group_counter
        material           = ms_maint_hdr-material
        plant              = ms_maint_hdr-plant
        task_maintain_mode = 'M'
        task               = ms_task
        task_x             = ms_taskx
      TABLES
        operations         = mt_operation
        operations_x       = mt_operationx
        return             = mt_return.
    READ TABLE mt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      RETURN.
    ENDIF.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDMETHOD.

  " 获取消息
  METHOD get_message.
    READ TABLE mt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      type = 'E'.
      LOOP AT mt_return REFERENCE INTO DATA(lr_return).
        MESSAGE ID lr_return->id TYPE lr_return->type
        NUMBER lr_return->number
        WITH lr_return->message_v1 lr_return->message_v2
             lr_return->message_v3 lr_return->message_v4
        INTO DATA(l_message).
        message = |{ message }{ l_message };|.
      ENDLOOP.
    ELSE.
      type = 'S'.
      message = '修改工艺路线成功'.
    ENDIF.
  ENDMETHOD.

  " 根据接口参数填充数据
  METHOD fill_data_by_type1.
    " 用于查询工艺路线,以确定工艺路线行项目是修改还是新增
    DATA lt_query_input TYPE zttpp_0027_input.
    DATA lt_query_output TYPE zttpp_0027_output.
    APPEND VALUE #(
      zsqlx = '修改'
      werks = head-werks
      matnr = head-matnr
      plnnr_alt = head-plnnr_alt
    ) TO lt_query_input.
    " 工艺路线查询
    CALL FUNCTION 'ZPP_OA_ROUTING_QUERY_ESB'
      EXPORTING
        it_input  = lt_query_input
      IMPORTING
        et_output = lt_query_output.
    SORT lt_query_output BY vornr.

    " 抬头
    ms_maint_hdr-key_date = sy-datum.
    ms_maint_hdr-task_list_type = 'N'.
    ms_maint_hdr-task_list_group = head-plnnr. " 工艺路线组
    ms_maint_hdr-group_counter = head-plnal. " 组计数器
    ms_maint_hdr-material = head-matnr. " 物料
    ms_maint_hdr-plant = head-werks. " 工厂

    DEFINE _set_task_field.
      ms_task-&1 = &2.
      ms_taskx-&1 = 'X'.
    END-OF-DEFINITION.
    _set_task_field plant head-werks. " 工厂
    _set_task_field old_number_of_task_list head-plnnr_alt. " 产线
    _set_task_field description head-ktext. " 工艺路线描述
    _set_task_field task_list_usage '1'. " 用途,默认值
    _set_task_field task_list_status '4'. " 状态,默认值
    _set_task_field lot_size_from head-losvn. " 批量下限
    _set_task_field lot_size_to head-losbs. " 产线批量上限
    _set_task_field task_measure_unit 'PCS'. " 单位

    LOOP AT items REFERENCE INTO DATA(lr_item).
      " 工序
      APPEND INITIAL LINE TO mt_operation REFERENCE INTO DATA(lr_operation).
      APPEND INITIAL LINE TO mt_operationx REFERENCE INTO DATA(lr_operationx).

      " 检查工序是否存在,存在修改,不存在新增
      READ TABLE lt_query_output REFERENCE INTO DATA(lr_query_output)
      WITH KEY vornr = lr_item->vornr BINARY SEARCH.
      IF sy-subrc = 0.
        lr_operation->maintain_mode = 'M'.
      ELSE.
        lr_operation->maintain_mode = 'C'.
      ENDIF.
      " 工序编号
      lr_operation->activity = lr_item->vornr.
      lr_operationx->activity = 'X'.
      lr_operation->activity_old  = lr_item->vornr.
      lr_operation->flag_bar_pointer = '1'.

      DEFINE _set_operation_filed.
        lr_operation->&1 = &2.
        lr_operationx->&1 = 'X'.
      END-OF-DEFINITION.
      _set_operation_filed plant head-werks. " 工厂
      _set_operation_filed description lr_item->ltxa1. " 工序短文本
      _set_operation_filed standard_text_key lr_item->vlsch. " 标准文本码
      _set_operation_filed work_cntr lr_item->arbpl. " 工作中心
      _set_operation_filed control_key lr_item->steus. " 控制码
      _set_operation_filed base_quantity lr_item->bmsch. " 工序基本数量
      _set_operation_filed operation_measure_unit lr_item->meinh. " 计量单位
      _set_operation_filed no_of_employee lr_item->anzma. " 雇员数量
      _set_operation_filed denominator '1'.
      _set_operation_filed nominator '1'.

      " 重复代码
      DEFINE _set_acti.
        _set_operation_filed std_unit_0&1 lr_item->vge0&1.
*        _set_operation_filed std_unit_0&1_iso lr_item->vge0&1.
        _set_operation_filed std_value_0&1 lr_item->vgw0&1.
      END-OF-DEFINITION.
      _set_acti 1. " 折旧摊销
      _set_acti 2. " 直接人工
      _set_acti 3. " 间接人工
      _set_acti 4. " 动力费
      _set_acti 5. " 生产耗材
      _set_acti 6. " 维修保养
    ENDLOOP.
  ENDMETHOD.

  " 初始化参数
  METHOD init.
    CLEAR ms_maint_hdr.
    CLEAR ms_task.
    CLEAR ms_taskx.
    CLEAR mt_mat_task.
    CLEAR mt_mat_taskx.
    CLEAR mt_operation.
    CLEAR mt_operationx.
    CLEAR mt_return.
  ENDMETHOD.
ENDCLASS.