Z나 Y로 시작하는 CBO테이블에 데이터를 업로드 하기위한 프로그램.
뜯어보면 쉽다.
단지 길 뿐.
*&---------------------------------------------------------------------*
*& Report ZSD_KR_FIELDINFO_UPDATE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsd_kr_fieldinfo_update.
TABLES: dd03l, " 테이블필드
dd01l, " 도메인
dd02t, " R/3-DD: SAP 테이블 텍스트
dd17s, " R/3 S_SECINDEX: 보조 인덱스, 필드
dd12t, " DD12L에 대한 텍스트 테이블
dd04t. " R/3 DD: Data element 텍스트
DATA BEGIN OF table_structure OCCURS 10.
INCLUDE STRUCTURE dfies.
DATA END OF table_structure.
* The dynamic program source table
DATA: BEGIN OF itab OCCURS 10,
line(72),
END OF itab.
DATA: programname LIKE sy-repid VALUE '<<ZDYNPRO>>'.
*-----------------------------------------------------------------------
* SELECTION-SCREEN.
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK bl_1 WITH FRAME TITLE title_1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (31) t_tab FOR FIELD tab_name.
PARAMETERS: tab_name LIKE dd03l-tabname OBLIGATORY.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK bl_1.
*
SELECTION-SCREEN BEGIN OF BLOCK bl_2 WITH FRAME TITLE title_2.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (31) t_fname FOR FIELD filename.
PARAMETERS: filename LIKE rlgrap-filename
DEFAULT space OBLIGATORY.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (31) t_ftype FOR FIELD filetype.
PARAMETERS: filetype LIKE rlgrap-filetype DEFAULT 'DAT'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_head AS CHECKBOX DEFAULT space.
SELECTION-SCREEN COMMENT 3(40) t_head FOR FIELD p_head.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_space AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(40) t_space FOR FIELD p_space.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_remark AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(40) t_remark FOR FIELD p_remark.
PARAMETERS: p_except(1) TYPE c DEFAULT '#'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN END OF BLOCK bl_2.
SELECTION-SCREEN BEGIN OF BLOCK bl_3 WITH FRAME TITLE title_3.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: r_disp RADIOBUTTON GROUP rad.
SELECTION-SCREEN COMMENT 3(40) t_disp FOR FIELD r_disp.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: r_upda RADIOBUTTON GROUP rad.
SELECTION-SCREEN COMMENT 3(40) t_upda FOR FIELD r_upda.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: r_refr RADIOBUTTON GROUP rad.
SELECTION-SCREEN COMMENT 3(40) t_refr FOR FIELD r_refr.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK bl_3.
INITIALIZATION.
title_1 = 'Select Options'.
title_2 = 'Upload Options'.
title_3 = 'Additional Options'.
t_tab = 'Table Name'.
t_fname = 'File Name'.
t_ftype = 'File Type'.
t_head = ' 데이터 첫행은 제외함'.
t_space = ' 데이터 값이 없는 라인은 제외함'.
t_remark = ' 데이터가 다음 문자로 시작되면 제외함'.
t_disp = ' Display Only'.
t_upda = ' Update Only'.
t_refr = ' Table Data Initialize & Update'.
SET TITLEBAR '%_T' OF PROGRAM 'RSSYSTDB'
WITH 'Table contents Upload Utility'.
**----------------------------------------------------------------------
** AT SELECTION-SCREEN.
**----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename.
PERFORM f4_help_datafile CHANGING filename.
*-----------------------------------------------------------------------
* START-OF-SELECTION.
*-----------------------------------------------------------------------
START-OF-SELECTION.
PERFORM table_field_info_get.
PERFORM make_program.
IF r_refr = 'X'. "- Delete & Update
PERFORM table_data_delete_all.
ENDIF.
INSERT REPORT programname FROM itab.
SUBMIT (programname) AND RETURN
WITH tab_name = tab_name
WITH filename = filename
WITH filetype = filetype
WITH p_head = p_head
WITH p_space = p_space
WITH p_remark = p_remark
WITH p_except = p_except
WITH r_disp = r_disp
WITH r_upda = r_upda
WITH r_refr = r_refr.
DELETE REPORT programname.
*&--------------------------------------------------------------------*
*& Form TABLE_field_info_get
*&--------------------------------------------------------------------*
FORM table_field_info_get.
DATA table_type TYPE dd02v-tabclass.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = tab_name
IMPORTING
ddobjtype = table_type
TABLES
dfies_tab = table_structure
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc <> 0 OR tab_name+0(1) NE 'Z' OR tab_name+0(1) NE 'Y'.
MESSAGE i001(00) WITH '테이블명이 잘못되었거나 CBO테이블이 아닙니다(Z*)'. STOP.
ENDIF.
SORT table_structure ASCENDING BY position.
READ TABLE table_structure INDEX 1.
IF ( sy-subrc = 0 ) AND
( table_structure-fieldname = 'MANDT' ).
DELETE table_structure INDEX 1.
ENDIF.
ENDFORM. "TABLE_field_info_get
*&--------------------------------------------------------------------*
*& Form f4_help_datafile
*&--------------------------------------------------------------------*
FORM f4_help_datafile CHANGING p_filename LIKE rlgrap-filename.
* rlgrap-filename
DATA: fname TYPE fieldname.
DATA: fvalue LIKE rlgrap-filename.
* GET CURSOR FIELD fname VALUE fvalue.
GET CURSOR FIELD p_filename VALUE fvalue.
IF ( fvalue IS INITIAL OR fvalue = '?' ).
fvalue = '*.*'.
ENDIF.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = fvalue
mask = ',*.*,*.*.'
title = '파일선택'
IMPORTING
filename = p_filename
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "f4_help_datafile
*&--------------------------------------------------------------------*
*& Form make_target_structure
*&--------------------------------------------------------------------*
FORM make_target_structure.
DATA: fld_name(30) TYPE c.
itab = 'DATA: BEGIN OF IN_DATA OCCURS 100,'. APPEND itab.
LOOP AT table_structure.
CLEAR: fld_name, itab.
CONCATENATE table_structure-fieldname '('
table_structure-outputlen ')'
' TYPE C,'
INTO itab.
APPEND itab.
ENDLOOP.
itab = 'END OF IN_DATA.'. APPEND itab.
ENDFORM. "make_target_structure
*&--------------------------------------------------------------------*
*& Form table_data_delete_all
*&--------------------------------------------------------------------*
FORM table_data_delete_all.
DATA: hd_text(100) TYPE c,
return_code TYPE c.
IF ( tab_name NP 'Y*' ) AND ( tab_name NP 'Z*' ).
MESSAGE i001(00) WITH
'Standard Table은 데이터를 삭제할 수 없습니다'.
STOP.
ENDIF.
CONCATENATE '테이블 (' tab_name
') 데이터를 모두 삭제후 작업을 진행합니다'
INTO hd_text SEPARATED BY space.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = hd_text
textline2 = '계속 진행하시겠습니까?'
titel = '데이터 삭제 확인'
defaultoption = 'N'
cancel_display = ''
IMPORTING
answer = return_code.
IF return_code <> 'J'.
MESSAGE s001(00) WITH '작업이 취소되었습니다'.
STOP.
ENDIF.
* 데이터베이스 테이블의 데이터를 전체 삭제
DELETE FROM (tab_name).
ENDFORM. "table_data_delete_all
*&--------------------------------------------------------------------*
*& Form make_program
*&--------------------------------------------------------------------*
FORM make_program.
CLEAR: itab. REFRESH: itab.
DEFINE program_body.
itab-line = &1.
append itab.
END-OF-DEFINITION.
itab = 'REPORT ZDYNPRO MESSAGE-ID 00 LINE-SIZE 210'. APPEND itab.
itab = ' NO STANDARD PAGE HEADING. '. APPEND itab.
* Input Table Structure
PERFORM make_target_structure.
* Target Table Structure
CONCATENATE 'DATA UP_DATA LIKE ' tab_name
INTO itab SEPARATED BY space.
CONCATENATE itab 'OCCURS 0 WITH HEADER LINE.'
INTO itab SEPARATED BY space.
APPEND itab.
* Program Body create
program_body:
'TYPE-POOLS: slis. ',
' ',
' ',
'DATA: gt_fieldcat TYPE slis_t_fieldcat_alv, ',
' gs_layout TYPE slis_layout_alv, ',
' pgm LIKE sy-repid, ',
' g_inclname LIKE trdir-name. ',
' ',
'DATA: cnt TYPE i, ',
' hd_text(100) TYPE c, ',
' return_code TYPE c. ',
' ',
'SELECTION-SCREEN BEGIN OF BLOCK bl_1 WITH FRAME TITLE title_1. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'SELECTION-SCREEN COMMENT (31) t_tab FOR FIELD tab_name. ',
'PARAMETERS: tab_name LIKE dd03l-tabname OBLIGATORY. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN END OF BLOCK bl_1. ',
'* ',
'SELECTION-SCREEN BEGIN OF BLOCK bl_2 WITH FRAME TITLE title_2. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'SELECTION-SCREEN COMMENT (31) t_fname FOR FIELD filename. ',
'PARAMETERS: filename LIKE rlgrap-filename ',
' DEFAULT ''C:\Data'' OBLIGATORY. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'SELECTION-SCREEN COMMENT (31) t_ftype FOR FIELD filetype. ',
'PARAMETERS: filetype LIKE rlgrap-filetype DEFAULT ''DAT''. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN SKIP 1. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'PARAMETERS: p_head AS CHECKBOX DEFAULT space. ',
'SELECTION-SCREEN COMMENT 3(40) t_head FOR FIELD p_head. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'PARAMETERS: p_space AS CHECKBOX DEFAULT ''X''. ',
'SELECTION-SCREEN COMMENT 3(40) t_space FOR FIELD p_space. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'PARAMETERS: p_remark AS CHECKBOX DEFAULT ''X''. ',
'SELECTION-SCREEN COMMENT 3(40) t_remark FOR FIELD p_remark.',
'PARAMETERS: p_except(1) TYPE c DEFAULT ''#''. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN SKIP 1. ',
'SELECTION-SCREEN END OF BLOCK bl_2. ',
' ',
'SELECTION-SCREEN BEGIN OF BLOCK bl_3 WITH FRAME TITLE title_3. ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'PARAMETERS: r_disp RADIOBUTTON GROUP rad. ',
'SELECTION-SCREEN COMMENT 3(30) t_disp FOR FIELD r_disp. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'PARAMETERS: r_upda RADIOBUTTON GROUP rad. ',
'SELECTION-SCREEN COMMENT 3(30) t_upda FOR FIELD r_upda. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN BEGIN OF LINE. ',
'PARAMETERS: r_refr RADIOBUTTON GROUP rad. ',
'SELECTION-SCREEN COMMENT 3(30) t_refr FOR FIELD r_refr. ',
'SELECTION-SCREEN END OF LINE. ',
' ',
'SELECTION-SCREEN END OF BLOCK bl_3. ',
' ',
'INITIALIZATION. ',
' title_1 = ''선택조건''. ',
' title_2 = ''추가옵션''. ',
' title_3 = ''처리옵션''. ',
' ',
' t_tab = ''테이블명''. ',
' t_fname = ''파일명''. ',
' t_ftype = ''파일형식''. ',
' ',
' t_head = ''데이터 첫행은 제외함''. ',
' t_space = ''데이터 값이 없는 라인은 제외함''. ',
' t_remark = ''데이터가 다음 문자로 시작되면 제외함''. ',
' ',
' t_disp = ''Display Only''. ',
' t_upda = ''Update Only''. ',
' t_refr = ''테이블 초기화 & Update''. ',
' ',
' SET TITLEBAR ''%_t'' OF PROGRAM ''rssystdb'' ',
' WITH ''Table contents Upload Utility''. ',
'AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename. ',
' PERFORM f4_help_datafile. ',
' ',
'START-OF-SELECTION. ',
' PERFORM data_upload. ',
' ',
' IF r_disp = ''X''. "- Display Only ',
' PERFORM selection_data_display. ',
' ELSEIF r_upda = ''X''. "- Update Only ',
' PERFORM selection_data_update. ',
' ELSEIF r_refr = ''X''. "- Delete & Update ',
'* PERFORM table_data_delete_all. ',
' PERFORM selection_data_update. ',
' ENDIF. ',
' ',
'*&-------------------------------------------------------------',
'* FORM F4_HELP_DATAFILE ',
'*&-------------------------------------------------------------',
'FORM f4_help_datafile. ',
' ',
' DATA: fname TYPE fieldname, ',
' fvalue LIKE rlgrap-filename. ',
' ',
' GET CURSOR FIELD fname VALUE fvalue. ',
' ',
' CALL FUNCTION ''WS_FILENAME_GET'' ',
' EXPORTING ',
' def_filename = fvalue ',
' mask = '',*.*,*.*.'' ',
' title = ''파일선택'' ',
' IMPORTING ',
' filename = filename ',
' EXCEPTIONS ',
' inv_winsys = 1 ',
' no_batch = 2 ',
' selection_cancel = 3 ',
' selection_error = 4 ',
' OTHERS = 5. ',
' IF sy-subrc <> 0. ',
' MESSAGE ID sy-msgid TYPE ''S'' NUMBER sy-msgno ',
' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ',
' ENDIF. ',
' ',
'ENDFORM. "f4_help_datafile ',
' ',
'*&-------------------------------------------------------------',
'* FORM DATA_UPLOAD ',
'*&-------------------------------------------------------------',
'FORM data_upload. ',
' CLEAR: in_data. REFRESH: in_data. ',
' CLEAR: up_data. REFRESH: up_data. ',
' ',
' CALL FUNCTION ''WS_UPLOAD'' ',
' EXPORTING ',
' filename = filename ',
' filetype = filetype ',
' TABLES ',
' data_tab = in_data ',
' EXCEPTIONS ',
' conversion_error = 1 ',
' file_open_error = 2 ',
' file_read_error = 3 ',
' invalid_type = 4 ',
' no_batch = 5 ',
' unknown_error = 6 ',
' invalid_table_width = 7 ',
' gui_refuse_filetransfer = 8 ',
' customer_error = 9 ',
' OTHERS = 10. ',
' IF sy-subrc <> 0. ',
' MESSAGE ID sy-msgid TYPE ''S'' NUMBER sy-msgno ',
' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ',
' STOP. ',
' ENDIF. ',
' ',
' LOOP AT in_data. ',
' IF ( sy-tabix = 1 ) AND "-- 데이터 머리글행은 제외함 ',
' ( p_head = ''X'' ). ',
' CONTINUE. ',
' ENDIF. ',
' IF ( in_data IS INITIAL ) AND "-- 데이터가 없는 행은 제외함',
' ( p_space = ''X'' ). ',
' CONTINUE. ',
' ENDIF. ',
' IF ( p_remark = ''X'' ) AND "-데이터가 제외문자로 시작 ',
' ( in_data(1) = p_except ). ',
' CONTINUE. ',
' ENDIF. ',
' ',
' ',
' CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS = 1 ',
' OTHERS = 2. ',
' ',
' MOVE-CORRESPONDING in_data TO up_data. ',
' ENDCATCH. ',
' ',
' IF SY-SUBRC = 0. ',
' APPEND up_data. ',
' CONTINUE. ',
' ELSE. ',
' WRITE SY-TABIX TO HD_TEXT LEFT-JUSTIFIED. ',
' CONCATENATE HD_TEXT ''번째 데이터를 변환할 수 없습니다.'' ',
' INTO hd_text. ',
' CALL FUNCTION ''POPUP_TO_CONFIRM_STEP'' ',
' EXPORTING ',
' textline1 = hd_text ',
' textline2 = ''오류 데이터를 제외하고 계속 진행하시겠습니까?'' ',
' titel = ''데이터 제외 확인'' ',
' defaultoption = ''N'' ',
' cancel_display = '''' ',
' IMPORTING ',
' answer = return_code. ',
' IF return_code <> ''J''. ',
' MESSAGE s001(00) WITH ''작업이 취소되었습니다''. ',
' STOP. ',
' ENDIF. ',
' ENDIF. ',
' ENDLOOP. ',
' ',
' DESCRIBE TABLE up_data LINES cnt. ',
' ',
'ENDFORM. "data_upload ',
' ',
'*&-------------------------------------------------------------',
'* FORM selection_data_display ',
'*&-------------------------------------------------------------',
'FORM selection_data_display. ',
' ',
' PERFORM layout_init USING gs_layout. ',
' PERFORM fieldcat_init USING tab_name. ',
' PERFORM fieldcat_modify USING gt_fieldcat[]. ',
' ',
' CALL FUNCTION ''REUSE_ALV_GRID_DISPLAY'' ',
' EXPORTING ',
' i_callback_program = pgm ',
' i_grid_title = ''Table Contents Upload Utility'' ',
' is_layout = gs_layout ',
' it_fieldcat = gt_fieldcat[] ',
' TABLES ',
' t_outtab = up_data ',
' EXCEPTIONS ',
' program_error = 1 ',
' OTHERS = 2. ',
' ',
' IF sy-subrc <> 0. ',
' MESSAGE ID sy-msgid TYPE ''I'' NUMBER sy-msgno ',
' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ',
' ENDIF. ',
' ',
'ENDFORM. "selection_data_display ',
' ',
' ',
'*&-------------------------------------------------------------',
'* FORM selection_data_update ',
'*&-------------------------------------------------------------',
'FORM selection_data_update. ',
' ',
' MODIFY (tab_name) FROM TABLE up_data. ',
' MESSAGE s001(00) WITH sy-dbcnt ''건 Upload 완료''. ',
' ',
'ENDFORM. "selection_data_update ',
' ',
'*&-------------------------------------------------------------',
'* FORM TABLE_DATA_DELETE_ALL ',
'*&-------------------------------------------------------------',
'FORM table_data_delete_all. ',
' DATA: hd_text(100) TYPE c. ',
' CONCATENATE ''테이블 ('' tab_name ',
' '')데이터를 모두 삭제후 작업을 진행합니다'' ',
' INTO hd_text SEPARATED BY space. ',
' CALL FUNCTION ''POPUP_TO_CONFIRM_STEP'' ',
' EXPORTING ',
' textline1 = hd_text ',
' textline2 = ''계속 진행하시겠습니까?'' ',
' titel = ''데이터 삭제 확인'' ',
' defaultoption = ''N'' ',
' cancel_display = '''' ',
' IMPORTING ',
' answer = return_code. ',
' IF return_code <> ''J''. ',
' MESSAGE s001(00) WITH ''작업이 취소되었습니다''. ',
' STOP. ',
' ENDIF. ',
' ',
'* 데이터베이스 테이블의 데이터를 전체 삭제 ',
' DELETE FROM (tab_name). ',
' ',
'ENDFORM. "table_data_delete_all ',
' ',
' ',
'*&-------------------------------------------------------------',
'* FORM layout_init ',
'*&-------------------------------------------------------------',
'FORM layout_init USING rs_layout TYPE slis_layout_alv. ',
'* Build layout for list display ',
' pgm = sy-repid. ',
' ',
' rs_layout-zebra = ''X''. ',
' rs_layout-colwidth_optimize = ''X''. ',
' ',
' rs_layout-no_keyfix = '' ''. ',
' ',
'ENDFORM. "layout_init ',
' ',
'*&-------------------------------------------------------------',
'*& Form fieldcat_init ',
'*&-------------------------------------------------------------',
'FORM fieldcat_init USING p_structure. ',
' g_inclname = sy-repid. ',
' CLEAR: gt_fieldcat. REFRESH: gt_fieldcat. ',
' ',
' CALL FUNCTION ''REUSE_ALV_FIELDCATALOG_MERGE'' ',
' EXPORTING ',
' i_program_name = pgm ',
' i_structure_name = p_structure ',
' i_inclname = g_inclname ',
' CHANGING ',
' ct_fieldcat = gt_fieldcat[]. ',
' ',
'ENDFORM. "fieldcat_init ',
' ',
'*&-------------------------------------------------------------',
'*& Form fieldcat_modify ',
'*&-------------------------------------------------------------',
'FORM fieldcat_modify ',
' USING p_fieldcat TYPE slis_t_fieldcat_alv. ',
' ',
' DATA: ls_fieldcat TYPE slis_fieldcat_alv. ',
' ',
' LOOP AT p_fieldcat INTO ls_fieldcat. ',
' IF ls_fieldcat-fieldname = ''MANDT''. ',
' ls_fieldcat-no_out = ''X''. ',
' ENDIF. ',
' MODIFY p_fieldcat FROM ls_fieldcat INDEX sy-tabix. ',
' ENDLOOP. ',
'ENDFORM. "fieldcat_modify ',
' '.
ENDFORM. "make_program
'SAP SD' 카테고리의 다른 글
[TABLE] TBTCO, TBTCP 스케쥴 잡 등록 테이블. (0) | 2016.01.12 |
---|