BAPI_USER_CREATE1
BAPI_USER_CHANGE
BAPI_USER_LOCK
BAPI_USER_UNLOCK
BAPI_USER_ACTGROUPS_ASSIGN
CLASS lcl_user_management DEFINITION.
PUBLIC SECTION.
TYPES:
BEGIN OF ts_gltg_date,
gltgv TYPE bapilogond-gltgv,
gltgb TYPE bapilogond-gltgb,
END OF ts_gltg_date,
BEGIN OF ts_user_info,
e_mail TYPE bapiaddr3-e_mail,
firstname TYPE bapiaddr3-firstname,
lastname TYPE bapiaddr3-lastname,
department TYPE bapiaddr3-department,
function TYPE bapiaddr3-function,
ustyp TYPE usr02-ustyp,
class TYPE usr02-class,
gltgv TYPE bapilogond-gltgv,
gltgb TYPE bapilogond-gltgb,
start_menu TYPE usr21-start_menu,
langu TYPE usr01-langu,
lic_type TYPE usr06-lic_type,
END OF ts_user_info .
TYPES:
BEGIN OF ts_assign_role,
agr_name TYPE agr_users-agr_name,
from_dat TYPE agr_users-from_dat,
to_dat TYPE agr_users-to_dat,
ecode TYPE c LENGTH 1, "(N : 신규, C : 변경, D : 삭제)
END OF ts_assign_role .
TYPES:
tt_assign_role TYPE STANDARD TABLE OF ts_assign_role WITH EMPTY KEY .
DATA: mv_userid TYPE usr02-bname.
CONSTANTS: BEGIN OF gc_default,
spdb TYPE c LENGTH 1 VALUE 'G', "즉시 인쇄
spda TYPE c LENGTH 1 VALUE 'D', "출력 후 삭제 (D: 출력후 삭제, K: 삭제 안함)
datfm TYPE xudatfm VALUE '4',
dcpfm TYPE xudcpfm VALUE 'X',
utype TYPE usertypen VALUE 'CB',
pamethod TYPE rspopameth VALUE 'G',
patype TYPE rspoptype VALUE 'KPSAPWIN',
END OF gc_default.
METHODS:
constructor IMPORTING iv_userid TYPE usr02-bname,
create IMPORTING iv_ref_userid TYPE usr02-bname OPTIONAL
iv_initial_password TYPE xuncode OPTIONAL
is_user_info TYPE ts_user_info
EXPORTING ev_initial_password TYPE xuncode
EXCEPTIONS error,
set_lock EXCEPTIONS error,
set_unlock EXCEPTIONS error,
reset_password IMPORTING iv_initial_password TYPE xuncode OPTIONAL
EXPORTING ev_initial_password TYPE xuncode
EXCEPTIONS error,
set_gltg_date IMPORTING is_gltg_date TYPE ts_gltg_date OPTIONAL
EXCEPTIONS error,
set_gra_editor IMPORTING iv_gra_editor TYPE rseumod-gra_editor
EXCEPTIONS error,
role_assign IMPORTING VALUE(it_assign_role) TYPE tt_assign_role OPTIONAL
EXCEPTIONS assign_error .
ENDCLASS.
CLASS lcl_user_management IMPLEMENTATION.
METHOD constructor.
mv_userid = iv_userid.
ENDMETHOD.
METHOD create.
DATA(lt_return) = VALUE bapirettab( ).
"로그온데이터
DATA(ls_logondata) = VALUE bapilogond( gltgv = is_user_info-gltgv
gltgb = is_user_info-gltgb
ustyp = is_user_info-ustyp ).
"초기 비밀번호
DATA(ls_password) = VALUE bapipwd( bapipwd = iv_initial_password ).
"주소
DATA(ls_address) = CORRESPONDING bapiaddr3( is_user_info ).
"라이선스 타입
DATA(ls_uclass) = VALUE bapiuclass( ).
"기본값
DATA(ls_defaults) = VALUE bapidefaul( ).
"매개변수
DATA(lt_param) = VALUE suid_tt_bapiparam1( ).
DATA lv_ref_ok TYPE abap_bool.
CLEAR lv_ref_ok.
"참조 사용자가 있으면 사용
IF iv_ref_userid IS NOT INITIAL.
DATA(ls_ref_logondata) = VALUE bapilogond( ).
DATA(lt_ref_return) = VALUE bapirettab( ).
"사용자의 기본값, 매개변수 정보 복사
"로그온 데이터, 기본값, 라이선스 타입
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
EXPORTING
username = iv_ref_userid
IMPORTING
logondata = ls_ref_logondata
defaults = ls_defaults
uclass = ls_uclass
TABLES
return = lt_ref_return
parameter1 = lt_param.
IF NOT line_exists( lt_ref_return[ type = 'E' ] ).
lv_ref_ok = abap_true.
ls_logondata-tzone = ls_ref_logondata-tzone.
ls_logondata-class = ls_ref_logondata-class.
ENDIF.
ENDIF.
IF lv_ref_ok NE abap_true. "참조사용자가 없다
"기본 출력장치
SELECT SINGLE
padest
FROM tsp03
WHERE pamethod EQ @gc_default-pamethod
AND patype EQ @gc_default-patype
INTO @DATA(lv_spld).
"사용자의 기본값 설정
ls_defaults = VALUE #( start_menu = is_user_info-start_menu
spld = lv_spld "출력 장치
spdb = gc_default-spdb "즉시 인쇄
spda = gc_default-spda "출력 후 삭제 (D: 출력후 삭제, K: 삭제 안함)
datfm = gc_default-datfm "날짜형식(YYYY.MM.DD)
dcpfm = gc_default-dcpfm "십진수 형식(#,###.##)
langu = is_user_info-langu "로그온 언어
).
"사용자 그룹
ls_logondata-class = is_user_info-class.
"사용자의 기본 라이선스 타입
ls_uclass-lic_type = is_user_info-lic_type.
ENDIF.
IF ls_logondata-tzone IS INITIAL.
SELECT SINGLE
CASE WHEN tzonedef IS NOT NULL AND tzonedef NE @space THEN tzonedef ELSE tzonesys END AS tzone
FROM ttzcu
INTO @ls_logondata-tzone.
ENDIF.
CALL FUNCTION 'BAPI_USER_CREATE1'
EXPORTING
username = mv_userid
logondata = ls_logondata
password = ls_password
defaults = ls_defaults
address = ls_address
uclass = ls_uclass
generate_pwd = COND #( WHEN iv_initial_password IS INITIAL THEN abap_true ELSE abap_false )
IMPORTING
generated_password = ls_password
TABLES
return = lt_return
parameter1 = lt_param.
READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
RAISING error.
EXIT.
ELSE.
ev_initial_password = COND #( WHEN iv_initial_password IS NOT INITIAL THEN iv_initial_password ELSE ls_password-bapipwd ).
ENDIF.
ENDMETHOD.
METHOD set_lock.
DATA(lt_return) = VALUE bapirettab( ).
CALL FUNCTION 'BAPI_USER_LOCK'
EXPORTING
username = mv_userid
TABLES
return = lt_return.
READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
RAISING error.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
ENDMETHOD.
METHOD set_unlock.
DATA(lt_return) = VALUE bapirettab( ).
CALL FUNCTION 'BAPI_USER_UNLOCK'
EXPORTING
username = mv_userid
TABLES
return = lt_return.
READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
RAISING error.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
ENDMETHOD.
METHOD reset_password.
DATA(lt_return) = VALUE bapirettab( ).
DATA(ls_password) = VALUE bapipwd( bapipwd = iv_initial_password ).
DATA(ls_passwordx) = VALUE bapipwdx( bapipwd = abap_true ).
CALL FUNCTION 'BAPI_USER_CHANGE'
EXPORTING
username = mv_userid
password = ls_password
passwordx = ls_passwordx
generate_pwd = COND #( WHEN iv_initial_password IS INITIAL THEN abap_true ELSE abap_false )
IMPORTING
generated_password = ls_password
TABLES
return = lt_return.
READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
RAISING error.
RETURN.
ELSE.
ev_initial_password = COND #( WHEN iv_initial_password IS NOT INITIAL THEN iv_initial_password ELSE ls_password-bapipwd ).
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDMETHOD.
METHOD set_gltg_date.
DATA(lt_return) = VALUE bapirettab( ).
DATA(ls_logondata) = CORRESPONDING bapilogond( is_gltg_date ).
DATA(ls_logondatax) = VALUE bapilogonx( gltgv = xsdbool( is_gltg_date-gltgv IS NOT INITIAL )
gltgb = xsdbool( is_gltg_date-gltgb IS NOT INITIAL ) ).
CALL FUNCTION 'BAPI_USER_CHANGE'
EXPORTING
username = mv_userid
logondata = ls_logondata
logondatax = ls_logondatax
TABLES
return = lt_return.
READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
RAISING error.
RETURN.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDMETHOD.
METHOD set_gra_editor.
UPDATE rseumod SET gra_editor = @iv_gra_editor WHERE uname EQ @mv_userid.
IF sy-subrc EQ 0.
COMMIT WORK.
ELSE.
MESSAGE e001(00) WITH '사용자의 ABAP Workbench에 대한 세팅이 없습니다. 사용자 로그인 후 업데이트 가능합니다' RAISING error.
ENDIF.
ENDMETHOD.
METHOD role_assign.
DATA(lt_return) = VALUE bapirettab( ).
DATA(lt_agr_users) = VALUE suid_tt_bapiagr( ).
DATA(ls_assign_role) = VALUE ts_assign_role( ).
"기존 보유 롤
SELECT
agr_name,
from_dat,
to_dat
FROM agr_users
WHERE uname EQ @mv_userid
AND col_flag EQ @abap_false
INTO TABLE @DATA(lt_old).
SORT lt_old BY agr_name from_dat to_dat.
SORT it_assign_role BY agr_name ecode.
IF REDUCE i( INIT i = 0 FOR <lfs> IN it_assign_role WHERE ( ecode NA 'CDN' ) NEXT i += 1 ) > 0.
MESSAGE 'ECODE 가 올바르지 않습니다' RAISING assign_error.
ENDIF.
"기존 권한은 이력으로 유지
LOOP AT lt_old INTO DATA(ls_old).
IF ls_old-to_dat < sy-datum. "유효기간이 지난건은 로그로 유지
APPEND VALUE #( agr_name = ls_old-agr_name
from_dat = ls_old-from_dat
to_dat = ls_old-to_dat ) TO lt_agr_users.
CONTINUE.
ENDIF.
"권한 삭제
READ TABLE it_assign_role INTO ls_assign_role WITH KEY agr_name = ls_old-agr_name
ecode = 'D' BINARY SEARCH.
IF sy-subrc EQ 0.
IF ls_old-from_dat <= sy-datum AND ls_old-to_dat > sy-datum.
APPEND VALUE #( agr_name = ls_old-agr_name
from_dat = ls_old-from_dat
to_dat = sy-datum - 1 ) TO lt_agr_users.
ENDIF.
CONTINUE.
ENDIF.
"기존 권한의 기간 변경
READ TABLE it_assign_role INTO ls_assign_role WITH KEY agr_name = ls_old-agr_name
ecode = 'C' BINARY SEARCH.
IF sy-subrc EQ 0.
CONTINUE.
ENDIF.
READ TABLE it_assign_role INTO ls_assign_role WITH KEY agr_name = ls_old-agr_name
ecode = 'N' BINARY SEARCH.
IF sy-subrc EQ 0.
CONTINUE.
ENDIF.
"삭제/변경이 없는 기존 권한
APPEND VALUE #( agr_name = ls_old-agr_name
from_dat = ls_old-from_dat
to_dat = ls_old-to_dat ) TO lt_agr_users.
ENDLOOP.
"신규 권한 부여
LOOP AT it_assign_role INTO ls_assign_role WHERE ecode EQ 'N' OR ecode EQ 'C'. "신규 또는 변경
APPEND VALUE #( agr_name = ls_assign_role-agr_name
from_dat = COND #( WHEN ls_assign_role-from_dat IS NOT INITIAL THEN ls_assign_role-from_dat ELSE sy-datum )
to_dat = COND #( WHEN ls_assign_role-to_dat IS NOT INITIAL THEN ls_assign_role-to_dat ELSE '99991231' ) ) TO lt_agr_users.
ENDLOOP.
CHECK lt_agr_users IS NOT INITIAL.
SORT lt_agr_users BY agr_name from_dat to_dat.
DELETE ADJACENT DUPLICATES FROM lt_agr_users COMPARING ALL FIELDS.
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'
EXPORTING
username = mv_userid
TABLES
activitygroups = lt_agr_users
return = lt_return.
READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
RAISING assign_error.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
ENDMETHOD.
ENDCLASS.
'ABAP > BAPI' 카테고리의 다른 글
[BAPI/SD] 판매오더(Sales Order) 생성 - BAPI_SALESORDER_CREATEFROMDAT2 (0) | 2023.10.12 |
---|
댓글