본문 바로가기
ABAP/BAPI

[BAPI/BC] BAPI_USER_CREATE1/CHANGE/LOCK/UNLOCK

by name_text 2025. 7. 28.

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.

댓글