이전 포스팅을 작성한 프로그램에 대해 개발을 하며 신경써서 코드를 짰던 부분을 같이 공유해보면 좋을 것 같다는 생각이 들어 SAP ABAP 교육을 들으며 쌓인 노하우를 적어보려 한다.

첫번째로는 Chain-Field문이다. SAP ABAP의 스크린은 기본적으로 PBO와 PAI따른다. 이전 포스트에서도 설명했지만, 간단하게 설명하자면 스크린이 구성되기 전 PBO 로직을 수행하고 스크린을 구성한 후 이벤트가 발생되기까지 대기한다. 이벤트가 발생하면 해당하는 User Command에 따라 로직이 수행되는 것이다.
이때 다이나믹 스크린 내 특정 Screen Element의 값에 변화에 따라 모듈을 수행하는 Chain-Field문을 사용할 수 있다. 해당하는 Field의 입력값이 변화하였을 때 모듈을 호출할 수 있다.
조건값이 구매오더코드, 구매오더생성일의 범위를 지정하여 검색하는 로직이기 때문에 유효한 범위를 체크하는 로직으로 사용하기 위해 Chain-Field문을 두번 사용하였다.

구매오더 코드는 첫번째 입력값이 두번째 입력값보다 크면 안되기 때문에 잘못된 입력값을 넣었을 시, 에러메세지를 띄워주는 로직을 사용하였다.

생성일 조회조건은 유효한 범위조건과, 검색할 수 있는 날짜의 범위를 2년 이내로 설정할 수 있게 설정하였다.
날짜의 범위를 계산할 SD_DATETIME_DIFFERENCE Function을 활용하였다.
구매오더의 경우 하루에도 많은 문서가 생성될 수 있고, 날짜의 리미트를 주지 않는다면 데이터를 불러옴에 있어 프로그램에 무리가 갈 수 있다고 판단하여 범위에 제한을 두었다.

ALV에 조회 조건에 맞는 리스트를 띄울 때, 거래처 코드를 보여주는 것은 의미가 없다. 거래처 코드가 아닌 거래처 명을 보여주는 것이 사용자를 배려한 프로그램이라고 생각한다. 그렇기에 ALV에 코드를 보여주는 것은 지양하는 바이다.
구매오더 테이블에는 거래처나 담당자에 대한 정보는 외래키로 테이블이 연결되어있다. 그렇게 되면 조건에 맞는 정보를 구매오더 테이블에서 데이터를 불러오고, LOOP를 돌면서 관계테이블에 접근하여 명칭이나 다른 정보를 불러올 수 있게 된다.
그렇다면 매 loop마다 Select문을 반복적으로 실행해야 할까?
개발을 하다 보면 의미없이 반복되는 일을 줄여나가 프로그램의 효율을 늘려야한다고 생각했다.
효율적인 데이터 관리 및, 의미없이 반복되는 Select문 호출을 막기 위해 인터널 테이블을 선언하여 한번 검색한 명칭은 인터널 테이블에 담아놓는 것이다!
먼저 인터널 테이블에서 키값을 검색한 후, 없다면 Select문을 통해 데이터를 불러오고 인터널 테이블에 저장을 하는 것이다.
거래처나 담당자같은 경우, 명칭이 자주 바뀌지 않는 Master성을 띈다고 판단했기 때문에 프로그램이 돌아가는 동안 인터널테이블에 값을 잠시 저장해놔도 된다고 생각해 위와 같은 로직을 작성하였다.

구매오더를 관리하는 프로그램에서 사용자가 어떤 정보를 보고싶을까?
프로그램을 설계하면서부터 생각해본 내용이다. 실무자라면 이 프로그램을 통해 어떤 정보를 얻고 싶을까에 대해 생각해보았다.
SAP MM모듈에서는 구매오더라고 부르지만 기업 입장에서는 발주, 주문서에 해당한다고 생각하였다.
그렇다면 가장 중요한 부분은 이 주문서를 통해 어떠한 품목을 몇 개 주문하였으며, 이 주문서의 총 가격은 어떻게 될지에 대한 정보가 키라고 생각하였다.
총액을 DB에 저장하는 것이 좋을까?
총액은 품목의 단가와 구매 수량을 곱한 값이다. 단순 계산을 통해 보여줄 수 있는 데이터라면 총액 필드를 DB에 저장하는 것이 좋을까? 고민하였다.
먼저 생각이 든 부분은 기업을 설계하면서 단가와 수량에 따른 총액은 변함이 없을것이라고 설계를 진행하였다. 거래간 할인은 없다고 정의하였기 때문에 굳이 DB에 총액을 저장하지 않아도 된다고 판단하였다.
Structure Type을 사용하면 DB에 저장하지 않아도 연산된 값을 보여줄 수 있기 때문에 Structure Type으로 총액 필드를 선언해서 값을 계산해주고, ALV에 띄웠다.
ALV에서 Field Catalog를 설정할 때, DoSum을 활용하여 모든 레코드의 총액을 더할 수 있도록 설정해 해당 주문서의 총 주문 금액을 확인할 수 있도록 화면을 구성하였다.
개발자로서 갖춰야할 역량을 생각해보았다. 클라이언트의 요구사항에 맞게 프로그램을 완성하는 것도 중요하지만, 프로그램을 효율적으로 만들고, 유저가 편리하게 사용할 수 있도록 프로그램을 짜는 것은 개발자의 몫이다. 어떻게 개발을 해야할지 항상 생각하고 더 효율적인 개발을 어떻게 해야할지 고민하는 성장하는 개발자가 되어야겠다!
이지훈의 성장을 위하여 Cheers~
보면서 많이 배웁니다. 지훈님의 성장을 응원합니다!