Files
abap-zcod/src/zcreatetable.prog.abap
2026-08-18 04:47:25 +00:00

199 lines
5.7 KiB
ABAP

*&---------------------------------------------------------------------*
*& Report ZCREATETABLE
*&---------------------------------------------------------------------*
*& dd02v-tabclass 값으로 테이블과 구조체등 변경 가능
*&---------------------------------------------------------------------*
REPORT zcreatetable.
" 데이터 선언
*DATA: lv_tabname TYPE tabname VALUE 'ZTESTEMPLOYEE',
DATA: lv_tabname TYPE tabname VALUE 'ZTY_EMPLOYEE',
lt_dd02v TYPE TABLE OF dd02v,
ls_dd02v TYPE dd02v,
lt_dd03p TYPE TABLE OF dd03p,
ls_dd03p TYPE dd03p,
lv_rc TYPE sy-subrc.
" 테이블 헤더 정보 설정
ls_dd02v-tabname = lv_tabname.
ls_dd02v-ddlanguage = sy-langu.
*ls_dd02v-tabclass = 'TRANSP'. " 투명 테이블
ls_dd02v-tabclass = 'INTTAB'. " 구조
ls_dd02v-clidep = 'X'. " 클라이언트 종속
ls_dd02v-ddtext = '직원 테스트 테이블'.
ls_dd02v-contflag = 'A'. " 활성
ls_dd02v-mainflag = 'X'. " 메인 테이블
APPEND ls_dd02v TO lt_dd02v.
* 아래 형식으로 사용해도 됨. 신 문법
* ls_dd02v = VALUE #(
* tabname = lv_tabname
* ddlanguage = sy-langu
* tabclass = 'TRANSP' " 투명 테이블
* clidep = 'X' " 클라이언트 종속
* ddtext = '직원 테스트 테이블'
* contflag = 'A' " 활성
* mainflag = 'X' " 메인 테이블
* ).
* APPEND ls_dd02v TO lt_dd02v.
" 테이블 필드 정보 설정
CLEAR ls_dd03p.
" 1. 클라이언트 필드
ls_dd03p = VALUE #(
tabname = lv_tabname
fieldname = 'MANDT'
keyflag = 'X'
notnull = 'X'
rollname = 'MANDT'
ddlanguage = sy-langu
position = '0001'
ddtext = '클라이언트'
).
APPEND ls_dd03p TO lt_dd03p.
" 2. 직원 번호 필드
CLEAR ls_dd03p.
ls_dd03p-tabname = lv_tabname.
ls_dd03p-fieldname = 'EMPNO'.
ls_dd03p-keyflag = 'X'.
ls_dd03p-mandatory = 'X'.
ls_dd03p-datatype = 'NUMC'.
ls_dd03p-leng = 8.
ls_dd03p-ddlanguage = sy-langu.
ls_dd03p-position = '0002'.
ls_dd03p-ddtext = '직원번호'.
APPEND ls_dd03p TO lt_dd03p.
" 3. 직원 이름 필드
CLEAR ls_dd03p.
ls_dd03p-tabname = lv_tabname.
ls_dd03p-fieldname = 'EMPNAME'.
ls_dd03p-datatype = 'CHAR'.
ls_dd03p-leng = 50.
ls_dd03p-ddlanguage = sy-langu.
ls_dd03p-position = '0003'.
ls_dd03p-ddtext = '직원이름'.
APPEND ls_dd03p TO lt_dd03p.
" 4. 부서 코드 필드
CLEAR ls_dd03p.
ls_dd03p-tabname = lv_tabname.
ls_dd03p-fieldname = 'DEPTCODE'.
ls_dd03p-datatype = 'CHAR'.
ls_dd03p-leng = 10.
ls_dd03p-ddlanguage = sy-langu.
ls_dd03p-position = '0004'.
ls_dd03p-ddtext = '부서코드'.
APPEND ls_dd03p TO lt_dd03p.
" 5. 급여 필드
*CLEAR ls_dd03p.
*ls_dd03p-tabname = lv_tabname.
*ls_dd03p-fieldname = 'SALARY'.
*ls_dd03p-datatype = 'CURR'.
*ls_dd03p-leng = 15.
*ls_dd03p-decimals = 2.
*ls_dd03p-ddlanguage = sy-langu.
*ls_dd03p-position = '0005'.
*ls_dd03p-ddtext = '급여'.
*APPEND ls_dd03p TO lt_dd03p.
" 6. 입사일 필드
CLEAR ls_dd03p.
ls_dd03p-tabname = lv_tabname.
ls_dd03p-fieldname = 'HIREDATE'.
ls_dd03p-datatype = 'DATS'.
ls_dd03p-leng = 8.
ls_dd03p-ddlanguage = sy-langu.
ls_dd03p-position = '0006'.
ls_dd03p-ddtext = '입사일'.
APPEND ls_dd03p TO lt_dd03p.
" DDIC 함수를 사용하여 테이블 생성
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name = lv_tabname
dd02v_wa = ls_dd02v
TABLES
dd03p_tab = lt_dd03p
EXCEPTIONS
tabl_not_found = 1
name_inconsistent = 2
tabl_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
WRITE: / '테이블 생성 실패:', sy-subrc.
MESSAGE e001(00) WITH '테이블 생성 중 오류가 발생했습니다'.
ELSE.
WRITE: / '테이블', lv_tabname, '이 성공적으로 생성되었습니다.'.
ENDIF.
" 테이블 활성화
DATA: lv_as4local TYPE dd02l-as4local.
" DDIF_TABL_ACTIVATE 함수 사용하여 테이블 활성화
CALL FUNCTION 'DDIF_TABL_ACTIVATE'
EXPORTING
name = lv_tabname
auth_chk = 'X'
EXCEPTIONS
not_found = 1
put_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
WRITE: / '테이블 활성화 성공.'.
" 활성화 상태 확인 (DD02L 테이블에서 AS4LOCAL 필드 확인)
SELECT SINGLE as4local FROM dd02l
INTO lv_as4local
WHERE tabname = lv_tabname.
IF lv_as4local = 'A'.
WRITE: / '테이블이 활성 상태로 확인되었습니다.'.
ELSE.
WRITE: / '테이블 상태:', lv_as4local, '(A=활성, M=유지보수, N=신규)'.
ENDIF.
ELSE.
WRITE: / '테이블 활성화 실패. SY-SUBRC:', sy-subrc.
CASE sy-subrc.
WHEN 1.
WRITE: / '오류: 테이블을 찾을 수 없습니다.'.
WHEN 2.
WRITE: / '오류: 활성화 처리 실패.'.
WHEN OTHERS.
WRITE: / '오류: 기타 오류가 발생했습니다.'.
ENDCASE.
ENDIF.
" 생성된 테이블 정보 확인
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = lv_tabname
langu = sy-langu
IMPORTING
dd02v_wa = ls_dd02v
TABLES
dd03p_tab = lt_dd03p
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc = 0.
WRITE: / '=== 생성된 테이블 정보 ==='.
WRITE: / '테이블명:', ls_dd02v-tabname.
WRITE: / '설명:', ls_dd02v-ddtext.
WRITE: / '테이블 클래스:', ls_dd02v-tabclass.
WRITE: / '=== 필드 정보 ==='.
LOOP AT lt_dd03p INTO ls_dd03p.
WRITE: / ls_dd03p-fieldname, ls_dd03p-datatype,
ls_dd03p-leng, ls_dd03p-ddtext.
ENDLOOP.
ENDIF.