[ABAP] D빠진 CRUD - Create & Update

JIHUN LEE·2024년 4월 25일
0

[ABAP] D빠진 CRUD

목록 보기
3/3

들어가기 전에.

Velog를 작성하면서 후딱후딱 글을 남기고 기록용으로 잘 만들어 보자고 생각했지만... 현실은 6시반에 집오면 저녁먹고 뻗는 삶... 나름 내 벨로그에 관심을 갖고 있는 친구들이 많아서 오랜만에 벨로그를 켰다. 이제 진짜 D빠진 CRUD 마지막 글이다!
사실 이 프로그램을 만든지... 어언 2달이 다되간다... Fiori도 글을 하나 남기고싶고 플젝내용도 담는게 목표인데 다들 많관부라고~

Create: 교과목 등록

이제 교과목을 등록해야 한다.
교과목을 등록을 하기 위해서는 새로운 Screen으로 넘어가야한다.
Screen Number는 100단위로 넘어가고, Subscreen이나 Modal Dialog Screen은 연관된 Screen Number의 1의 단위 숫자를 바꿔가며 만들어가면 스크린과의 연관성을 빠르게 찾아볼 수 있다.(ex. 100번 Screen에서 Load되는 101번 Subscreen, 102번 Modal Dialog Screen ...)

100번 Screen에서 교과목 등록 버튼을 누르면 이벤트가 발생해 PAI로직을 타게 되고 해당 버튼의 User Command인 INPUT이 SY-UCOMM에 들어가 Create로직을 수행할 수 있다.

Screen 200

Screen 200의 Layout은 다음과 같다.

교과목 코드와 교과목 명, 금액은 필수 입력값으로 처리를 했고, 통화단위는 KRW로 고정시켰다. 왜 고정시켰는지는 아래에서 설명해줄게 ><

값을 입력 후 등록 버튼을 누르면 아래와 같은 로직으로 수행된다.

Subject Table(교과목 테이블)은 교과목 코드 금액 통화단위 필드로 이루어져 있으며 교과목명은 Subject Text Table 로 관리가 된다.
Text Table은 교과목 코드 언어 교과목 명으로 이루어져 있으며 교과목 명 같은 경우는 다국어 처리가 가능하기 때문에 명칭은 Text Table로 따로 관리를 한다.

테이블이 두개로 나누어져 있기 때문에 교과목테이블에 Record를 먼저 Create하고 Text Table에 Create 한다.
두 테이블에 값을 생성할 때 같은 정보가 2개의 테이블에 한번에 Insert되어야 하기 때문에, 한 테이블에서라도 에러로 인해 값이 생성되지 않는다면 Rollback을 해야 한다.

에러없이 위 과정을 수행하면 Create는 여기서 끝이다!

확인을 하기 위해서는 T-code SE11에서 DB에 새로운 Record가 생성되었는지 보면 된다! Record가 추가되었다면 완!

Update: 교과목 변경

교과목을 변경하기 위해서는 ALV에서 변경할 레코드를 선택해야한다!

아래 사진과 같이 조회조건에서 검색을 한 후 왼쪽 선택 버튼이 선택된 상태에서 교과목 변경버튼이 눌려야 한다!

선택된 레코드에 대한 정보를 어떻게 얻는지에 대해 생각을 해보아야 한다.

우리는 ALV를 통해 정보를 보여주고 있다. 그렇기에 ALV 객체의 메서드를 사용해야 한다! 많은 메서드 중 GET_SELECTED_ROWS라는 메서드를 사용해 선택된 줄이 한 줄인지, 선택된 줄이 여러 줄인지, 아예 선택되지 않았는지 확인한 후에 그에 따른 명령이 있어야 한다.

우리가 원하는 것은 사용자가 하나의 레코드만 선택해서 그 레코드의 정보를 변경할 수 있도록 하는 것이다!

레코드가 선택되지 않았더라면 "레코드를 선택해주세요"라는 메시지가 떠야하고, 만약 2줄 이상의 레코드가 선택되었을 때는 "하나의 레코드만 선택해 주세요"라는 에러처리가 있어야한다.

하나의 레코드가 선택된 후에는 교과목의 정보를 변경할 수 있는 스크린으로 넘어가야한다.

레코드가 선택이 되었다면 선택된 레코드의 정보를 가져가 아래 사진과 같이 300번 Screen에서 띄워주면 된다.

교과목 코드는 Primary Key이기 때문에 수정을 할 수 없게 만들었고, 통화단위 역시 바꾸지 못하게 input Box를 비활성화 시켰다.

통화단위

통화단위를 바꾸면 어떤 이슈가 발생하는지 생각을 해보아야 한다!
SAP는 기업용 소프트웨어이기 때문에 금액과 통화단위가 상당히 중요한 필드중 하나이다.

그럼 SAP는 금액을 어떻게 관리할까?

글로벌 기업용 소프트웨어이기 때문에 통화단위가 엄청 많다!

우리가 100원을 저장할 때 SAP에는 100 KRW를 넣는것이 아니라, 1.00 KRW의 값을 넣는다.

SAP를 하면서 가장 헷갈리는 부분이기도 하고 통화단위가 많기 때문에 찾아보면서 개발을 해야하는 부분이다.

자, 그래서 교과목 정보를 변경하는 화면에서 왜 통화단위는 값을 바꾸지 못하게 하였는가!

우리가 수강료를 605,000원이라고 했을 때, 레코드에는 6050.00 KRW가 들어간다. 만약 KRW(원화)를 USD(달러)로 바꾸게 된다면 쌩뚱맞게 6050달러가 들어가는 것이다! 그러면 작성일 기준 8,344,825원이 되는 마법을 체험할 수 있다. 유저가 잘못된 값을 입력하는 실수를 방치하는 것 보단, 개발자가 유저의 실수를 막아준다면? 이게 진정한 SAP개발자가 아닐까?

다시 Update Logic

Create와 큰 맥락에서는 비슷하다!

Subject Table(교과목 테이블)은 교과목 코드 금액 통화단위 필드로 이루어져 있으며 교과목명은 Subject Text Table 로 테이블이 구분되어 있기 때문에 교과목 Key값인 교과목 코드 에 따라 필드의 값을 Update 해주면 된다!

아래 로직과 같이 Create에서 진행했던 로직대로! 두 테이블에 Update를 하지만 한 Update문이 오류가 발생한다면 둘 다 Rollback을 해줘야 무결성 없이 값이 들어가게 된다.

Modify vs Update

ABAP에서 레코드의 정보를 수정할 땐 ModifyUpdate가 있다.

이 둘의 차이는 뭘까?

두 쿼리는 Key값을 통해 해당하는 레코드를 찾아 레코드의 정보를 변경해주는 공통점이 있지만 Modify문은 Key값을 찾아 레코드가 없으면 새로운 레코드를 만들어 DB에 저장을 하고, Update는 Key값을 찾지 못했거나 Update에 실패를 하면 SY-SUBRC값이 4가 되며 에러를 띄운다.

sy-subrc is basically a return code for any operation.

Modify는 레코드 변경에 실패했을 때, sy-subrc값을 4로 띄우는게 아니라 새로운 레코드를 만들어주기 때문에 개발자의 의도대로 흘러가지 않을 위험이 있다.

Modify역시 사용에 따라 적재적소하게 사용한다면 정말 좋은 코드가 될 수 있다. 하지만 둘의 차이를 안다면 Modify를 쉽게 사용하지 못 할 것이다. 개발자의 의도에 맞지 않게 수정이 아닌 새로운 레코드 생성이 될 수 있기 때문에, 좋은 기능이지만 나는 Update를 좀 더 애용하는 편이다.

마무리

이렇게 기나긴 D빠진 CRUD의 막이 내렸다.

첫 게시글을 작성한 이후로 많은 ABAP CRUD프로그램을 만들어 봤다. 많이 성장한 부분도 있고, 밋밋한 교과목 CRUD 프로그램보단 더 많은 기능을 구현할 수 있게 되었고, 최근 진행하는 프로젝트에서는 MM파트의 PO를 Header와 Item으로 나눠 CRUD 프로그램 개발을 진행하였다.

곧. 새로운 프로그램으로 다시 찾겠다!

항상 마무리 말로 게시글을 읽고 궁금한게 있거나, 같이 나누고 싶은 이야기가 있다면 함께 공유하자고 남기는데! 상투적인 마무리가 아니라, 함께 성장하는 계기가 될 수 있으니 부담없이 디엠디엠미~~

그럼 이만~!

profile
Hello I'm Jihun

0개의 댓글