背景:原本用ME11创建采购信息记录,但没有输入制造商的位置,所以改用MEK1创建采购信息记录。
解决方法:(详细步骤参考以下链接,本次选用RV_CONDITION_COPY方法)
MEK1/VK11创建条件记录BAPI_DeveloperMrMeng的博客-CSDN博客
总结三种创建条件记录的BAPI,均可为SD或者MM创建对应的条件记录,只需更改对应条件表信息及key的信息即可。
1.BAPI_PRICES_CONDITIONS
2.IDOC_INPUT_COND_A
3.RV_CONDITION_COPY、RV_CONDITION_SAVE、RV_CONDITION_RESET
具体代码步骤:
1、后台表A952是业务配置提供的
2、代码
(1)MEK1,创建数据
FORM frm_mek1_c1 USING pt_item TYPE zsrm_s_zfmmmsrm015 CHANGING pv_type pv_msg.
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,
ls_a952 TYPE STANDARD TABLE OF a952 WITH HEADER LINE,
ls_a951 TYPE STANDARD TABLE OF a951 WITH HEADER LINE,
lt_ztmm033 TYPE STANDARD TABLE OF ztmm033 WITH HEADER LINE.
DATA: lv_tab TYPE kotabnr.
"定价表
IF pt_item-remark01 = '01'. "采购组织层级
lv_tab = '952'.
"若条件信息完全一致,返回报错消息:价格条件已存在!
SELECT
SINGLE * INTO ls_a952
FROM a952
WHERE lifnr = pt_item-lifnr
AND matnr = pt_item-matnr
AND ekorg = pt_item-ekorg
AND esokz = pt_item-esokz
AND emlif = pt_item-mfrnr
AND datab = pt_item-datab
AND datbi = pt_item-datbi.
IF ls_a952 IS NOT INITIAL.
pv_msg = '价格条件已存在!'.
CLEAR ls_a952.
EXIT.
ENDIF.
ELSEIF pt_item-remark01 = 'S'. "工厂层级
lv_tab = '951'.
"若条件信息完全一致,返回报错消息:价格条件已存在!
SELECT
SINGLE * INTO ls_a951
FROM a951
WHERE lifnr = pt_item-lifnr
AND matnr = pt_item-matnr
AND ekorg = pt_item-ekorg
AND werks = pt_item-werks
AND esokz = pt_item-esokz
AND emlif = pt_item-mfrnr
AND datab = pt_item-datab
AND datbi = pt_item-datbi.
IF ls_a951 IS NOT INITIAL.
pv_msg = '价格条件已存在!'.
CLEAR ls_a951.
EXIT.
ENDIF.
ENDIF.
" key fields
ls_key_fields-lifnr = pt_item-lifnr. "'1000000006'.
ls_key_fields-ekorg = pt_item-ekorg. "'1000'.
ls_key_fields-matnr = pt_item-matnr. "'000000010000000017'.
IF pt_item-remark01 = 'S'.
ls_key_fields-werks = pt_item-werks. "'100A'.
ENDIF.
ls_key_fields-ekkol = 'S'. "'S'.
ls_key_fields-ean11 = 'TESTBAPI_9'.
ls_key_fields-kfrst = ''.
ls_key_fields-esokz = pt_item-esokz. "'0'.
ls_key_fields-emlif = pt_item-mfrnr.
CLEAR ls_copy_records.
" condtion fields
ls_copy_records-kopos = '01'.
ls_copy_records-kschl = pt_item-kschl. "'PB00'.
ls_copy_records-kappl = 'M'.
ls_copy_records-waers = pt_item-waers. "'JPY'.
ls_copy_records-kmein = pt_item-meins. "pt_item-kmein. "'ST'.
ls_copy_records-kbetr = pt_item-netpr. "pt_item-netpr.
ls_copy_records-kpein = pt_item-peinh. "'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 = lv_tab
condition_type = pt_item-kschl "'PB00'
date_from = pt_item-datab "'20220304'
date_to = pt_item-datbi "'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.
pv_type = 'S'.
pv_msg = ''.
ELSE.
pv_type = 'E'.
pv_msg = ''.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
(2)MEK2,更新数据(更新删除标识)
FORM frm_mek2_update1 USING pt_item TYPE zsrm_s_zfmmmsrm015 CHANGING pv_type pv_msg.
DATA: BEGIN OF bdcdata OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF bdcdata.
DATA:lt_message LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: lt_bapireturn TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE .
DATA:lv_mode TYPE c VALUE 'N'.
DATA: lv_netpr TYPE p DECIMALS 2,
ls_a951 TYPE a951,
ls_a952 TYPE a952,
lv_string TYPE vakey_long,
lv_knumh TYPE i,
lv_str TYPE c LENGTH 10,
lv_knumh_str TYPE a952-knumh.
DATA: BEGIN OF lt_a95tab OCCURS 0,
lifnr TYPE a952-lifnr,
matnr TYPE a952-matnr,
ekorg TYPE a952-ekorg,
esokz TYPE a952-esokz,
emlif TYPE a952-emlif,
datbi TYPE a952-datbi,
datab TYPE a952-datab,
knumh TYPE a952-knumh,
werks TYPE a951-werks,
kbetr TYPE konp-kbetr,
kpein TYPE konp-kpein,
kmein TYPE konp-kmein,
konwa TYPE konp-konwa,
END OF lt_a95tab.
DATA: lt_ztmm033 TYPE STANDARD TABLE OF ztmm033 WITH HEADER LINE .
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.
DATA: lv_tab TYPE kotabnr.
"定价表
IF pt_item-remark01 = '01'. "采购组织层级
lv_tab = '952'.
SELECT
a~lifnr a~matnr a~ekorg a~esokz a~emlif a~datbi a~datab a~knumh
b~kbetr b~kpein b~kmein b~konwa
INTO CORRESPONDING FIELDS OF TABLE lt_a95tab
FROM a952 AS a
INNER JOIN konp AS b
ON a~knumh = b~knumh
WHERE a~lifnr = pt_item-lifnr
AND a~matnr = pt_item-matnr
AND a~ekorg = pt_item-ekorg
AND a~esokz = pt_item-esokz
AND a~emlif = pt_item-mfrnr
* AND datab = pt_item-datab
AND a~datbi > pt_item-datbi
AND b~loevm_ko NE 'X'
.
ELSEIF pt_item-remark01 = 'S'. "工厂层级
lv_tab = '951'.
SELECT
a~lifnr a~matnr a~ekorg a~werks a~esokz a~emlif a~datbi a~datab a~knumh
b~kbetr b~kpein b~kmein b~konwa
INTO CORRESPONDING FIELDS OF TABLE lt_a95tab
FROM a951 AS a
INNER JOIN konp AS b
ON a~knumh = b~knumh
WHERE a~lifnr = pt_item-lifnr
AND a~matnr = pt_item-matnr
AND a~ekorg = pt_item-ekorg
AND a~werks = pt_item-werks
AND a~esokz = pt_item-esokz
AND a~emlif = pt_item-mfrnr
* AND datab = pt_item-datab
AND a~datbi > pt_item-datbi
AND b~loevm_ko NE 'X'
.
ENDIF.
IF lt_a95tab[] IS NOT INITIAL.
READ TABLE lt_a95tab INDEX 1.
" key fields
ls_key_fields-lifnr = lt_a95tab-lifnr. "'1000000006'.
ls_key_fields-ekorg = lt_a95tab-ekorg. "'1000'.
ls_key_fields-matnr = lt_a95tab-matnr. "'000000010000000017'
.
IF pt_item-remark01 = 'S'. "工厂层级.
ls_key_fields-werks = lt_a95tab-werks. "'100A'.
ENDIF.
* ls_key_fields-ekkol = 'S'. "'S'.
ls_key_fields-ean11 = 'TESTBAPI_9'.
ls_key_fields-kfrst = ''.
ls_key_fields-esokz = lt_a95tab-esokz. "'0'.
ls_key_fields-emlif = lt_a95tab-emlif.
CLEAR ls_copy_records.
" condtion fields
ls_copy_records-knumh = lt_a95tab-knumh. "'0000253006'.
ls_copy_records-kopos = '01'.
ls_copy_records-kschl = pt_item-kschl. "'Z001'.
ls_copy_records-kappl = 'M'.
ls_copy_records-waers = lt_a95tab-konwa. "pt_item-waers. "'JPY'.
ls_copy_records-kmein = lt_a95tab-kmein. "pt_item-kmein. "'ST'.
ls_copy_records-kbetr = lt_a95tab-kbetr. "pt_item-netpr.
ls_copy_records-kpein = lt_a95tab-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 = lv_tab
condition_type = pt_item-kschl "'PB00'
date_from = lt_a95tab-datab "'20220304'
date_to = lt_a95tab-datbi "'99991231'
key_fields = ls_key_fields
maintain_mode = 'B' "A:创建 B:更新
overlap_confirmed = 'X'
used_by_idoc = 'X'
keep_old_records = ''
selection_date = lt_a95tab-datab "'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.
"成功后存储表ztmm033
lt_ztmm033-lifnr = pt_item-lifnr.
lt_ztmm033-matnr = pt_item-matnr.
lt_ztmm033-ekorg = pt_item-ekorg.
lt_ztmm033-remark01 = pt_item-remark01.
lt_ztmm033-esokz = pt_item-esokz.
lt_ztmm033-emlif = pt_item-mfrnr.
lt_ztmm033-wglif = pt_item-wglif.
lt_ztmm033-bstma = pt_item-bstma.
lt_ztmm033-zdate = sy-datum.
lt_ztmm033-ztime = sy-uzeit.
APPEND lt_ztmm033.
MODIFY ztmm033 FROM TABLE lt_ztmm033[].
COMMIT WORK.
CLEAR:lt_ztmm033,lt_ztmm033[].
ENDIF.
ENDFORM.