😱 SAP - BAPI - RV_CONDITION_COPY

首页 / 🐽 SAP / 正文

🎏 前言

正式入职后的第一个 BAPI 项目,就让我苦不堪言,下面就总结一些这次的使用和存在的问题!

🙉 参考文章

文章链接 1

文章链接 2

🥬 使用场景

本次开发为二开,负责实现顾问提出的需求「对导入的数据实现日期截断效果」

  • ZVK11 原来的处理方式是直接修改已经存在的价格记录导致历史价格无法保留
  • 解决方案是修改价格也按照创建的方式建立新的价格,并将已经存在价格结束有效日期

示例:

促销类型工厂库位售达方物料编号价格单位起始日截止日
源数据881A001PO101447VFE000NPT3.15CNY20220010120221231
导入的数据881A001PO101447VFE000NPT3.10CNY2022090120221231
导入后结果881A001PO101447VFE000NPT3.15CNY20220010120220831

使用 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.
您阅读这篇文章共花了:
打赏
评论区
头像
文章目录