Files
abap-ztopdown/src/zcl_copa_topdown_install.clas.abap
T
2026-08-18 00:26:57 +00:00

2057 lines
65 KiB
ABAP

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: <itab> TYPE STANDARD TABLE, " 동적 테이블용 필드심볼
<wa> TYPE any, " 동적 워크에어리어 필드심볼
<field> 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 <itab>.
CREATE DATA wa_ref LIKE LINE OF <itab>.
ASSIGN wa_ref->* TO <wa>.
* 3. 필드값 세팅
ASSIGN COMPONENT 'ERKRS' OF STRUCTURE <wa> TO <field>.
IF sy-subrc = 0. <field> = erkrs. ENDIF.
ASSIGN COMPONENT 'TYPE' OF STRUCTURE <wa> TO <field>.
IF sy-subrc = 0. <field> = '1'. ENDIF.
ASSIGN COMPONENT 'TBNAME' OF STRUCTURE <wa> TO <field>.
IF sy-subrc = 0. <field> = tabname. ENDIF.
ASSIGN COMPONENT 'TEXT' OF STRUCTURE <wa> TO <field>.
IF sy-subrc = 0. <field> = 'CBO테이블관리'. ENDIF.
** 4. 동적 테이블에 데이터 삽입
INSERT (tabname) FROM <wa>.
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: <lt_table> 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 <lt_table>.
FIELD-SYMBOLS : <lv_type> TYPE any,
<lv_tbname> TYPE any,
<lv_text> TYPE any.
LOOP AT <lt_table> ASSIGNING FIELD-SYMBOL(<ls_row>).
"TYPE 필드 동적 할당
ASSIGN COMPONENT 'TYPE' OF STRUCTURE <ls_row> TO <lv_type>.
ASSIGN COMPONENT 'TBNAME' OF STRUCTURE <ls_row> TO <lv_tbname>.
ASSIGN COMPONENT 'TEXT' OF STRUCTURE <ls_row> TO <lv_text>.
CASE <lv_type>.
WHEN '1'.
gv_manager = <lv_tbname>.
WHEN '2'.
gv_variant = <lv_tbname>.
WHEN '3'.
gv_sender = <lv_tbname>.
WHEN '4'.
gv_receiver = <lv_tbname>.
WHEN '5'.
gv_result = <lv_tbname>.
WHEN '6'.
gv_target = <lv_tbname>.
WHEN '7'.
gv_distinfo = <lv_tbname>.
WHEN '8'.
gv_distrule = <lv_tbname>.
ENDCASE.
ls_mng_table = VALUE #(
type = <lv_type>
tb_name = <lv_tbname>
text = <lv_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.