原因:需要供应商区分权限, A部门只能维护显示一部分供应商, 找到了供应商账户组,标准权限对象F_LFA1_GRP, 可按账户组控制显示, 编辑, F4列表等;
账户组有关联编号规则, 但标准功能也是可以更改, 不过因为涉及的供应商几千个, 所以写了一个程序统一更新如下:
*&---------------------------------------------------------------------*
*& Report ZBMM_001_CHG_KTOKK
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zbmm_001_chg_ktokk.
TABLES: lfa1.
DATA: BEGIN OF gs_err,
id TYPE int4,
lifnr TYPE lfa1-lifnr,
typ TYPE c,
msg TYPE string,
END OF gs_err,
gt_err LIKE TABLE OF gs_err.
SELECT-OPTIONS: s_lifnr FOR lfa1-lifnr.
PARAMETERS: p_ktokk TYPE lfa1-ktokk.
DATA ls_main TYPE vmds_ei_main.
DATA lt_vendors TYPE vmds_ei_extern_t.
DATA ls_vendors TYPE vmds_ei_extern.
DATA: l1 TYPE vmds_ei_main,
l2 TYPE cvis_message,
l3 TYPE vmds_ei_main,
l4 TYPE cvis_message.
LOOP AT s_lifnr[] INTO DATA(ls).
CLEAR: ls_main,
ls_vendors,
lt_vendors.
CLEAR: l1,
l2,
l3,
l4.
* 供应商表头
ls_vendors-header-object_instance-lifnr = ls-low. "供应商
ls_vendors-header-object_task = 'M'. "创建/更改
ls_vendors-central_data-central-data-ktokk = p_ktokk.
ls_vendors-central_data-central-datax-ktokk = 'X'.
APPEND ls_vendors TO lt_vendors.
CLEAR ls_vendors.
ls_main-vendors = lt_vendors.
* 创建或者更新供应商
CALL METHOD vmd_ei_api=>maintain_direct_input
EXPORTING
is_master_data = ls_main
IMPORTING
es_master_data_correct = l1
es_message_correct = l2
es_master_data_defective = l3
es_message_defective = l4.
gs_err-lifnr = ls-low.
IF l4-is_error = ''.
gs_err-typ = 'S'.
gs_err-msg = 'Success'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
READ TABLE l4-messages INTO DATA(ls_message) WITH KEY type = 'E'.
IF sy-subrc = 0.
MESSAGE ID ls_message-id
TYPE ls_message-type
NUMBER ls_message-number
WITH ls_message-message_v1
ls_message-message_v2
ls_message-message_v3
ls_message-message_v4
INTO gs_err-msg.
ENDIF.
gs_err-typ = 'E'.
ENDIF.
APPEND gs_err TO gt_err.
CLEAR gs_err.
ENDLOOP.
PERFORM display_tab USING gt_err.
FORM display_tab USING pTAB LIKE gt_err.
DATA: lt_fieldcat TYPE lvc_t_fcat,
ls_layout TYPE lvc_s_layo,
v_title TYPE lvc_title.
CHECK ptab IS NOT INITIAL.
v_title = '导入结果信息'.
ls_layout-zebra = 'X'.
PERFORM get_error_fieldcat CHANGING lt_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_grid_title = v_title
i_screen_start_column = 5
i_screen_start_line = 5
i_screen_end_column = 100
i_screen_end_line = 80
it_fieldcat_lvc = lt_fieldcat
is_layout_lvc = ls_layout
TABLES
t_outtab = gt_err
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
FORM get_error_fieldcat CHANGING ptab TYPE lvc_t_fcat.
FIELD-SYMBOLS <fs> LIKE LINE OF ptab.
CLEAR ptab.
CALL FUNCTION 'ZAKE_TRANS_TAB_TO_FIELDCAT'
TABLES
tab = gt_err
itab_fcat = ptab.
LOOP AT ptab ASSIGNING <fs>.
CASE <fs>-fieldname.
WHEN 'LIFNR'.
<fs>-scrtext_s = <fs>-scrtext_m = <fs>-scrtext_l = '供应商'.
WHEN 'TYP'.
<fs>-scrtext_s = <fs>-scrtext_m = <fs>-scrtext_l = '类型'.
<fs>-col_opt = 'X'.
WHEN 'MSG'.
<fs>-scrtext_s = <fs>-scrtext_m = <fs>-scrtext_l = '信息'.
<fs>-col_opt = 'X'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM. "get_error_fieldcat
完成后与到一个问题, 提示不允许更新供应商账户组, 加了一个隐式增强点更改了参数, 完成。