Я искал стандартные ФМ. По ходу их нет. Сама транзакция заполняет их на основе классов. Я выдрал код и склеил упрощенную версию. В данном случае заполняю три строчки по драг металам из трех пар полей структуры:
Code:
*&---------------------------------------------------------------------*
*& Form create_glo
*&---------------------------------------------------------------------*
* Взято из группы функций GLO_FIAA_SCREENS
*----------------------------------------------------------------------*
FORM create_glo USING ps_data TYPE zaa_s_dc01_alv.
DATA: ls_key TYPE faa_s_asset_key,
lo_manager TYPE REF TO if_glo_master_data_mngr,
lt_precmsa TYPE j_3rf_precmtt WITH HEADER LINE,
ls_data TYPE glo_s_asset_data,
lo_msglist TYPE REF TO cl_hrbas_message_list,
lt_error TYPE hrbas_message_tab.
FIELD-SYMBOLS: <ls_error> LIKE LINE OF lt_error.
CHECK ps_data-bukrs IS NOT INITIAL AND ps_data-anln1 IS NOT INITIAL AND ps_data-anlkl IS NOT INITIAL.
" Заполняем таблицу данных
IF ps_data-preccode1 IS NOT INITIAL.
CLEAR lt_precmsa.
SELECT SINGLE * FROM j_3rf_precmet INTO CORRESPONDING FIELDS OF lt_precmsa WHERE preccode = ps_data-preccode1.
lt_precmsa-quantity = 1.
lt_precmsa-mass = ps_data-mass1.
APPEND lt_precmsa.
ENDIF.
IF ps_data-preccode2 IS NOT INITIAL.
CLEAR lt_precmsa.
SELECT SINGLE * FROM j_3rf_precmet INTO CORRESPONDING FIELDS OF lt_precmsa WHERE preccode = ps_data-preccode2.
lt_precmsa-quantity = 1.
lt_precmsa-mass = ps_data-mass2.
APPEND lt_precmsa.
ENDIF.
IF ps_data-preccode3 IS NOT INITIAL.
CLEAR lt_precmsa.
SELECT SINGLE * FROM j_3rf_precmet INTO CORRESPONDING FIELDS OF lt_precmsa WHERE preccode = ps_data-preccode3.
lt_precmsa-quantity = 1.
lt_precmsa-mass = ps_data-mass3.
APPEND lt_precmsa.
ENDIF.
CHECK lt_precmsa[] IS NOT INITIAL.
" Преобразуем данные в нужный формат
ls_key-orgunit = ps_data-bukrs.
ls_key-asset = ps_data-anln1.
ls_key-subnumber = ps_data-anln2.
MOVE-CORRESPONDING ls_key TO ls_data.
CALL FUNCTION 'J_3RF_PRECM_ASSET_PACK'
EXPORTING
tb_precmat = lt_precmsa[]
IMPORTING
preccodes = ls_data-glo_rus_precct
quantities = ls_data-glo_rus_precq
weights = ls_data-glo_rus_precw.
" Создаем менеджер
TRY.
CALL METHOD cf_glo_master_data_mngr=>find_by_key
EXPORTING
is_asset_key = ls_key
id_activity = '01'
id_assetclass = ps_data-anlkl
RECEIVING
ro_instance = lo_manager.
CATCH cx_faa_asset.
ps_data-message_type = sy-msgty.
ps_data-message_id = sy-msgid.
ps_data-message_number = sy-msgno.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno INTO ps_data-message
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDTRY.
CHECK lo_manager IS BOUND.
" Сохраняем данные
TRY.
CALL METHOD lo_manager->set_data
EXPORTING
is_data = ls_data.
CALL METHOD lo_manager->check_data
CHANGING
co_msglist = lo_msglist.
IF lo_msglist IS BOUND.
TRY.
CALL METHOD lo_msglist->get_message_list
IMPORTING
messages = lt_error.
LOOP AT lt_error ASSIGNING <ls_error>.
ROLLBACK WORK.
MOVE-CORRESPONDING <ls_error> TO sy.
RAISE EXCEPTION TYPE cx_faa_asset.
ENDLOOP.
CATCH cx_hrbas_violated_assertion.
ENDTRY.
ENDIF.
CATCH cx_faa_asset.
ps_data-message_type = sy-msgty.
ps_data-message_id = sy-msgid.
ps_data-message_number = sy-msgno.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno INTO ps_data-message
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDTRY.
TRY.
CALL METHOD lo_manager->if_faa_storable~store
EXPORTING
ib_update_task = 'X'.
CATCH cx_faa_storable.
ps_data-message_type = sy-msgty.
ps_data-message_id = sy-msgid.
ps_data-message_number = sy-msgno.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno INTO ps_data-message
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDTRY.
ENDFORM. "create_glo