Folgende Bausteine sind ab S/4 HANA verfügbar:
Variante 1 (Anlegen und ändern eines Infosatzes)
* Testlauf?
PARAMETERS: p_test TYPE abap_bool DEFAULT abap_true.
* Kennzeichen Regellieferant?
PARAMETERS: p_relif TYPE abap_bool DEFAULT abap_true.
* Nummer des Einkaufsinfosatzes EINA
PARAMETERS: p_infnr TYPE infnr.
* Materialnummer MARA
PARAMETERS: p_matnr TYPE matnr.
* Lieferant LFA1
PARAMETERS: p_lifnr TYPE lfa1-lifnr.
* Basismengeneinheit T006
PARAMETERS: p_meins TYPE t006-msehi DEFAULT 'ST'.
* Bestellmengeneinheit T006
PARAMETERS: p_bstme TYPE t006-msehi DEFAULT 'ST'.
* Zähler für die Umrechnung BPRME in BME
PARAMETERS: p_bpumz TYPE bpumz DEFAULT '1'.
* Nenner für die Umrechnung BPRME in BME
PARAMETERS: p_bpumn TYPE bpumn DEFAULT '1'.
* Einkaufsorganisation T024E
PARAMETERS: p_ekorg TYPE t024e-ekorg.
* Werk T001W
PARAMETERS: p_werks TYPE werks_d.
* Typ des Einkaufsinfosatzes
* 0 Normal
* 2 Konsignation
* 3 Lohnbearbeitung
* P Pipeline
* 1 Chargeable
PARAMETERS: p_esokz TYPE esokz DEFAULT '0'.
* Planlieferzeit in Tagen
PARAMETERS: p_plifz TYPE plifz DEFAULT '5'.
* Einkäufergruppe T024
PARAMETERS: p_bkgrp TYPE t024-ekgrp.
* Umsatzsteuerkennzeichen T007A
PARAMETERS: p_mwskz TYPE t007a-mwskz DEFAULT 'V1'.
* Konditionsbetrag
PARAMETERS: p_kbetr TYPE konp-kbetr DEFAULT '100.0'.
START-OF-SELECTION.
* Einkaufsinfosatz - allgemeine Daten
SELECT SINGLE FROM eina
FIELDS infnr
WHERE matnr = @p_matnr
AND lifnr = @p_lifnr
INTO @DATA(lv_infnr).
* Schalter für Neuanlage oder Update Tabellen EINA und EINE
DATA(lv_eina_update) = abap_true.
DATA(lv_eine_update) = abap_false.
IF sy-subrc = 0.
lv_eina_update = abap_true.
* Einkaufsinfosatz - Einkaufsorganisationsdaten
SELECT SINGLE FROM eine
FIELDS loekz
WHERE infnr = @lv_infnr
AND werks = @p_werks
INTO @DATA(lv_loekz).
IF sy-subrc = 0.
lv_eine_update = abap_true.
ELSE.
lv_eine_update = abap_false.
ENDIF.
ELSE.
lv_eina_update = abap_false.
ENDIF.
DATA(ls_eina) = VALUE mewieina( info_rec = COND infnr( WHEN lv_eina_update = abap_true THEN lv_infnr ELSE '' )
vendor = p_lifnr
norm_vend = CONV relif( p_relif )
material = p_matnr
vend_mat = CONV idnlf( |{ p_matnr ALPHA = IN WIDTH = 10 }| )
base_uom = p_meins
po_unit = p_bstme
conv_num1 = p_bpumz
conv_den1 = p_bpumn ).
DATA(ls_einax) = VALUE mewieinax( info_rec = lv_eina_update " Infosatz neu/update
vendor = 'X'
norm_vend = p_relif
material = 'X'
base_uom = 'X'
po_unit = 'X'
conv_num1 = 'X'
conv_den1 = 'X' ).
DATA(ls_eine) = VALUE mewieine( info_rec = COND infnr( WHEN lv_eine_update = abap_true THEN lv_infnr ELSE '' )
purch_org = p_ekorg
plant = p_werks
info_type = p_esokz
conv_num1 = p_bpumz
conv_den1 = p_bpumn
plnd_delry = p_plifz
pur_group = p_bkgrp
tax_code = p_mwskz
net_price = p_kbetr
currency = 'EUR'
price_unit = '1' ).
DATA(ls_einex) = VALUE mewieinex( info_rec = lv_eine_update " Infosatz neu/update
purch_org = 'X'
plant = 'X'
info_type = 'X'
conv_num1 = 'X'
conv_den1 = 'X'
plnd_delry = 'X'
pur_group = 'X'
tax_code = 'X' ).
* Konditionen
DATA: it_cond_validity TYPE STANDARD TABLE OF mewivalidity WITH DEFAULT KEY.
DATA: it_condition TYPE STANDARD TABLE OF mewicondition WITH DEFAULT KEY.
APPEND VALUE #( plant = p_werks
valid_from = sy-datum
valid_to = '99991231'
) TO it_cond_validity.
APPEND VALUE #( cond_type = 'PB00'
cond_value = p_kbetr
currency = 'EUR'
cond_p_unt = '1' " KPEIN '1'
cond_unit = p_bstme " KMEIN 'ST'
) TO it_condition.
DATA(it_return) = VALUE mewi_t_return( ).
* RFC Function Module to Create and Change Info Record
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_eina
i_einax = ls_einax
i_eine = ls_eine
i_einex = ls_einex
testrun = p_test
* IMPORTING
* E_EINA =
* E_EINE =
TABLES
* TXT_LINES =
cond_validity = it_cond_validity
condition = it_condition
* COND_SCALE_VALUE =
* COND_SCALE_QUAN =
return = it_return.
* Fehlerauswertung
DATA(lv_message) = ||.
LOOP AT it_return ASSIGNING FIELD-SYMBOL(<m>) WHERE type CA 'AEX'.
IF lv_message IS INITIAL.
lv_message = <m>-message.
ELSE.
lv_message = |{ lv_message }/{ <m>-message }|.
ENDIF.
WRITE: / <m>-message.
ENDLOOP.
IF lv_message IS INITIAL.
DATA(lv_return) = VALUE bapiret2( ).
* alles ok: COMMIT
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = lv_return.
WRITE: / lv_return-message.
ELSE.
* bei Fehlern: ROLLBACK
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
Variante 2 (Anlegen und ändern mehrerer Infosätze)
* https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=533669791
* SAP Note: 2492873 (Verbesserung im Beschaffungsprozess zur Pflege mehrerer Infosätze zusammen mit Konditionen)
* https://launchpad.support.sap.com/#/notes/2492873
* SAP Note: 3070467 (ME_INFORECORD_MAINTAIN_MULTI: Template for creating info record - SAP for Me)
* https://me.sap.com/notes/3070467/E
* RFC Function Module to Create and Change multiple Info Records
CALL FUNCTION 'ME_INFORECORD_MAINTAIN_MULTI'
* EXPORTING
* TESTRUN =
* IMPORTING
* ET_EINA =
* ET_EINE =
* TABLES
* T_EINA =
* T_EINAX =
* T_EINE =
* T_EINEX =
* TXT_LINES =
* COND_VALIDITY =
* CONDITION =
* COND_SCALE_VALUE =
* COND_SCALE_QUAN =
* RETURN =
.
DATA(lv_return) = VALUE bapiret2( ).
* Daten verbuchen
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true
IMPORTING
return = lv_return.
WRITE: / |COMMIT [{ lv_return-type } { lv_return-number }]: { lv_return-message }|.
Variante 3 (DMC_MIG_PURCH_INFO_RECORD)
DATA(lv_test) = abap_true.
DATA(ls_eina) = VALUE eina( ).
DATA: it_eine TYPE STANDARD TABLE OF eine WITH DEFAULT KEY.
* Migration of purchasing info record
* kapselt folgende Funktionsbausteine
* ME_INITIALIZE_INFORECORD
* ME_MAINTAIN_INFORECORD
* ME_POST_INFORECORD
CALL FUNCTION 'DMC_MIG_PURCH_INFO_RECORD'
EXPORTING
* ACTIVITY = 'H' " V - update, H - create
i_eina = ls_eina
* I_EINE =
* O_EINA =
* O_EINE =
* I_VORGA = 'B' " Kennung für die Anwendung, die den Funktionsbaustein aufruft: A - Integrierte Artikelpflege, B - ALE
testrun = lv_test
* IMPORTING
* E_EINA =
* E_EINE =
TABLES
* T_HEAD =
* T_LINE =
t_eine = it_eine.