Skip to content

计划独立需求(PIR)

PIR删除

示例代码
*&---------------------------------------------------------------------*
*&      Form  FRM_PIR_DELETE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_<FS_HEAD>_MATNR  text
*      -->P_P_WERKS  text
*      -->P_P_VERSB  text
*----------------------------------------------------------------------*
FORM frm_pir_delete USING p_matnr TYPE pbim-matnr
                          p_werks TYPE pbim-werks
                          p_versb TYPE pbim-versb.

  DATA lt_bdcdata TYPE STANDARD TABLE OF bdcdata WITH EMPTY KEY.
  DATA ls_bdcdata TYPE bdcdata .

  DEFINE _bdc_dynpro.
    CLEAR ls_bdcdata.
    ls_bdcdata-program = &1.
    ls_bdcdata-dynpro = &2.
    ls_bdcdata-dynbegin = 'X'.
    INSERT ls_bdcdata INTO TABLE lt_bdcdata.
  END-OF-DEFINITION.

  DEFINE _bdc_field.
    CLEAR ls_bdcdata.
    ls_bdcdata-fnam = &1.
    ls_bdcdata-fval = &2.
    INSERT ls_bdcdata INTO TABLE lt_bdcdata.
  END-OF-DEFINITION.

  " MD62筛选页面
  _bdc_dynpro 'SAPMM60X' '0106'.
  _bdc_field:
    'BDC_OKCODE' '/00',
    'AM60X-MATAW' 'X',
    'AM60X-MATNR' p_matnr,
    'AM60X-PRGRP' '',
    'AM60X-PBDNR' '',
    'RM60X-BEDAE' '',
    'AM60X-WERKS' p_werks,
    'AM60X-VERAW' 'X',
    'RM60X-VERSB' p_versb.

  " 全选
  _bdc_dynpro 'SAPLM60E' '0200'.
  _bdc_field:
    'BDC_OKCODE' '=ALMK'.

  " 点击删除按钮
  _bdc_dynpro 'SAPLM60E' '0200'.
  _bdc_field:
    'BDC_OKCODE' '=POLO'.

  " 点击确认
  _bdc_dynpro 'SAPLSPO1' '0500'.
  _bdc_field:
    'BDC_OKCODE' '=OPT1'.

  " 保存
  _bdc_dynpro 'SAPLM60E' '0200'.
  _bdc_field:
    'BDC_OKCODE' '=SICH'.

  DATA ls_option TYPE ctu_params.
  ls_option-dismode = 'N'. " 后台
  ls_option-updmode = 'L'. " 本地
  ls_option-nobinpt = 'X'. " 有弹窗,需要启用这个标识

  DATA lt_message TYPE STANDARD TABLE OF bdcmsgcoll WITH EMPTY KEY.

  CALL TRANSACTION 'MD62' USING lt_bdcdata
        OPTIONS FROM ls_option
        MESSAGES INTO lt_message.
  " 不管如何,BDC都回滚不了,直接提交了事
  COMMIT WORK AND WAIT.
ENDFORM.                    " FRM_PIR_DELETE

PIR维护

示例代码
FORM frm_import_pir .
  " 导入数据校验
  FIELD-SYMBOLS <fs_data_tab> TYPE STANDARD TABLE.
  ASSIGN gr_data_tab->* TO <fs_data_tab>.
  CHECK <fs_data_tab> IS NOT INITIAL.

  " 版本下全部计划独立需求
  TYPES:
    BEGIN OF ty_pbim,
      matnr TYPE pbim-matnr,
      werks TYPE pbim-werks,
      bedae TYPE pbim-bedae,
      versb TYPE pbim-versb,
      pbdnr TYPE pbim-pbdnr,
      vervs TYPE pbim-vervs,
      loevr TYPE pbim-loevr,
    END OF ty_pbim.
  TYPES tt_pbim TYPE STANDARD TABLE OF ty_pbim WITH EMPTY KEY.
  DATA lt_pbim TYPE tt_pbim.

  " 估计是指代物料?
  DATA l_bedae TYPE pbim-bedae VALUE 'VSF'.
  DATA l_pbdnr TYPE pbim-pbdnr VALUE ''.
  DATA l_vervs TYPE pbim-vervs VALUE 'X'.

  " 查询版本下,所有预测数据
  SELECT matnr werks bedae versb pbdnr vervs loevr
    FROM pbim
    INTO TABLE lt_pbim
    WHERE werks = p_werks
      AND bedae = l_bedae
      AND versb = p_versb
      AND pbdnr = l_pbdnr.
  SORT lt_pbim BY matnr werks bedae versb pbdnr.

  " 创建/修改
  DATA ls_pir_item TYPE bapisitemr.
  DATA lt_pir_schedule_in TYPE TABLE OF bapisshdin.
  DATA lt_return TYPE TABLE OF bapireturn1.
  " 整体的一个状态
  DATA l_err TYPE xflag.

  " 逐行执行
  LOOP AT <fs_data_tab> ASSIGNING <fs_data>.
    ASSIGN COMPONENT gc_suffix-head OF STRUCTURE <fs_data> TO <fs_head>.
    ASSIGN COMPONENT gc_suffix-forecast OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fs_forecast>).

    CLEAR ls_pir_item.
    ls_pir_item-material = <fs_head>-matnr. " 物料
    ls_pir_item-plant = p_werks. " 工厂
    ls_pir_item-requ_type = l_bedae. " 需求类型
    ls_pir_item-version = p_versb. " 版本
    ls_pir_item-req_number = l_pbdnr. " 需求计划
    ls_pir_item-vers_activ = l_vervs. " 激活

    CLEAR lt_pir_schedule_in.
    LOOP AT gt_date_list REFERENCE INTO DATA(lr_date).
      ASSIGN COMPONENT lr_date->fieldname OF STRUCTURE <fs_forecast> TO FIELD-SYMBOL(<fs_nump>).
      " 有个疑问,导入为0是不是就不用导入了?
      IF <fs_nump> IS NOT INITIAL.
        APPEND VALUE #(
          req_date = lr_date->date
          req_qty = <fs_nump>
          date_type = '1' " 表示:天
          prod_ves = <fs_head>-verid
        ) TO lt_pir_schedule_in REFERENCE INTO DATA(lr_pir_schedule_in).
      ENDIF.
    ENDLOOP.

    " 检查版本下的物料是否存在
    READ TABLE lt_pbim TRANSPORTING NO FIELDS
    WITH KEY matnr = ls_pir_item-material
             werks = ls_pir_item-plant
             bedae = ls_pir_item-requ_type
             versb = ls_pir_item-version
             pbdnr = ls_pir_item-req_number
             BINARY SEARCH.
    IF sy-subrc = 0.
      " 删除需要导入的行
      DELETE lt_pbim INDEX sy-tabix.

      " 修改
      CALL FUNCTION 'BAPI_REQUIREMENTS_CHANGE'
        EXPORTING
          material                 = ls_pir_item-material
          plant                    = ls_pir_item-plant
          requirementstype         = ls_pir_item-requ_type
          version                  = ls_pir_item-version
          reqmtsplannumber         = ls_pir_item-req_number
          vers_activ               = ls_pir_item-vers_activ
          do_commit                = ' '
          delete_old               = 'X'
        TABLES
          requirements_schedule_in = lt_pir_schedule_in
          return                   = lt_return.
    ELSE.
      CLEAR lt_return.
      CALL FUNCTION 'BAPI_REQUIREMENTS_CREATE'
        EXPORTING
          requirements_item        = ls_pir_item
          do_commit                = ' ' " 最后统一提交统一回滚
        TABLES
          requirements_schedule_in = lt_pir_schedule_in
          return                   = lt_return.
    ENDIF.

    " 错误消息
    LOOP AT lt_return REFERENCE INTO DATA(lr_return) WHERE type CA 'AXE'.
      <fs_head>-status = 'E'.
      <fs_head>-icon = icon_red_light.
      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_msg).
      <fs_head>-message = |{ <fs_head>-message }{ l_msg };|.
    ENDLOOP.

    IF <fs_head>-status = 'E'.
      l_err = 'X'.
    ENDIF.
  ENDLOOP.

  " 回滚
  IF l_err = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    RETURN.
  ENDIF.

  " 不出错的情况,全部提交
  CHECK l_err = ''.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.

  " 导入成功后,通过BDC删除其他版本号
  " 不在导入前删除的原因,是为了保持数据一致性
  " (BDC无法回滚,如果BDC删除成功,后面导入失败,将无法回退到初始状态)
  " 删除的项目无法再次删除,所以也要排除
  DELETE lt_pbim WHERE loevr <> ''.

  " 通过BDC删除其余没有导入的物料数据
  LOOP AT lt_pbim REFERENCE INTO DATA(lr_pbim).
    PERFORM frm_pir_delete USING lr_pbim->matnr lr_pbim->werks lr_pbim->versb.
  ENDLOOP.

ENDFORM.                    " frm_import_pir