PLM 通过接口实现 物料各层级状态修改
接口搭建
功能实现
FUNCTION zfm_plm_001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(INPUT) TYPE ZSTPLM_001_INPUT
*" EXPORTING
*" VALUE(OUTPUT) TYPE ZSTPLM_001_OUTPUT
*"----------------------------------------------------------------------
*--init
PERFORM frm_init USING 'ZFM_PLM_001'.
*--json in
gv_json_in = zcl_common=>abap_to_json( input ).
*--if active check
PERFORM frm_check_active USING gc_i.
IF gv_active EQ abap_true.
*--input check
IF input[] IS INITIAL.
APPEND VALUE #( code = 'E' msg = '输入数据为空,请检查!') TO output.
ELSE.
PERFORM frm_material_del_flag_chg TABLES input output.
ENDIF.
ELSE.
PERFORM frm_001_ret_e TABLES input output.
ENDIF.
*--json out
gv_json_out = zcl_common=>abap_to_json( output ).
*--set log
PERFORM frm_set_log USING gc_i.
ENDFUNCTION.
核心逻辑
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_material_del_flag_chg
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> INPUT
*& --> OUTPUT
*&---------------------------------------------------------------------*
FORM frm_material_del_flag_chg TABLES pt_input TYPE zstplm_001_input
pt_output TYPE zstplm_001_output.
DATA:lv_fjt_flag TYPE c.
LOOP AT pt_input.
gv_matnr = |{ pt_input-matnr ALPHA = IN }|.
APPEND INITIAL LINE TO pt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
<fs_output>-matnr = pt_input-matnr.
SELECT SINGLE * FROM mara INTO @DATA(ls_mara) WHERE matnr EQ @gv_matnr.
IF sy-subrc NE 0.
<fs_output> = VALUE #( BASE <fs_output>
code = gc_e
msg = '该物料不存在,请检查' ) .
gv_type = gc_e.
CONTINUE.
ENDIF.
"物料检查是否进行集团级别删除
PERFORM frm_material_del_jtcheck USING pt_input gv_matnr CHANGING lv_fjt_flag.
IF lv_fjt_flag EQ abap_true."非集团操作
PERFORM frm_material_del_njt USING pt_input gv_matnr CHANGING <fs_output>.
ELSE."集团层级操作
PERFORM frm_material_del_jt USING pt_input gv_matnr CHANGING <fs_output>.
ENDIF.
READ TABLE <fs_output>-o_werks INTO DATA(ls_werks) WITH KEY code = gc_e.
IF sy-subrc EQ 0.
<fs_output> = VALUE #( BASE <fs_output> code = gc_e msg = '处理失败' ).
ELSE.
<fs_output> = VALUE #( BASE <fs_output> code = gc_s msg = '处理成功' ).
ENDIF.
IF gv_type NE gc_e.
gv_type = <fs_output>-code.
ENDIF.
ENDLOOP.
ENDFORM.
定义
CONSTANTS:gc_i TYPE zietype VALUE 'I',
gc_o TYPE zietype VALUE 'O',
gc_w TYPE zietype VALUE 'W',
gc_e TYPE zietype VALUE 'E',
gc_s TYPE zietype VALUE 'S'.
DATA: gv_sysid TYPE ze_sysid01,
gv_id TYPE ze_zid01,
gv_zname TYPE rs38l_fnam,
gv_guid TYPE sysuuid_c,
gv_active TYPE c,
gv_msg TYPE string,
gv_type TYPE c,
gv_json_in TYPE string,
gv_json_out TYPE string.
DATA:gv_matnr TYPE char18.
TYPES:BEGIN OF typ_001_input_trans,
matnr TYPE string,
werks TYPE string,
matnr_in TYPE matnr,
END OF typ_001_input_trans.
DEFINE material_input.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = &1
IMPORTING
output = &1
EXCEPTIONS
length_error = 1
OTHERS = 2.
END-OF-DEFINITION .
子例程
*&---------------------------------------------------------------------*
*& Form frm_material_del_flag_chg
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> INPUT
*& --> OUTPUT
*&---------------------------------------------------------------------*
FORM frm_material_del_flag_chg TABLES pt_input TYPE zstplm_001_input
pt_output TYPE zstplm_001_output.
DATA:lv_fjt_flag TYPE c.
LOOP AT pt_input.
gv_matnr = |{ pt_input-matnr ALPHA = IN }|.
APPEND INITIAL LINE TO pt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
<fs_output>-matnr = pt_input-matnr.
SELECT SINGLE * FROM mara INTO @DATA(ls_mara) WHERE matnr EQ @gv_matnr.
IF sy-subrc NE 0.
<fs_output> = VALUE #( BASE <fs_output>
code = gc_e
msg = '该物料不存在,请检查' ) .
gv_type = gc_e.
CONTINUE.
ENDIF.
"物料检查是否进行集团级别删除
PERFORM frm_material_del_jtcheck USING pt_input gv_matnr CHANGING lv_fjt_flag.
IF lv_fjt_flag EQ abap_true."非集团操作
PERFORM frm_material_del_njt USING pt_input gv_matnr CHANGING <fs_output>.
ELSE."集团层级操作
PERFORM frm_material_del_jt USING pt_input gv_matnr CHANGING <fs_output>.
ENDIF.
READ TABLE <fs_output>-o_werks INTO DATA(ls_werks) WITH KEY code = gc_e.
IF sy-subrc EQ 0.
<fs_output> = VALUE #( BASE <fs_output> code = gc_e msg = '处理失败' ).
ELSE.
<fs_output> = VALUE #( BASE <fs_output> code = gc_s msg = '处理成功' ).
ENDIF.
IF gv_type NE gc_e.
gv_type = <fs_output>-code.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_JTCHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> PT_INPUT
*& <-- LV_JT_FLAG
*&---------------------------------------------------------------------*
FORM frm_material_del_jtcheck USING ps_input TYPE zsplm_001_input
gv_matnr TYPE char18
CHANGING cv_flag TYPE char1.
CLEAR:cv_flag."不进行集团操作
DATA:lt_marc_in TYPE STANDARD TABLE OF marc WITH HEADER LINE,
lt_marc TYPE STANDARD TABLE OF marc WITH HEADER LINE.
lt_marc_in[] = CORRESPONDING #( ps_input-i_marc ).
SORT lt_marc_in.
SELECT *
FROM marc
INTO TABLE lt_marc
WHERE matnr = gv_matnr.
LOOP AT lt_marc.
"传入物料对应工厂,包含物料已扩充的所有工厂,则进行集团层级操作
READ TABLE lt_marc_in WITH KEY werks = lt_marc-werks BINARY SEARCH.
IF sy-subrc NE 0.
cv_flag = abap_true.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_NJT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> PT_INPUT
*& --> GV_MATNR
*& --> LV_FJT_FLAG
*& <-- <FS_OUTPUT>
*&---------------------------------------------------------------------*
FORM frm_material_del_njt USING ps_input TYPE zsplm_001_input
pv_matnr TYPE char18
CHANGING cs_output TYPE zsplm_001_ret.
LOOP AT ps_input-i_marc INTO DATA(ls_marc).
PERFORM frm_material_del_single USING ls_marc-werks ps_input CHANGING cs_output.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_SINGLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_MARC_WERKS
*& <-- CS_OUTPUT
*&---------------------------------------------------------------------*
FORM frm_material_del_single USING pv_werks
ps_input TYPE zsplm_001_input
CHANGING cs_output TYPE zsplm_001_ret.
DATA(ls_rm03g) = VALUE rm03g( matnr = gv_matnr
"werks = ls_marc-werks
"lvobw = COND #( WHEN pt_input-flag EQ 'Y' THEN space ELSE abap_true )
"lvobk = COND #( WHEN pt_input-flag EQ 'Y' THEN space ELSE abap_true )
"lvoma = COND #( WHEN pt_input-flag EQ 'Y' THEN space ELSE abap_true )
lvowk = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
lvolg = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
lvoln = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
lvolt = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
lvovk = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
lvoba = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
).
IF pv_werks IS NOT INITIAL."非集团操作
ls_rm03g-werks = pv_werks.
ELSE."集团层级操作
ls_rm03g-lvobw = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true ).
ls_rm03g-lvobk = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true ).
ls_rm03g-lvoma = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true ).
ENDIF.
CALL FUNCTION 'SET_LVORM_MATERIAL'
EXPORTING
material_record = ls_rm03g
write_change_documents = abap_true
uname = sy-uname
EXCEPTIONS
kein_buchungskreis = 1
inkons_custom = 2
kein_bewertungskreis = 3
keine_lagernummer = 4
kein_lagerort = 5
kein_lagertyp = 6
keine_vkorg = 7
kein_vertriebsweg = 8
kein_werk = 9
no_material = 10
OTHERS = 11.
IF pv_werks IS NOT INITIAL.
APPEND VALUE #( werks = pv_werks
code = COND #( WHEN sy-subrc NE 0 THEN gc_e ELSE gc_s )
msg = COND #( WHEN sy-subrc NE 0 THEN COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作失败'
ELSE COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作成功' )
) TO cs_output-o_werks .
ELSE.
LOOP AT ps_input-i_marc INTO DATA(ls_marc).
APPEND VALUE #( werks = ls_marc-werks
code = COND #( WHEN sy-subrc NE 0 THEN gc_e ELSE gc_s )
msg = COND #( WHEN sy-subrc NE 0 THEN COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作失败'
ELSE COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作成功' )
) TO cs_output-o_werks .
ENDLOOP.
ENDIF.
cs_output-code = COND #( WHEN cs_output-code NE gc_e THEN COND #( WHEN sy-subrc NE 0 THEN gc_e ELSE gc_s )
ELSE cs_output-code ).
cs_output-msg = COND #( WHEN cs_output-code EQ gc_s THEN '操作成功' ELSE '操作失败' ).
CLEAR ls_rm03g.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_JT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> PT_INPUT
*& --> GV_MATNR
*& <-- <FS_OUTPUT>
*&---------------------------------------------------------------------*
FORM frm_material_del_jt USING ps_input TYPE zsplm_001_input
pv_matnr TYPE char18
CHANGING cs_output TYPE zsplm_001_ret.
PERFORM frm_material_del_single USING '' ps_input CHANGING cs_output.
ENDFORM.
涉及公共方法
zcl_common=>abap_to_json
ABAP TYPE ANY 输入abap数据
PRETTY_NAME TYPE CHAR1 OPTIONAL j输出json格式
value( JSON ) TYPE STRING 输出json数据
METHOD abap_to_json.
TRY.
json = /ui2/cl_json=>serialize( data = abap pretty_name = pretty_name ).
CATCH cx_root INTO DATA(lr_root).
DATA(l_str) = lr_root->get_text( ).
MESSAGE l_str TYPE 'S'.
ENDTRY.
ENDMETHOD.
zcl_common=>abap_to_json
ABAP TYPE ANY 输入abap数据
PRETTY_NAME TYPE CHAR1 OPTIONAL j输出json格式
value( JSON ) TYPE STRING 输出json数据
METHOD abap_to_json.
TRY.
json = /ui2/cl_json=>serialize( data = abap pretty_name = pretty_name ).
CATCH cx_root INTO DATA(lr_root).
DATA(l_str) = lr_root->get_text( ).
MESSAGE l_str TYPE 'S'.
ENDTRY.
ENDMETHOD.
zcl_common=>get_guid
METHOD get_guid.
TRY.
rv_guid = cl_system_uuid=>create_uuid_c32_static( ).
CATCH cx_uuid_error.
rv_guid = cl_fdt_uuid=>get_uuid( ).
ENDTRY.
ENDMETHOD.
zcl_common=>bapi_commit
METHOD bapi_commit.
IF type <> 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDMETHOD.