FUNCTION z_cm_auth_check.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(P_BUKRS) TYPE  BUKRS OPTIONAL
*"     VALUE(P_WERKS) TYPE  WERKS_D OPTIONAL
*"     VALUE(P_KOKRS) TYPE  KOKRS OPTIONAL
*"     VALUE(P_MODULE) TYPE  CHAR5 OPTIONAL
*"  EXPORTING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  CHAR100
*"  TABLES
*"      S_BUKRS STRUCTURE  BUKRS_RAN OPTIONAL
*"      S_WERKS STRUCTURE  RANGE_WERKS OPTIONAL
*"      S_KOKRS STRUCTURE  TYPE_KOKRS_RANGE OPTIONAL
*"----------------------------------------------------------------------

  DATA BEGIN OF lt_bukrs OCCURS 0,
           bukrs TYPE t001-bukrs,
         END OF lt_bukrs.

  DATA BEGIN OF lt_werks OCCURS 0,
           werks TYPE t001w-werks,
         END OF lt_werks.

  DATA BEGIN OF lt_kokrs OCCURS 0,
           kokrs TYPE tka01-kokrs,
         END OF lt_kokrs.

  DATAp_chk_bukrs TYPE  char1,
        p_chk_werks TYPE  char1,
        p_chk_kokrs TYPE  char1.

  DATAlv_plant_obj TYPE xuobject.

  e_code 'S'.

  "batch mode에서는 권한 check 하지 않음.
  CHECK sy-batch IS INITIAL.

  IF p_bukrs IS NOT INITIAL.
    p_chk_bukrs 'X'.

    s_bukrs-sign    'I'.
    s_bukrs-option  'EQ'.
    s_bukrs-low     p_bukrs.
    APPEND s_bukrs.
  ENDIF.

  IF p_werks IS NOT INITIAL.
    p_chk_werks 'X'.

    s_werks-sign    'I'.
    s_werks-option  'EQ'.
    s_werks-low     p_werks.
    APPEND s_werks.
  ENDIF.

  IF p_kokrs IS NOT INITIAL.
    p_chk_kokrs 'X'.

    s_kokrs-sign    'I'.
    s_kokrs-option  'EQ'.
    s_kokrs-low     p_kokrs.
    APPEND s_kokrs.
  ENDIF.

  IF s_bukrs IS SUPPLIED OR
     s_bukrs[] IS NOT INITIAL.
    p_chk_bukrs 'X'.

    SELECT  bukrs
      INTO  TABLE lt_bukrs
      FROM  t001
     WHERE  bukrs IN s_bukrs.
    IF sy-subrc <> 0.
      e_code 'E'.
      "Company code is not available.
      MESSAGE s004(zmc_commINTO e_msg.
      EXIT.
    ENDIF.
  ENDIF.

  IF s_werks IS SUPPLIED OR
     s_werks[] IS NOT INITIAL.
    p_chk_werks 'X'.

    SELECT  werks
      INTO  TABLE lt_werks
      FROM  t001w
     WHERE  werks IN s_werks.
    IF sy-subrc <> 0.
      e_code 'E'.
      "Plant code is not available.
      MESSAGE s005(zmc_commINTO e_msg.
      EXIT.
    ENDIF.
  ENDIF.

  IF s_kokrs IS SUPPLIED OR
     s_kokrs[] IS NOT INITIAL.
    p_chk_kokrs 'X'.

    SELECT  kokrs
      INTO  TABLE lt_kokrs
      FROM  tka01
     WHERE  kokrs IN s_kokrs.
    IF sy-subrc <> 0.
      e_code 'E'.
      "Controlling Area code is not available.
      MESSAGE s006(zmc_commINTO e_msg.
      EXIT.
    ENDIF.
  ENDIF.

  IF lt_werks[] IS NOT INITIAL.
    SELECT tk~bukrs
 APPENDING TABLE lt_bukrs
      FROM t001w AS tw
     INNER JOIN t001k AS tk
        ON tk~bwkey tw~bwkey
       FOR ALL ENTRIES IN lt_werks
     WHERE tw~werks lt_werks-werks.
  ENDIF.

  CASE p_module.
    WHEN 'PP'.
      CLEAR lv_plant_obj.
*      lv_plant_obj = 'Z_PP_WRK'.
    WHEN OTHERS.
      CLEAR lv_plant_obj.
  ENDCASE.

  "Plnat code check 시에는 Bukrs 권한도 check 한다.
  IF p_chk_werks 'X'.
    p_chk_bukrs 'X'.
  ENDIF.

  IF p_chk_bukrs IS NOT INITIAL AND
     lt_bukrs[] IS INITIAL.
    e_code 'E'.
    "회사코드 값이 없습니다.
    e_msg TEXT-t01.
    EXIT.
  ENDIF.

  IF p_chk_werks IS NOT INITIAL AND
     lt_werks[] IS INITIAL.
    e_code 'E'.
    "플랜트 값이 없습니다.
    e_msg TEXT-t02.
    EXIT.
  ENDIF.

  IF p_chk_kokrs IS NOT INITIAL AND
     lt_kokrs[] IS INITIAL.
    e_code 'E'.
    "관리회계 영역 값이 없습니다.
    e_msg TEXT-t03.
    EXIT.
  ENDIF.

  IF lt_werks[] IS NOT INITIAL AND
     lv_plant_obj IS NOT INITIAL.

    LOOP AT lt_werks.
      "권한 Object 결정되면 수정 필요
      AUTHORITY-CHECK OBJECT lv_plant_obj
                      ID 'WERKS' FIELD lt_werks-werks.

      IF sy-subrc <> 0.
        e_code 'E'.
        "플랜트 & 에 대한 사용권한이 없습니다.
        MESSAGE s002(zmc_commWITH lt_werks INTO e_msg.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

  IF lt_bukrs[] IS NOT INITIAL.
    LOOP AT lt_bukrs.
      AUTHORITY-CHECK OBJECT 'Z_COM_BUK'
                      ID 'BUKRS' FIELD lt_bukrs-bukrs.

      IF sy-subrc <> 0.
        e_code 'E'.
        "회사코드 & 에 대한 사용권한이 없습니다.
        MESSAGE s001(zmc_commWITH lt_bukrs INTO e_msg.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

  IF lt_kokrs[] IS NOT INITIAL.
    LOOP AT lt_kokrs.
      "권한 Object 결정되면 수정 필요
*      AUTHORITY-CHECK OBJECT 'Z_COM_BUK'
*                      ID 'KOKRS' FIELD lt_kokrs-kokrs.
*
*      IF sy-subrc <> 0.
*        e_code = 'E'.
*        "관리회계 영역 & 에 대한 사용권한이 없습니다.
*        MESSAGE s003(zmc_comm) WITH lt_kokrs INTO e_msg.
*
*        EXIT.
*      ENDIF.
    ENDLOOP.
  ENDIF.


ENDFUNCTION.

'SAP Program > ABAP' 카테고리의 다른 글

DLL 사용하기  (0) 2018.04.20
병렬처리 예제  (0) 2018.04.18
sorted table 선언  (0) 2018.03.23
amount를 currency에 맞게 conversion input/output  (0) 2018.03.21
Number range 관련 재미있는 coding  (0) 2018.02.20

설정

트랙백

댓글