MR21 创建标准价函数摘自标准功能
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