[ ABAP老白 ](javascript:void\(0\);)
关键代码:
*&\---------------------------------------------------------------------*
*& Form SAVE
*&\---------------------------------------------------------------------*
FORM save .DATA : lt_1251 TYPE TABLE OF pt1251 WITH HEADER LINE ,
lt_1250 TYPE TABLE OF pt1250 WITH HEADER LINE .
DATA : BEGIN OF lt_agr_name OCCURS 0 ,
agr_name TYPE agr_name ,
newline ,
END OF lt_agr_name .DATA : xuauth TYPE xuauth ,
numc ( 2 ) TYPE n .
LOOP AT <fs_out> INTO <fs_out_wa> .MOVE-CORRESPONDING <fs_out_wa> TO lt_agr_name .
COLLECT lt_agr_name .
ENDLOOP .SORT lt_agr_name .
LOOP AT lt_agr_name .CLEAR : lt_1251 , lt_1251[] , lt_1250 , lt_1250[] , xuauth ,
agr_1016 , agr_1250 .
PERFORM mess_retn TABLES return
USING 'I' ' 上传角色 :' lt_agr_name \- agr_name '' '' .
CALL FUNCTION 'ENQUEUE_E_AGR_DEF'EXPORTING
agr_name = lt_agr_name \- agr_nameEXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3 .
IF sy \- subrc <> 0 .PERFORM symsg_retn TABLES return .
CONTINUE .
ENDIF .SELECT SINGLE * FROM agr_1016
WHERE agr_name = lt_agr_name \- agr_name .
IF agr_1016 \- profile IS INITIAL .PERFORM mess_retn TABLES return
USING 'E' ' 角色或者角色的参数文件不存在 :' lt_agr_name \- agr_name '' '' .
CONTINUE .
ENDIF .SELECT SINGLE * FROM agr_1250
WHERE agr_name = lt_agr_name \- agr_name ANDobject = p_objct .
SELECT MAX ( auth ) INTO xuauthFROM agr_1250
WHERE agr_name = lt_agr_name \- agr_name .
IF agr_1250 IS INITIAL .
IF xuauth IS INITIAL .CONCATENATE agr_1016 \- profile '00' INTO xuauth .
ELSE .
xuauth+10 ( 2 ) = numc = xuauth+10 ( 2 ) \+ 1 .
ENDIF .CALL FUNCTION 'PRGN_1250_READ_AUTH_DATA'EXPORTING
activity_group = lt_agr_name \- agr_nameTABLES
auth_data = lt_1250EXCEPTIONS
no_data_available = 1
OTHERS = 2 .
lt_1250 \- object = p_objct .
lt_1250 \- auth = xuauth .
lt_1250 \- modified = 'U' .COLLECT lt_1250 .
ELSEIF lt_agr_name \- newline = 'X' .xuauth+10 ( 2 ) = numc = xuauth+10 ( 2 ) \+ 1 .
CALL FUNCTION 'PRGN_1250_READ_AUTH_DATA'EXPORTING
activity_group = lt_agr_name \- agr_nameTABLES
auth_data = lt_1250EXCEPTIONS
no_data_available = 1
OTHERS = 2 .
lt_1250 \- object = p_objct .
lt_1250 \- auth = xuauth .
lt_1250 \- modified = 'U' .COLLECT lt_1250 .
ENDIF .CLEAR lt_1251[] .
CALL FUNCTION 'PRGN_1251_READ_FIELD_VALUES'EXPORTING
activity_group = lt_agr_name \- agr_nameTABLES
field_values = lt_1251EXCEPTIONS
no_data_available = 1
OTHERS = 2 .
* whstr = `agr_name = lt_agr_name-agr_name`. " 早期 ECC 版本不支持 LOOP ..WHERE (whstr).
LOOP AT <fs_out> INTO <fs_out_wa> .ASSIGN COMPONENT 'AGR_NAME' OF STRUCTURE <fs_out_wa> TO <fs_fld> .
CHECK <fs_fld> = lt_agr_name \- agr_name .DO .
CHECK sy \- index > 2 .
READ TABLE fldct INDEX sy \- index .
IF sy \- subrc <> 0 .EXIT .
ENDIF .ASSIGN COMPONENT sy \- index OF STRUCTURE <fs_out_wa> TO <fs_fld> .
lt_1251 \- object = p_objct .
lt_1251 \- auth = xuauth .
lt_1251 \- field = fldct \- fieldname .
lt_1251 \- low = <fs_fld> .
SELECT SINGLE * FROM usorg WHERE field = fldct \- fieldname .
IF sy \- subrc = 0 AND p_usorg = 'X' .
lt_1251 \- modified = 'S' .ELSEIF sy \- subrc = 0 AND p_usorg = '' .
lt_1251 \- modified = 'M' .ELSE .
lt_1251 \- modified = 'U' .
ENDIF .COLLECT lt_1251 .
ENDDO .
ENDLOOP .IF lt_1250[] IS NOT INITIAL .
CALL FUNCTION 'PRGN_1250_SAVE_AUTH_DATA'EXPORTING
activity_group = lt_agr_name \- agr_nameTABLES
auth_data = lt_1250 .
ENDIF .CALL FUNCTION 'PRGN_1251_SAVE_FIELD_VALUES'EXPORTING
activity_group = lt_agr_name \- agr_nameTABLES
field_values = lt_1251 .CALL FUNCTION 'PRGN_UPDATE_DATABASE' .COMMIT WORK AND WAIT .
CALL FUNCTION 'DEQUEUE_E_AGR_DEF'EXPORTING
agr_name = lt_agr_name \- agr_name .CALL FUNCTION 'PRGN_AUTO_GENERATE_PROFILE_NEW'EXPORTING
activity_group = lt_agr_name \- agr_namerebuild_auth_data = ' '
no_dialog = 'X'
org_levels_with_star = 'X'fill_empty_fields_with_star = 'X'
EXCEPTIONS
activity_group_does_not_exist = 1
activity_group_enqueued = 2
profile_name_exists = 3
profile_not_in_namespace = 4
no_auth_for_prof_creation = 5
no_auth_for_role_change = 6
no_auth_for_auth_maint = 7
no_auth_for_gen = 8
no_auths = 9
open_auths = 10
too_many_auths = 11
profgen_tables_not_updated = 12
error_when_generating_profile = 13
OTHERS = 14 .
IF sy \- subrc <> 0 .PERFORM symsg_retn TABLES return .
ELSE .
PERFORM mess_retn TABLES return
USING 'S' ' 角色 ' lt_agr_name \- agr_name ' 上传结束 ' '' .
ENDIF .
ENDLOOP .CALL FUNCTION 'SUSR_DISPLAY_LOG'EXPORTING
display_in_popup = 'X'
TABLES
it_log_bapiret2 = return
EXCEPTIONS
parameter_error = 1
OTHERS = 2 .
LEAVE TO CURRENT TRANSACTION .
ENDFORM . " SAVE