🎏 前言
正式入职后的第一个 BAPI
项目,就让我苦不堪言,下面就总结一些这次的使用和存在的问题!
🙉 参考文章
🥬 使用场景
本次开发为二开,负责实现顾问提出的需求「对导入的数据实现日期截断效果」
ZVK11
原来的处理方式是直接修改已经存在的价格记录导致历史价格无法保留- 解决方案是修改价格也按照创建的方式建立新的价格,并将已经存在价格结束有效日期
示例:
促销类型 | 工厂 | 库位 | 售达方 | 物料编号 | 价格 | 单位 | 起始日 | 截止日 | |
---|---|---|---|---|---|---|---|---|---|
源数据 | 881 | A001 | PO | 101447 | VFE000NPT | 3.15 | CNY | 202200101 | 20221231 |
导入的数据 | 881 | A001 | PO | 101447 | VFE000NPT | 3.10 | CNY | 20220901 | 20221231 |
导入后结果 | 881 | A001 | PO | 101447 | VFE000NPT | 3.15 | CNY | 202200101 | 20220831 |
使用 BAPI_PRICES_CONDITONS
对条件价格进行创建,并不会去检查主键,会有各种各样的 BUG 产生
在网上找了另外一个 BAPI: RV_CONDITION_COPY
,使用后发现可以自动对区间进行拆分,不会产生主键重复的 BUG,以下是源代码:
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_PRICENEW
*&---------------------------------------------------------------------*
* 更换后的 BAPI 创建(实现日期截断)
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_create_pricenew .
DATA: ls_key_fields TYPE komg,
lt_copy_records TYPE TABLE OF komv,
ls_copy_records TYPE komv,
lt_copy_staffel TYPE TABLE OF condscale,
ls_copy_staffel TYPE condscale,
ls_condition_table TYPE t681-kotabnr.
" 查询物料单位 MEINS
IF gt_price IS NOT INITIAL.
CLEAR gt_mara.
SELECT mara~matnr " 物料编号
mara~meins " 物料单位
FROM mara
INTO CORRESPONDING FIELDS OF TABLE gt_mara
FOR ALL ENTRIES IN gt_price " 系统为 ECC,语法格式有所调整
WHERE mara~matnr = gt_price-matnr.
ENDIF.
LOOP AT gt_price INTO gs_price.
CLEAR: ls_key_fields.
ls_key_fields-vkaus = gs_price-vkaus. " 促销类型
ls_key_fields-werks = gs_price-werks. " 工厂
ls_key_fields-lgort = gs_price-lgort. " 库存地点
ls_key_fields-kunag = gs_price-kunag. " 售达方
ls_key_fields-matnr = gs_price-matnr. " 物料号
IF p_974 = 'X'.
ls_condition_table = '974'.
ELSEIF p_977 = 'X'. " 上传 977 赋值 运输条件
ls_condition_table = '977'.
ls_key_fields-sdabw = gs_price-sdabw. " 运输条件
ENDIF.
CLEAR ls_copy_records.
" condtion fields
ls_copy_records-kappl = 'V'. " 应用 看表
ls_copy_records-kschl = 'ZCX2'. " 类型 看表
ls_copy_records-kbetr = gs_price-kbetr. " 价格
ls_copy_records-waers = gs_price-konwa. " 单位
CLEAR: gs_mara.
READ TABLE gt_mara INTO gs_mara WITH KEY matnr = gs_price-matnr.
IF sy-subrc = 0.
ls_copy_records-kmein = gs_mara-meins. " 对物料单位字段进行赋值
ENDIF.
ls_copy_records-kpein = '1'. " 定价单位
APPEND ls_copy_records TO lt_copy_records.
CALL FUNCTION 'RV_CONDITION_COPY'
EXPORTING
application = 'V'
condition_table = ls_condition_table
condition_type = 'ZCX2'
date_from = gs_price-datab
date_to = gs_price-datbi
key_fields = ls_key_fields
maintain_mode = 'A' " A:创建 B:更新
enqueue = 'X' " lock entry 锁定 VK11/VK12
overlap_confirmed = 'X'
used_by_idoc = 'X'
keep_old_records = 'X'
* IMPORTING
* e_komk = ls_komk
* e_komp = ls_kompx
* new_record = lv_record
TABLES
copy_records = lt_copy_records
* copy_staffel = lt_copy_staffel
EXCEPTIONS
enqueue_on_record = 1
invalid_application = 2
invalid_condition_number = 3
invalid_condition_type = 4
no_authority_ekorg = 5
no_authority_kschl = 6
no_authority_vkorg = 7
no_selection = 8
table_not_valid = 9
no_material_for_settlement = 10
no_unit_for_period_cond = 11
no_unit_reference_magnitude = 12
invalid_condition_table = 13
OTHERS = 14.
IF sy-subrc = 0.
CALL FUNCTION 'RV_CONDITION_SAVE'.
CALL FUNCTION 'RV_CONDITION_RESET'.
COMMIT WORK AND WAIT.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ENDLOOP.
ENDFORM. " FRM_CREATE_PRICENEW
🎯 注意事项
sy-subrc = 0
时执行的 FUNCTION
是:
CALL FUNCTION 'RV_CONDITION_SAVE'.
CALL FUNCTION 'RV_CONDITION_RESET'.
COMMIT WORK AND WAIT.