SAP/ABAP 코드

(ABAP 코드) 자주 사용 되는 펑션/메소드 모음

haramang 2021. 10. 11. 17:52
Class 내의 SY-UCOMM 을 PAI에서 관리할 수 있게 함  
CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
    EXPORTING
      NEW_CODE = E_UCOMM.
  CLEAR E_UCOMM.
Edit 모드 활성/비활성화
cl_gui_alv_grid=>mc_style_disabled.
cl_gui_alv_grid=>mc_style_enabled.
data_changed 이벤트에서 변경 된 셀 데이터 찾아서 수정할 때,
DATA: ls_mod_cells TYPE lvc_s_modi.
LOOP AT pr_data_changed->mt_mod_cells INTO ls_mod_cells.

data_changed_finished 이벤트에서 변경된 셀 찾아서 수정할 때,
after_data_changed 이벤트에서 변경 된 셀 데이터 찾아서 수정할 때,
LOOP AT et_good_cells INTO ls_good_cell.
Row 셋팅 및 해제  
CALL METHOD po_grid->get_selected_rows
    IMPORTING
      et_row_no = lt_row_no.

    CALL METHOD go_grid->set_selected_rows
      EXPORTING
        it_index_rows = lt_sel_rows.
data_changed 이벤트 강제 발생
FORM check_data_changed  USING    po_grid TYPE REF TO cl_gui_alv_grid.

  DATA: lv_valid   TYPE c,
        lv_refresh TYPE c.

  CHECK po_grid IS BOUND.

  CALL METHOD po_grid->check_changed_data
    IMPORTING
      e_valid   = lv_valid
    CHANGING
      c_refresh = lv_refresh.


ENDFORM.
ALV 높이 조절
  CALL METHOD go_splitter->set_row_height
    EXPORTING
      id     = 1
      height = 13.

  CALL METHOD go_splitter->set_column_width
    EXPORTING
      id    = 1
      width = 60.
CL_DD_DOCUMENT 선언 - ALV 헤더 용
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
DATA: go_doc TYPE REF TO cl_dd_document.

  CREATE OBJECT go_doc
    EXPORTING
      style = 'ALV_GRID'.

  CALL METHOD po_grid->list_processing_events
    EXPORTING
      i_event_name = 'TOP_OF_PAGE'
      i_dyndoc_id  = go_doc.
Edit Event 등록 ( 엔터 눌렀을 때, 셀 이동 시 )  
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID =  CL_GUI_ALV_GRID=>MC_EVT_ENTER.

  CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID =  CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
BDC 데이터 셋팅
FORM set_bdc_data  USING    pv_chk
                            pv_name
                            pv_value.

  CLEAR: gs_bdc.

  IF pv_chk EQ gc_x.
    gs_bdc-program  = pv_name.
    gs_bdc-dynpro   = pv_value.
    gs_bdc-dynbegin = gc_x.
  ELSE.
    gs_bdc-fnam     = pv_name.
    gs_bdc-fval     = pv_value.
  ENDIF.

  APPEND gs_bdc TO gt_bdc.
ALV Cell 값 변경

 pr_data_changed   TYPE REF TO cl_alv_changed_data_protocol

  CALL METHOD pr_data_changed->modify_cell
    EXPORTING
      i_row_id    = ps_mod_cells-row_id
      i_fieldname = ps_mod_cells-fieldname
      i_value     = ps_mod_cells-value.
스탠다드 툴바 제외 설정
FORM set_exclude_toolbar  TABLES   pt_toolbar TYPE ui_functions
                          USING    VALUE(p_value).

* Toolbar function code variable
  DATA: ls_execlude TYPE ui_func.

* Standtard toolbar 에서 지울 toolbar를 셋팅하고 gt_toolbar에 저장
  ls_execlude = p_value.
  APPEND ls_execlude TO pt_toolbar.

ENDFORM.
스탠다드 툴바 셋팅
FORM handle_toolbar  USING    pe_object
                                TYPE REF TO cl_alv_event_toolbar_set
                              pe_interactive.

* Toolbar 생성하는 variable
  DATA: ls_toolbar TYPE stb_button.

* 전체선택 toolbar 생성
  MOVE 'SELALL'         TO ls_toolbar-function.
  MOVE icon_insert_row  TO ls_toolbar-icon.
  MOVE '전체선택'         TO ls_toolbar-quickinfo.
  MOVE '전체선택'         TO ls_toolbar-text.
  MOVE ' '              TO ls_toolbar-disabled.
  INSERT ls_toolbar INTO pe_object->mt_toolbar INDEX 1.

* 전체해제 toolbar 생성
  MOVE 'DESELALL'        TO ls_toolbar-function.
  MOVE icon_deselect_all TO ls_toolbar-icon.
  MOVE '전체해제'          TO ls_toolbar-quickinfo.
  MOVE '전체해제'          TO ls_toolbar-text.
  MOVE ' '               TO ls_toolbar-disabled.
  INSERT ls_toolbar INTO pe_object->mt_toolbar INDEX 2.

ENDFORM.
RTTS를 사용하여 인터널 테이블에 있는 타입으로 필드카탈로그 생성
DATA: gr_structdescr TYPE REF TO cl_abap_structdescr.
DATA: gr_tabledescr TYPE REF TO cl_abap_tabledescr.
FORM set_field_catalog      USING       VALUE(ps_fcat) TYPE lvc_s_fcat
                            CHANGING    pt_fcat        TYPE lvc_t_fcat.

* 자재내역 인터널 테이블로부터 Line data 가져옴
  gr_tabledescr ?= cl_abap_typedescr=>describe_by_data( gt_mat_data ).
  gr_structdescr ?= gr_tabledescr->get_table_line_type( ).

* Line type을 loop을 돌면서 필드카탈로그와 스타일 세팅
  LOOP AT gr_structdescr->components[] INTO gs_element.
    CASE gs_element-name.
      WHEN 'ID'.
        ps_fcat-coltext   = '상태'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MATNR'.
        ps_fcat-coltext   = '자재번호'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MAKTX'.
        ps_fcat-coltext   = '자재내역'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MEINS'.
        ps_fcat-coltext   = '기본단위'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MTART'.
        ps_fcat-coltext   = '자재유형'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MTBEZ'.
        ps_fcat-coltext   = '자재유형명'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'SPART'.
        ps_fcat-coltext   = '제품군'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MATKL'.
        ps_fcat-coltext   = '자재그룹'.
        ps_fcat-col_opt   = gc_x.
      WHEN 'MESSAGE'.
        ps_fcat-coltext   = '메시지'.
        ps_fcat-outputlen = 30.
      WHEN 'LOG'.
        ps_fcat-coltext   = '이력'.
        ps_fcat-just      = 'C'.
        ps_fcat-hotspot   = 'X'.
      WHEN OTHERS.
        ps_fcat-no_out    = gc_x.
    ENDCASE.

*   필드이름, 데이터타입, 길이, 소숫점 셋팅
    ps_fcat-fieldname = gs_element-name.
    ps_fcat-datatype  = gs_element-type_kind.
    ps_fcat-inttype   = gs_element-type_kind.
    ps_fcat-intlen    = gs_element-length / cl_abap_char_utilities=>charsize.
    ps_fcat-decimals  = gs_element-decimals.

    APPEND ps_fcat TO pt_fcat.
    CLEAR: ps_fcat, gs_element.

  ENDLOOP.

ENDFORM.
RTTS로 동적 인터널 테이블, 필드카탈로그 생성
FORM create_dynamic_itab .

  DATA: lv_date_low  TYPE d,              " 시작일자
        lv_date_high TYPE d,              " 종료일자
        lv_date      TYPE n LENGTH 6.     " 월 ( 동적 인터널 테이블 필드 선언 용)
  DATA: lv_diff_mon  TYPE i.              " 종료일자 - 시작일자
  DATA: lv_loop_cnt  TYPE i.              " LOOP 카운터
  DATA: lv_col_cnt   TYPE i VALUE 3.      " COL_POS 카운터
  DATA: lv_err_msg   TYPE string.
  DATA: lo_excep     TYPE REF TO cx_root.
  DATA: lo_excep_pos type i.
  DATA: lv_fname     type string.


  gw_component-name = 'ZNAME1'.
  gw_component-type = CAST #( cl_abap_elemdescr=>describe_by_name( 'ZE15_NAME1' ) ).
  APPEND gw_component TO gt_components.
  CLEAR gw_component.

  gw_component-name = 'ZNAME2'.
  gw_component-type = CAST #( cl_abap_elemdescr=>describe_by_name( 'ZE15_NAME2' ) ).
  APPEND gw_component TO gt_components.
  CLEAR gw_component.

* 종료일자가 입력되지 않았을 경우, (시작일자만 입력 됨)
  IF s_date-high IS INITIAL.
    lv_fname = s_date-low.
    gw_component-name = lv_fname.
    gw_component-type ?= cl_abap_elemdescr=>get_c( 2 ).
    APPEND gw_component TO gt_components.
    CLEAR gw_component.

* 시작일자, 종료일자 모두 입력되었을 경우,
  ELSE.

*   종료일자 - 시작일자 계산.
    lv_diff_mon = ABS( s_date-high(4) * 12 + s_date-high+4(2) ) -
                  ABS( s_date-low(4) * 12 + s_date-low+4(2) ).

*   종료일자 - 시작일자가  11보다 클 경우, 12개월 이상
    IF lv_diff_mon > 11.
      " Loop 카운터를 12로 셋팅
      lv_loop_cnt = 12.

*   종료일자 - 시작일자가 11보다 작을 경우, 12개월 이하
    ELSE.
      " 종료일자 - 시작일자 에서 1을 더 더함
      " 12월 - 11월 일 경우, 1개월로 계산되지만, LOOP으로 11월 12월, 모두 2번 돌아야 되기 때문.
      lv_loop_cnt = lv_diff_mon + 1.
    ENDIF.

*   lv_date에 시작일자을 저장
    lv_date = s_date-low.

*   Loop 카운터 수만큼 계산.
    DO ( lv_loop_cnt ) TIMES.
      lv_fname = lv_date.
      gw_component-name = lv_fname.
      gw_component-type ?= cl_abap_elemdescr=>get_c( 2 ).
      APPEND gw_component TO gt_components.
      CLEAR: gw_component.

      IF lv_date+4(2) EQ 12.
        lv_date = lv_date + 100 - 11.
      ELSE.
        lv_date = lv_date + 1.
      ENDIF.

*     필드카탈로그 필드 포지션 카운터
      lv_col_cnt = lv_col_cnt + 1.

    ENDDO.

  ENDIF.

* Color 테이블 필드 셋팅
  gw_component-name = 'ZCOLOR'.
  gw_component-type = CAST #( cl_abap_typedescr=>describe_by_name( 'LVC_T_SCOL' ) ).
  gw_component-as_include = abap_false.
  APPEND gw_component TO gt_components.
  CLEAR: gw_component.

* 시작일자 종료일자 셋팅 - DB 에서 데이터 가져올 때, WHERE 구문에 사용 됨
  gv_date_low = s_date-low.
  gv_date_high = lv_date - 1.


* 동적 테이블 구성
  TRY.
      gr_structdescr ?= cl_abap_structdescr=>create( p_components = gt_components
                                                     p_strict     = cl_abap_structdescr=>false ).
      gr_tabledescr  ?= cl_abap_tabledescr=>create( p_line_type = gr_structdescr
                                                   p_table_kind = 'S'
                                                   p_unique     = abap_false
                                                   p_key        = VALUE #( ( name = 'ZNAME1' )
                                                                           ( name = 'ZNAME2' ) )
                                                   p_key_kind   = cl_abap_tabledescr=>keydefkind_user ).

      CREATE DATA gt_data TYPE HANDLE gr_tabledescr.
      ASSIGN gt_data->* TO <fs_data>.

      CREATE DATA gs_data TYPE HANDLE gr_structdescr.
      ASSIGN gs_data->* TO <fs_line>.

    CATCH cx_root INTO lo_excep.
      lv_err_msg = lo_excep->GET_TEXT( ).
      MESSAGE S000 WITH '동적 인터널 생성에 실패하였습니다.' DISPLAY LIKE 'E'.
      WRITE:/ lv_err_msg.

  ENDTRY.

ENDFORM.

필드카탈로그 생성
LOOP AT gr_structdescr->components INTO LS_COMPONENTS.
  IF LS_COMPONENTS-NAME NE 'ZCOLOR'.
    LS_FCAT-FIELDNAME = LS_COMPONENTS-NAME.
    LS_FCAT-COLTEXT = LS_COMPONENTS-NAME.
    LS_FCAT-DATATYPE = LS_COMPONENTS-TYPE_KIND.
    LS_FCAT-INTTYPE = LS_COMPONENTS-TYPE_KIND.
    LS_FCAT-INTLEN = LS_COMPONENTS-LENGTH.
    APPEND LS_FCAT TO LT_FCAT.
  ENDIF.
ENDLOOP.
Search Help 프로그램 내에서 만들기
FORM SEARCH_HELP_FOR_COSTCENTER CHANGING PV_KOSTL.

  DATA : F4_RETURN  LIKE TABLE OF DDSHRETVAL WITH HEADER LINE,
         LT_DYNMAPP TYPE TABLE OF DSELC      WITH HEADER LINE,
         LT_DYNTAB  TYPE TABLE OF STRING.

* Search Help### ## ### ##



  CLEAR : LT_DYNMAPP[], LT_DYNTAB[].

* Search Help ### ## Field# ####

  DATA: BEGIN OF LS_DATA,
          KOSTL TYPE KOSTL,
          KTEXT TYPE KTEXT,
        END OF LS_DATA,
        LT_DATA LIKE TABLE OF LS_DATA.

  SELECT DISTINCT KOSTL, KTEXT
    FROM ZTP5KOSTLB
    INTO TABLE @LT_DATA
    ORDER BY KOSTL.


* Search Help ### ## Function
*-> CALL FUNCTION
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'KOSTL'
      DYNPPROG        = SY-CPROG
      DYNPNR          = SY-DYNNR
*     WINDOW_TITLE    = '#####'
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = LT_DATA
      RETURN_TAB      = F4_RETURN
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

* F4_RETURN# ### Line
  READ TABLE F4_RETURN INDEX 1.

  CHECK SY-SUBRC = 0.
* P_DEV(#### ## ##)# FIELDVAL# ##
  PV_KOSTL = F4_RETURN-FIELDVAL.

ENDFORM.
Gui Download
FORM DOWNLOAD_REPORT .

  DATA: LV_FILENAME TYPE STRING,
        LV_PATH TYPE STRING,
        LV_FULLPATH TYPE STRING,
        LV_RESULT TYPE I.

  DATA: BEGIN OF LT_HEADING OCCURS 0,
          TEXT(20) TYPE C,
        END OF LT_HEADING.

  " Save Dialog
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE              = '### ##'
*      FILE_FILTER               = 'EXCEL FILES (*.XLS)|*.XLS|EXCEL FILES (*.XLSX)|*.XLSX|'
      FILE_FILTER               = 'EXCEL FILES (*.XLS)|*.XLS'
      INITIAL_DIRECTORY         = 'C:\'
    CHANGING
      FILENAME                  = LV_FILENAME
      PATH                      = LV_PATH
      FULLPATH                  = LV_FULLPATH
      USER_ACTION =               LV_RESULT.

  " ## ## ### ##,
  IF LV_RESULT = 9.
    EXIT.
  ENDIF.


  " ## ## ##
  LOOP AT GT_REP_FCAT INTO GS_REP_FCAT.
    LT_HEADING-TEXT = GS_REP_FCAT-FIELDNAME.
    APPEND LT_HEADING.
  ENDLOOP.

  " ## ####
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME                = LV_FULLPATH
      FILETYPE                = 'ASC'
      APPEND                  = 'X'
      WRITE_FIELD_SEPARATOR   = 'X'
      CODEPAGE                = '8500'
    TABLES
      DATA_TAB                = <FT_DATA>
      FIELDNAMES              = LT_HEADING
    EXCEPTIONS
      FILE_WRITE_ERROR        = 1
      NO_BATCH                = 2
      GUI_REFUSE_FILETRANSFER = 3
      INVALID_TYPE            = 4
      NO_AUTHORITY            = 5
      UNKNOWN_ERROR           = 6
      HEADER_NOT_ALLOWED      = 7
      SEPARATOR_NOT_ALLOWED   = 8
      FILESIZE_NOT_ALLOWED    = 9
      HEADER_TOO_LONG         = 10
      DP_ERROR_CREATE         = 11
      DP_ERROR_SEND           = 12
      DP_ERROR_WRITE          = 13
      UNKNOWN_DP_ERROR        = 14
      ACCESS_DENIED           = 15
      DP_OUT_OF_MEMORY        = 16
      DISK_FULL               = 17
      DP_TIMEOUT              = 18
      FILE_NOT_FOUND          = 19
      DATAPROVIDER_EXCEPTION  = 20
      CONTROL_FLUSH_ERROR     = 21
      OTHERS                  = 22.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.