BDC + ALV 실습

HI ·2020년 9월 22일

실습

목록 보기
2/2
  • 현재 로그온된 사용자를 조회한다.

SCREEN 1000

  • 비밀번호 잠금여부 체크시 해당 데이터만 조회한다.
  • user type에 맞춰 데이터를 조회한다.
  • tab 을 이용하여 일별 월별을 각각 조회한다.
process before output.
  module status_0100.
  module alv_100.

process after input.
  module user_command_0100.

SCREEN 100

  • 비밀번호잠금일자가 존재하면 LAYOUT에 COLOER을 지정해준다.
  • CHECK BOX를 생성하여 비밀번호 초기화 여부가 2가 아니면 CHECK 한다.
  • 버튼을 생성한후 클릭하면 TRANSACTION을 호출한다. (ST03N)
  • SAP 계정을 클릭하면 BDC 를 이용해서 TRANSACTION을 호출한다. (SU01D)

1. MAIN

include zabap120_20top.
include zabap120_20cls.
include zabap120_20scr.
include zabap120_20alv.
include zabap120_20o01.
include zabap120_20i01.
include zabap120_20f01.

initialization.
  button1 = text-010.
  button2 = text-020.
  mytab-prog = sy-repid.
  mytab-dynnr = 1100.
  mytab-activetab = 'BUTTON1'.

at selection-screen.
  case sy-ucomm.
    when 'PUSH1'.
      mytab-dynnr = 1100.
      mytab-activetab = 'BUTTON1'.
    when 'PUSH2'.
      mytab-dynnr = 1200.
      mytab-activetab = 'BUTTON2'.
  endcase.


start-of-selection.

  perform get_data.

end-of-selection.

  call screen '0100'.

2. zabap120_20top.

data : begin of gs_alv ,
bname like  usr02-bname, "SAP계정
terminal like usr41-terminal, " 단말기정보
server like usr41-server, "서버정보
name_last like adrp-name_last, "사용자명
langu like usr01-langu, " 로그온 언어
ustyp like usr02-ustyp, " 사용자유형
ustext(300), "사용자유형명
erdat like usr02-erdat, "계정생성일
aname like usr02-aname, " 계정생성자
trdat like usr02-trdat , " 최종로그온 일자
ltime like usr02-ltime, "최종로그온 시간
pwdchgdate like usr02-pwdchgdate, "최종비밀번호 변경일
uflag like usr02-uflag, " 비밀번호상태
pwdinitial like usr02-pwdinitial, "비밀번호초기화 여부
check type c length 1 ,
pwdlockdate like usr02-pwdlockdate, " 비밀번호잠금일자
  cell type lvc_t_scol,
end of gs_alv.

data gt_alv like table of gs_alv.

"ALV 관련
data : go_docking_container  type ref to cl_gui_docking_container,
       go_grid              type ref to cl_gui_alv_grid,
*       go_event_receiver    TYPE REF TO gcl_event_receiver,

        gs_fieldcat          type lvc_s_fcat,
       gt_fieldcat          type lvc_t_fcat,

       gt_sort              type lvc_t_sort,

       gs_layout            type lvc_s_layo,
       gs_variant           type disvariant,

       gt_exclude           type ui_functions.
      

※ get data

case mytab-activetab.
    when 'BUTTON1'.

      select a~ustyp " usr02
             a~erdat
             a~aname
             a~trdat
             a~ltime
             a~pwdchgdate
             a~uflag
             a~pwdinitial
             a~pwdlockdate
             b~terminal "usr41
             b~server
             c~name_last "adrp = USR21
             d~langu " usr01
             e~bname  "USR21
        into corresponding fields of table gt_alv
        from usr02 as a
        join usr41 as b
        on a~bname = b~bname
        join usr21 as e
        on a~bname = e~bname
        join adrp as c
        on e~persnumber = c~persnumber
        join usr01 as d
        on a~bname = d~bname
        where e~bname in s_bname
        and d~langu = sy-langu
        and a~trdat in s_trdat.

      if gt_alv is not initial .
        perform change_data .
      endif.

    when 'PUSH2'.

      clear : gt_alv, gs_alv.

      data :  lv_month_s type c length 8.
      data :  lv_month_l type c length 8.
      lv_month_s = p_month && '01'.
      lv_month_l = p_month && '31'.
      select a~ustyp " usr02
             a~erdat
             a~aname
             a~trdat
             a~ltime
             a~pwdchgdate
             a~uflag
             a~pwdinitial
             a~pwdlockdate
             b~terminal "usr41
             b~server
             c~name_last "adrp = USR21
             d~langu " usr01
             e~bname  "USR21
        into corresponding fields of table gt_alv
        from usr02 as a
        join usr41 as b
        on a~bname = b~bname
        join usr21 as e
        on a~bname = e~bname
        join adrp as c
        on e~persnumber = c~persnumber
        join usr01 as d
        on a~bname = d~bname
        where e~bname in s_bname
        and d~langu = sy-langu
        and a~trdat between lv_month_s and lv_month_l.

      if gt_alv is not initial .
        perform change_data .
      endif.


  endcase.
  • (조건)CHECK BOX를 생성하여 비밀번호 초기화 여부가 2가 아니면 CHECK 한다.
loop at gt_alv into gs_alv.
    if gs_alv-pwdinitial <> 2.
      gs_alv-check = 'X'.
    endif.
    modify gt_alv from gs_alv.

  endloop.
  • (조건)비밀번호잠금일자가 존재하면 LAYOUT에 COLOER을 지정해준다.
 data: ls_cell type lvc_s_scol.
  data: lt_cell type lvc_t_scol.

  ls_cell-fname = 'PWDLOCKDATE'.
  ls_cell-color-col = '6'.  " Red.
  append ls_cell to lt_cell.



  loop at gt_alv into gs_alv.
    if gs_alv-pwdlockdate is not initial.
      gs_alv-cell = lt_cell.
    endif.

    modify gt_alv from gs_alv index sy-tabix transporting cell.

  endloop.

perform change_data .

  • 사용자 유형을 사용자명으로 변환
  • 해당 라디오 버튼 클릭시 원하는 데이터만 조회
 IF p_val1 IS NOT INITIAL.
    DELETE gt_alv WHERE uflag IS INITIAL.
  ENDIF.

  IF gt_alv IS NOT INITIAL.

    LOOP AT gt_alv INTO gs_alv .


      IF gs_alv-ustyp = 'A'.
        gs_alv-ustext = '다이얼로그'.

      ELSEIF gs_alv-ustyp = 'B'.
        gs_alv-ustext = '시스템'.

      ELSEIF gs_alv-ustyp = 'C'.
        gs_alv-ustext = '통신 데이터'.

      ELSEIF gs_alv-ustyp = 'L'.
        gs_alv-ustext = '참조(로그온 불가능)'.

      ELSEIF gs_alv-ustyp = 'S'.
        gs_alv-ustext = '서비스'.
      ENDIF.
      MODIFY gt_alv FROM gs_alv .

    ENDLOOP.
  ENDIF.

  CASE 'X'.
    WHEN p_ra1. "다이얼로그
      DELETE gt_alv WHERE ustyp <> 'A'.
    WHEN p_ra2. "시스템
      DELETE gt_alv WHERE ustyp <> 'B'.
    WHEN p_ra3.   "통신데이터
      DELETE gt_alv WHERE ustyp <> 'C'.
    WHEN p_ra4. "참조
      DELETE gt_alv WHERE ustyp <> 'L'.
    WHEN p_ra5. "서비스
      DELETE gt_alv WHERE ustyp <> 'S'.

  ENDCASE.

3. zabap120_20cls.

  • 사용할 EVENT => hotspot
class gcl_hotspot_event definition.
  public section.

    methods : handle_hotspot_click
                     for event hotspot_click of cl_gui_alv_grid
         importing e_row_id
                     e_column_id
                     es_row_no.

endclass.

class gcl_hotspot_event implementation.

  method : handle_hotspot_click.
    perform hotspot_event_create using e_row_id e_column_id es_row_no.
  endmethod.

endclass.

data : hotspot_event type ref to gcl_hotspot_event.

perform hotspot_event_create using e_row_id e_column_id es_row_no.

  • bdc 이용해서 transaction 호출하기
form hotspot_event_create  using    pe_row_id type lvc_s_row
                                    pe_column_id type lvc_s_col
                                    pe_row_no type lvc_s_roid.

  if pe_column_id-fieldname = 'BNAME'.
    read table gt_alv into gs_alv index   pe_row_no-row_id.
    if sy-subrc = 0.

      data bdcdata_tab type table of bdcdata.

      data opt type ctu_params.

      bdcdata_tab = value #(
        ( program  = 'SAPLSUID_MAINTENANCE' dynpro   = '1050' dynbegin = 'X' )
        ( fnam = 'SUID_ST_BNAME-BNAME' fval = gs_alv-bname )
        ( fnam = 'BDC_OKCODE'       fval = '=SHOW' ) ).

      opt-dismode = 'E'.
      opt-defsize = 'X'.

      call transaction 'SU01D' with authority-check
                              using bdcdata_tab options from opt.
    endif.
  endif.
endform.                    " HOTSPOT_EVENT_CREATE

4. zabap120_20scr.

  • SCREEN 1000 셋팅
  • TAB 이용
tables usr02.


selection-screen begin of block b1 with frame title text-001.
select-options s_bname for usr02-bname.
parameter : p_val1 as checkbox . "비밀번호 잠금여부

selection-screen end of block b1.

selection-screen begin of block b2 with frame title text-002.
parameters : p_ra1 radiobutton group a1 .
parameters : p_ra2 radiobutton group a1 .
parameters : p_ra3 radiobutton group a1 .
parameters : p_ra4 radiobutton group a1 .
parameters : p_ra5 radiobutton group a1 .


selection-screen end of block b2.


* SUBSCREEN 2
selection-screen begin of screen 1100 as subscreen.
selection-screen begin of block b3 with frame title text-003.
select-options : s_trdat for usr02-trdat.
selection-screen end of block b3.
selection-screen end of screen 1100.


* SUBSCREEN 3
selection-screen begin of screen 1200 as subscreen.
selection-screen begin of block b4 with frame title text-004.
parameters : p_month type spmon default '202009'.
selection-screen end of block b4.
selection-screen end of screen 1200.

* STANDARD SELECTION SCREEN
selection-screen: begin of tabbed block mytab for 10 lines,
                    tab (20) button1 user-command push1,
                    tab (20) button2 user-command push2,
                  end of block mytab.

5. zabap120_20alv.

FORM create_alv .


  IF go_docking_container IS INITIAL.

    PERFORM create_container USING go_docking_container.
    PERFORM create_grid      USING go_docking_container
                                    go_grid.
    PERFORM create_fieldcat TABLES gt_fieldcat
                             USING gs_fieldcat
                                  'M'.
    PERFORM create_layout USING gs_layout.
    PERFORM create_event.
    PERFORM create_display .


  ENDIF.
ENDFORM.                    " CREATE_ALV

5-1) PERFORM create_container USING go_docking_container.

FORM create_container  USING    po_docking_container TYPE REF TO cl_gui_docking_container.
  CREATE OBJECT po_docking_container
    EXPORTING
      extension = 2000.
ENDFORM.                    " CREATE_CONTAINER

5-2) PERFORM create_grid USING go_docking_container go_grid.

FORM create_grid  USING    po_docking_container TYPE REF TO cl_gui_docking_container
                                          po_grid TYPE REF TO cl_gui_alv_grid.
  CREATE OBJECT po_grid
    EXPORTING
      i_parent = po_docking_container.
ENDFORM.                    " CREATE_GRID

5-3) PERFORM create_fieldcat TABLES gt_fieldcat USING gs_fieldcat 'M'.

FORM create_fieldcat  TABLES   pt_fieldcat TYPE  lvc_t_fcat
                       USING    ps_fieldcat TYPE lvc_s_fcat
                                gv_flag.


  DEFINE  _append.
    ps_fieldcat-fieldname = &1.
    ps_fieldcat-COLTEXT = &2.
    APPEND ps_fieldcat to pt_fieldcat.

  END-OF-DEFINITION.

  _append : 'BNAME' 'SAP계정' ,
             'TERMINAL' '단말기정보',
             'SERVER' '서버정보' ,
             'NAME_LAST' '사용자명',
             'LANGU' '로그온 언어',
             'USTYP' '사용자유형',
             'USTEXT' '사용자유형명',
             'ERDAT' '계정생성일',
             'ANAME' '계정생성자',
             'TRDAT' '최종로그온 일자',
             'LTIME' '최종로그온 시간',
             'PWDCHGDATE' '최종비밀번호 변경일',
             'UFLAG' '비밀번호상태',
             'PWDINITIAL' '비밀번호초기화 여부',
             'CHECK' 'check',
             'PWDLOCKDATE' '비밀번호잠금일자'.


  LOOP AT pt_fieldcat INTO ps_fieldcat.
    IF ps_fieldcat-fieldname = 'CHECK'.
      ps_fieldcat-checkbox = 'X'.

    ELSEIF ps_fieldcat-fieldname = 'BNAME'.
      ps_fieldcat-hotspot = 'X'.

    ENDIF.
    MODIFY pt_fieldcat FROM ps_fieldcat.
  ENDLOOP.


ENDFORM.                    " CREATE_FIELDCAT

5-4) PERFORM create_layout USING gs_layout.

FORM create_layout  USING    ps_layout TYPE lvc_s_layo.

  ps_layout-cwidth_opt = 'X'.
  ps_layout-sel_mode   = 'D' .
  ps_layout-zebra      = 'X'.   "
  gs_layout-ctab_fname = 'CELL'.  " Cell Color

ENDFORM.                    " CREATE_LAYOUT

5-5) PERFORM create_event.

FORM create_event .

  CREATE OBJECT hotspot_event.

  SET HANDLER hotspot_event->handle_hotspot_click FOR go_grid.

ENDFORM.                    " CREATE_EVENT

5-6) PERFORM create_display .

FORM create_display .
  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      i_save          = 'X'
      is_layout       = gs_layout
    CHANGING
      it_outtab       = gt_alv
      it_fieldcatalog = gt_fieldcat.
ENDFORM.                    " CREATE_DISPL

6. zabap120_20o01.

module status_0100 output.
  set pf-status '100'.
  set titlebar '100'.

endmodule.                 " STATUS_0100  OUTPUT
module alv_100 output.
 perform create_alv.
endmodule.                 " ALV_100  OUTPUT

7. zabap120_20i01.

module user_command_0100 input.
  case sy-ucomm.
    when 'BACK'.
      leave to screen 0.
    when 'EXIT'.
      leave program.
    when 'HISTORY'.
      call function 'ABAP4_CALL_TRANSACTION'
        exporting
          tcode = 'ST03N'.

  endcase.
endmodule.                 " USER_COMMAND_0100  INPUT

0개의 댓글