1 FUNCTION ZRFC_FICO_MR21_V1.
2 *"----------------------------------------------------------------------
3 *"*"本地接口:
4 *" IMPORTING
5 *" VALUE(BUDAT) TYPE BUDAT OPTIONAL
6 *" TABLES
7 *" IM_TAB STRUCTURE ZSTRU_MEBW_MR21 OPTIONAL
8 *" EX_MESSAGE STRUCTURE CMFMSG OPTIONAL
9 *"----------------------------------------------------------------------
10 *" 创建成本价
11 * 传入金额,币种----转换为工厂本位币
12 * 没有使用ROLLBACK
13 *"----------------------------------------------------------------------
14
15 DATA: BEGIN OF WERK_TAB OCCURS 0,
16 BUKRS TYPE BUKRS,
17 WERKS TYPE WERKS_D,
18 WAERS TYPE WAERS,
19 FACTOR TYPE ISOC_FACTOR,
20 END OF WERK_TAB.
21
22 DATA: LV_TAB LIKE ZSTRU_MEBW_MR21.
23 DATA: LT_TAB TYPE TABLE OF ZSTRU_MEBW_MR21.
24 DATA: LT_RESULT TYPE TABLE OF ZSTRU_MEBW_MR21.
25 DATA: I TYPE I,
26 J TYPE I.
27
28 *----------------------------------------------------------------------
29 *初始化全局变量
30 *----------------------------------------------------------------------
31 " 过账日期
32 F_MR21HEAD-BUDAT = BUDAT.
33 IF F_MR21HEAD-BUDAT IS INITIAL.
34 F_MR21HEAD-BUDAT = SY-DATUM.
35 ENDIF.
36
37 * 初始化输出参数
38 REFRESH EX_MESSAGE.
39
40 *----------------------------------------------------------------------
41 *初始化本地参数
42 *----------------------------------------------------------------------
43
44 * 汇集公司 工厂
45 SORT IM_TAB BY BUKRS WERKS MATNR.
46 LOOP AT IM_TAB.
47 WERK_TAB-BUKRS = IM_TAB-BUKRS.
48 WERK_TAB-WERKS = IM_TAB-WERKS.
49 WERK_TAB-WAERS = IM_TAB-WAERS.
50 COLLECT WERK_TAB.
51 ENDLOOP.
52 " 循环公司工厂
53 LOOP AT WERK_TAB.
54
55 IF WERK_TAB-WAERS IS INITIAL.
56 SELECT SINGLE WAERS INTO WERK_TAB-WAERS FROM T001 WHERE BUKRS = WERK_TAB-BUKRS.
57 ENDIF.
58
59 WERK_TAB-FACTOR = 1.
60 CALL FUNCTION 'ZGET_CURRENCY_FACTOR'
61 EXPORTING
62 CURRENCY = WERK_TAB-WAERS
63 IMPORTING
64 FACTOR = WERK_TAB-FACTOR.
65
66
67
68 F_MR21HEAD-BUKRS = WERK_TAB-BUKRS.
69 CLEAR LT_TAB[].
70
71 LOOP AT IM_TAB INTO LV_TAB WHERE BUKRS = WERK_TAB-BUKRS
72 AND WERKS = WERK_TAB-WERKS .
73 APPEND LV_TAB TO LT_TAB.
74 ENDLOOP.
75
76
77 CLEAR I.
78 LOOP AT LT_TAB INTO LV_TAB .
79 I = I + 1.
80 J = I MOD 500.
81 LV_TAB-KBETR = LV_TAB-KBETR / WERK_TAB-FACTOR.
82 APPEND LV_TAB TO LT_RESULT.
83
84 IF J = 0 . " 是倍数,则执行
85 "创建成本价
86 PERFORM CREATE_MR21 TABLES LT_RESULT.
87 IF G_RT = 1.
88 WRITE : '有错误---生成成本价. 公司工厂',
89 WERK_TAB-BUKRS, WERK_TAB-WERKS,/ .
90 ENDIF.
91
92 " 返回消息
93 APPEND LINES OF GT_MSG TO EX_MESSAGE.
94
95 "初始化
96 CLEAR LT_RESULT[].
97 ENDIF.
98
99 AT LAST. "最后一条不是倍数,则执行
100 IF J <> 0.
101 "创建成本价
102 PERFORM CREATE_MR21 TABLES LT_RESULT.
103 IF G_RT = 1.
104 WRITE : '有错误---生成成本价. 公司工厂',
105 WERK_TAB-BUKRS, WERK_TAB-WERKS,/ .
106 ENDIF.
107
108 " 返回消息
109 APPEND LINES OF GT_MSG TO EX_MESSAGE.
110
111 "初始化
112 CLEAR LT_RESULT[].
113
114 ENDIF.
115 ENDAT.
116
117 ENDLOOP.
118
119
120 ENDLOOP.
121
122
123 ENDFUNCTION.
124
125
126 FORM CREATE_MR21 TABLES IM_MBEW STRUCTURE ZSTRU_MEBW_MR21.
127 DATA: LT_MSG TYPE STANDARD TABLE OF CMFMSG,
128 LV_MSG TYPE CMFMSG.
129
130 DATA: H_INDEX LIKE SY-TABIX.
131 DATA: H_POPER LIKE CKMLPP-POPER,
132 H_BDATJ LIKE CKMLPP-BDATJ.
133
134 DATA: LV_TAB LIKE ZSTRU_MEBW_MR21.
135 DATA: L_RX LIKE TCURR-UKURS, "汇率
136 L_KBETR LIKE MBEW-STPRS, "成本价
137 L_VPRSV LIKE MBEW-VPRSV. "价格控制指示符 V OR S
138
139 *----------------------------------------------------------------------
140 *初始化
141 *----------------------------------------------------------------------
142 CLEAR G_RT. "执行标志初始化
143 CLEAR GT_MSG[].
144
145 REFRESH: T_MATPR.
146 CLEAR : T_MATPR, F_MATPR, F_MATCR.
147
148 CLEAR LT_MSG[].
149 CLEAR LV_MSG.
150 *----------------------------------------------------------------------
151 *查看账期,并检查物料账期是否开启
152 *----------------------------------------------------------------------
153 *获取过账日期
154 CALL FUNCTION 'FI_PERIOD_DETERMINE'
155 EXPORTING
156 I_BUKRS = F_MR21HEAD-BUKRS
157 I_BUDAT = F_MR21HEAD-BUDAT
158 IMPORTING
159 E_MONAT = POPER
160 E_GJAHR = BDATJ.
161
162 H_BDATJ = BDATJ.
163 H_POPER = POPER.
164
165 CALL FUNCTION 'FI_PERIOD_CHECK'
166 EXPORTING
167 I_BUKRS = F_MR21HEAD-BUKRS
168 I_GJAHR = H_BDATJ
169 I_KOART = '+'
170 I_KONTO = '+'
171 I_MONAT = H_POPER "TH
172 EXCEPTIONS
173 ERROR_PERIOD = 1
174 ERROR_PERIOD_ACC = 2.
175
176 CALL FUNCTION 'MARV_SINGLE_READ'
177 EXPORTING
178 KZRFB = ' '
179 MAXTZ = '100'
180 BUKRS = F_MR21HEAD-BUKRS
181 IMPORTING
182 WMARV = MARV
183 EXCEPTIONS
184 NOT_FOUND = 1
185 WRONG_CALL = 2
186 OTHERS = 3.
187
188 DATA: XRUEM,
189 XRUEJ.
190 DATA: L_RET TYPE STRING.
191 CLEAR L_RET.
192 PERFORM MARV_CHECK USING XRUEM XRUEJ L_RET .
193 IF L_RET IS NOT INITIAL.
194 CLEAR LV_MSG.
195 LV_MSG-ARBGB = 'CKPRCH'.
196 LV_MSG-MSGTY = 'E'.
197 LV_MSG-MSGNR = '009'.
198 LV_MSG-MSGV1 = L_RET.
199 APPEND LV_MSG TO GT_MSG.
200 RETURN.
201 ENDIF.
202 *----------------------------------------------------------------------
203 *需求的物料清单
204 *----------------------------------------------------------------------
205 LOOP AT IM_MBEW INTO LV_TAB.
206 CLEAR F_ONECURR.
207 F_ONECURR-MATNR = LV_TAB-MATNR. "物料号
208 F_ONECURR-BWKEY = LV_TAB-WERKS. "工厂
209
210 CLEAR F_MATPR.
211 READ TABLE T_MATPR INTO F_MATPR
212 WITH KEY PP-MATNR = F_ONECURR-MATNR
213 PP-BWKEY = F_ONECURR-BWKEY
214 PP-BWTAR = F_ONECURR-BWTAR
215 PP-VBELN = F_ONECURR-VBELN
216 PP-POSNR = F_ONECURR-POSNR
217 PP-PSPNR = F_ONECURR-PSPNR.
218 IF SY-SUBRC <> 0.
219 MOVE-CORRESPONDING F_ONECURR TO F_MATPR-PP.
220 F_MATPR-PP-POPER = H_POPER.
221 F_MATPR-PP-BDATJ = H_BDATJ.
222
223 REFRESH F_MATPR-CR.
224
225 APPEND F_MATPR TO T_MATPR.
226 ENDIF.
227 ENDLOOP.
228
229 *----------------------------------------------------------------------
230 *获取产品成本核算号以及对用币种
231 *----------------------------------------------------------------------
232 CALL FUNCTION 'CM_F_INITIALIZE'
233 EXPORTING
234 APLID = 'CKML'.
235 "读取物料
236 CALL FUNCTION 'PRICES_PROPOSE'
237 EXPORTING
238 ACTUAL_BDATJ = H_BDATJ
239 ACTUAL_POPER = H_POPER
240 BUKRS = F_MR21HEAD-BUKRS
241 TABLES
242 T_MATPR = T_MATPR
243 EXCEPTIONS
244 DATA_ERROR = 1
245 OTHERS = 2.
246
247 IF SY-SUBRC <> 0.
248
249 G_RT = 1.
250 * MESSAGE e017(ckprch) WITH t_onecurr-matnr.
251 CLEAR LV_MSG.
252 LV_MSG-ARBGB = 'CKPRCH'.
253 LV_MSG-MSGTY = 'E'.
254 LV_MSG-MSGNR = '017'.
255 APPEND LV_MSG TO GT_MSG.
256 ENDIF.
257
258 CALL FUNCTION 'CM_F_MESSAGES_GET'
259 EXPORTING
260 APLID = 'CKML'
261 TABLES
262 E_MSGPROT = LT_MSG.
263 APPEND LINES OF LT_MSG TO GT_MSG.
264 LOOP AT LT_MSG INTO LV_MSG WHERE MSGTY = 'A' OR MSGTY = 'E'.
265 G_RT = 1.
266 EXIT.
267 ENDLOOP.
268
269 * IF g_rt = 1.
270 * RETURN.
271 * ENDIF.
272 *----------------------------------------------------------------------
273 * 获得新的物料价格--根据币种
274 *----------------------------------------------------------------------
275
276 DATA: V_FACTOR TYPE ISOC_FACTOR.
277
278 LOOP AT IM_MBEW INTO LV_TAB.
279 CLEAR F_ONECURR.
280 F_ONECURR-MATNR = LV_TAB-MATNR. "物料号
281 F_ONECURR-BWKEY = LV_TAB-WERKS. "工厂
282
283
284
285
286 V_FACTOR = 1.
287 CALL FUNCTION 'ZGET_CURRENCY_FACTOR'
288 EXPORTING
289 CURRENCY = LV_TAB-WAERS
290 IMPORTING
291 FACTOR = V_FACTOR.
292
293
294
295 READ TABLE T_MATPR INTO F_MATPR
296 WITH KEY
297 PP-MATNR = F_ONECURR-MATNR
298 PP-BWKEY = F_ONECURR-BWKEY
299 PP-BWTAR = F_ONECURR-BWTAR
300 PP-VBELN = F_ONECURR-VBELN
301 PP-POSNR = F_ONECURR-POSNR
302 PP-PSPNR = F_ONECURR-PSPNR.
303 IF SY-SUBRC = 0.
304 CLEAR H_INDEX.
305 H_INDEX = SY-TABIX.
306
307 "物料标准价类型
308 CLEAR L_VPRSV.
309 SELECT SINGLE VPRSV INTO L_VPRSV
310 FROM MBEW
311 WHERE MATNR = F_ONECURR-MATNR AND BWKEY = F_ONECURR-BWKEY.
312
313 "设定新价格
314 LOOP AT F_MATPR-CR INTO F_MATCR.
315 F_MATCR-NEWPEINH = LV_TAB-KPEIN. "新价格单位
316 "检查币种,获取汇率
317 CLEAR L_RX.
318 CLEAR L_KBETR.
319 IF F_MATCR-WAERS = LV_TAB-WAERS.
320 L_KBETR = LV_TAB-KBETR.
321
322
323
324
325
326 ELSE.
327
328 CLEAR L_RX.
329 data: L_rate TYPE p LENGTH 15 DECIMALS 7.
330 data: L_TMP type TZNTSTMPL.
331 clear: L_TMP , L_RATE.
332 CALL FUNCTION 'ZRFC_EXCHANGERATE_GETDETAIL'
333 EXPORTING
334 FROM_CURR = LV_TAB-WAERS
335 TO_CURRNCY = F_MATCR-WAERS
336 IMPORTING
337 NEW_RATE = L_TMP.
338 * EXCH_RATE = L_RX. "注释by kasen 20200318
339 Move L_TMP to L_RATE.
340 L_KBETR = LV_TAB-KBETR * L_RATE * V_FACTOR.
341
342 ENDIF.
343
344 "更新价格类型
345 IF L_VPRSV = 'V'.
346 F_MATCR-NEWPVPRS = L_KBETR. "移动平均价
347 IF F_MATCR-NEWPVPRS <> F_MATCR-PVPRS
348 OR F_MATCR-NEWPEINH <> F_MATCR-PEINH.
349
350 F_MATCR-MANPAE_V = 'X'. "价格变更标志
351 ENDIF.
352 ELSE.
353 F_MATCR-NEWSTPRS = L_KBETR. "标准价格
354 IF F_MATCR-NEWSTPRS <> F_MATCR-STPRS
355 OR F_MATCR-NEWPEINH <> F_MATCR-PEINH.
356
357 F_MATCR-MANPAE_S = 'X'. "价格变更标志
358 ENDIF.
359 ENDIF.
360
361
362 MODIFY F_MATPR-CR FROM F_MATCR.
363
364 ENDLOOP.
365
366 MODIFY T_MATPR FROM F_MATPR INDEX H_INDEX.
367 ENDIF.
368
369 ENDLOOP.
370
371 IF T_MATPR[] IS INITIAL. "没有记录
372 G_RT = 1.
373 RETURN.
374 ENDIF.
375
376 *----------------------------------------------------------------------
377 * 检查变更的物料 并保存更新
378 *----------------------------------------------------------------------
379 PERFORM KALK_ENRICH CHANGING
380 T_MATPR.
381
382 CALL FUNCTION 'CM_F_INITIALIZE'
383 EXPORTING
384 APLID = 'CKPF'.
385
386 "检查数据
387 CALL FUNCTION 'PRICES_CHANGE'
388 EXPORTING
389 ACTUAL_BDATJ = H_BDATJ
390 ACTUAL_POPER = H_POPER
391 BUKRS = F_MR21HEAD-BUKRS
392 BUDAT = F_MR21HEAD-BUDAT
393 XBLNR = F_MR21HEAD-XBLNR
394 * account_modification = h_komok
395 * subs_dbt = 'X'
396 TABLES
397 T_MATPR = T_MATPR
398 EXCEPTIONS
399 ERROR_MESSAGE = 1
400 INVALID_PERIOD = 2
401 OTHERS = 3.
402
403
404 "没有物料的价格变更
405 READ TABLE T_MATPR WITH KEY PP-XERROR = ' '
406 TRANSPORTING NO FIELDS.
407 IF SY-SUBRC <> 0.
408 G_RT = 1.
409 * MESSAGE i046(ckprch).
410 CLEAR LV_MSG.
411 LV_MSG-ARBGB = 'CKPRCH'.
412 LV_MSG-MSGTY = 'I'.
413 LV_MSG-MSGNR = '046'.
414 APPEND LV_MSG TO GT_MSG.
415 * Es wurden keine Preisänderungen durchgeführt
416 ELSE.
417
418 * Falls Customizing für variable KOMOKs gepflegt, wird hier der
419 * eingetragene KOMOK an Prices_Post mit dem Belegkopftext übergeben.
420 "更新数据
421 CALL FUNCTION 'PRICES_POST'
422 EXPORTING
423 I_BKTXT = F_MR21HEAD-BKTXT
424 BUKRS = F_MR21HEAD-BUKRS
425 LIS_UPDATE = 'X'
426 TABLES
427 T_MATPR = T_MATPR.
428
429
430 CALL FUNCTION 'CM_F_MESSAGES_GET'
431 EXPORTING
432 APLID = 'CKPF'
433 TABLES
434 E_MSGPROT = LT_MSG.
435
436 APPEND LINES OF LT_MSG TO GT_MSG.
437 * LOOP AT lt_msg INTO lv_msg WHERE MSGTY = 'A' OR MSGTY = 'E'.
438 * g_rt = 1.
439 * EXIT.
440 * ENDLOOP.
441 * IF g_rt = 1.
442 * ROLLBACK WORK.
443 * RETURN.
444 * ELSE.
445 * COMMIT WORK.
446 * ENDIF.
447
448 COMMIT WORK.
449
450 ENDIF.
451
452
453 ENDFORM.
454
455
456 *&---------------------------------------------------------------------*
457 *& Form kalk_enrich
458 *&---------------------------------------------------------------------*
459 * Die Untertabelle CKMLPR aus dem globalen Kontrollblock
460 * GD_MATCB_TBL sowie die Untertabelle KEKO aus dem globalen
461 * Kontrollbrlock GD_KEKOCB_TBL
462 * wird in die Struktur R_MATPR übertragen, falls es
463 * zu dem Material eine Plankalkulation existiert.
464 *----------------------------------------------------------------------*
465 * <--> R_MATPR Liste der Materialien
466 *----------------------------------------------------------------------*
467 FORM KALK_ENRICH CHANGING
468 R_MATPR TYPE CKMPR_MAT_PRICE.
469
470 FIELD-SYMBOLS:
471 <R_MATPR> LIKE LINE OF R_MATPR,
472 <MATCR> TYPE LINE OF CKMPR_CURTP_PRICES.
473
474 DATA:
475 LD_COSTING_TO_RELEASE TYPE BOOLE_D,
476 LD_WA_MATCB LIKE LINE OF GD_MATCB_TBL,
477 LD_WA_KEKOCB LIKE LINE OF GD_KEKOCB_TBL.
478
479 LOOP AT R_MATPR ASSIGNING <R_MATPR>.
480
481 * Existiert zu irgendeiner Währung eine Plankalkulation?
482 CLEAR LD_COSTING_TO_RELEASE.
483 LOOP AT <R_MATPR>-CR ASSIGNING <MATCR>.
484 IF <MATCR>-ERZKALK = Y_X.
485 LD_COSTING_TO_RELEASE = Y_X.
486 ENDIF.
487 ENDLOOP.
488 UNASSIGN <MATCR>.
489 CHECK NOT LD_COSTING_TO_RELEASE IS INITIAL.
490
491 * Übertragen der Tabelle für die zukünftigen Preise
492 * aus dem globalen Kontrollblock in die T_MATPR
493 READ TABLE GD_MATCB_TBL INTO LD_WA_MATCB
494 WITH TABLE KEY KALNR = <R_MATPR>-PP-KALN1.
495 IF SY-SUBRC EQ 0.
496 <R_MATPR>-CKMLPR[] = LD_WA_MATCB-CKMLPR[].
497 ENDIF.
498 * Übertragen der Tabelle für die Kalkulationsdaten
499 * aus dem globalen Kontrollblock in die T_MATPR
500 READ TABLE GD_KEKOCB_TBL INTO LD_WA_KEKOCB
501 WITH TABLE KEY KALNR = <R_MATPR>-PP-KALN1.
502 IF SY-SUBRC EQ 0.
503 <R_MATPR>-KEKO[] = LD_WA_KEKOCB-KEKO[].
504 ENDIF.
505 ENDLOOP.
506 UNASSIGN <R_MATPR>.
507
508 ENDFORM. " kalk_enrich
509
510 *&---------------------------------------------------------------------*
511 *& Form MARV_CHECK
512 *&---------------------------------------------------------------------*
513 * text
514 *----------------------------------------------------------------------*
515 * -->P_XRUEM text *
516 * -->P_XRUEJ text *
517 *----------------------------------------------------------------------*
518 FORM MARV_CHECK USING P_XRUEM TYPE XFELD
519 P_XRUEJ TYPE XFELD
520 P_RET TYPE STRING.
521 DATA: MESSAGE_TEXT(60).
522
523 TABLES: CKMLMVADMIN.
524 STATICS: ADMIN_READ TYPE C,
525 ALLOW_BACKPOSTING TYPE C.
526
527 IF ADMIN_READ IS INITIAL.
528 ADMIN_READ = Y_X.
529 SELECT SINGLE * FROM CKMLMVADMIN
530 WHERE KKEY = 'MR21_XRUEM'.
531 IF SY-SUBRC = 0 AND CKMLMVADMIN-KDATA+0(1) = Y_X.
532 ALLOW_BACKPOSTING = Y_X.
533 ENDIF.
534 ENDIF.
535
536 CLEAR: P_XRUEM,
537 P_XRUEJ.
538
539 IF BDATJ NE MARV-LFGJA
540 OR POPER NE MARV-LFMON.
541 IF BDATJ = MARV-VJGJA
542 AND POPER = MARV-VJMON.
543
544 *------- Rueckbuchen Vorjahr -----------------------------------------*
545 P_XRUEJ = 'X'.
546 IF BDATJ = MARV-VMGJA
547 AND POPER = MARV-VMMON.
548
549 *------- Rueckbuchen Vorjahr gleich Vormonat -------------------------*
550 P_XRUEM = 'X'.
551 ELSE.
552 *------- Rueckbuchen Vorjahr ungleich Vormonat------------------------*
553 IF MARV-XRUEM = SPACE AND ALLOW_BACKPOSTING IS INITIAL.
554 CALL FUNCTION 'MB_EDIT_MESSAGE'
555 EXPORTING
556 T1 = MARV-LFMON
557 T2 = MARV-LFGJA
558 IMPORTING
559 MESSAGE = MESSAGE_TEXT.
560 ELSE.
561 CALL FUNCTION 'MB_EDIT_MESSAGE'
562 EXPORTING
563 T1 = MARV-LFMON
564 T2 = MARV-LFGJA
565 T3 = '/'
566 T4 = MARV-VMMON
567 T5 = MARV-VMGJA
568 IMPORTING
569 MESSAGE = MESSAGE_TEXT.
570 ENDIF.
571 "ADD BY LH 20180906
572 * MESSAGE ID 'CKPRCH' TYPE 'E' NUMBER '009' WITH message_text.
573 P_RET = MESSAGE_TEXT.
574 RETURN.
575
576 ENDIF.
577 ELSE.
578 IF BDATJ = MARV-VMGJA
579 AND POPER = MARV-VMMON
580 AND ( MARV-XRUEM NE SPACE OR ALLOW_BACKPOSTING = Y_X ).
581
582 *------- Rueckbuchen Monat -------------------------------------------*
583 P_XRUEM = 'X'.
584 ELSE.
585
586 *------- Periode ungueltig -------------------------------------------*
587 IF MARV-XRUEM = SPACE AND ALLOW_BACKPOSTING IS INITIAL.
588 CALL FUNCTION 'MB_EDIT_MESSAGE'
589 EXPORTING
590 T1 = MARV-LFMON
591 T2 = MARV-LFGJA
592 IMPORTING
593 MESSAGE = MESSAGE_TEXT.
594 ELSE.
595 CALL FUNCTION 'MB_EDIT_MESSAGE'
596 EXPORTING
597 T1 = MARV-LFMON
598 T2 = MARV-LFGJA
599 T3 = '/'
600 T4 = MARV-VMMON
601 T5 = MARV-VMGJA
602 IMPORTING
603 MESSAGE = MESSAGE_TEXT.
604 ENDIF.
605 "ADD BY LH 20180906
606 * MESSAGE ID 'CKPRCH' TYPE 'E' NUMBER '009' WITH message_text.
607 P_RET = MESSAGE_TEXT.
608 RETURN.
609
610 ENDIF.
611 ENDIF.
612 ENDIF.
613
614 ENDFORM. " MARV_CHECK