D빠진 CRUD가 이렇게 길어질줄 몰랐다.
이 포스트는 CRUD의 Read와 더불어 ALV에 대한 글을 남겨 볼까 한다. 그럼 Screen Flow Logic도 설명을 먼저 하는 것이 이해가 편할 것 같...은데.. 이거부터 적어 나가 보겠다.
먼저 조건에 맞는 Record들을 불러와 화면에 보여주기 위해서는 ALV를 통해 보여주는 것이 편리하고 일반적이다.
SAP에서는 처음에 스크린이 뿅 하고 생성이 되는 것이 아니다!
스크린이 화면에 Display 되기 전에 필요한 로직이 있고, 스크린에서 이벤트가 발생한 후에 필요한 로직이 분명히 존재한다.

스크린이 호출되면 화면이 띄워지기 전에 진행하는 로직이다.
주로 화면을 구성하는데 필요한 로직이 담기는 부분이다.
스크린에서 이벤트가 발생하면 해당 이벤트에 따라 동작하는 로직이다.
Enter, Back, Exit, Canc와 같은 Standard Toolbar부터 프로그램에서 정의된 이벤트까지, 유저가 발생시킨 모든 이벤트를 컨트롤 할 수 있는 로직이 작성되는 부분이다.
Screen에는 Next Dynpro가 설정이 되어있다. 보통 Next Dynpro는 자신의 프로그램으로 다시 돌오게 맵핑되어 있다. 다른 Screen으로 이동하는 로직은 보통 PAI안에서 실행을 한다.
ABAP List View
Screen에서 Record를 조회하거나 조회된 데이터를 가공할 수 있는 viewer다.
그렇다면 이 ALV의 설정은 어디에서 진행을 해야할까!
화면이 구성되기 전, PBO 로직을 통해 ALV를 구성해야한다.
CL_GUI_CUSTOM_CONTAINER 클래스와 CL_GUI_ALV_GRID 클래스를 통해 ALV를 구성한 후 SET_TABLE_FOR_FIRST_DISPLAY라는 메서드로 ALV설정과 데이터를 보여줄 ITAB을 설정할 수 있다.

위 사진과 같이 먼저 변수를 선언한다. CL_GUI_CUSTOM_CONTAINER 클래스와 CL_GUI_ALV_GRID 클래스의 객체 변수를 선언하고, 아래 변수들은 ALV의 설정을 도울 변수들을 선언한다.

스크린의 PBO에서 ALV를 Setting하는 것을 볼 수 있다.

크게 2 Subroutine으로 나눌 수 있다.
객체를 생성하는 로직은 create_alv_object_0100과 'ALV를 뿌려준다' 라고 표현하는 set_alv_display_0100으로 나눌 수 있다.
객체를 생성할 때에는 아래 그림과 같이 Layout의 Container Area와 Container 객체를 연결해주고, Container와 ALV 객체를 연결시켜 준다.

후에 SET_TABLE_FOR_FIRST_DISPLAY라는 메서드로 보여줄 레코드들에 대한 설정을 한다. 이번 실습에서는 Field Catalog, Sort, Layout을 설정해 주었다. 그리고 보여줄 데이터가 담겨있는 ITAB을 연결해 주면 ALV를 통해 데이터를 보여줄 수 있다.
아래 사진과 같이 ALV가 있는 100번 Screen이 띄워진다!![]

ALV가 비어있기 때문에 조건에 맞게 값을 입력한 후에 Search버튼을 누르면 다음과 같은 값을 호출할 수 있다.

DB에서 값을 가져오는 로직은 위 다이어그램과 같다. SEARCH User Command가 발생하면 입력된 교과목 코드 범위에 맞춰 Subject Table(교과목 테이블)에서 교과목 코드 금액 통화단위 를 가져오고, 한줄 한줄 Loop를 돌며 교과목 코드와 시스템 언어(SY-LANGU)를 조건으로 교과목 명을 가져온다.

그 결과 위 사진과 같이 교과목 데이터를 가져올 수 있었다.
SET_TABLE_FOR_FIRST_DISPLAY메서드를 호출할 때, 파라미터로 Sort를 설정할 수 있는 lvc_t_sort타입의 ITAB을 넘겨주었다. 그렇기 때문에 교과목 코드의 오름차순으로 값을 보여줄 수 있었고, 로그인시 설정하는 시스템 언어(SY-LANGU)가 영어로 설정되어 있기 때문에 교과목 명이 영어로 보이는 것을 확인할 수 있다.
다음 글로는 Create와 Update를 구현한 로직에 대해 서술해 볼 예정이다.
혹시나 이 글을 보고 궁금한 점이나, 개선사항 등이 있다면 언제든! 댓글이나 이메일을 주신다면 함께 토론해보고 결과를 도출할 수 있는 유의미한 시간을 가지는 것을 반긴다.
그럼 sqrt(400000000).
도움이 많이 되었습니다~~ 잘하시네요~ ^^