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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467 | *----------------------------------------------------------------------*
***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.
|