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.