class ZCL_COPA_TOPDOWN_INSTALL definition public create public . public section. types: BEGIN OF ty_bpsel, sort TYPE rke_lfd4, fnam TYPE fieldname, sign TYPE raldb_sign, option TYPE raldb_opti, low TYPE rke_low_l, high TYPE rke_high_l, END OF ty_bpsel . types: * types: * ty_zcotd_tab TYPE STANDARD TABLE OF zcotd1200 WITH EMPTY KEY . ty_bpsel_tab TYPE STANDARD TABLE OF ty_bpsel WITH EMPTY KEY . methods CONSTRUCTOR . methods CREATE_INIT_TABLE importing !ERKRS type ERKRS . methods START_PACKAGE_INSTALL importing value(ERKRS) type ERKRS value(TABNAME) type TABNAME default 'ZCOTD1000' value(FUNCTION_GROUP) type RS38L_AREA value(CREATE_ELEMENT_YN) type BOE_BOOL default 'X' value(CREATE_TABLE_YN) type BOE_BOOL default 'X' value(CREATE_FUNCTION_YN) type BOE_BOOL default 'X' exporting !RESULT type BAPIRET2 . PROTECTED SECTION. private section. types: BEGIN OF ty_mng_table, type TYPE db2type, tb_name TYPE tabname, text TYPE mssviewortable, END OF ty_mng_table . types: tt_dfies TYPE STANDARD TABLE OF dfies WITH DEFAULT KEY . types: tt_bdcdata TYPE STANDARD TABLE OF bdcdata WITH DEFAULT KEY . types: " 클래스내에서 필요한 기본 정보 BEGIN OF ty_working_info, perio TYPE jahrper, variant TYPE covariant, END OF ty_working_info . types: BEGIN OF ty_key_map, key_string TYPE string, dist_id TYPE PBR_SEQRE, END OF ty_key_map . types: tt_key_map TYPE HASHED TABLE OF ty_key_map WITH UNIQUE KEY key_string . types: tt_dd03p TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY . data: gt_mng_table TYPE TABLE OF ty_mng_table . data MT_SENDER_KEYS type TT_KEY_MAP . data: gv_dist_counter TYPE n LENGTH 9 value '000000000' ##NO_TEXT. data GV_TABNAME type COVAD-TABNAME . data GV_MESSAGE type STRING . data GV_SOURCE type TABNAME . data GV_MANAGER type TABNAME . data GV_VARIANT type TABNAME . data GV_SENDER type TABNAME . data GV_RECEIVER type TABNAME . data GV_RESULT type TABNAME . data GV_TARGET type TABNAME . data GV_DISTINFO type TABNAME . data GV_DISTRULE type TABNAME . data WORKING_INFO type TY_WORKING_INFO . methods CREATE_INIT_DATA_ELEMENTS returning value(RESULT) type BAPIRET2 . methods CREATE_INIT_DATA_TABLE importing value(ERKRS) type ERKRS value(TABNAME) type TABNAME returning value(RESULT) type BAPIRET2 . methods CREATE_INIT_FUNCTION importing value(FUNCTION_GROUP) type RS38L_AREA value(TABNAME) type TABNAME returning value(RESULT) type BAPIRET2 . methods GET_PACKAGE_INFO importing value(ERKRS) type ERKRS returning value(RESULT) type BAPIRET2 . methods GENERATE_TABLE_FIELD importing value(TABNAME) type TABNAME value(TYPE) type DB2TYPE value(POSITION_START) type TABFDPOS exporting !CBO_DD03P type TT_DD03P !FIELD_EXCEPTS type TT_DD03P returning value(POSITION) type TABFDPOS . methods CREATE_INIT_STRUCTURE importing !ERKRS type ERKRS . methods CREATE_INIT_STRUCTURE_EX_MANDT importing !ERKRS type ERKRS . ENDCLASS. CLASS ZCL_COPA_TOPDOWN_INSTALL IMPLEMENTATION. METHOD constructor. CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT' EXPORTING titel = '주의' textline1 = TEXT-017 textline2 = TEXT-018. ENDMETHOD. METHOD create_init_data_elements. DATA: ls_domain TYPE dd01v, ls_element TYPE dd04v, lt_domain_values TYPE TABLE OF dd07v, ls_domain_value TYPE dd07v, lv_message TYPE string, lx_error TYPE REF TO cx_root. DATA : iv_domain_name TYPE dom_ref VALUE 'ZTBLS', iv_elemnt_name TYPE rollname VALUE 'ZTBLS'. * DATA : iv_domain_name TYPE dom_ref VALUE 'ZTST', "테스트 * iv_elemnt_name TYPE rollname VALUE 'ZTST'. "테스트 * 1. Domain 생성 " Domain 속성 정의 * ls_domain-domname = iv_domain_name. * ls_domain-ddlanguage = sy-langu. * ls_domain-datatype = 'CHAR'. * ls_domain-leng = 1. * ls_domain-ddtext = '테이블 유형'. ls_domain = VALUE #( domname = iv_domain_name ddlanguage = sy-langu datatype = 'CHAR' leng = '1' ddtext = '테이블 유형' ). " 값 범위 설정 ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0001' ddlanguage = sy-langu domvalue_l = '1' ddtext = 'CBO 테이블 관리 테이블' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0002' ddlanguage = sy-langu domvalue_l = '2' ddtext = '배부 기준 정보(월별)' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0003' ddlanguage = sy-langu domvalue_l = '3' ddtext = '배부 대상 테이블' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0004' ddlanguage = sy-langu domvalue_l = '4' ddtext = '배부 기준 테이블' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0005' ddlanguage = sy-langu domvalue_l = '5' ddtext = '배부 결과 테이블' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0006' ddlanguage = sy-langu domvalue_l = '6' ddtext = '전표 발행 테이블' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0007' ddlanguage = sy-langu domvalue_l = '7' ddtext = '배부 조건 세부 정보' ). APPEND ls_domain_value TO lt_domain_values. ls_domain_value = VALUE #( domname = iv_domain_name valpos = '0008' ddlanguage = sy-langu domvalue_l = '8' ddtext = '배부 조건 Customizing' ). APPEND ls_domain_value TO lt_domain_values. " 도메인 생성 CALL FUNCTION 'DDIF_DOMA_PUT' EXPORTING name = ls_domain-domname dd01v_wa = ls_domain TABLES dd07v_tab = lt_domain_values. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'Domain 생성 중 오류가 발생하였습니다.' ). EXIT. ENDIF. " 도메인 활성화 CALL FUNCTION 'DDIF_DOMA_ACTIVATE' EXPORTING name = ls_domain-domname. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'Domain 활성화 과정에서 오류가 발생하였습니다.' ). EXIT. ENDIF. * 2. Data Elements 생성 " 데이터 엘리먼트 속성 정의 ls_element = VALUE #( rollname = iv_elemnt_name domname = iv_domain_name ddlanguage = sy-langu ddtext = '유형' headlen = 55 scrlen1 = 10 scrlen2 = 20 scrlen3 = 40 ). " 데이터 엘리먼트 생성/업데이트 CALL FUNCTION 'DDIF_DTEL_PUT' EXPORTING name = ls_element-rollname dd04v_wa = ls_element EXCEPTIONS element_not_found = 1 illegal_action = 2 OTHERS = 3. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'Data Elements 생성 중 오류가 발생하였습니다.' ). EXIT. ENDIF. " 데이터 엘리먼트 활성화 CALL FUNCTION 'DDIF_DTEL_ACTIVATE' EXPORTING name = ls_element-rollname EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'Data Elements 활성화 과정에서 오류가 발생하였습니다.' ). EXIT. ENDIF. " 성공 메시지 추가 result = VALUE #( type = 'S' id = 'SUCCESS' number = '000' message = 'Domain과 Data Element가 성공적으로 생성되었습니다' ). ENDMETHOD. METHOD create_init_data_table. " 데이터 선언 DATA: 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_dd09v TYPE dd09v. " 기술 설정 구조체 추가. DATA : lv_tbtext TYPE as4text VALUE 'CO-PA Top-Down 배부 관련 테이블'. " 테이블 헤더 정보 설정 ls_dd02v = VALUE #( tabname = tabname ddlanguage = sy-langu tabclass = 'TRANSP' clidep = 'X' " 클라이언트 종속 ddtext = lv_tbtext contflag = 'A' " 활성 mainflag = 'X' " 메인 테이블 ). APPEND ls_dd02v TO lt_dd02v. " 테이블 필드 정보 설정 CLEAR ls_dd03p. ls_dd03p = VALUE #( tabname = tabname fieldname = 'MANDT' keyflag = 'X' notnull = 'X' rollname = 'MANDT' ddlanguage = sy-langu position = '0001' ddtext = '클라이언트' ). APPEND ls_dd03p TO lt_dd03p. ls_dd03p = VALUE #( tabname = tabname fieldname = 'ERKRS' keyflag = 'X' notnull = 'X' rollname = 'ERKRS' ddlanguage = sy-langu position = '0002' ddtext = '경영단위' ). APPEND ls_dd03p TO lt_dd03p. ls_dd03p = VALUE #( tabname = tabname fieldname = 'TYPE' keyflag = 'X' notnull = 'X' rollname = 'ZTBLS' ddlanguage = sy-langu position = '0003' ddtext = '유형' ). APPEND ls_dd03p TO lt_dd03p. ls_dd03p = VALUE #( tabname = tabname fieldname = 'TBNAME' * keyflag = 'X' * notnull = 'X' rollname = 'P15_ORIGT' ddlanguage = sy-langu position = '0004' ddtext = 'Source table' ). APPEND ls_dd03p TO lt_dd03p. ls_dd03p = VALUE #( tabname = tabname fieldname = 'TEXT' * keyflag = 'X' * notnull = 'X' rollname = 'MSSVIEWORTABLE' ddlanguage = sy-langu position = '0005' ddtext = 'View or table name' ). APPEND ls_dd03p TO lt_dd03p. " 기술 설정(DD09L) 정보 설정 CLEAR ls_dd09v. ls_dd09v-tabname = tabname. ls_dd09v-as4local = 'A'. " 활성화 상태 ls_dd09v-tabkat = '3'. " 일반 테이블 ls_dd09v-tabart = 'APPL1'. " 응용 프로그램 테이블 " DDIC 함수를 사용하여 테이블 생성 CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = 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. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'TABLE 생성 중 오류가 발생하였습니다.' ). EXIT. ENDIF. " 테이블 활성화 DATA: lv_as4local TYPE dd02l-as4local. " DDIF_TABL_ACTIVATE 함수 사용하여 테이블 활성화 CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = tabname auth_chk = 'X' EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'TABLE 활성화 과정에서 오류가 발생하였습니다.' ). EXIT. ENDIF. * 관리테이블의 기본 데이타를 등록한다. DATA : wa_ref TYPE REF TO data, " 동적 워크에어리어 tab_ref TYPE REF TO data, " 동적 테이블 참조 lt_fcat TYPE lvc_t_fcat, " 필드카탈로그 ls_fcat TYPE lvc_s_fcat. FIELD-SYMBOLS: TYPE STANDARD TABLE, " 동적 테이블용 필드심볼 TYPE any, " 동적 워크에어리어 필드심볼 TYPE any. " 필드값 세팅용 * 1. 테이블 구조 메타데이터 가져오기 CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = tabname CHANGING ct_fieldcat = lt_fcat. * 2. 동적 내부테이블과 워크에어리어 생성 CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = lt_fcat IMPORTING ep_table = tab_ref. ASSIGN tab_ref->* TO . CREATE DATA wa_ref LIKE LINE OF . ASSIGN wa_ref->* TO . * 3. 필드값 세팅 ASSIGN COMPONENT 'ERKRS' OF STRUCTURE TO . IF sy-subrc = 0. = erkrs. ENDIF. ASSIGN COMPONENT 'TYPE' OF STRUCTURE TO . IF sy-subrc = 0. = '1'. ENDIF. ASSIGN COMPONENT 'TBNAME' OF STRUCTURE TO . IF sy-subrc = 0. = tabname. ENDIF. ASSIGN COMPONENT 'TEXT' OF STRUCTURE TO . IF sy-subrc = 0. = 'CBO테이블관리'. ENDIF. ** 4. 동적 테이블에 데이터 삽입 INSERT (tabname) FROM . IF sy-subrc NE 0. gv_message = TEXT-005. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '005' message = gv_message ). EXIT. ELSE. " 성공 메시지 추가 result = VALUE #( type = 'S' id = 'SUCCESS' number = '000' message = '관리용 TABLE이 성공적으로 생성되었습니다' ). ENDIF. ENDMETHOD. METHOD create_init_function. TYPES: ty_rssource TYPE TABLE OF rssource. DATA: lv_function_group TYPE rs38l-area, lv_function_name TYPE rs38l-name VALUE 'ZTOPDOWN_ENV', lv_short_text TYPE tftit-stext VALUE '테이블명 반환 함수', lt_source TYPE ty_rssource, lt_export TYPE TABLE OF rsexp. DATA: ls_export TYPE rsexp, " RSEXP 구조체 사용 lv_include TYPE rs38l-include. DATA: ls_source TYPE rssource. LV_function_group = function_group. "function 그룹 존재 여부 확인 SELECT SINGLE area FROM tlibg INTO @DATA(lv_exists) WHERE area = @function_group. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'Function 그룹이 존재하지 않습니다.' ). EXIT. ENDIF. " Export 파라미터 정의 (정확한 RSEXP 구조체 필드만 사용) CLEAR ls_export. ls_export-parameter = 'TB_NAME'. " 파라미터명 ls_export-typ = 'TABNAME'. " DB 필드명 (필수) " OPTIONAL/DEFAULT 필드 제거 (RSEXP 구조체에 없음) APPEND ls_export TO lt_export. "생성할 function 소스 ls_source-line = | tb_name = '{ tabname }'.|. APPEND ls_source TO lt_source. " 함수 모듈 생성 CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT' EXPORTING funcname = lv_function_name function_pool = lv_function_group short_text = lv_short_text TABLES export_parameter = lt_export source = lt_source EXCEPTIONS function_already_exists = 1 OTHERS = 2. IF sy-subrc <> 0. " 실패 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = 'Function 생성 중 오류가 발생하였습니다.' ). EXIT. ENDIF. " 성공 메시지 추가 result = VALUE #( type = 'S' id = 'SUCCESS' number = '000' message = '성공적으로 Function이 생성되었습니다.' ). ENDMETHOD. METHOD create_init_structure. DATA : result TYPE bapiret2, lt_dfies TYPE TABLE OF dfies. " 데이터 선언 DATA: lt_dd02v TYPE TABLE OF dd02v, ls_dd02v TYPE dd02v, lt_dd03p TYPE TABLE OF dd03p, "MANDT 포함한 구조(Table과 일치) ls_dd03p TYPE dd03p, lv_position TYPE tabfdpos VALUE '0000'. "필드 순번 LOOP AT gt_mng_table INTO DATA(ls_struct) WHERE type <> 1. "관리테이블은 생성 제외 CLEAR : ls_dd02v, lt_dd03p. " 1. 소스 구조 조회 CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = ls_struct-tb_name TABLES dfies_tab = lt_dfies EXCEPTIONS not_found = 1 OTHERS = 2. "타입별로 패키지 내부 고정 명 지정(Rename) CASE ls_struct-type. WHEN '2'. ls_struct-tb_name = 'ZSTOP_VARIANT'. WHEN '3'. ls_struct-tb_name = 'ZSTOP_SENDER'. WHEN '4'. ls_struct-tb_name = 'ZSTOP_RECEIVER'. WHEN '5'. ls_struct-tb_name = 'ZSTOP_RESULT'. WHEN '6'. ls_struct-tb_name = 'ZSTOP_TARGET'. WHEN '7'. ls_struct-tb_name = 'ZSTOP_DISTINFO'. WHEN '8'. ls_struct-tb_name = 'ZSTOP_DISTRULE'. ENDCASE. CONCATENATE ls_struct-text '(구조)' INTO ls_struct-text. " 1. 구조 헤더 정보 설정 ls_dd02v = VALUE #( tabname = ls_struct-tb_name ddlanguage = sy-langu tabclass = 'INTTAB' " 구조체 clidep = 'X' " 클라이언트 종속 ddtext = ls_struct-text contflag = 'A' " 활성 mainflag = 'X' " 메인 테이블 ). LOOP AT lt_dfies INTO DATA(dfies). CLEAR ls_dd03p. lv_position = lv_position + 1. ls_dd03p = VALUE #( tabname = ls_struct-tb_name fieldname = dfies-fieldname rollname = dfies-rollname datatype = dfies-datatype leng = dfies-leng reftable = SWITCH #( dfies-reftable WHEN '' THEN '' ELSE ls_struct-tb_name ) reffield = dfies-reffield ddlanguage = sy-langu position = lv_position ddtext = dfies-fieldtext ). APPEND ls_dd03p TO lt_dd03p. ENDLOOP. "1. DDIC 함수를 사용하여 테이블 생성(MANDT 포함 - CRUD시 주요 사용) CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = ls_struct-tb_name 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. "오류 메시지 gv_message = TEXT-016. MESSAGE gv_message TYPE 'E'. ENDIF. " 테이블 활성화 CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = ls_struct-tb_name auth_chk = 'X' EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. "오류 메시지 gv_message = TEXT-016. MESSAGE gv_message TYPE 'E'. ENDIF. ENDLOOP. ENDMETHOD. METHOD create_init_structure_ex_mandt. DATA : result TYPE bapiret2, lt_dfies TYPE TABLE OF dfies. " 데이터 선언 DATA: lt_dd02v TYPE TABLE OF dd02v, ls_dd02v TYPE dd02v, lt_dd03p TYPE TABLE OF dd03p, "MANDT 포함한 구조(Table과 일치) ls_dd03p TYPE dd03p, lv_position TYPE tabfdpos VALUE '0000'. "필드 순번 LOOP AT gt_mng_table INTO DATA(ls_struct) WHERE type <> 1. "관리테이블은 생성 제외 CLEAR : ls_dd02v, lt_dd03p. " 1. 소스 구조 조회 CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = ls_struct-tb_name TABLES dfies_tab = lt_dfies EXCEPTIONS not_found = 1 OTHERS = 2. "타입별로 패키지 내부 고정 명 지정(Rename) CASE ls_struct-type. WHEN '2'. ls_struct-tb_name = 'ZSTOP_VARIANT_M'. WHEN '3'. ls_struct-tb_name = 'ZSTOP_SENDER_M'. WHEN '4'. ls_struct-tb_name = 'ZSTOP_RECEIVER_M'. WHEN '5'. ls_struct-tb_name = 'ZSTOP_RESULT_M'. WHEN '6'. ls_struct-tb_name = 'ZSTOP_TARGET_M'. WHEN '7'. ls_struct-tb_name = 'ZSTOP_DISTINFO_M'. WHEN '8'. ls_struct-tb_name = 'ZSTOP_DISTRULE_M'. ENDCASE. CONCATENATE ls_struct-text '(구조-MANDT제외)' INTO ls_struct-text. " 1. 구조 헤더 정보 설정 ls_dd02v = VALUE #( tabname = ls_struct-tb_name ddlanguage = sy-langu tabclass = 'INTTAB' " 구조체 clidep = 'X' " 클라이언트 종속 ddtext = ls_struct-text contflag = 'A' " 활성 mainflag = 'X' " 메인 테이블 ). LOOP AT lt_dfies INTO DATA(dfies). CHECK dfies-fieldname NE 'MANDT'. "클라이언트 필드 제외 CLEAR ls_dd03p. lv_position = lv_position + 1. ls_dd03p = VALUE #( tabname = ls_struct-tb_name fieldname = dfies-fieldname rollname = dfies-rollname datatype = dfies-datatype leng = dfies-leng reftable = SWITCH #( dfies-reftable WHEN '' THEN '' ELSE ls_struct-tb_name ) reffield = dfies-reffield ddlanguage = sy-langu position = lv_position ddtext = dfies-fieldtext ). APPEND ls_dd03p TO lt_dd03p. ENDLOOP. "1. DDIC 함수를 사용하여 테이블 생성(MANDT 포함 - CRUD시 주요 사용) CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = ls_struct-tb_name 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. "오류 메시지 gv_message = TEXT-016. MESSAGE gv_message TYPE 'E'. ENDIF. " 테이블 활성화 CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = ls_struct-tb_name auth_chk = 'X' EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. "오류 메시지 gv_message = TEXT-016. MESSAGE gv_message TYPE 'E'. ENDIF. ENDLOOP. ENDMETHOD. METHOD create_init_table. DATA: lv_source_table TYPE tabname, lt_dfies TYPE TABLE OF dfies. DATA : result TYPE bapiret2. " 데이터 선언 DATA: lt_dd02v TYPE TABLE OF dd02v, ls_dd02v TYPE dd02v, lt_dd03p TYPE TABLE OF dd03p, ls_dd03p TYPE dd03p, lt_exceipt TYPE TABLE OF dd03p, "제외할 필드 lv_rc TYPE sy-subrc, ls_dd09v TYPE dd09v, " 기술 설정 구조체 추가 lv_as4local TYPE dd02l-as4local, lv_position TYPE tabfdpos VALUE '0000'. "필드 순번 * DATA : ls_crtable-tb_name TYPE tabname VALUE 'ZCOTD1300'. " 관리 테이블 정보를 전역 Internal 테이블(gt_mng_table)에 업데이트. (생성 테이블 목록) CALL METHOD me->get_package_info EXPORTING erkrs = erkrs RECEIVING result = result. IF result-type NE 'S'. "오류 발생. gv_message = TEXT-010. MESSAGE gv_message TYPE 'E'. ENDIF. " 1. 소스 구조 조회 CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = gv_source TABLES dfies_tab = lt_dfies EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc <> 0. "오류 발생. gv_message = TEXT-015. MESSAGE gv_message TYPE 'E'. ENDIF. LOOP AT gt_mng_table INTO DATA(ls_crtable) WHERE type <> '1'. "관리테이블은 생성된 상태이므로 제외. CLEAR : ls_dd02v, lt_dd02v[], lt_dd03p. " 1. 테이블 헤더 정보 설정 ls_dd02v = VALUE #( tabname = ls_crtable-tb_name ddlanguage = sy-langu tabclass = 'TRANSP' " 투명 테이블 clidep = 'X' " 클라이언트 종속 ddtext = ls_crtable-text contflag = 'A' " 활성 mainflag = 'X' " 메인 테이블 ). * APPEND ls_dd02v TO lt_dd02v. " 2. 테이블 필드 정보 설정 CLEAR : ls_dd03p, lv_position. CALL METHOD me->generate_table_field EXPORTING tabname = ls_crtable-tb_name type = ls_crtable-type position_start = lv_position IMPORTING cbo_dd03p = lt_dd03p field_excepts = lt_exceipt RECEIVING position = lv_position. "배부 관련 테이블은 경영단위 구조를 참조하여 추가한다. IF ls_crtable-type = '3' OR ls_crtable-type = '4' OR ls_crtable-type = '5' OR ls_crtable-type = '6'. LOOP AT lt_dfies INTO DATA(dfies). "참조 테이블 필드 추가(센더/리시버/결과/전표발행 테이블 ONly) READ TABLE lt_exceipt WITH KEY tabname = ls_crtable-tb_name fieldname = dfies-fieldname TRANSPORTING NO FIELDS. CHECK sy-subrc NE 0. " 제외 필드 인 경우에는 제외. CLEAR ls_dd03p. lv_position = lv_position + 1. ls_dd03p = VALUE #( tabname = ls_crtable-tb_name fieldname = dfies-fieldname keyflag = dfies-keyflag notnull = dfies-keyflag rollname = dfies-rollname reftable = SWITCH #( dfies-reftable WHEN '' THEN '' ELSE ls_crtable-tb_name ) reffield = dfies-reffield ddlanguage = sy-langu position = lv_position ddtext = dfies-fieldtext ). APPEND ls_dd03p TO lt_dd03p. ENDLOOP. ENDIF. " 기술 설정(DD09L) 정보 설정 CLEAR ls_dd09v. ls_dd09v-tabname = ls_crtable-tb_name. ls_dd09v-as4local = 'A'. " 활성화 상태 ls_dd09v-tabkat = '3'. " 일반 테이블 ls_dd09v-tabart = 'APPL1'. " 응용 프로그램 테이블 " DDIC 함수를 사용하여 테이블 생성 CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = ls_crtable-tb_name dd02v_wa = ls_dd02v dd09l_wa = ls_dd09v " 기술설정 추가 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. "오류 메시지 gv_message = TEXT-016. MESSAGE gv_message TYPE 'E'. ENDIF. " 테이블 활성화 CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = ls_crtable-tb_name auth_chk = 'X' EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. "오류 메시지 gv_message = TEXT-016. MESSAGE gv_message TYPE 'E'. ENDIF. ENDLOOP. "배부 관련 테이블 구조 생성 CALL METHOD me->create_init_structure EXPORTING erkrs = erkrs. "배부 관련 테이블 구조 생성(mandt 제외) CALL METHOD me->create_init_structure_ex_mandt EXPORTING erkrs = erkrs. "정상 처리 완료 메시지 gv_message = TEXT-011. MESSAGE gv_message TYPE 'S'. ENDMETHOD. METHOD generate_table_field. DATA : ls_dd03p TYPE dd03p. position = position_start. "공통 필드 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'MANDT' keyflag = 'X' notnull = 'X' rollname = 'MANDT' ddlanguage = sy-langu position = '0001' ddtext = '클라이언트' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. CASE type. WHEN '2'. "배부 기준 정보(월별) 테이블 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'ERKRS' keyflag = 'X' notnull = 'X' rollname = 'ERKRS' ddlanguage = sy-langu position = position ddtext = '경영 단위' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'PERIO' keyflag = 'X' notnull = 'X' rollname = 'JAHRPER' ddlanguage = sy-langu position = position ddtext = '기간/연도' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'APPLCLASS' keyflag = 'X' notnull = 'X' rollname = 'APPLCLASS' ddlanguage = sy-langu position = position ddtext = 'DD 오브젝트에 대한 어플리케이션 클래스 (사용되지 않음)' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SUBCLASS' keyflag = 'X' notnull = 'X' rollname = 'SUBCLASS' ddlanguage = sy-langu position = position ddtext = '어플리케이션 클래스별 하위그룹' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'TABNAME' keyflag = 'X' notnull = 'X' rollname = 'TABNAME' ddlanguage = sy-langu position = position ddtext = '테이블이름' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'FUNC' keyflag = 'X' notnull = 'X' rollname = 'COFUNC' ddlanguage = sy-langu position = position ddtext = '기능' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VTEXT' keyflag = '' notnull = '' rollname = 'COVARITXT' ddlanguage = sy-langu position = position ddtext = '변형이름' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SENDER' datatype = 'CHAR' INTTYPE = 'C' * INTLEN = '1' LENG = '1' ddlanguage = sy-langu position = position ddtext = '센더 데이타 추출 진행 여부' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'RECEIVER' datatype = 'CHAR' INTTYPE = 'C' * INTLEN = '1' LENG = '1' ddlanguage = sy-langu position = position ddtext = '배부 기준 데이타 추출 진행 여부' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'PROC_DIST' datatype = 'CHAR' INTTYPE = 'C' * INTLEN = '1' LENG = '1' ddlanguage = sy-langu position = position ddtext = '배부 수행 여부' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'POST' datatype = 'CHAR' INTTYPE = 'C' * INTLEN = '1' LENG = '1' ddlanguage = sy-langu position = position ddtext = '전표 발행 수행 여부' ). APPEND ls_dd03p TO cbo_dd03p. WHEN '3'. "센더 테이블 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'DIST_ID' keyflag = 'X' notnull = 'X' rollname = 'PBR_SEQRE' ddlanguage = sy-langu position = position ddtext = '배부키' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. WHEN '4'. "리시버/배부 기준 테이블 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'DIST_ID' keyflag = 'X' notnull = 'X' rollname = 'PBR_SEQRE' ddlanguage = sy-langu position = position ddtext = '배부키' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SEQ' keyflag = 'X' notnull = 'X' rollname = 'PU12_SEQNR' ddlanguage = sy-langu position = position ddtext = '순번' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. WHEN '5'. "배부 결과 테이블 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'DIST_ID' keyflag = 'X' notnull = 'X' rollname = 'PBR_SEQRE' ddlanguage = sy-langu position = position ddtext = '배부키' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SEQ' keyflag = 'X' notnull = 'X' rollname = 'PU12_SEQNR' ddlanguage = sy-langu position = position ddtext = '순번' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. WHEN '6'. "전표 발행 대상 테이블 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'DIST_ID' keyflag = 'X' notnull = 'X' rollname = 'PBR_SEQRE' ddlanguage = sy-langu position = position ddtext = '배부키' ). APPEND ls_dd03p TO cbo_dd03p. APPEND ls_dd03p TO field_excepts. WHEN '7'. "배부 기준 세부 정보 테이블(STD->CBO) position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'ERKRS' keyflag = 'X' notnull = 'X' rollname = 'ERKRS' ddlanguage = sy-langu position = position ddtext = '경영 단위' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'PERIO' keyflag = 'X' notnull = 'X' rollname = 'JAHRPER' ddlanguage = sy-langu position = position ddtext = '기간/연도' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'APPLCLASS' keyflag = 'X' notnull = 'X' rollname = 'APPLCLASS' ddlanguage = sy-langu position = position ddtext = 'DD 오브젝트에 대한 어플리케이션 클래스 (사용되지 않음)' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SUBCLASS' keyflag = 'X' notnull = 'X' rollname = 'SUBCLASS' ddlanguage = sy-langu position = position ddtext = '어플리케이션 클래스별 하위그룹' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'TABNAME' keyflag = 'X' notnull = 'X' rollname = 'TABNAME' ddlanguage = sy-langu position = position ddtext = '테이블이름' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'FUNC' keyflag = 'X' notnull = 'X' rollname = 'COFUNC' ddlanguage = sy-langu position = position ddtext = '기능' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SORT' keyflag = 'X' notnull = 'X' rollname = 'RKE_LFD4' ddlanguage = sy-langu position = position ddtext = '순번' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'FNAM' keyflag = 'X' notnull = 'X' rollname = 'FIELDNAME' ddlanguage = sy-langu position = position ddtext = '필드 이름' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SIGN' keyflag = 'X' notnull = 'X' rollname = 'RALDB_SIGN' ddlanguage = sy-langu position = position ddtext = 'SELECT-OPTIONS 테이블생성에서 부호필드' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'OPTIONN' keyflag = 'X' notnull = 'X' rollname = 'RALDB_OPTI' ddlanguage = sy-langu position = position ddtext = 'SELECT-OPTIONS 테이블구조의 OPTION 필드' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'LOW' keyflag = 'X' notnull = 'X' rollname = 'RKE_LOW_L' ddlanguage = sy-langu position = position ddtext = '특성 값 하한' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'HIGH' keyflag = 'X' notnull = 'X' rollname = 'RKE_HIGH_L' ddlanguage = sy-langu position = position ddtext = '특성값 상한선 (간격내에서만)' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'LOWTX' keyflag = '' notnull = '' rollname = 'SCRTEXT_M' ddlanguage = sy-langu position = position ddtext = '중간 필드 레이블' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'HIGHTX' keyflag = '' notnull = '' rollname = 'SCRTEXT_M' ddlanguage = sy-langu position = position ddtext = '중간 필드 레이블' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'CDATE' keyflag = '' notnull = '' rollname = 'CDATE' ddlanguage = sy-langu position = position ddtext = '생성일' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'CTIME' keyflag = '' notnull = '' rollname = 'CTME' ddlanguage = sy-langu position = position ddtext = '생성 시간' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'CNAME' keyflag = '' notnull = '' rollname = 'CRNAM' ddlanguage = sy-langu position = position ddtext = '생성자' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'UDATE' keyflag = '' notnull = '' rollname = 'RTC_DATE_M' ddlanguage = sy-langu position = position ddtext = '수정일' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'UTIME' keyflag = '' notnull = '' rollname = 'AEZET' ddlanguage = sy-langu position = position ddtext = '최종변경시간' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'UNAME' keyflag = '' notnull = '' rollname = 'UPNAME' ddlanguage = sy-langu position = position ddtext = '최종변경인' ). APPEND ls_dd03p TO cbo_dd03p. WHEN '8'. "배부 조건 Custimizing 테이블 position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'ERKRS' keyflag = 'X' notnull = 'X' rollname = 'ERKRS' ddlanguage = sy-langu position = position ddtext = '경영 단위' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'PERFROM' keyflag = 'X' notnull = 'X' rollname = 'JAHRPER' ddlanguage = sy-langu position = position ddtext = '기간/연도 FROM' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'PERTO' keyflag = 'X' notnull = 'X' rollname = 'JAHRPER' ddlanguage = sy-langu position = position ddtext = '기간/연도 TO' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'APPLCLASS' keyflag = 'X' notnull = 'X' rollname = 'APPLCLASS' ddlanguage = sy-langu position = position ddtext = 'DD 오브젝트에 대한 어플리케이션 클래스 (사용되지 않음)' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SUBCLASS' keyflag = 'X' notnull = 'X' rollname = 'SUBCLASS' ddlanguage = sy-langu position = position ddtext = '어플리케이션 클래스별 하위그룹' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'TABNAME' keyflag = 'X' notnull = 'X' rollname = 'TABNAME' ddlanguage = sy-langu position = position ddtext = '테이블이름' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'FUNC' keyflag = 'X' notnull = 'X' rollname = 'COFUNC' ddlanguage = sy-langu position = position ddtext = '기능' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'VARIANT' keyflag = 'X' notnull = 'X' rollname = 'COVARIANT' ddlanguage = sy-langu position = position ddtext = '변형' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SORT' keyflag = 'X' notnull = 'X' rollname = 'RKE_LFD4' ddlanguage = sy-langu position = position ddtext = '순번' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'FNAM' keyflag = 'X' notnull = 'X' rollname = 'FIELDNAME' ddlanguage = sy-langu position = position ddtext = '필드 이름' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'SIGN' keyflag = 'X' notnull = 'X' rollname = 'RALDB_SIGN' ddlanguage = sy-langu position = position ddtext = 'SELECT-OPTIONS 테이블생성에서 부호필드' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'OPTIONN' keyflag = 'X' notnull = 'X' rollname = 'RALDB_OPTI' ddlanguage = sy-langu position = position ddtext = 'SELECT-OPTIONS 테이블구조의 OPTION 필드' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'LOW' keyflag = 'X' notnull = 'X' rollname = 'RKE_LOW_L' ddlanguage = sy-langu position = position ddtext = '특성 값 하한' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'HIGH' keyflag = 'X' notnull = 'X' rollname = 'RKE_HIGH_L' ddlanguage = sy-langu position = position ddtext = '특성값 상한선 (간격내에서만)' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'LOWTX' keyflag = '' notnull = '' rollname = 'SCRTEXT_M' ddlanguage = sy-langu position = position ddtext = '중간 필드 레이블' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'HIGHTX' keyflag = '' notnull = '' rollname = 'SCRTEXT_M' ddlanguage = sy-langu position = position ddtext = '중간 필드 레이블' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'CDATE' keyflag = '' notnull = '' rollname = 'CDATE' ddlanguage = sy-langu position = position ddtext = '생성일' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'CTIME' keyflag = '' notnull = '' rollname = 'CTME' ddlanguage = sy-langu position = position ddtext = '생성 시간' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'CNAME' keyflag = '' notnull = '' rollname = 'CRNAM' ddlanguage = sy-langu position = position ddtext = '생성자' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'UDATE' keyflag = '' notnull = '' rollname = 'RTC_DATE_M' ddlanguage = sy-langu position = position ddtext = '수정일' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'UTIME' keyflag = '' notnull = '' rollname = 'AEZET' ddlanguage = sy-langu position = position ddtext = '최종변경시간' ). APPEND ls_dd03p TO cbo_dd03p. position = position + 1. ls_dd03p = VALUE #( tabname = tabname fieldname = 'UNAME' keyflag = '' notnull = '' rollname = 'UPNAME' ddlanguage = sy-langu position = position ddtext = '최종변경인' ). APPEND ls_dd03p TO cbo_dd03p. ENDCASE. ENDMETHOD. METHOD get_package_info. DATA: ls_mng_table TYPE ty_mng_table, lv_tabname TYPE tabname. FIELD-SYMBOLS: TYPE ANY TABLE. IF erkrs IS INITIAL . gv_message = TEXT-012. MESSAGE gv_message TYPE 'E'. ENDIF. gv_source = |CE1{ erkrs }|. CALL FUNCTION 'ZTOPDOWN_ENV' IMPORTING tb_name = lv_tabname. SELECT type, tbname, text FROM (lv_tabname) WHERE erkrs = @erkrs INTO TABLE NEW @DATA(lt_mng_table). "런타임시 구조 결정 IF sy-subrc NE 0. " 오류 메시지 추가 result = VALUE #( type = 'E' id = 'FAIL' number = '000' message = '관리 테이블 정보 조회 오류' ). EXIT. ENDIF. ASSIGN lt_mng_table->* TO . FIELD-SYMBOLS : TYPE any, TYPE any, TYPE any. LOOP AT ASSIGNING FIELD-SYMBOL(). "TYPE 필드 동적 할당 ASSIGN COMPONENT 'TYPE' OF STRUCTURE TO . ASSIGN COMPONENT 'TBNAME' OF STRUCTURE TO . ASSIGN COMPONENT 'TEXT' OF STRUCTURE TO . CASE . WHEN '1'. gv_manager = . WHEN '2'. gv_variant = . WHEN '3'. gv_sender = . WHEN '4'. gv_receiver = . WHEN '5'. gv_result = . WHEN '6'. gv_target = . WHEN '7'. gv_distinfo = . WHEN '8'. gv_distrule = . ENDCASE. ls_mng_table = VALUE #( type = tb_name = text = ). APPEND ls_mng_table TO gt_mng_table. ENDLOOP. " 성공 메시지 추가 gv_message = TEXT-013. result = VALUE #( type = 'S' id = 'SUCCESS' number = '000' message = gv_message ). ENDMETHOD. METHOD start_package_install. IF erkrs IS INITIAL OR tabname IS INITIAL OR function_group IS INITIAL. gv_message = TEXT-012. MESSAGE gv_message TYPE 'E'. ENDIF. * 1. Domain & Data Elements 생성 IF create_element_yn EQ 'X'. CALL METHOD me->create_init_data_elements RECEIVING result = result. IF result-type <> 'S'. "오류 발생. gv_message = TEXT-008. MESSAGE gv_message TYPE 'E'. ENDIF. ENDIF. * 2. 관리 테이블 생성 IF create_table_yn EQ 'X'. CALL METHOD me->create_init_data_table EXPORTING erkrs = erkrs tabname = tabname RECEIVING result = result. IF result-type <> 'S'. "오류 발생. gv_message = TEXT-009. MESSAGE gv_message TYPE 'E'. ENDIF. ENDIF. * 3. 관리 테이블 코드값 리턴 함수 생성. IF create_function_yn EQ 'X'. CALL METHOD me->create_init_function EXPORTING function_group = function_group tabname = tabname RECEIVING result = result. IF result-type <> 'S'. "오류 발생. gv_message = TEXT-010. MESSAGE gv_message TYPE 'E'. ENDIF. ENDIF. "정상 처리 완료 메시지 gv_message = TEXT-011. MESSAGE gv_message TYPE 'S'. ENDMETHOD. ENDCLASS.