SAP 维护SD价格的探讨

45 篇文章 3 订阅

SAP前台维护SD模块价格 vk11/vk12/vk13

对应的BAPI:BAPI_PRICES_CONDITIONS

假设维护A类价格时,当期有效价格期间是 20220101~20221231

1)本次维护价格期间如果是 20230101~20231231 (即本次维护与当期有效价格无交叉)

2)本次维护价格期间如果是 20220301~20220531 (即本次维护被当期有效价格包含)

3)本次维护价格期间如果是 20221201~20230531 (即本次维护被当期有效价格部分交叉)

抑或是 20211201-20220301 (实际情况可能不存在,一般要求起始时间>当前时间)

4)本次维护价格期间如果是 20211201~20230531 (即本次维护包含当期有效价格)

==================================================================

第一种情况:

前台操作:vk11 新增价格维护接口

BAPI:直接新增

第二种情况:VK11新增时,会将当期有效价格期间拆分成2段,前后都是当期价格,中间一段是新维护价格。

BAPI:先对当期有效价格期间尽心拆分,原则上拆分成2段。然后新增价格

第三种:VK11新增时,会将当期有效价格期间拆分成2段,前/后都是当期价格。交叉部分是新维护价格

BAPI:先对当期有效价格期间的起始/截止日期修改。然后新增维护价格

第四种:VK11 新增时,直接删除当期有效价格,维护新价格

BAPI:删除当期有效价格记录,维护新价格

BAPI:

 DATA:LITEM LIKE ZSTRU_SD_PRICE_CONDITION.
  DATA:L_KEY   LIKE BAPICONDCT-VARKEY.
  DATA:LPDATE TYPE SY-DATUM.
  DATA:LKUNNR LIKE KNA1-KUNNR,
            LMATNR LIKE MARA-MATNR.
  data:lflg TYPE ABAP_BOOL.
  DATA: H_VARKEY(255),
          H_COND_UNIT TYPE MEINS .
  DATA: LT_BAPICONDCT  TYPE  BAPICONDCT OCCURS 0  ,  "
        WA_BAPICONDCT  TYPE  BAPICONDCT ,

        LT_BAPICONDHD  TYPE  BAPICONDHD OCCURS 0  ,  "
        WA_BAPICONDHD  TYPE  BAPICONDHD ,

        LT_BAPICONDIT  TYPE  BAPICONDIT OCCURS 0  ,
        WA_BAPICONDIT  TYPE  BAPICONDIT ,

        LT_BAPICONDQS  TYPE  BAPICONDQS OCCURS 0  ,
        WA_BAPICONDQS  TYPE  BAPICONDQS ,

        LT_BAPICONDVS  TYPE  BAPICONDVS OCCURS 0  ,
        WA_BAPICONDVS  TYPE  BAPICONDVS .

  DATA:LITEMRET LIKE ZOBJDESC,
        L_MESSAGE TYPE MSGTXT.
  DATA: LT_BAPIRET2 LIKE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE .
  DATA: RET    TYPE  BAPIRET2 .

  DATA: LT_BAPIKNUMHS TYPE BAPIKNUMHS  OCCURS  0 .
  DATA: LT_MEM_INITIAL TYPE  CND_MEM_INITIAL OCCURS 0 .
  lflg = ABAP_TRUE.
  EV_STATUS = 'S'.
  EV_MESSAGE = '成功'.
  LOOP AT ITEMS  INTO LITEM.
    IF LITEM-VALID_TO < LITEM-VALID_FROM OR LITEM-VALID_FROM <= SY-DATUM.
      LFLG = ABAP_FALSE.
      CONTINUE.
    ENDIF.
    CLEAR LT_BAPICONDCT[].
    CLEAR WA_BAPICONDCT.
    CLEAR LT_BAPICONDHD[].
    CLEAR WA_BAPICONDHD.
    CLEAR LT_BAPICONDIT[].
    CLEAR WA_BAPICONDIT.

    IF COND_USAGE  = 'A' AND TABLE_NO = '920'.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LITEM-KUNNR
        IMPORTING
          OUTPUT = LKUNNR.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LITEM-MATNR
        IMPORTING
          OUTPUT = LMATNR.
      CONCATENATE LKUNNR  LMATNR LITEM-WAERS INTO H_VARKEY.
    ENDIF.

    SELECT  SINGLE MEINS FROM MARA
    INTO H_COND_UNIT  WHERE MATNR = LMATNR.

    WA_BAPICONDCT-TABLE_NO = TABLE_NO."'941'.
    WA_BAPICONDCT-APPLICATIO = APPLICATIO."'V'.
    WA_BAPICONDCT-COND_USAGE = COND_USAGE."'A'.      "条件表用途 ‘A' 定价
    WA_BAPICONDCT-COND_TYPE = COND_TYPE."I_KSCHL.    "定价条件
    WA_BAPICONDCT-OPERATION = OPERATION."'009'.     "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
*    WA_BAPICONDCT-OPERATION = '004'.         "更改
    WA_BAPICONDCT-VARKEY = H_VARKEY.
    WA_BAPICONDCT-VALID_TO = LITEM-VALID_TO.
    WA_BAPICONDCT-VALID_FROM = LITEM-VALID_FROM.

    WA_BAPICONDCT-COND_NO = '$000000001'.   "创建

    APPEND WA_BAPICONDCT TO LT_BAPICONDCT.
*KONH
    WA_BAPICONDHD-OPERATION = OPERATION."'009'.
*WA_BAPICONDHD-OPERATION = '004'.
    WA_BAPICONDHD-COND_NO = '$000000001'.
*WA_BAPICONDHD-COND_NO = '0003224015'.
    WA_BAPICONDHD-CREATED_BY = SY-UNAME.
    WA_BAPICONDHD-CREAT_DATE = SY-DATUM.
    WA_BAPICONDHD-COND_USAGE = COND_USAGE."'A'.
    WA_BAPICONDHD-TABLE_NO = TABLE_NO."'941'.
    WA_BAPICONDHD-APPLICATIO = APPLICATIO."'V'.
    WA_BAPICONDHD-COND_TYPE = COND_TYPE."I_KSCHL.    "
    WA_BAPICONDHD-VARKEY = H_VARKEY.
    WA_BAPICONDHD-VALID_FROM = LITEM-VALID_FROM.
    WA_BAPICONDHD-VALID_TO = LITEM-VALID_TO.

    APPEND WA_BAPICONDHD TO  LT_BAPICONDHD .
*KONP
    WA_BAPICONDIT-OPERATION = OPERATION."'009'.
    WA_BAPICONDIT-COND_NO = '$000000001'.
    WA_BAPICONDIT-COND_COUNT = '01'.     "条件序列号
    WA_BAPICONDIT-APPLICATIO = APPLICATIO."'V'.
    WA_BAPICONDIT-COND_TYPE =  COND_TYPE."I_KSCHL.    "
    WA_BAPICONDIT-SCALETYPE = 'A'.       "STFKZ STAFFELSOORT
    WA_BAPICONDIT-SCALEBASIN = ''.      "KZBZG TEKEN:REKENEENHEID "  WA_BAPICONDIT-SCALEBASIN = 'C'. 存在数量等级
    WA_BAPICONDIT-SCALE_QTY = '0'.       "KSTBM CONDITIESTAFFELBASIS HOEVEELHEID
    WA_BAPICONDIT-COND_P_UNT = '1'.      "KPEIN PRIJSEENHEID
    WA_BAPICONDIT-COND_UNIT = H_COND_UNIT.      "KMEIN CONDITIE-HOEVEELHEIDSEENHEID
    WA_BAPICONDIT-CALCTYPCON = 'C'.      "KRECH CONDITIE-REKENREGEL
    WA_BAPICONDIT-COND_VALUE = LITEM-COND_VALUE.
    WA_BAPICONDIT-CONDCURR = LITEM-WAERS.

    APPEND  WA_BAPICONDIT  TO LT_BAPICONDIT.

    if  LFLG = ABAP_TRUE.

     LPDATE = LITEM-VALID_From - 1.
      CALL FUNCTION 'ZRFC_SD_KNA_PART_PRICE_M'
      EXPORTING
        PDATBI = LPDATE
        KUNNR = LITEM-KUNNR
        MATNR = LITEM-MATNR
        WAERK = LITEM-WAERS
        CURRDAT = LITEM-VALID_FROM
        COND_TYPE = COND_TYPE
        TABLE_NO = TABLE_NO
        APPLICATIO = APPLICATIO
        COND_USAGE = COND_USAGE
        OPERATION = '004'.
      commit WORK AND WAIT.

      CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
* EXPORTING
*   PI_INITIALMODE             = ' '
*   PI_BLOCKNUMBER             =
*   PI_PHYSICAL_DELETION       =
      TABLES
        TI_BAPICONDCT              = LT_BAPICONDCT
        TI_BAPICONDHD              = LT_BAPICONDHD
        TI_BAPICONDIT              = LT_BAPICONDIT
        TI_BAPICONDQS              = LT_BAPICONDQS
        TI_BAPICONDVS              = LT_BAPICONDVS
        TO_BAPIRET2                = LT_BAPIRET2
        TO_BAPIKNUMHS              = LT_BAPIKNUMHS
        TO_MEM_INITIAL             = LT_MEM_INITIAL
      EXCEPTIONS
        UPDATE_ERROR               = 1
        OTHERS                     = 2.

      IF SY-SUBRC = 0.
        LOOP AT LT_BAPIRET2 WHERE TYPE EQ 'A' OR TYPE EQ 'E'.
          L_MESSAGE = L_MESSAGE && LT_BAPIRET2-MESSAGE.
        ENDLOOP.
        IF SY-SUBRC EQ 0.
          EV_STATUS = 'E'.
          EV_MESSAGE = '客户价格更新失败:' && L_MESSAGE.
          LITEMRET-OBJDESC = H_VARKEY.
          LITEMRET-OBJKEY = EV_STATUS.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ELSE.
          LITEMRET-OBJDESC = H_VARKEY.
          LITEMRET-OBJKEY = 'S'.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
        ENDIF.
        APPEND LITEMRET TO ITEMSMSG.
      ELSE.
        EV_STATUS = 'E'.
        EV_MESSAGE = '客户价格更新失败:' && L_MESSAGE.
        LITEMRET-OBJDESC = H_VARKEY.
        LITEMRET-OBJKEY = EV_STATUS.
        APPEND LITEMRET TO ITEMSMSG.
      ENDIF.
    else.
      EV_STATUS = 'E'.
      EV_MESSAGE = '客户价格更新失败:有效期间不正确'.
      LITEMRET-OBJDESC = H_VARKEY.
      LITEMRET-OBJKEY = EV_STATUS.
      APPEND LITEMRET TO ITEMSMSG.
    endif.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      IMPORTING
        RETURN = RET.

  ENDLOOP.
ENDFUNCTION.
FUNCTION ZRFC_SD_KNA_PART_PRICE_M.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(PDATBI) TYPE  SY-DATUM DEFAULT SY-DATUM
*"     VALUE(KUNNR) TYPE  KUNNR OPTIONAL
*"     VALUE(MATNR) TYPE  MATNR OPTIONAL
*"     VALUE(WAERK) TYPE  WAERK OPTIONAL
*"     VALUE(CURRDAT) TYPE  SY-DATUM DEFAULT SY-DATUM
*"     VALUE(COND_TYPE) TYPE  CHAR4 DEFAULT 'ZPR1'
*"     VALUE(TABLE_NO) TYPE  NUMC3 DEFAULT '920'
*"     VALUE(APPLICATIO) TYPE  CHAR1 DEFAULT 'V'
*"     VALUE(COND_USAGE) TYPE  CHAR1 DEFAULT 'A'
*"     VALUE(OPERATION) TYPE  CHAR3 DEFAULT '004'
*"  EXPORTING
*"     VALUE(EV_STATUS) TYPE  ZE_STATUS
*"     VALUE(EV_MESSAGE) TYPE  MSGTXT
*"----------------------------------------------------------------------
  data:lA920 like A920 OCCURS 0 WITH HEADER LINE,
          lvalue TYPE konp-KBETR,
       WA920 TYPE A920,
          LT_BAPICONDCT  TYPE  BAPICONDCT OCCURS 0  ,  "
          WA_BAPICONDCT  TYPE  BAPICONDCT ,
          LT_BAPICONDHD  TYPE  BAPICONDHD OCCURS 0  ,  "
          WA_BAPICONDHD  TYPE  BAPICONDHD ,
          LT_BAPICONDIT  TYPE  BAPICONDIT OCCURS 0  ,
          WA_BAPICONDIT  TYPE  BAPICONDIT ,
          LT_BAPICONDQS  TYPE  BAPICONDQS OCCURS 0  ,
          WA_BAPICONDQS  TYPE  BAPICONDQS ,
          LT_BAPICONDVS  TYPE  BAPICONDVS OCCURS 0  ,
          WA_BAPICONDVS  TYPE  BAPICONDVS .
  FIELD-SYMBOLS: <FS1> TYPE BAPICONDCT,
                 <fs2> TYPE BAPICONDHD,
                 <fs3> TYPE BAPICONDIT.
  DATA: LT_BAPIRET2 LIKE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE .
  DATA: LT_BAPIKNUMHS TYPE BAPIKNUMHS  OCCURS  0 .
  DATA: LT_MEM_INITIAL TYPE  CND_MEM_INITIAL OCCURS 0 .
  DATA: H_VARKEY(255),
        H_COND_UNIT TYPE MEINS .
  DATA:LKUNNR LIKE KNA1-KUNNR,
        LMATNR LIKE MARA-MATNR.
  DATA:L_KEY   LIKE BAPICONDCT-VARKEY.
  SELECT  * INTO TABLE LA920
    FROM  A920
    WHERE A920~DATBI > CURRDAT AND DATAB < CURRDAT AND
    MATNR  = MATNR AND KUNNR  = KUNNR AND WAERK  = WAERK and KSCHL = COND_TYPE and KAPPL = APPLICATIO.

  IF LA920[] IS NOT INITIAL.
    READ TABLE LA920 INTO WA920 INDEX 1.
    SELECT SINGLE KBETR INTO LVALUE
      FROM KONP
    WHERE KONP~KNUMH  = WA920-KNUMH.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = WA920-KUNNR
      IMPORTING
        OUTPUT = LKUNNR.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = WA920-MATNR
      IMPORTING
        OUTPUT = LMATNR.
    CONCATENATE LKUNNR  LMATNR waerk INTO H_VARKEY.

    SELECT  SINGLE MEINS FROM MARA
    INTO H_COND_UNIT  WHERE MATNR = LMATNR.

    WA_BAPICONDCT-TABLE_NO = TABLE_NO."'941'.
    WA_BAPICONDCT-APPLICATIO = APPLICATIO."'V'.
    WA_BAPICONDCT-COND_USAGE = COND_USAGE."'A'.      "条件表用途 ‘A' 定价
    WA_BAPICONDCT-COND_TYPE = COND_TYPE."I_KSCHL.    "定价条件
    WA_BAPICONDCT-OPERATION = '003'."'009'.     "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
*    WA_BAPICONDCT-OPERATION = '004'.         "更改
    WA_BAPICONDCT-VARKEY = H_VARKEY.
    WA_BAPICONDCT-VALID_TO = WA920-DATBI.
    WA_BAPICONDCT-VALID_FROM = WA920-DATAB.

    WA_BAPICONDCT-COND_NO = WA920-KNUMH.   "创建

    APPEND WA_BAPICONDCT TO LT_BAPICONDCT.

    WA_BAPICONDHD-OPERATION = '003'."'009'.
*WA_BAPICONDHD-OPERATION = '004'.
    WA_BAPICONDHD-COND_NO = WA920-KNUMH.
*WA_BAPICONDHD-COND_NO = '0003224015'.
    WA_BAPICONDHD-CREATED_BY = SY-UNAME.
    WA_BAPICONDHD-CREAT_DATE = SY-DATUM.
    WA_BAPICONDHD-COND_USAGE = COND_USAGE."'A'.
    WA_BAPICONDHD-TABLE_NO = TABLE_NO."'941'.
    WA_BAPICONDHD-APPLICATIO = APPLICATIO."'V'.
    WA_BAPICONDHD-COND_TYPE = COND_TYPE."I_KSCHL.    "
    WA_BAPICONDHD-VARKEY = H_VARKEY.
    WA_BAPICONDHD-VALID_FROM = WA920-DATAB.
    WA_BAPICONDHD-VALID_TO = WA920-DATBI.

    APPEND WA_BAPICONDHD TO  LT_BAPICONDHD .

    WA_BAPICONDIT-OPERATION = '003'."'009'.
    WA_BAPICONDIT-COND_NO = WA920-KNUMH. "'$000000001'.
    WA_BAPICONDIT-COND_COUNT = '01'.     "条件序列号
    WA_BAPICONDIT-APPLICATIO = APPLICATIO."'V'.
    WA_BAPICONDIT-COND_TYPE =  COND_TYPE."I_KSCHL.    "
    WA_BAPICONDIT-SCALETYPE = 'A'.       "STFKZ STAFFELSOORT
    WA_BAPICONDIT-SCALEBASIN = ''.      "KZBZG TEKEN:REKENEENHEID "  WA_BAPICONDIT-SCALEBASIN = 'C'. 存在数量等级
    WA_BAPICONDIT-SCALE_QTY = '0'.       "KSTBM CONDITIESTAFFELBASIS HOEVEELHEID
    WA_BAPICONDIT-COND_P_UNT = '1'.      "KPEIN PRIJSEENHEID
    WA_BAPICONDIT-COND_UNIT = H_COND_UNIT.      "KMEIN CONDITIE-HOEVEELHEIDSEENHEID
    WA_BAPICONDIT-CALCTYPCON = 'C'.      "KRECH CONDITIE-REKENREGEL
    WA_BAPICONDIT-COND_VALUE = LVALUE.
    WA_BAPICONDIT-CONDCURR = WAERK.

    APPEND  WA_BAPICONDIT  TO LT_BAPICONDIT.

    CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
 EXPORTING
*   PI_INITIALMODE             = ' '
*   PI_BLOCKNUMBER             =
    PI_PHYSICAL_DELETION       = 'X' "物理删除 删除的时候要打上X
    TABLES
      TI_BAPICONDCT              = LT_BAPICONDCT
      TI_BAPICONDHD              = LT_BAPICONDHD
      TI_BAPICONDIT              = LT_BAPICONDIT
      TI_BAPICONDQS              = LT_BAPICONDQS
      TI_BAPICONDVS              = LT_BAPICONDVS
      TO_BAPIRET2                = LT_BAPIRET2
      TO_BAPIKNUMHS              = LT_BAPIKNUMHS
      TO_MEM_INITIAL             = LT_MEM_INITIAL
    EXCEPTIONS
      UPDATE_ERROR               = 1
      OTHERS                     = 2.
  ENDIF.

  COMMIT WORK AND WAIT.

  READ TABLE LT_BAPICONDCT ASSIGNING <FS1> INDEX 1.
  <FS1>-OPERATION =  operation.
  <FS1>-VALID_TO  = PDATBI.
  READ TABLE LT_BAPICONDHD ASSIGNING <FS2> INDEX 1.
  <FS2>-OPERATION =  operation.
  <FS2>-VALID_TO  = PDATBI.
  READ TABLE LT_BAPICONDIT ASSIGNING <FS3> INDEX 1.
  <FS3>-OPERATION =  operation.


  CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
  TABLES
    TI_BAPICONDCT              = LT_BAPICONDCT
    TI_BAPICONDHD              = LT_BAPICONDHD
    TI_BAPICONDIT              = LT_BAPICONDIT
    TI_BAPICONDQS              = LT_BAPICONDQS
    TI_BAPICONDVS              = LT_BAPICONDVS
    TO_BAPIRET2                = LT_BAPIRET2
    TO_BAPIKNUMHS              = LT_BAPIKNUMHS
    TO_MEM_INITIAL             = LT_MEM_INITIAL
  EXCEPTIONS
    UPDATE_ERROR               = 1
    OTHERS                     = 2.

ENDFUNCTION.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gavin_gxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值