ERP(SAP)
[ABAP] CBO 개발 리스트 조회
가시가되어
2025. 4. 24. 14:10
[ABAP] CBO 개발 리스트 조회
🔍 프로그램 목적
SAP 시스템의 TADIR 테이블에서 사용자 정의 개발 객체(주로 Z/Y 이름공간)를 조회하고, 그 객체들의 유형에 따라 분류하여 프로그램 목록, 트랜잭션 목록, 웹 오브젝트 등을 추출하여 별도의 내부 테이블로 구성합니다. 이 프로그램을 ALV 출력으로 확장하거나, 사용자 정의 보고서로 전환하거나, 범용 유틸리티화할 수도 있어요. 어떤 방향으로 확장하여 사용할 수도 있습니다.
🧱 주요 테이블 및 필드
- TADIR: 개발 오브젝트의 메타데이터 저장 (PGMID, DEVCLASS, OBJECT, OBJ_NAME 등)
- TRDIR: 프로그램(Report) 관련 메타데이터 (NAME, SUBC, UCCHECK 등)
📌 소스코드 - FORM select_data
FORM select_data .
DATA: lv_name LIKE trdir-name.
DATA: ls_pro TYPE tadir,
ls_trdir TYPE trdir.
CLEAR: gt_display, r_dev, gt_program, gt_pro, gt_tcode, gt_table,
gt_object.
REFRESH: gt_display, r_dev, gt_program, gt_table, gt_object,
gt_tcode, gt_pro.
IF s_dev[] IS INITIAL.
SELECT devclass object obj_name AS program INTO TABLE gt_pro
FROM tadir
WHERE pgmid = 'R3TR'
* AND DEVCLASS IN S_DEV.
AND ( devclass LIKE 'Z%' OR
devclass LIKE 'Y%' )
AND delflag NE 'X'.
ELSE.
SELECT devclass object obj_name AS program INTO TABLE gt_pro
FROM tadir
WHERE pgmid = 'R3TR'
AND devclass IN s_dev
AND delflag NE 'X'.
ENDIF.
LOOP AT gt_pro.
CASE gt_pro-object.
"------------------------------------------
" 프로그램 (PROG) 처리
"------------------------------------------
WHEN c_prog.
" 임시 구조(gt_program1)에 프로그램 정보 저장
MOVE: gt_pro-devclass TO gt_program1-devclass,
gt_pro-program TO gt_program1-program.
" 프로그램 설명 가져오기
PERFORM find_program_name USING gt_program1-program
CHANGING gt_program1-ctext.
APPEND gt_program1.
CLEAR gt_program1.
" 실제 프로그램 존재 여부 확인 (TRDIR 조회)
SELECT SINGLE name uccheck INTO (lv_name, ls_trdir-uccheck)
FROM trdir
WHERE name = gt_pro-program
AND ( subc = '1' OR subc = 'M' ).
IF sy-subrc = 0.
MOVE: gt_pro-devclass TO gt_program-devclass,
gt_pro-program TO gt_program-program,
ls_trdir-uccheck TO gt_program-uccheck.
" 프로그램 설명 다시 저장
PERFORM find_program_name USING gt_program-program
CHANGING gt_program-ctext.
APPEND gt_program.
CLEAR gt_program.
ENDIF.
"------------------------------------------
" Web Dynpro (W3MI) 처리
"------------------------------------------
WHEN c_w3mi.
MOVE: gt_pro-devclass TO gt_object-devclass,
gt_pro-program TO gt_object-obj_name.
APPEND gt_object.
CLEAR gt_object.
"------------------------------------------
" 트랜잭션 코드 (TRAN) 처리
"------------------------------------------
WHEN c_tran.
MOVE: gt_pro-devclass TO gt_tcode-devclass,
gt_pro-program TO gt_tcode-tcode.
APPEND gt_tcode.
CLEAR gt_tcode.
"------------------------------------------
" 그 외 항목 무시
"------------------------------------------
WHEN OTHERS.
CONTINUE.
ENDCASE.
ENDLOOP.
ENDFORM. " SELECT_DATA
- 초기화 및 조건 필터링
- gt_pro 등 여러 내부 테이블 초기화
- 조건이 없는 경우 Z*, Y* 개발클래스 대상
- TADIR 테이블 조회
- PGMID = 'R3TR' 이고 삭제되지 않은(DELFLAG NE 'X') 오브젝트를 필터링하여 gt_pro에 저장
- OBJ_NAME은 program이라는 별칭으로 사용됨
- 오브젝트 유형 분류 및 처리
- OBJECT 값에 따라 CASE 문으로 분류
- PROG: 프로그램으로 간주, TRDIR에서 프로그램 존재 및 타입 확인
- W3MI: WebDynpro 관련 오브젝트
- TRAN: 트랜잭션 코드
- 기타 오브젝트는 무시 (CONTINUE)
- OBJECT 값에 따라 CASE 문으로 분류
- 프로그램 설명 조회
- PERFORM find_program_name 서브루틴을 통해 설명(ctext) 저장
- 프로그램 존재 여부는 TRDIR에서 SUBC = 1 또는 M 조건으로 확인
📌 DATA 선언
CONSTANTS: c_tran(4) VALUE 'TRAN'.
CONSTANTS: c_tabl(4) VALUE 'TABL'.
CONSTANTS: c_prog(4) VALUE 'PROG'.
CONSTANTS: c_w3mi(4) VALUE 'W3MI'.
DATA: BEGIN OF gt_transaction OCCURS 0,
program LIKE tadir-obj_name,
tcode LIKE tstc-tcode,
END OF gt_transaction.
DATA: BEGIN OF gt_smw0 OCCURS 0,
program LIKE tadir-obj_name,
objid LIKE wwwdata-objid,
text LIKE wwwdata-text,
devclass LIKE tadir-devclass,
END OF gt_smw0.
DATA: BEGIN OF gt_pro OCCURS 0,
devclass LIKE tadir-devclass,
object LIKE tadir-object,
program LIKE tadir-obj_name,
ctext(70),
END OF gt_pro.
DATA: BEGIN OF gt_display OCCURS 0,
devclass LIKE tdevc-devclass,
program LIKE tadir-obj_name,
tcode LIKE tstc-tcode,
objid LIKE wwwdata-objid,
ctext(70),
text(70),
screen(4),
bicon(4),
zmark,
uccheck(1),
count TYPE i,
END OF gt_display.
DATA: BEGIN OF gt_program OCCURS 0,
devclass LIKE tadir-devclass,
program LIKE tadir-obj_name,
ctext(70),
uccheck LIKE trdir-uccheck,
END OF gt_program.
DATA: BEGIN OF gt_program1 OCCURS 0,
devclass LIKE tadir-devclass,
program LIKE tadir-obj_name,
ctext(70),
END OF gt_program1.
DATA: BEGIN OF gt_object OCCURS 0,
devclass LIKE tadir-devclass,
program LIKE tadir-obj_name,
obj_name LIKE tadir-obj_name,
END OF gt_object.
DATA: BEGIN OF gt_screen OCCURS 0,
program LIKE tadir-obj_name,
objid LIKE wwwdata-objid,
text LIKE wwwdata-text,
devclass LIKE tadir-devclass,
END OF gt_screen.
DATA: BEGIN OF gt_table OCCURS 0,
devclass LIKE tadir-devclass,
program LIKE tadir-obj_name,
obj_name LIKE tadir-obj_name,
END OF gt_table.
DATA: BEGIN OF gt_tcode OCCURS 0,
devclass LIKE tadir-devclass,
program LIKE tadir-obj_name,
tcode LIKE tstc-tcode,
END OF gt_tcode.
DATA: BEGIN OF table_names OCCURS 0,
program LIKE tadir-obj_name,
tabname LIKE dd02l-tabname,
tabtext LIKE dd02t-ddtext,
END OF table_names.
DATA: BEGIN OF gt_main OCCURS 0,
devclass LIKE tadir-devclass,
main_program LIKE tadir-obj_name,
sub_program LIKE tadir-obj_name,
END OF gt_main.
DATA: program LIKE tadir-obj_name,
devclass LIKE tadir-devclass.
RANGES: r_dev FOR tdevc-devclass.
📌 소스코드 - FORM find_program_name
FORM find_program_name USING programme_name
CHANGING programme_text.
READ TEXTPOOL programme_name INTO i_programme_texts LANGUAGE sy-langu.
READ TABLE i_programme_texts WITH KEY 'R'.
IF sy-subrc EQ 0.
programme_text = i_programme_texts-entry.
DELETE i_programme_texts INDEX sy-tabix.
ENDIF.
ENDFORM. " FIND_PROGRAM_NAME