Skip to content

计划独立需求(PIR)

PIR删除

示例代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
*&---------------------------------------------------------------------*
*&      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维护

示例代码
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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