프로젝트 및 운영업무 중 ABAP 개발을 하다 보면 "표준 기능에 딱 하나만 더 있었으면..." 하는 아쉬운 순간을 자주 마주합니다.
특히, 자재 마스터를 찾는 F4 Search Help는 강력하지만, 우리 회사만의 기준으로 자재를 찾은 요구사항이 거의 백이면 백 존재합니다.
표준으로 써도 될것 같은데 약간의 불편함(?)..이렇게 말하면 고객지향이 아니겠죠?
회사 業만의 특성에 따라 검색을 편리하게 바꿔 달라는 요구사항이 있습니다.
지금 회사에서도 역시 그런 요구사항이 나왔습니다.
특정 자재가 1물 2코드가 되었다. ECC에서 사용하는 자재코드인데 마이그레이션과 과거 데이타로 한시적으로 사용된다.
그러나 반품이 있기에 삭제는 불가능한다. 사용자들의 그 자재를 선택하지 못하도록 검색에서부터 없애 달라..라는 요구사항이었습니다.
먼저 최종화면 모습니다.
1. 개념 이해
Search Help의 구조를 '책'에 비유하면 아주 쉽게 이해할 수 있습니다.
- Collective Search Help (종합 검색 도움)
: 여러 검색 기능을 묶어놓은 '책'과 같습니다. 표준 자재 검색인 MAT1이 바로 이 책에 해당합니다. - Elementary Search Help (기본 검색 도움)
: 책 안에 담긴 각각의 '목차' 또는 '챕터'입니다. '자재 내역으로 검색', '클래스로 검색' 등 탭 하나하나가 바로 이 챕터입니다. - Append Search Help (추가 검색 도움)
: 기존에 출판된 책에 새로운 내용을 추가하기 위해 붙이는 '부록(Appendix)'과 같습니다. 우리는 이 '부록'을 만들어 MAT1이라는 책에 붙이는 작업을 할 것입니다.
2. 실전 단계별 가이드
1단계: 데이터의 기초 공사 (Database View OR CDS View 생성)
가장 먼저, 검색에 필요한 모든 데이터를 한곳에 모아주는 Database View를 만듭니다.
복잡한 Select 쿼리를 Exit에서 매번 수행하는 것보다, View를 만들어 두면 성능과 유지보수 측면에서 매우 유리합니다.
요즘 View보단 CDS View 훨씬 쉽게 편하겠죠~.. 하지만 먼저 전통적인 Database View로 해봅니다.
뷰는 설명은 캡처화면으로 보는것이 빠를듯 합니다.
- T-Code: SE11 에서 'View'에 ZG_MATNR 입력 후 [Create] -> 'Database View' 선택
- [Table/Join Conditions] 탭: 검색에 필요한 모든 테이블을 넣고 Join 조건을 설정합니다.
3. [View Fields] 탭: Join된 테이블들에서 화면에 보여주거나 검색 조건으로 사용할 필드들을 모두 선택합니다.
4. [Selection Conditions] 탭: View 레벨에서 고정적으로 적용할 조건이 있다면 여기에 WHERE절을 추가할 수 있습니다
저는 아무것도 조건을 걸지 않습니다.
5. 모두 설정 후 [저장(Save)] 및 [활성화(Activate)] 합니다.
2단계: 검색 화면 디자인 (Elementary Search Help 생성)
이제 방금 만든 View를 데이터 소스로 사용하여, 사용자에게 보여질 검색 화면과 결과 리스트를 디자인합니다.
- T-Code: SE11에서 'Search help'에 ZG_MATNR 입력 후
[Create] -> 'Elementary search help' 선택 - [Definition] 탭 설정:
- Selection method: ZS_MATNR (1단계에서 만든 View 이름)
- Search help exit: ZG_MATNR_F4_HELP_EXIT (3단계에서 만들 Exit 함수 이름. 미리 입력해 둡니다.)
- Parameters: 아래 스크린샷과 같이 검색 조건(IMP)과 결과 리스트(EXP)에 사용될 모든 파라미터를 상세하게 정의합니다.
- 설정 후 [저장(Save)] 및 [활성화(Activate)] 합니다.
3단계: 동적 비즈니스 로직 구현 (Search Help Exit 작성)
가장 핵심적인 단계입니다.
View를 통해 가져온 데이터에 대해, ABAP 코드로 추가적인 데이터 가공 및 필터링을 수행합니다.
- T-Code: SE37에서 'Function Module' ZG_MATNR_F4_HELP_EXIT를 생성합니다. (F4IF_SHLP_EXIT_EXAMPLE를 복사해서 만들면 편리합니다.)
- Tables 파라미터에 SHLP_TAB, RECORD_TAB을, Changing 파라미터에 SHLP, CALLCONTROL을 선언합니다.
- 특정자재를 제거하는 로직이 들어 갑니다.
FUNCTION zg_matnr_f4_help_exit.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" REFERENCE(SHLP) TYPE SHLP_DESCR
*" REFERENCE(CALLCONTROL) TYPE DDSHF4CTRL
*"----------------------------------------------------------------------
IF callcontrol-step <> 'DISP'. RETURN. ENDIF.
*--- 1단계: CBO테이블에 있는 자재 제외 ---
CONSTANTS: lc_matnr_offset TYPE i VALUE 3. " STRING 내 MATNR 시작 오프셋 (0부터 시작) // <-- 여기를 3으로 수정!
CONSTANTS: lc_matnr_length TYPE i VALUE 18. " STRING 내 MATNR 길이 // <-- 여기는 18 유지!
DATA: lt_excl_matnrs TYPE HASHED TABLE OF matnr WITH UNIQUE KEY table_line.
SELECT DISTINCT matnr FROM CBO테이블 INTO TABLE lt_excl_matnrs.
DATA: lt_records_after_exclusion TYPE STANDARD TABLE OF seahlpres.
FIELD-SYMBOLS: <rec_current> TYPE seahlpres.
LOOP AT record_tab ASSIGNING <rec_current>.
DATA: lv_current_matnr TYPE matnr.
IF lc_matnr_offset >= 0 AND lc_matnr_length > 0.
lv_current_matnr = <rec_current>-string+lc_matnr_offset(lc_matnr_length).
CONDENSE lv_current_matnr NO-GAPS. " 추출된 자재 번호의 앞뒤/중간 공백 제거 (필요시)
ENDIF.
IF lv_current_matnr IS NOT INITIAL AND
NOT line_exists( lt_excl_matnrs[ table_line = lv_current_matnr ] ).
APPEND <rec_current> TO lt_records_after_exclusion.
ENDIF.
ENDLOOP.
record_tab[] = lt_records_after_exclusion[].
*--- 2단계: 보이는 모든 컬럼 기준 중복 제거 ---
DATA: lt_records_final_unique TYPE HASHED TABLE OF seahlpres WITH UNIQUE KEY string.
LOOP AT record_tab ASSIGNING <rec_current>.
INSERT <rec_current> INTO TABLE lt_records_final_unique.
ENDLOOP.
record_tab[] = lt_records_final_unique[].
ENDFUNCTION.
4. Function Module을 [저장(Save)] 및 [활성화(Activate)] 합니다.
이건 표준 자재마스터 Search Help 추가하는건이고 원하는것을 만들어서 사용할 수 있습니다.
어떻게 보면 이런 스킬로 개발하는 것이 점점 줄어 들고 있습니다.
간만에 추가하는 작업이라 여려분과 공유 합니다.
감사합니다.
'ABAP' 카테고리의 다른 글
[ABAP] Part 2 - 시점별 재고 ( 전통적인ABAP + ALV 리포트) (0) | 2025.07.05 |
---|---|
[ABAP] Part 1 - 시점별 재고 (CDS View + ALV 리포트) (0) | 2025.07.05 |
[ABAP] 재고는 있는데 재고 부족? BAPI 이슈 해결 (0) | 2025.06.29 |
[ABAP] 엑셀로 구매정보레코드(Info Record) 대량 생성/변경 (0) | 2025.06.29 |
[ABAP] 구시스템 참조하여 데이터 가져오기 (0) | 2025.06.28 |