199 lines
5.7 KiB
ABAP
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.
|