반응형

ABAP에서 Selection Screen 화면에서 

 

Select Option에서 나오는 서치헬프를 제한할 수 있다.

 

Select Option Search Help 화면

 

보통 select option 에서 서치헬프를 클릭하면 다음과 같이 4개의 탭이 나온다.

 

이 4개에 탭에서 필요없는 항목을 제거할 수 있고,

 

selection options 종류도 제한적으로 설정할 수 있다.

selection options 의 종류

 

사용할 function은 바로 'SELECT_OPTIONS_RESTRICT' 이다.

 

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = ls_restriction
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

 

위의 코드를 INITIALIZATION. 단계 혹은 PBO 단계에서 입력해주면 

 

Selection Screen 의 특정 필드에 대해서 제한을 걸 수 있다.

 

그러면 함수에서 restriction에는 어떠한 정보를 제공해야 하는지 확인해보자.

 

해당 SSCR_RESTRICT 를 더블클릭 하여 들어가보면

 

해당 타입은 다음과 같이 구성되어 있는 걸 확인 할 수 있다.

 

* The type for SELECT_OPTIONS_RESTRICT (to be extended)
TYPES: BEGIN OF SSCR_RESTRICT,
         OPT_LIST_TAB TYPE SSCR_OPT_LIST_TAB,
         ASS_TAB     TYPE SSCR_ASS_TAB,
       END   OF SSCR_RESTRICT.
       
* List of option lists
TYPES: SSCR_OPT_LIST_TAB TYPE SSCR_OPT_LIST OCCURS 5.

* One list of options
TYPES: BEGIN OF SSCR_OPT_LIST,
         NAME    LIKE RSRESTRICT-OPTIONLIST,
         OPTIONS LIKE RSOPTIONS,
       END   OF SSCR_OPT_LIST.

* The association table
TYPES: SSCR_ASS_TAB TYPE SSCR_ASS OCCURS 20.

* One line of table associating selection screen object with opt. list
TYPES: BEGIN OF SSCR_ASS,
         KIND LIKE RSSCR-KIND,               " A(ll), B(lock), S(elect-Option)
         NAME LIKE RSRESTRICT-OBJECTNAME,    " Blockname, maximal 20
         SG_MAIN LIKE RSRESTRICT-SIGN,       " (only) I, * = both
         SG_ADDY LIKE RSRESTRICT-SIGN,       " additional SIGN
                                             " on multiple selection screen
         OP_MAIN LIKE RSRESTRICT-OPTIONLIST, " name of option list for
                                             " main selection screen
         OP_ADDY LIKE RSRESTRICT-OPTIONLIST, " name of additional option
                                             " list for multiple selection screen
       END   OF SSCR_ASS.

 

Restriction 에는 기본적으로 opt_list_tab ( one list of options table ) 와 ass_tab ( association table )를 구성해야한다.

 

1. OPT_LIST_TAB

option list를 나타내는 이름과 , options 의 종류 설정이다.

 

이름은 10글자 이내로 원하는대로 넣으면 된다. [ EX) 'ONLY_EQ' , 'SELOP_EQ', 'EQ_ONLY' , 'ONLY_NE' 등 ]

 

options는 원하는 항목에 대해서 아래 Structure Name 을 선택하여 구성하면 된다.

selection options 의 종류 Structure.

 

구성 방법은 다음과 같다.

DATA: ls_sscr_opt_list TYPE sscr_opt_list,
      ls_sscr_ass_list  type SCR_ASS,
      ls_restriction   TYPE sscr_restrict.

* 'SELOP_EQ' 라는 이름과 EQ만 허용
ls_sscr_opt_list-name = 'SELOP_EQ'.
ls_sscr_opt_list-options-eq = 'X'.

* 만든 option list를 restriction 의 opt_list_tab에 append.
APPEND ls_sscr_opt_list TO ls_restrict-opt_list_tab.

* New Syntax 선언 방법 ( ass_tab 은 아래 추가 설정 )
DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) ) )
                          ass_tab      = VALUE #(  ) ).

 

해당 코드는 'SELOP_EQ' 라는 이름을 가지고 selection option 은 EQ만 허용하는 opt_list_tab를 설정한 것이다.

반응형

2. ASS_TAB

KIND는 특정 유형의 필드를 제어할지 나타내는 것이다.

A : ALL(모든필드)를 제어한다.

B: Block(블락)을 제어한다.

S: Select-option(선택옵션) 제어 사용.

 

나는 Select-option을 제어할 것이기에 Kind = 'S'를 설정할 것이다. 

 

NAME은 제어할 필드의 이름이다. [ ex) s_bukrs, p_bukrs ]

 

SG_MAIN은 메인 선택기호 (Sign)이며, SG_ADDY 는 추가 선택기호이다.

'I' = Include로 포함을 의미한다.

'*'을 넣어주면 Include, Exclude 둘다 적용 된다.

 

OP_MAIN은 메인 option list 이름이며, OP_ADDY는 추가 option list 이다. 

해당 값은 위에 설정했던 OPT_LIST_TAB에 있는 option_list_tab-name 이다.

 

구성방법은 다음과 같다.

DATA: ls_sscr_opt_list TYPE sscr_opt_list,
      ls_sscr_ass_list  type SCR_ASS,
      ls_restriction   TYPE sscr_restrict.

* 'SELOP_EQ' 라는 이름과 EQ만 허용
ls_sscr_opt_list-name = 'SELOP_EQ'.
ls_sscr_opt_list-options-eq = 'X'.

* 만든 option list를 restriction 의 opt_list_tab에 append.
APPEND ls_sscr_opt_list TO ls_restrict-opt_list_tab.

* ass_list 구성 후 ls_restriction의 ass_tab에 append.
ls_sscr_ass_list-kind = 'S'.
ls_sscr_ass_list-name = 'S_BUKRS'
ls_sscr_ass_list-sg_main = 'I'.
ls_sscr_ass_list-op_main = 'SELOP_EQ'.

APPEND ls_sccr_ass_list TO ls_restriction-ass_tab.


* New Syntax 선언 방법
DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_EQ' ) ) ).
                          
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction  = ls_restriction

 

사용방법은 위의 코드와 같다.

 

그러면 실행해서 어떻게 제어가 되는지 확인해보자.

 

위에 코드 실행 시 아래 화면과 같이 제어가 된다.

sg_main = 'I' , select-options는 EQ만 사용.

 

그러면 sg_main = '*' 로 변경하면 어떻게 되는지 확인해보자.

sg_main = '*', select-options는 EQ만 사용.

 

Single Value가 아니라 Range를 넣고 싶으면, 

  DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) )
                                                  ( name = 'SELOP_BT'    options = VALUE #( bt = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_BT' ) ) ).

 

사용할 op_main을 BT로 설정한 list_tab 이름으로 변경해주면 된다.

Select Ranges로 변경된 것을 확인.

위와 동일하게 sg_main = '*'로 하면 select ranges탭과 exclude select ranges 탭 2개가 생긴다.

 

  DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) )
                                                  ( name = 'SELOP_BT'    options = VALUE #( bt = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_BT' op_addy = 'SELOP_EQ' ) ) ).

 

op_addy에 SELOP_EQ를 넣으면 select single values와 select ranges 탭으로 설정 가능하다.

Select single value와 select ranges 탭으로만 설정.

 

마지막으로 selection options에 값 추가해보자.

  DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) )
                                                  ( name = 'GE&NE'       options = VALUE #( ge = 'X' ne = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_EQ' op_addy = 'GE&NE' ) ) ).

 

selection options 제어 화면

 

opt_list_tab 구성 시 제어하기를 원하는 필드를 추가하여 위와 같이 설정해주면

 

위 화면과 같이 seletion options를 제어 할 수 있다.

반응형
반응형

https://economic-diary.tistory.com/entry/ABAP-SWM0%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Excel-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C

 

[ABAP] SMW0를 이용한 Excel 다운로드

Excel 을 다운로드 하는 경우가 종종 생긴다. 먼저 Download 할 위치를 정해줘야 하는데 SAP 스탠다드 코드를 이용할 수 있다. Method cl_gui_frontend_services=>file_save_dialog를 이용하면 된다.  DATA : lv_file_fil

economic-diary.tistory.com

 

SMW0에 등록하여 WebRFC를 이용하여 Excel 다운로드 하는 방법을 알아보았다.

 

혹시 모르면 위에 내용 참고하시면 됩니다.

 

 

이번엔 SMW0에 등록을 하려는데 MIME type이 없다고 등록이 안되는 현상이 발생 할 수 있다.

SMW0 등록 과정
Error 문구

 

이런 경우 MIME type을 설정해주면 되는데,

 

SMW0에서 해당 파일을 등록하는 화면에서 세팅 -> MIME 타입 정의 를 클릭해주면 된다.

Define MIME Types

 

TYPE과 EXTENSION을 넣어주면 해당 오류는 사라지고 등록 할 수 있다.

 

대표적으로 등록하는 타입들은 아래 캡쳐화면을 참고하면 대부분의 확장자들에 대해서는 등록 가능.

 

주로 사용하는 엑셀이나, 사진, 파워포인트, PDF는 등록을 해두면 편하다.

 

MIME Type과 Extension 설정

반응형
반응형

 

ABAP에서 URL에 접근하여 데이터를 가져오는 가장 일반적인 방법은

 

HTTP Client Class를 사용하는 것이다.

 

CL_HTTP_CLIENT 클래스를 이용하여 HTTP요청을 보낼 수 있다.

 

DATA : lo_http_client TYPE REF TO if_http_client,
       lv_json        TYPE string,
       lv_api_token   TYPE string VALUE '접근가능한 API TKOEN명',  " API Token
       lv_auth        TYPE string,
       ls_data        TYPE gty_data.


DATA(lv_url) = |https://접근할 URL 주소|.
" HTTP 클라이언트 생성
cl_http_client=>create_by_url( EXPORTING url = lv_url
                               IMPORTING client = lo_http_client ).

" HTTP 요청 설정
lv_auth = |Bearer { lv_api_token }|.
lo_http_client->request->set_header_field( name = 'Authorization' value = lv_auth ).
lo_http_client->request->set_header_field( name = 'Content-Type' value = if_rest_media_type=>gc_appl_json ).
lo_http_client->request->set_method( if_http_request=>co_request_method_get ).

" HTTP 요청 전송
lo_http_client->send( ).

lo_http_client->receive( ).

" HTTP 상태 코드 확인.
lo_http_client->response->get_status( IMPORTING code = DATA(lv_status_code) ).

IF lv_status_code <> '200'.
  " 실패 Message 처리
  EXIT.
ELSE.

  " Body Data
  DATA(lv_response_body) = lo_http_client->response->get_cdata( ).

  " HTTP 클라이언트 종료
  lo_http_client->close( ).

  "  Json Data -> ABAP Stucture로 변환
  CALL METHOD /ui2/cl_json=>deserialize(
    EXPORTING
      json = lv_response_body
    CHANGING
      data = ls_data ).    " ABAP Structure Data

ENDIF.

 

코드를 다음과 같이 작성하면 URL에 접근이 가능하다.

 

CL_HTTP_CLIENT 클래스를 사용하요 HTTP 클라이언트를 생성하고,

 

Header 및 Method 구성 후 send 와 receive를 사용하여 요청하고 응답을 받을 수 있습니다.

 

만약 URL에 데이터를 전송하려면 Method구성 시 GET이 아니라 POST를 요청하면 된다.

 

IF_REST_MEDIA_TYPE 해당 인터페이스를 들어가보면 Attribute에 변수가 저장되어 있어서 

 

알맞은 attribute를 찾아서 header와 method를 구성하면 쉽게 접근할 수 있다.

 

IF_REST_MEDIA_TYPE 인터페이스에 설정되어 있는 atrribute

 

IF_HTTP_ENTITY의 attribute

 

위의 코드로 접근 시 해당 data를 받아오면 되는데 JSON type 으로 요청했기 때문에

 

JSON data를 ABAP Structure로 변환만 해주면 된다.

 

" Status, issue info
TYPES: BEGIN OF gty_name,
         name TYPE string,
       END OF gty_name.

" Field info
TYPES: BEGIN OF gty_fields,
         issuetype         TYPE gty_name,      
         status            TYPE gty_name,       
         resolutiondate    TYPE string,          
         created           TYPE string,           
       END OF gty_fields.

" JSON Data Info
TYPES : BEGIN OF gty_data,
          key    TYPE string,                  
          fields TYPE gty_fields,          
        END OF gty_data.

 

JSON 받을 data는 다음과 같이 deep structure로 구성하여 필요한 필드만 구성하여 받을 수 있다.

 

이렇게 구성되어 나온 JSON데이터를 가공하여

 

아래 그림과 같이 ABAP Structure로 변환 된 data를 사용할 수 있다.

 

반응형
반응형

 

BDC(Batch Data Communication)으로 SAP시스템에서 대량의 데이터를 일괄적으로

 

입력하거나 업데이트하기 위해 사용되는 기술로 수작업으로 데이터를 입력하는 대신 

 

자동화된 방식으로 데이터를 처리할 수 있는 기능이다.

 

 

BDC는 크게 기록(Recording)을 통해 트랜젝션을 기록하고 BDC프로그램을 작성하는 Session Method와

 

작성한 BDC프로그램을 Call Transaction Method 를 실행하는 방법으로 구성되어있다.

 

 

1. T-Code : SHDB 실행 후 기록.

SHDB 화면 ( Recording Overview)

 

해당프로그램에서 New recording을 클릭.

Create Recording 화면

 

Recording 명을 작성하고 기록할 T-Code입력 후 start recording을 눌러 실행한다.

 

내가 프로그램을 자동화 처리하기 위한 하나의 과정을 진행하고 종료하면 다음과 같이 행위에 대한 결과가 저장된다.

 

Recording 결과

반응형

2. 코드작성 

DATA : lt_bdcdata TYPE TABLE OF bdcdata WITH EMPTY KEY.

 lv_opt = VALUE ctu_params( dismode = 'E' ).
 lt_bdcdata = VALUE #(
                      ( program = 'RDDM0001' dynpro = '0200' dynbegin = 'X' )
                      ( fnam    = 'BDC_CURSOR'           fval = 'TRDYSE01SN-TR_TRKORR' )
                      ( fnam    = 'TRDYSE01SN-TR_TRKORR' fval = ls_list-trkorr )
                      ( fnam    = 'BDC_OKCODE'           fval = '=SINGLE_LOGS' ) ).

CALL TRANSACTION 'SE01' USING lt_bdcdata OPTIONS FROM lv_opt.

 

RDDM0001이란 프로그램의 화면 0200을 시작하겠다고 선언.

 

위의 기록대로 필요한 값을 bdcdata Type table에 넣어주면 된다.

 

lv_opt 이란 bdc가 작동하면서 화면을 어떻게 보여줄지에 대한 설정이다.

 

                                       'A' : 모든 화면에 대해 조회하면서 트랜잭션 수행 모드

 

                                       'E' : 에러 발생할 경우 해당화면 조회

 

                                       'N' : 화면을 표시하지 않음.

 

보통 'E' 모드를 많이 쓰고, Data 값을 가져오기 위한 경우엔 'N'화면을 많이 사용한다.

 

 

 

더블클릭 or Hotspot 클릭을 이용하여 특정 필드에 대한 Event를 등록하면

 

해당 TROKRR ( Request No)를 가지고 바로 SE01의 Log화면을 띄워주는 걸 확인 할 수 있다.

 

반응형
반응형

 

Excel 을 다운로드 하는 경우가 종종 생긴다.

 

먼저 Download 할 위치를 정해줘야 하는데 SAP 스탠다드 코드를 이용할 수 있다.

 

Method cl_gui_frontend_services=>file_save_dialog를 이용하면 된다.

 

  DATA : lv_file_filter       TYPE string,
         lv_initial_directory TYPE string,
         lv_filename          TYPE string,
         lv_path              TYPE string,
         lv_fullpath          TYPE string.

  lv_filename = 'Template'.
  lv_file_filter = 'Excel File(*.xlsx; *.xls )|*.xlsx; *.xls'.
  lv_initial_directory = 'C:'.
  cl_gui_frontend_services=>file_save_dialog(
    EXPORTING
      default_extension         = 'xlsx'                " Default Extension
      default_file_name         = lv_filename           " Default File Name
      file_filter               = lv_file_filter        " File Type Filter Table
      initial_directory         = lv_initial_directory  " Initial Directory
    CHANGING
      filename                  = lv_filename           " File Name to Save
      path                      = lv_path               " Path to File
      fullpath                  = lv_fullpath           " Path + File Name
    EXCEPTIONS
      cntl_error                = 1                     " Control error
      error_no_gui              = 2                     " No GUI available
      not_supported_by_gui      = 3                     " GUI does not support this
      invalid_default_file_name = 4                     " Invalid default file name
      OTHERS                    = 5.
      
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  
  IF lv_fullpath IS INITIAL.
    RETURN.
  ENDIF.

 

위 코드와 같이 작성을 하면 아래와 같이 Download하는 창을 불러올 수 있다.

Excel Download 창

 

Default로 C드라이브 , 제목은 Template고 형식은 Excel로 들어간다.

 

필요에 따라 저장위치, 파일이름, 형식은 변경이 가능

 

lv_fullpath 는 저장위치(path) + 파일이름(File Name)  으로 구성되는 String으로 반환된다.

 

 

자 그러면 이제 Excel 혹은 Excel Template를 SAP 스탠다드에(웹저장소) 등록을 해보자.

 

T-Code : SMW0 실행.

 

SMW0 화면

 

Binary data for WebRFC applications를 선택하고 실행을 눌러준다.

 

Binary data for WebRFC 화면

 

해당 프로그램이 포함된 Package를 넣어주고 Excute(실행) 클릭

반응형

 

Obj. name 과 Description을 작성하고 import 버튼을 눌러 생성해준다.

 

Obj. name은 나중에 select문에 사용된다.

 

Import 클릭 후 화면

 

Import 버튼을 누르면 Excel을 선택하는 창이 나오는데,

 

미리 작성해둔 template excel 파일을 선택하여 등록하면 SAP 스탠다드 웹 저장소에 Upload되면서 저장이 된다.

 

그럼 코드로 돌아와서 해당 파일을 가져오자.

 

DATA : ls_item              TYPE wwwdatatab,
       lv_file              TYPE rlgrap-filename.
       
lv_file = lv_fullpath.

  SELECT SINGLE FROM wwwdata
   FIELDS *
    WHERE objid = 'Z_EXCEL_TEMPLATE'
     INTO CORRESPONDING FIELDS OF @ls_item.             "#EC CI_NOORDER

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_item
      destination = lv_file.

  IF ls_item IS INITIAL.
    "File is not exist
    MESSAGE s044 DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

 

wwwdata 에서 방금 만든 obj.name 의 data를 가져와 

 

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' 를 사용해서 다운로드를 해주면 

 

기존의 만들어 뒀던 template의 모든 형식그대로 다운로드가 된다.

 

( 날짜 타입, 엑셀 border, Cell style 모두 적용된 상태로 다운 )

 

반응형

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

[ABAP] URL 접근하여 데이터 얻는 방법  (0) 2024.09.12
[ABAP] BDC를 활용한 CALL TRANSACTION  (2) 2024.09.10
[ABAP] Subtotal(소계) 세팅  (1) 2024.09.02
[ABAP] SELECT WITH 구문  (0) 2024.06.24
[ABAP] Pass by Value vs Pass by Reference  (1) 2024.06.16
반응형

ALV에서 로직을 이용하여 Subtotal 초기 세팅하는 법에 대해서 알아보자.

 

다음과 같은 List가 있다.

해당 List를 보면 Company Code, Status, Posting Date, Document Date, Document Number는 동일하고

 

전표안에 있는 Line Item들의 고객마다 처리할 금액이 여러 건 있는 케이스다.

 

이럴 경우 전표번호에 따른 금액을 Subtotal(소계) 하여 보여주고 싶을 경우가 생길 것이다.

 

이럴 때 사용하는 Subtotal 에 대해서 알아보겠습니다.

 

먼저 Fieldcatalog 세팅에서 소계를 해줄 필드에대해서 세팅을 해준다.

Fieldcatalog에서 do_sum 세팅

 

해당필드에 do_sum = 'X' (abap_true)로 세팅을 해주면 

do_sum 결과 ALV화면

 

해당 필드에 값들이 모두 더해진 라인이 맨 아래 생긴다.

 

 전표번호를 기준으로 Subtotal이 필요하기에 이 세팅을 해줘야 하는데

 

Sort 세팅에서 넣어줘야한다.

 

Sort 세팅.

 

spos : 정렬 순서를 의미

fieldname : 어떤 필드로 정렬할지

up : 오름차순으로 정렬 (내림차순으로 하고싶은면 down 이다. )

subtot : 해당 필드로 소계를 적용하겠다.

반응형

이렇게 설정을 하고 실행을 해보면

해당 전표 별로 소계가 되어 나오는 걸 알 수 있다.

 

하지만, ALV화면 맨아래 총 합은 모든 전표에 대한 합계이기 때문에 필요없을 수 있다.

 

이럴 경우에는 Layout 설정에 가서 설정해주면 된다.

no_totline = 'X' (abap_true) 로 설정하고 실행하면

no_totline 설정 후 ALV 화면

 

노란색으로 되어있던 전체 합계 라인이 사라진 것을 확인 할 수 있다.

 

그러면 동일 한 필드에 대해서는 전표번호 처럼 합쳐서 나오게 하려면 

 

Sort 세팅에서 묶어주면 해결된다.

Sort 세팅

이렇게 원하는 필드에 대해서 Sort table에 넣어주면 된다.

 

 

이러면 테이블이 보는게 훨씬 깔끔해야지고 가독성이 올라간다.

 

지금까지 세팅한 Sort, layout, fieldcat 은 alv를 불러올 때

 

입력해주는 값 들에 세팅을 해줘야 하며,

 

set_table_for_first_display 가 실행되기 전에 세팅을 해야한다.

 

또한, set_ready_for_input( i_ready_for_input = 0 )

 

필수로 설정해줘야 동일 필드가 합쳐져서 1개로 보인다.

반응형

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

[ABAP] BDC를 활용한 CALL TRANSACTION  (2) 2024.09.10
[ABAP] SMW0를 이용한 Excel 다운로드  (1) 2024.09.09
[ABAP] SELECT WITH 구문  (0) 2024.06.24
[ABAP] Pass by Value vs Pass by Reference  (1) 2024.06.16
[ABAP] ALV Grid Event Handler - 2편  (0) 2024.06.11
반응형

 

CTE ( Common Table Expression, 공통 테이블 ) 단일 명령문의 범위 내에 존재하는 명명된 임시 결과 집합이다.

 

이러한 공통 테이블 표현식을 지정하기 위해서 사용되는게 WITH구문이다.

 

CTE 이름은 다른 CTE에서 참조할 있으므로 CTE 다른 CTE 기반으로 정의 있다.

 

또한, CTE 자신을 참조하여 재귀 CTE 정의할 있다.

 

이러한 이유로 복잡한 쿼리를 단순하게 정의 있어 가독성을 높이고 중복을 제거하는데 도움이 된다.

 

WITH구문 사용하는 방법은 다음과 같다.

 

 

WITH +(NAME) AS (

SELECT 쿼리

             ),

 +(NAME) AS (

SELECT 쿼리

 ),

+(NAME) AS (

SELECT 쿼리

)

메인 SELECT 쿼리

 

Name 길이는 최대 30 까지 가능하기에 이름만으로 추론할 있도록 이름으로 설정할 있다.

   또한, 이름앞에 반드시 '+' 기호를 사용해야 한다.

 

다음과 같이 항공편 테이블이 있다고 , WITH구문을 이용하여 데이터를 추출해보자.

 

 

다음과 같이 2개의 임시 View 생성한다.

 

첫번째 (+main_spfli) 메인 테이블 도착이 배정안되어 있는 곳은 제외한 데이터

두번째 (+airline) 메인 테이블에서 항공사, 출발나라 , 거리단위 같은 항목끼리 Group by 하여 운항 거리를 합한 데이터

 

 

이렇게 임시의 View 만들어 Inner Join 통하여 두개의 데이터를 가공할 있다.

 

예시로 2개의 (View 만들었지만, 실제로는 여러 개를 만들 있으며 만들었으면 무조건 사용은 해야한다.

 

실행 결과) 항공사별 출발지가 같은 곳의 최종 거리가 추가된 것을 확인 있다.

 

 

1개의 View 만들 안에서도 Join이나 Union 모두 사용가능 하기에 복잡한 데이터를 가공하기에 매우 유용하게 사용할 있다.

 

ABAP에서 CDS View 이용하여 쿼리를 많이 짜는 방향으로 바꼈는데 WITH 구문을 사용하여 가독성을 높여보자.

 

복잡한 쿼리인 경우 SELECT문이 길어지면서 가독성이 떨어지는데 WITH구문으로 VIEW 이름을

 

용도에 맞게 나눠서 만들기에 가독성이 매우 높아지기 때문에 유지보수에도 도움이 것이다.

 

또한, WITH구문은 본절에서 1 사용될 때는 서브쿼리와 성능차이가 보이지 않지만,

 

WITH구문으로 정의된 테이블이 2번이상 사용될 때에는 내부적으로 메모리에 쿼리의 결과값을 저장하고 반복하여 사용하는 방식으로

 

저장된 결과값을 불러와 실행 수를 줄여주기 때문에 성능의 개선이 있다.

반응형

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

[ABAP] SMW0를 이용한 Excel 다운로드  (1) 2024.09.09
[ABAP] Subtotal(소계) 세팅  (1) 2024.09.02
[ABAP] Pass by Value vs Pass by Reference  (1) 2024.06.16
[ABAP] ALV Grid Event Handler - 2편  (0) 2024.06.11
[ABAP] ALV Grid Event Handler - 1편  (0) 2024.06.10
반응형

SAP에서 Class Method Function Module 혹은 Subroutine( Perform )

 

을 작성하다보면 모두 파라미터를 주고받는 방식으로 작성하게 된다.

 

 

이때 Pass by Value Pass by Reference의 차이점을 알아보자.

 

Pass by Value

 

Pass by Value는 실제 파라미터를 보낼 때 복사본을 만들어서 사용한다고 보면 된다.

 

프로시저가 호출되면 파라미터와 반환 값이 초기화 된다.

 

입력 파라미터는 호출 시 실제 파라미터 값을 받지만반환 될 때 초기화가 되기에 

 

Return을 사용할 경우에 값을 전달 받을 수 있다.

 

, 매개변수가 Method Function Module 혹은 Subroutine( Perform ) 안에서 변화가 된다고 해도

 

복사된 입력 파라미터에만 영향을 미치기 때문에 기존 실제 파라미터에는 영향을 주지 않는다.

 

이렇기 때문에 Pass by Value는 대용량 데이터를 처리할 경우 메모리와 시간이 많이 들 수 있는 단점이 있다.

 

Pass by Reference

 

Pass by Reference는 실제 파라미터를 보낼 때 Reference ( Pointer ) 를 포함하여 보낸다고 보면 된다.

 

프로시저에 전달되고 실제 파라미터와 함께 작동하는 경우다.

 

, 매개변수가 Method Function Module 혹은 Subroutine( Perform ) 안에서 변화가 된다면

 

실제 파라미터값도 동일하게 변경된다.

 

그렇기에 Pass by Value에 비해 대용량 데이터 처리를 할 경우 퍼포먼스 측면에서는 확실 히 더 좋은 장점이 있다.

 

다만, Pass by Reference는 실제 데이터 값을 변경시키기 때문에 증간에 결과가 변경될 수 있어

 

잠재적은 부작용을 일으킬 수 가 있어서 주의가 필요하다.

 

Perform 문을 구성할 때 Using / Changing / Tables 를 사용하는데 먼저 이것부터 이해하고 예시를 보겠습니다.

 

Using은 값을 던져주는 것이고,

 

Changing은 값을 던지고 받아오는 것,

 

Tables Table을 넘겨서 받아오는 것으로 이해하면 쉽다.

 

자 그러면 Using Changing을 먼저 이해해보도록 하자.

 

Perform Using vs Changing

다음과 같이 작성을 하고 실행을 해보면 다음과 같은 결과가 나온다.

Using Changing은 결국 값을 변환시키고 내뱉는다

 

Pass by Reference 로 실행이 되는 것이다

 

사실 Using Chaning은 차이 없이 값이 변경되어 나오기 때문에 차이가 없고 똑같은 기능이다.

 

하지만 Value라는 값으로 감싸주면 두개의 기능이 차이가 생긴다.

 

같은 코드에 Value 구문을 추가해서 실행을 시켜보자.

Perform Using vs Change by Value

 

Using은 초기 파라미터 값이 변경되어 나오지 않은 반면 Changing은 변경되어 나온다.

이부분에서 왜 Using Changing 구문이 나눠지는지 알 수 있는 부분이다.

 

Using Value구문을 쓰면 Pass by Value가 되고

 

Chaning은 쓰나 안쓰나 Pass by Reference가 되는 것이다.

 

명시적인 표현으로 구분을 하기 위해서는 Using구문에서는 value를 사용하여 Pass by Value로 사용하고

 

Pass by Reference로 사용하려면 Changing 구문을 사용하는게 맞는 것 같다.

 

 

자 그러면 참조변수로 설정 되어있는 값에 대해서는 어떻게 변경되는지도 확인을 해봐야

 

좀 더 깊게 이해를 한다고 생각한다.

 

하나는 Value로 하나는 New로 변수가 아닌 Structure 타입으로 생성을 해보자.

 

디버깅을 태워보면 Value New의 차이점을 볼 수 있다.

Value Structure타입으로 생성을 해주고 New는 해당 Structure Reference 변수로 생성을 한다.

 

그렇기에 addr_ref2 -> 동적 개체 할당 기호를 사용하여 접근을 해야한다

 

그러면 생성된 2개의 값을 Using value를 사용하여 Pass by Value로 보내본다.

 

그리고 실행을 해보면 결과는 다음과 같다.

 

참조변수로 생성된 값은 Perform문을 통하여 Pass by Value로 보낸다고 해도

 

Subroutine 내에서 값이 변경되면 파라미터가 변하기 때문에 Using Value가 먹히지 않는 것을 알 수 있다.

 

이렇게 Pass by Value Pass by Reference 차이를 알아봤다.

 

Class Method Function Module 혹은 Subroutine( Perform ) 작성할 때 

 

어떤 값을 value로 할지 reference 할지 생각하자.

반응형

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

[ABAP] Subtotal(소계) 세팅  (1) 2024.09.02
[ABAP] SELECT WITH 구문  (0) 2024.06.24
[ABAP] ALV Grid Event Handler - 2편  (0) 2024.06.11
[ABAP] ALV Grid Event Handler - 1편  (0) 2024.06.10
[ABAP] ALV Class - Method 1편  (1) 2024.06.04

+ Recent posts