*&---------------------------------------------------------------------* *& 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.