总结三种创建条件记录的BAPI,均可为SD或者MM创建对应的条件记录,只需更改对应条件表信息及key的信息即可。
1.BAPI_PRICES_CONDITIONS
2.IDOC_INPUT_COND_A
3.RV_CONDITION_COPY、RV_CONDITION_SAVE、RV_CONDITION_RESET
本例为MM创建条件记录,使用定价类型Z001,定价表为A991,定价所需字段如下:
BAPI_PRICES_CONDITIONS 的使用方式
BAPI通过TABLE_NO参数确定价格信息写入哪张表,通过VARKEY参数将KEY值写入对应字段,以A991为例,根据标准程序对应的传值逻辑可以看到程序是如何将VARKEY赋值给各个定价表的key值字段的(以RV13+表名去查找对应的标准程序,BAPI中会根据表名调用对应程序的DB_UPDATE子例程)。
*&---------------------------------------------------------------------*
*& Report ZTEST_MEK1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_MEK1.
DATA:
LT_CONDCT TYPE STANDARD TABLE OF BAPICONDCT,
LS_CONDCT TYPE BAPICONDCT,
LT_CONDHD TYPE STANDARD TABLE OF BAPICONDHD,
LS_CONDHD TYPE BAPICONDHD,
LT_CONDIT TYPE STANDARD TABLE OF BAPICONDIT,
LS_CONDIT TYPE BAPICONDIT,
LT_CONDQS TYPE STANDARD TABLE OF BAPICONDQS,
LS_CONDQS TYPE BAPICONDQS,
LT_CONDVS TYPE STANDARD TABLE OF BAPICONDVS,
LS_CONDVS TYPE BAPICONDVS,
LT_RETURN TYPE STANDARD TABLE OF BAPIRET2,
LS_RETURN TYPE BAPIRET2,
LT_KNUMHS TYPE STANDARD TABLE OF BAPIKNUMHS,
LS_KNUMHS TYPE BAPIKNUMHS,
LT_INITIAL TYPE STANDARD TABLE OF CND_MEM_INITIAL,
LS_INITIAL TYPE CND_MEM_INITIAL.
DATA:
LS_A991 TYPE A991.
*定价信息KEY字段
LS_A991-LIFNR = '1000000005'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = '10000000309'
IMPORTING
OUTPUT = LS_A991-MATNR
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
LS_A991-EKORG = '1000'.
LS_A991-WERKS = '100A'.
LS_A991-EKKOL = 'M'.
LS_A991-EAN11 = '20210721'.
LS_A991-KFRST = ''.
LS_CONDCT-OPERATION = '009'. "009创建 004更改 003删除
LS_CONDCT-COND_USAGE = 'A'. "定价用途
LS_CONDCT-TABLE_NO = '991'. "定价表
LS_CONDCT-APPLICATIO = 'M'. "M:采购 V:销售
LS_CONDCT-COND_TYPE = 'Z001'. "条件类型
LS_CONDCT-VALID_FROM = '20210719'. "有效期开始
LS_CONDCT-VALID_TO = '20220719'. "有效期结束
MOVE LS_A991+9(81) TO LS_CONDCT-VARKEY_LONG. "定价表KEY信息组合
LS_CONDCT-COND_NO = '$000000001'. "创建时该字段第一位需要为'$',更新时为条件信息记录编号
APPEND LS_CONDCT TO LT_CONDCT.
LS_CONDHD-OPERATION = '009'.
LS_CONDHD-CREATED_BY = SY-UNAME.
LS_CONDHD-CREAT_DATE = SY-DATUM.
LS_CONDHD-COND_USAGE = 'A'.
LS_CONDHD-TABLE_NO = '991'.
LS_CONDHD-APPLICATIO = 'M'.
LS_CONDHD-COND_TYPE = 'Z001'.
LS_CONDHD-VALID_FROM = '20210719'.
LS_CONDHD-VALID_TO = '20220719'.
MOVE LS_A991+9(81) TO LS_CONDHD-VARKEY_LONG.
LS_CONDHD-COND_NO = '$000000001'.
APPEND LS_CONDHD TO LT_CONDHD.
LS_CONDIT-OPERATION = '009'.
LS_CONDIT-APPLICATIO = 'M'.
LS_CONDIT-COND_TYPE = 'Z001'.
LS_CONDIT-COND_NO = '$000000001'.
LS_CONDIT-COND_COUNT = 01. "必须为01
LS_CONDIT-SCALETYPE = 'A'.
LS_CONDIT-CALCTYPCON = 'C'.
LS_CONDIT-COND_VALUE = '6.00'.
LS_CONDIT-CONDCURR = 'JPY'.
LS_CONDIT-COND_P_UNT = '1'.
LS_CONDIT-COND_UNIT = 'ST'.
LS_CONDIT-CONDCURREN = 'JPY'.
LS_CONDIT-COND_UNIT = 'ST'.
LS_CONDIT-CURRENCY = 'JPY'.
APPEND LS_CONDIT TO LT_CONDIT.
*条件记录创建
CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
* EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
* PI_PHYSICAL_DELETION =
TABLES
TI_BAPICONDCT = LT_CONDCT
TI_BAPICONDHD = LT_CONDHD
TI_BAPICONDIT = LT_CONDIT
TI_BAPICONDQS = LT_CONDQS
TI_BAPICONDVS = LT_CONDVS
TO_BAPIRET2 = LT_RETURN
TO_BAPIKNUMHS = LT_KNUMHS
TO_MEM_INITIAL = LT_INITIAL
EXCEPTIONS
UPDATE_ERROR = 1
OTHERS = 2.
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE CA 'EAX'.
ENDLOOP.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
CL_DEMO_OUTPUT=>DISPLAY( LT_RETURN ).
如果不知道MEK1前台创建的记录定价底表是哪个,可以按照如下方式去查看
以上为创建条件记录的方式,下面看修改和删除;
比如先创建一个条件记录的有效区间为(价格信息在KONH及KONP表中):
2021/07/21~9999/12/31,价格为5 CNY
现在新增一条有效区间为:
2023/07/21~2023/12/31,价格为6 CNY
那么理论上最终结果在A991定价表中应该有三条,分别为:
2021/07/21~2023/07/20,价格为5 CNY
2023/07/21~2023/12/31,价格为6 CNY
2024/01/01~9999/12/31,价格为5 CNY
所以这种场景下,使用BAPI_PRICES_CONDITIONS去更新定价时,应该操作三次数据:
2021/07/21~9999/12/31,价格为5 CNY => 2021/07/21~2023/07/20,价格为5 CNY 更新
2023/07/21~2023/12/31,价格为6 CNY 新增
2024/01/01~9999/12/31,价格为5 CNY 新增
新增传值参考上文,更新传值demo如下:
LS_CONDCT-OPERATION = '004'. "009创建 004更改 003删除
LS_CONDCT-COND_USAGE = 'A'. "定价用途
LS_CONDCT-TABLE_NO = '991'. "定价表
LS_CONDCT-APPLICATIO = 'M'. "M:采购 V:销售
LS_CONDCT-COND_TYPE = 'ZNN1'. "条件类型
LS_CONDCT-VALID_FROM = '20210721'. "有效期开始
LS_CONDCT-VALID_TO = '20231231'. "有效期结束
LS_CONDCT-VARKEY_LONG = LS_A991+9(81). "定价表KEY信息组合
LS_CONDCT-COND_NO = '0000010964'. "更新时为条件信息记录编号
APPEND LS_CONDCT TO LT_CONDCT.
LS_CONDHD-OPERATION = '004'.
LS_CONDHD-CREATED_BY = SY-UNAME.
LS_CONDHD-CREAT_DATE = SY-DATUM.
LS_CONDHD-COND_USAGE = 'A'.
LS_CONDHD-TABLE_NO = '991'.
LS_CONDHD-APPLICATIO = 'M'.
LS_CONDHD-COND_TYPE = 'ZNN1'.
LS_CONDHD-VALID_FROM = '20210721'.
LS_CONDHD-VALID_TO = '20231231'.
LS_CONDHD-VARKEY_LONG = LS_A991+9(81).
LS_CONDHD-COND_NO = '0000010964'.
APPEND LS_CONDHD TO LT_CONDHD.
LS_CONDIT-OPERATION = '004'.
LS_CONDIT-APPLICATIO = 'M'.
LS_CONDIT-COND_TYPE = 'ZNN1'.
LS_CONDIT-COND_NO = '0000010964'.
LS_CONDIT-COND_COUNT = 01. "必须为01
LS_CONDIT-SCALETYPE = 'A'.
LS_CONDIT-CALCTYPCON = 'C'.
LS_CONDIT-COND_VALUE = '14.00'.
LS_CONDIT-CONDCURR = 'CNY'.
LS_CONDIT-COND_P_UNT = '1'.
LS_CONDIT-COND_UNIT = 'ST'.
LS_CONDIT-CONDCURREN = 'CNY'.
LS_CONDIT-COND_UNIT = 'ST'.
LS_CONDIT-CURRENCY = 'CNY'.
APPEND LS_CONDIT TO LT_CONDIT.
另外一种场景,可能会对某个区间的条件记录做删除标记,传值demo如下:
LS_CONDCT-OPERATION = '003'. "009创建 004更改 003删除
LS_CONDCT-COND_USAGE = 'A'. "定价用途
LS_CONDCT-TABLE_NO = '991'. "定价表
LS_CONDCT-APPLICATIO = 'M'. "M:采购 V:销售
LS_CONDCT-COND_TYPE = 'Z001'. "条件类型
LS_CONDCT-VALID_FROM = '20210721'. "有效期开始
LS_CONDCT-VALID_TO = '99991231'. "有效期结束
LS_CONDCT-VARKEY_LONG = LS_A991+9(81). "定价表KEY信息组合
LS_CONDCT-COND_NO = '0000252967'. "更新时为条件信息记录编号
APPEND LS_CONDCT TO LT_CONDCT.
LS_CONDHD-OPERATION = '003'.
LS_CONDHD-CREATED_BY = SY-UNAME.
LS_CONDHD-CREAT_DATE = SY-DATUM.
LS_CONDHD-COND_USAGE = 'A'.
LS_CONDHD-TABLE_NO = '991'.
LS_CONDHD-APPLICATIO = 'M'.
LS_CONDHD-COND_TYPE = 'Z001'.
LS_CONDHD-VALID_FROM = '20210721'.
LS_CONDHD-VALID_TO = '99991231'.
LS_CONDHD-VARKEY_LONG = LS_A991+9(81).
LS_CONDHD-COND_NO = '0000252967'.
APPEND LS_CONDHD TO LT_CONDHD.
LS_CONDIT-OPERATION = '003'.
LS_CONDIT-APPLICATIO = 'M'.
LS_CONDIT-COND_TYPE = 'Z001'.
LS_CONDIT-COND_NO = '0000252967'.
LS_CONDIT-COND_COUNT = 01. "必须为01
LS_CONDIT-SCALETYPE = 'A'.
LS_CONDIT-CALCTYPCON = 'C'.
LS_CONDIT-COND_VALUE = '14.00'.
LS_CONDIT-CONDCURR = 'CNY'.
LS_CONDIT-COND_P_UNT = '1'.
LS_CONDIT-COND_UNIT = 'ST'.
LS_CONDIT-CONDCURREN = 'CNY'.
LS_CONDIT-COND_UNIT = 'ST'.
LS_CONDIT-CURRENCY = 'CNY'.
LS_CONDIT-INDIDELETE = 'X'. "删除标记
APPEND LS_CONDIT TO LT_CONDIT.
IDOC_INPUT_COND_A 的使用方式
该函数只支持创建模式,会自动针对于有效期区间去做条件记录的拆分,比如Key值相同的情况下,先创建一条有效区间为2021/07/21~9999/12/31的记录,再创建一条2031/01/01~2024/12/13的记录,会自动拆分产生三条记录,有一点要注意的是,debug时候发现底层varkey映射的时候,针对物料字段,S4系统新的长度为40位,但是字段映射时候是只截取18位的,按照旧的物料字段长度去截取的,所以传值时需要注意。
*&---------------------------------------------------------------------*
*& Report ZTEST_MEK1_IDOC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_MEK1_IDOC.
DATA:
LV_INPUT_METHOD TYPE BDWFAP_PAR-INPUTMETHD,
LV_MASS_PROCESSING TYPE BDWFAP_PAR-MASS_PROC,
LT_IDOC_CONTRL TYPE STANDARD TABLE OF EDIDC,
LS_IDOC_CONTRL TYPE EDIDC,
LT_IDOC_DATA TYPE STANDARD TABLE OF EDIDD,
LS_IDOC_DATA TYPE EDIDD,
LT_IDOC_STATUS TYPE STANDARD TABLE OF BDIDOCSTAT,
LS_IDOC_STATUS TYPE BDIDOCSTAT,
LT_RETURN_VARIABLES TYPE STANDARD TABLE OF BDWFRETVAR,
LT_SERIALIZATION_INFO TYPE STANDARD TABLE OF BDI_SER.
DATA:
LS_KOMG TYPE E1KOMG,
LS_KONH TYPE E1KONH,
LS_KONP TYPE E1KONP,
LS_A991 TYPE A991.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = '10000000001'
IMPORTING
OUTPUT = LS_A991-MATNR
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
LS_A991-LIFNR = '1000000005'.
LS_A991-EKORG = '1000'.
LS_A991-WERKS = '100A'.
LS_A991-EKKOL = 'M'.
LS_A991-EAN11 = 'test0721'.
LS_A991-KFRST = ''.
**********************************************************************IDOC HEADER
LS_IDOC_CONTRL-DOCTYP = 'COND_A04'. "IDOC类型
LS_IDOC_CONTRL-MESTYP = 'COND_A'. "消息类型
LS_IDOC_CONTRL-DOCREL = '700'. "版本
*LS_IDOC_CONTRL-RCVPRT = 'LS'. "接收方伙伴类型
*LS_IDOC_CONTRL-RCVPRN = 'SAPSD1'. "接收方伙伴编号
*LS_IDOC_CONTRL-RCVPOR = 'SD1CLNT300'. "接收方逻辑系统
*
*LS_IDOC_CONTRL-SNDPRT = 'LS'. "发送方伙伴类型
*LS_IDOC_CONTRL-SNDPRN = 'SAPSD1'. "发送方伙伴编号
*LS_IDOC_CONTRL-SNDPOR = 'SD1CLNT300'. "发送方逻辑系统
APPEND LS_IDOC_CONTRL TO LT_IDOC_CONTRL.
**********************************************************************KOMG
LS_IDOC_DATA-SEGNUM = '1'. "层级
LS_IDOC_DATA-HLEVEL = '1'. "层级
LS_IDOC_DATA-SEGNAM = 'E1KOMG'. "KEY数据
LS_KOMG-KVEWE = 'A'. "定价用途
LS_KOMG-KOTABNR = '991'. "定价表
LS_KOMG-KAPPL = 'M'. "M:采购 V:销售
LS_KOMG-KSCHL = 'Z001'. "条件类型
LS_KOMG-VAKEY = |1000000005{ LS_A991-MATNR }{ LS_A991+59(31) }|. "定价表KEY信息组合 注意:物料的key只能放18位进去
LS_IDOC_DATA-SDATA = LS_KOMG.
APPEND LS_IDOC_DATA TO LT_IDOC_DATA.
CLEAR:
LS_KOMG,
LS_IDOC_DATA.
**********************************************************************KONH
LS_IDOC_DATA-SEGNUM = '2'. "层级
LS_IDOC_DATA-HLEVEL = '2'. "层级
LS_IDOC_DATA-SEGNAM = 'E1KONH'. "KONH
LS_KONH-KNUMH = '$000000001'. "创建
LS_KONH-DATAB = '20210721'. "有效期开始
LS_KONH-DATBI = '99991231'. "有效期结束
LS_IDOC_DATA-SDATA = LS_KONH.
APPEND LS_IDOC_DATA TO LT_IDOC_DATA.
CLEAR:
LS_KOMG,
LS_IDOC_DATA.
**********************************************************************KONP
LS_IDOC_DATA-SEGNUM = '3'. "层级
LS_IDOC_DATA-HLEVEL = '3'. "层级
LS_IDOC_DATA-SEGNAM = 'E1KONP'. "KONP
LS_KONP-KSCHL = 'Z001'. "条件类型
LS_KONP-KBETR = '500'. "价格
LS_KONP-KRECH = 'C'. "条件计算类型
LS_KONP-STFKZ = 'A'.
LS_KONP-KPEIN = '1'. "单位
LS_KONP-KMEIN = 'PCE'. "物料单位,例单位为PC,这里赋值为T006-MSEHI = 'ST' 去取得的ISOCODE,即PCE
LS_KONP-KONWA = 'JPY'. "货币
LS_KONP-LOEVM_KO = 'X'. "要删除时只需要打上该标记,其余字段传值不变
LS_IDOC_DATA-SDATA = LS_KONP.
LS_IDOC_DATA-SDATA = LS_KONP.
APPEND LS_IDOC_DATA TO LT_IDOC_DATA.
CLEAR:
LS_KOMG,
LS_IDOC_DATA.
CALL FUNCTION 'IDOC_INPUT_COND_A'
EXPORTING
INPUT_METHOD = LV_INPUT_METHOD
MASS_PROCESSING = LV_MASS_PROCESSING
* IMPORTING
* WORKFLOW_RESULT =
* APPLICATION_VARIABLE =
* IN_UPDATE_TASK =
* CALL_TRANSACTION_DONE =
TABLES
IDOC_CONTRL = LT_IDOC_CONTRL
IDOC_DATA = LT_IDOC_DATA
IDOC_STATUS = LT_IDOC_STATUS
RETURN_VARIABLES = LT_RETURN_VARIABLES
SERIALIZATION_INFO = LT_SERIALIZATION_INFO
EXCEPTIONS
WRONG_FUNCTION_CALLED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CL_DEMO_OUTPUT=>NEW( )->WRITE_DATA( LT_IDOC_STATUS
)->WRITE_DATA( LT_RETURN_VARIABLES
)->DISPLAY( ).
RV_CONDITION_COPY、RV_CONDITION_SAVE、RV_CONDITION_RESET 的使用方式
该方法会自动拆分创建条件记录,底层调用的是跟前台一样的逻辑,IDOC_INPUT_COND_A函数里面调用的就是该方法,所以也会自动拆分条件记录。
创建demo如下,需要注意的是,KEEP_OLD_RECORDS参数需要打上 'X' ,因为实际测试中发现假如上一条记录为更新删除标记,后面调用此方法创建出来的记录都会打上删除标记(即KONP-LOEVM_KO = 'X'),KEEP_OLD_RECORDS设置为 'X' 可以保证创建出来的新纪录不会打上删除标记。
*&---------------------------------------------------------------------*
*& Report ZTEST_MEK1_BAPI
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_MEK1_BAPI.
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,
LT_KNUMH_COMP TYPE TABLE OF KNUMH_COMP,
LS_KNUMH_COMP TYPE KNUMH_COMP,
LS_KOMK TYPE KOMK,
LS_KOMP TYPE KOMP,
LV_RECORD TYPE KONH-KNUMH.
" key fields
LS_KEY_FIELDS-LIFNR = '1000000006'.
LS_KEY_FIELDS-EKORG = '1000'.
LS_KEY_FIELDS-MATNR = '000000010000000017'.
LS_KEY_FIELDS-WERKS = '100A'.
LS_KEY_FIELDS-EKKOL = 'S'.
LS_KEY_FIELDS-EAN11 = 'TESTBAPI_9'.
LS_KEY_FIELDS-KFRST = ''.
CLEAR LS_COPY_RECORDS.
" condtion fields
LS_COPY_RECORDS-KOPOS = '01'.
LS_COPY_RECORDS-KSCHL = 'Z001'.
LS_COPY_RECORDS-KAPPL = 'M'.
LS_COPY_RECORDS-WAERS = 'JPY'.
LS_COPY_RECORDS-KMEIN = 'ST'.
LS_COPY_RECORDS-KBETR = '30'.
LS_COPY_RECORDS-KPEIN = '1'.
LS_COPY_RECORDS-KZBZG = 'C'.
LS_COPY_RECORDS-STFKZ = 'A'.
APPEND LS_COPY_RECORDS TO LT_COPY_RECORDS.
CLEAR LS_COPY_RECORDS.
CALL FUNCTION 'RV_CONDITION_RESET'.
CALL FUNCTION 'RV_CONDITION_COPY'
EXPORTING
APPLICATION = 'M'
CONDITION_TABLE = '991'
CONDITION_TYPE = 'Z001'
DATE_FROM = '20210721'
DATE_TO = '99991231'
KEY_FIELDS = LS_KEY_FIELDS
MAINTAIN_MODE = 'A' "A:创建 B:更新
OVERLAP_CONFIRMED = 'X'
USED_BY_IDOC = 'X'
KEEP_OLD_RECORDS = 'X'
IMPORTING
E_KOMK = LS_KOMK
E_KOMP = LS_KOMP
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.
" commit and get condition NO.
CALL FUNCTION 'RV_CONDITION_SAVE'
TABLES
KNUMH_MAP = LT_KNUMH_COMP.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CALL FUNCTION 'RV_CONDITION_RESET'.
READ TABLE LT_KNUMH_COMP INTO LS_KNUMH_COMP INDEX 1.
IF SY-SUBRC = 0 AND LS_KNUMH_COMP-KNUMH_NEW IS NOT INITIAL.
MESSAGE LS_KNUMH_COMP-KNUMH_NEW TYPE 'S'.
ELSE.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
更新demo如下,需要注意的是,更新时需要指定LS_COPY_RECORDS-KNUMH为要更新的条件记录编号、传入参数的SELECTION_DATE设置为起始日期、MAINTAIN_MODE设置为 'B';
另外,如果需要更新删除标记字段,除了设置LS_COPY_RECORDS-LOEVM_KO = 'X',还需要将KEEP_OLD_RECORDS = '',否则不会更新删除标记字段。
*&---------------------------------------------------------------------*
*& Report ZTEST_MEK1_BAPI
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_MEK1_BAPI.
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,
LT_KNUMH_COMP TYPE TABLE OF KNUMH_COMP,
LS_KNUMH_COMP TYPE KNUMH_COMP,
LS_KOMK TYPE KOMK,
LS_KOMP TYPE KOMP,
LV_RECORD TYPE KONH-KNUMH.
" key fields
LS_KEY_FIELDS-LIFNR = '1000000006'.
LS_KEY_FIELDS-EKORG = '1000'.
LS_KEY_FIELDS-MATNR = '000000010000000017'.
LS_KEY_FIELDS-WERKS = '100A'.
LS_KEY_FIELDS-EKKOL = 'S'.
LS_KEY_FIELDS-EAN11 = 'TESTBAPI_9'.
LS_KEY_FIELDS-KFRST = ''.
CLEAR LS_COPY_RECORDS.
" condtion fields
LS_COPY_RECORDS-KNUMH = '0000253006'.
LS_COPY_RECORDS-KOPOS = '01'.
LS_COPY_RECORDS-KSCHL = 'Z001'.
LS_COPY_RECORDS-KAPPL = 'M'.
LS_COPY_RECORDS-WAERS = 'JPY'.
LS_COPY_RECORDS-KMEIN = 'ST'.
LS_COPY_RECORDS-KBETR = '30'.
LS_COPY_RECORDS-KPEIN = '1'.
LS_COPY_RECORDS-KZBZG = 'C'.
LS_COPY_RECORDS-STFKZ = 'A'.
LS_COPY_RECORDS-LOEVM_KO = 'X'.
APPEND LS_COPY_RECORDS TO LT_COPY_RECORDS.
CLEAR LS_COPY_RECORDS.
CALL FUNCTION 'RV_CONDITION_RESET'.
CALL FUNCTION 'RV_CONDITION_COPY'
EXPORTING
APPLICATION = 'M'
CONDITION_TABLE = '991'
CONDITION_TYPE = 'Z001'
DATE_FROM = '20210721'
DATE_TO = '99991231'
KEY_FIELDS = LS_KEY_FIELDS
MAINTAIN_MODE = 'B'
OVERLAP_CONFIRMED = 'X'
USED_BY_IDOC = 'X'
* KEEP_OLD_RECORDS = 'X'
SELECTION_DATE = '20230721'
IMPORTING
E_KOMK = LS_KOMK
E_KOMP = LS_KOMP
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.
" commit and get condition NO.
CALL FUNCTION 'RV_CONDITION_SAVE'
TABLES
KNUMH_MAP = LT_KNUMH_COMP.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CALL FUNCTION 'RV_CONDITION_RESET'.
READ TABLE LT_KNUMH_COMP INTO LS_KNUMH_COMP INDEX 1.
IF SY-SUBRC = 0 AND LS_KNUMH_COMP-KNUMH_NEW IS NOT INITIAL.
MESSAGE LS_KNUMH_COMP-KNUMH_NEW TYPE 'S'.
ELSE.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
以上。