이때개발시스템에서개발한ABAP프로그램같은것들을운영시스템에반영해야할때가찾아옵니다.이럴때에쓰이는것이CTS입니다. Change and Transport System의말그대로변경사항을관리해주는시스템인것이지요.여기서Target을말하자면,개발시스템의Target시스템은검증시스템이고,검증시스템의Target시스템은운영시스템인셈입니다.
(2) TMS (Transport Management System)
CTS안에는TMS라고하는관리시스템이있습니다.이TMS를사용해서Transport Domain을생성/관리하고, System Landscape를구성/관리할수있습니다.
Transport Domain이란쉽게말해,변경사항을적용할수있는그룹을말합니다.이Transport Domain내에있는시스템끼리만변경사항적용이가능한것이지요.
ABAP 프로그램을 작성하기 위하여 필수적으로 사용하여야 할 기본 Object 및 사용법에 대하여 학습했다.Data Browser, Abap Editor, Menu Painter, Function Builder, Message Builder.
ABAP 프로그램 생성.
ABAP 프로그램 생성법에 대하여 학습했다. 실제 샘플 프로젝트의 프로그램명과 각 Attribute를 작성했다.
ABAP Dictionaray
Database를 유지 보수하는 Object에 대해 학습했다. Table 생성법, Table을 구성하는 Data Element와 Domain 생성법, Structure 생성법, View생성법을 익혔다. 샘플 프로젝트에서 필요한 테이블과 테스트 데이터를 여러분들은 이 모듈에서 생성하였다.
Report 초기화면및 Data
보고서를 작성하기 위하여 초기화면에서 필요한 사용자 입력화면 정의방법과 각종 데이터 선언법에 대하여 학습하였다. SELECTION-SCREEN Event문에서 Parameter, Select-option,Data, Internal Table 등을 선언한다. 샘플 프로젝트에서는 초기화면에서 지역과 그룹을 Select-Option으로 선언하고 지역/그룹별, 그룹/지역별을 Parameter로 선언하고 필요 데이터를 정의하였다.
Data Retrieval
초기화면에서사용자가 입력한 사항에 맞는 데이터를 테이블로부터 발췌하는 SQL문에 대하여 학습하였다. 샘플 프로젝트에서는 START-OF-SELECTION Event절에서 미리 생성해놓은 테이블로부터 조건에 맞는 데이터를 SQL문으로 발췌하여 Internal Table에 저장한다.
Basic Statements.
가장 기본적인제어문, 조건문, 대입문, Subroutine에 대하여 학습하였다. 샘플소스에서는 각 지역/그룹별 인원합계를 구하기 위하여 조건문, 제어문, 대입문을 사용하였다.
Internal Table
Internal Table의 선언법, Internal Table에 데이터를 채우는법, Internal Table의 각 제어문에 대하여 학습하였다. 샘플소스에서는 발췌한 데이터를 Internal Table에 저장하여 Internal Table을 LOOPING하면서 각 제어문으로 지역/그룹코드를 출력하고 인원수 합계를 구하여 지정된 보고서를 출력한다.
Output화면구성
발췌한 데이터를 실제로 화면상에 출력하는 Write문에 대하여 학습하였다. 기본 Write문, Format문, Layout지정에 대하여 학습하였다.END-OF-SELECTION Event절에서 Write문으로지정된 보고서 양식에 맞는 메인 화면을 작성하였다. TOP-OF-PAGE Event절에서는 머리말을END-OF-PAGE 에서는 꼬리말을 작성 하였다.
상세화면 출력
기본화면에서 상세내역을 보고자 하는라인을 더블클릭할 경우의 상세보고서를 출력하는 법에 대하여 학습하였니다. 기본화면에서 상세내역으로 데이터를 넘겨주는 방법 및 Event에 대하여 학습하였죠.
At LINE-SELECTION 절에서 상세내역을 보여주고TOP-OF-PAGE DURING LINE-SELECTION 절에서 상세화면의 머리말을 작성하였습니다.
User Menu처리
단순히 보여주는 화면에서 더 나아가 실제 User의 Event처리를 하기 위하여 필요한 At USER-COMMAND절, GUI Status, GUI Title, Function사용법, Message사용법, 화면상의 출력된 데이터를 읽고 쓰는법, 테이블에 데이터를 반영하는 법들에 대하여 학습하였다. 샘플소스에서는 At USER-COMMAND에서 전체선택, 전체취소, Download, Delete 등의 기능들을 작성하였다.
주소록 현황 Report 작성하기.
- 먼저 사용자에게 초기화면에서 지역과 그룹의 값을 입력 받고 주소록 Table인 tkks01로 부터 데이터를 발췌하여 주소록 현황보고서를 출력 - 사용자가 하나의 지역과 그룹을 선택해서 더블클릭을 할 경우 주소록 상세내역을 출력 - 첫 번째 화면에서 상단의 User Menu를 선택할 경우 그에 적절한 기능을 수행할 수 있도록 구현
소스보기.
*&---------------------------------------------------------------------* *& Report ZTKKS001 * *& * *&---------------------------------------------------------------------* *& System Name : Demo * *& Description : 주소록 관리 * *& Create on : 2003.04.11 * *& Create by : KSKIM * *&---------------------------------------------------------------------* report ztkks001 message-id zg line-size 73 line-count 65(1) no standard page heading.
tables:ztkks01, "주소록 관리 테이블 ztkks02. "주소록 관리 테이블(임시)
data:gkey1_text like dd07t-ddtext, gkey2_text like dd07t-ddtext, gkey1_domain like dd01l-domname, gkey2_domain like dd01l-domname.
data:begin of itab occurs 0, check, key1(3), "Key Field 추가 key2(3). include structure ztkks01. data:end of itab.
data:$ztkks02 like ztkks02 occurs 0 with header line.
*************************************************** * Selection Screen *************************************************** selection-screen skip 1. selection-screen begin of block p1 with frame title text-001. select-options:zgroup for ztkks01-zgroup, "그룹 area for ztkks01-area. "지역 selection-screen uline. selection-screen end of block p1.
selection-screen begin of block p2 with frame title text-002. parameters:opt1 radiobutton group grp, opt2 radiobutton group grp. selection-screen end of block p2. ************************************************** * Event Start-of-Selection *************************************************** start-of-selection. perform init. perform retrieve_data. perform set_key_field. *************************************************** * Event End-of-Selection *************************************************** end-of-selection. perform display_result. *************************************************** * Event At user-command *************************************************** at user-command. case sy-ucomm. when 'SELA'. perform select_all. when 'DSEL'. perform deselect_all. when 'ASEN'. perform sort_ascending. when 'DESC'. perform sort_descending. when 'DOWN'. perform download_to_pc. when 'DEL'. perform delete_data. when 'PICK'. perform show_detail. endcase.
*************************************************** * Event At line-selection *************************************************** at line-selection. case sy-ucomm. when 'PICK'. perform show_detail. endcase.
else. write: at /1(73) sy-uline. write: at /1 sy-vline, 30 '>>주소록<<' color 1, 73 sy-vline, at /1(73) sy-vline, 73 sy-vline. write: at /1 sy-vline, 3 '조회일: ', 12 sy-datum, 57 'User: ', 62 sy-uname, 73 sy-vline. write: at /1(73) sy-uline. format intensified on color 4. write: at /1(73) sy-uline. write: at /4 '지역코드', 14 gkey1_text, 44 gkey2_text, 59 '인원'. perform draw_vline. write: at /1(73) sy-uline. format intensified off color off. endif.
: At LINE-SELECTION절에서는 상세내역을 보고자 하는 라인을 더블 클릭할 경우 상세내역을 출력하는 기능을 작성한다. 해당 지역과 그룹 내에 속하는 주소록 세부내역인 이름,지역명 , 그룹명, 전화번호,핸드폰,E-mail,주소를 출력한다.
: TOP-OF-PAGE절에서는 기본화면의 머리말을 출력한다. 기본보고서의 제목,조회일자,User ID와 메인화면의 각 항목의 제목을 출력한다.
: TOP-OF-PAGE DURING LINE-SELECTION절에서는 AT LINE-SELECTION절에 의해서 출력된 화면의 머리말을 출력한다. 즉.세부내역에 해당되는 머리말이다. <주소록 세부내역>이라는 제목과 세부 메인 화면의 각항목의 제목을 출력한다.
: END-OF-PAGE 절에서는 꾀리말을 출력한다. 여기서는 페이지 번호를 출력하기로 되어 있다.
2) 데이터 추출
- 먼저 사용자에게 초기화면에서 지역과 그룹의 값을 입력 받고 주소록 Table인 tkks01로부터 데이터를 발췌하여 주소록 현황보고서를 출력 - 사용자가 하나의 지역과 그룹을 선택해서 더블클릭을 할 경우 주소록 상세내역을 출력 - 첫 번째 화면에서 상단의 User Menu를 선택할 경우 그에 적절한 기능을 수행할 수 있도록 구현
*&---------------------------------------------------------------------* * 사용자가 선택한 Option에 따라서 키필드명및 키필드에 해당하는 * Domain Name을 초기화 *----------------------------------------------------------------------* * Parameter : Nothing *----------------------------------------------------------------------* form init. if opt1 eq 'X'. gkey1_text = '지역'. gkey2_text = '그룹'. gkey1_domain = 'ZCHR3'. gkey2_domain = 'ZCHR1'. else. gkey1_text = '그룹'. gkey2_text = '지역'. gkey1_domain = 'ZCHR1'. gkey2_domain = 'ZCHR3'. endif. endform. " INIT
*&---------------------------------------------------------------------* *& Form RETRIEVE_DATA *&---------------------------------------------------------------------* * Table:ZTKKS001로부터 입력받은 조건에 의해서 데이타를 추출하는 FORM *----------------------------------------------------------------------* * Parameters : None *----------------------------------------------------------------------* form retrieve_data. select * appending corresponding fields of table itab from ztkks01 where zgroup in zgroup and area in area. endform. " RETRIEVE_DATA
*&---------------------------------------------------------------------* *& Form SET_KEY_FIELD *&---------------------------------------------------------------------* * 선택된 Option에 맞게 Internal Table의 Key Field를 정의한다. *----------------------------------------------------------------------* * Parameter : None *----------------------------------------------------------------------* form set_key_field. loop at itab. if opt1 eq 'X'. "지역/그룹인 경우 move:itab-area to itab-key1, itab-zgroup to itab-key2. modify itab. elseif opt2 eq 'X'. "그룹/지역인 경우 move:itab-zgroup to itab-key1, itab-area to itab-key2. modify itab. endif. endloop. sort itab by key1 key2. endform. " SET_KEY_FIELD
: 초기 화면에서 입력 받은 지역/그룹 Option에 따른 변수 지정을 하는 Subroutine을 호출한다.
: 입력조건에 맞는 데이터를 발췌하는 Subroutine을 호출한다.
: 초기 화면에서 입력 받은 지역/그룹 Option에 따라서 sort key를 지정하는 Subroutine을 호출한다.
: 초기 입력 화면에서 지역/그룹 Option을 선택할 경우는 첫번째는 지역, 두번째는 그룹이 키가 되고
그룹/지역 Option을 선택할 경우는 첫번째는 그룹,두번째는 지역이 key가 된다. 이후 소스에서 각 코드의
description을 domain의 fixed value에서 가져오기 위하여 미리 각 key별 domain값을 지정해 두는 부분이다.
: 주소록 테이블 ztkks01로부터 입력 받은 조건에 맞는 데이터를 발췌한다. Select절을 이용하여 발췌함과 동시에 Internal Table <itab>에 저장한다. Where 조건절에서는 in을 써서 입력 받은 조건 zgoup과 area에 해당하는 데이터를 발췌하도록 한다.
: 초기 입력 화면에서 지역/그룹 Option을 선택할 경우는 sort할 때 순서가 지역+그룹이 되며 그룹/지역을 선택할 경우는 sort시 순서가 그룹+지역이 된다. 이러한 기능을 하가 위하여 option에 따라서 key1,key2에 각각 지역/그룹
* 보고서의 제목/일자/USER ID를 출력한다. write: at /1(73) sy-uline. write: at /1 sy-vline, 30 '>>주소록<<' color 1, 73 sy-vline, at /1(73) sy-vline, 73 sy-vline. write: at /1 sy-vline, 3 '조회일: ', 12 sy-datum, 57 'User: ', 62 sy-uname, 73 sy-vline. write: at /1(73) sy-uline.
* 보고서의 각 ITEM제목을 출력한다. format intensified on color 4. write: at /1(73) sy-uline. write: at /4 '지역코드', 14 gkey1_text, 44 gkey2_text, 59 '인원'. perform draw_vline. write: at /1(73) sy-uline. format intensified off color off.
*&---------------------------------------------------------------------* *& Form DISPLAY_RESULT *&---------------------------------------------------------------------* * 추출된 결과를 화면에 출력하는 Form *----------------------------------------------------------------------* * Parameter : None *----------------------------------------------------------------------* form display_result.
data:l_key1_total type i, "key1의 인원수 합계 l_key2_total type i, "key2의 인원수 합계 lkey1_text like dd07t-ddtext, "key1의 코드명 lkey2_text like dd07t-ddtext. "key2의 코드명
* 메뉴바와 첫번째 OUTPUT 화면 Setting sy-lsind = 0. set titlebar '0100'. set pf-status 'MENU01'.
* 초기화면에서 지역/그룹별을 선택시 loop at itab.
* 지역코드명 추출및 화면에 출력 at new key1. clear:l_key1_total. perform get_domain_value changing:itab-key1 gkey1_domain lkey1_text. write: at 2 itab-check as checkbox, 4 itab-key1, 14 lkey1_text. perform draw_vline. endat.
* 그룹코드명 추출및 화면에 출력 at new key2. clear:l_key2_total. perform get_domain_value changing:itab-key2 gkey2_domain lkey2_text. write: at 44 lkey2_text. endat.
* 지역별/그룹별 인원수 합계 구하기 add 1 to l_key1_total. add 1 to l_key2_total.
hide itab.
* 지역별/그룹별 인원수 출력 at end of key2. write: at 59 l_key2_total. perform draw_vline. new-line. endat.
* 지역이 바뀔경우 밑줄을 그음. at end of key1. write: at /1(73) sy-uline. new-line. endat. endloop.
clear:itab.
* 꼬릿말을 출력하기 위하여 제일 마지막 장에선 꼬릿말 위치로 커서 이동 skip to line sy-linct.
endform. " DISPLAY_RESULT
*&---------------------------------------------------------------------* *& Form GET_DOMAIN_VALUE *&---------------------------------------------------------------------* * Domain Value및 Domain Name을 인수로 받아서 Domain의 Value Text를 추출 *----------------------------------------------------------------------* * --> D_value : Domain Value * --> D_Domain : Domain name * <-- D_text : Domain Fixed Value의 Text *----------------------------------------------------------------------* form get_domain_value changing d_value d_domain d_text. call function 'STF4_GET_DOMAIN_VALUE_TEXT' exporting iv_domname = d_domain iv_value = d_value importing ev_value_text = d_text exceptions value_not_found = 1 others = 2. if sy-subrc <> 0. message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif.
endform. " GET_DOMAIN_VALUE
: 보고서의 메인 화면을 출력하는 Subroutine을 호출한다.
: 보고서의 머리말을 작성한다. 제목,작업일자, User ID ,메인 화면의 각 필드 제목을 출력한다.
: 보거서의 머리말/꼬리말을 작성한다. 페이지 번호를 출력하도록 한다.
: 실제 보고서 화면을 출력하는 소스이다.
: 기본 보고서의 상단에 나올 Menu와 Title을 지정한다.
: 입력 초기화면에서 지역/그룹 option을 선택하였을 경우는 기준으로 설명하겠다.
Key1=지역 , Key2=그룹이 된다. 우선 지역이 바뀔경우 즉 AT NEW KEY1 제어문을 쓰면 된다. 지역명을 domain의 fixed value의 description 에서 가져와서 지역코드와 지역명을 출력한다.
: 그룹이 바뀔 경우 그룹명을 Domain의 fixed value의 description에서 가져와서 그룹명을 출력한다.
: 지역/그룹별 인원수 합계를 구하기 위하여 1씩 합계변수를 증가시킨다.
: 세부내역을 출력하기 위하여 더블라인을 클릭할경우 기본화면의 데이터를 넘겨줘야 하는데, 이때 HIDE명령어를 사용하여 HIDE Area에 해당 라인의 데이터를 저장한다.
: 하나의 그룹이 끝난 경우 인원수를 출력하여야 한다. AT END OF KEY2 제어문을 사용하여 인원수를 출력한다.
: 꼬리말을 출력시키기 위해서는 보고서의 맨 끝 줄로 커서를 이동 시켜줘야 한다.
SKIP TO SY-LINCT라고 쓰면 보고서 하단의 끝 줄로 옮겨 간다.
: Domain의 fixed value의 각 description을 가져오기 위하여 standard 함수인 'STF4_GET_DOMAIN_VAL_TEXT'를 사용한다. 함수에 Domain name과 코드값을 넘겨주면 코드명을 return값으로
받을 수 있다.
*결과화면
4) 상세 보고서 출력.
- 한 라인을 선택한 다음 더블 클릭하면 AT LINE-SELECTION Event를 수행하게 되고 그 부분에 상세 내역 출력 Routine을 추가 - 사용자가 원하는 지역/그룹의 라인을 더블 클릭하면 해당 지역/그룹 내의 상세 주소록 현황인 이름, 전화번호, E-Mail, 주소 등을 출력
소스보기.
*************************************************** * Event At line-selection ***************************************************
at line-selection. case sy-ucomm. when 'PICK'. perform show_detail. endcase.
*************************************************** * Event Top-of-Page during line-selection *************************************************** top-of-page during line-selection.
if sy-lsind ne 0. format color col_heading. skip 2. write: at /2 '주소록 세부내역'. new-line. write: at /1(142) sy-uline. new-line. write: at /1 sy-vline, 2 '이름',12 sy-vline,13 '지역', 23 sy-vline,24 '그룹', 31 sy-vline,32 '(집)전화번호', 47 sy-vline,48 '핸드폰', 63 sy-vline,64 'E-mail', 79 sy-vline,80 '주소', 142 sy-vline. new-line. write: at 1(142) sy-uline. format color off.
else write: at /1(73) sy-uline. write: at /1 sy-vline, 30 '>>주소록<<' color 1, 73 sy-vline, at /1(73) sy-vline, 73 sy-vline. write: at /1 sy-vline, 3 '조회일: ', 12 sy-datum, 57 'User: ', 62 sy-uname, 73 sy-vline. write: at /1(73) sy-uline. format intensified on color 4. write: at /1(73) sy-uline. write: at /4 '지역코드', 14 gkey1_text, 44 gkey2_text, 59 '인원'. perform draw_vline. write: at /1(73) sy-uline. format intensified off color off. endif.
: HIDE Area에 저장해놨던 데이터를 사용한다. HIDE 시켰던 해당 변수를 사용하면 바로 클릭한 라인의 해당
변수값을 얻을 수가 있다. 만일 ITAB-ZGROUP이라는 화면필드의 값이 SPACE라는 얘기는 다른 라인 부분을 클릭
했다는 의미이므로 상세내역을 보여줄 필요가 없이 Message만 보여준다.
: 상세 화면에서는 <SelectAll>,<DeSelect>등의 메뉴는 불필요하다. 따라서 기본화면과는 다른 Menu를 지정한다.
: 상세화면은 기본화면보다 가로길이가 길어야 한다. 한 라이당 보여지는 항목이 많다. NEW-PAGE 구문을 사용하여 상세화면의 적절한 가로길이와 세로길이를 지정한다.
: HIDE Area에 저장되어 있는 화면 필드값을 새로운 지역/그룹 변수로 옮긴다.
: 지역/그룹 변수에 해당하는 데이터만 ITAB에서 발췌하여 출력한다. WHERE 조건절을 사용한다.
: 지역과 그룹명을 구하기 위하여 기본화면에서도 호출했던 Subroutine을 이용한다.
지역코드와 지역코드의 domain명을 넘겨주고 지역코드명을 return값으로 받는다.
: 이름, 지역명 , 그룹명 , 전화번호 , 핸드폰 , E-Mail 주소를 순서대로 출력한다. 각 항목간 구분은 '|'로 구분한다.
* 결과화면
5) User Menu 처리
기본보고서의 상단의 메뉴작업들, 즉 <SelectAll>, <DeSelect>, <Ascending>, <Descending>, <Download>, <Delete> 기능들을 수행
=> 이러한 User Menu처리는 AT USER-COMMAND Event절에서 함.
소스보기.
at user-command. case sy-ucomm. when 'SELA'. perform select_all. when 'DSEL'. perform deselect_all. when 'ASEN'. perform sort_ascending. when 'DESC'. perform sort_descending. when 'DOWN'. perform download_to_pc. when 'DEL'. perform delete_data. when 'PICK'. perform show_detail. endcase.
: 기본 보고서의 상단의 아이콘 즉 User Menu의 기능을 처리한다.
: <SelectAll>의 기능을 수행하는 Subroutine을 호출한다. 화면상의 checkbox를 모두 check상태로
바꾸는 기능을 기술한다.
: <DeSelect>의 기능을 수행하는 Subroutine을 호출한다. 화면상의 checkbox를 모두 space상태로 바꿔준다.
: <Ascending>의 기능을 수행하는 Subroutine을 호출한다. 지역/그룹의 정렬 순서를 오름차순으로 재정렬하여
화면에 다시 보여준다.
: <Descending>의 기능을 수행하는 Subroutine을 호출한다. 지역/그룹의 정렬순서를 내림차순으로 재정렬하여
이화면을 다시 보여준다.
: <Download>의 기능을 수행하는 Subroutine을 호출한다. 현재 Internal Table에 있는 내용을 PC파일로 Down받는다.
: <Delete>의 기능을 수행하는 Subroutine을 호출한다. Check된 데이터를 Backup용 테이블로 저장하고 화면상에서는 해당 데이터를 삭제하여 화면을 다시 보여준다.
: 라인을 더블 클릭하였을 때와 같은 기능을 수행한다.
- <SelectAll>/<Deselect> Command기능
소스보기.
*&---------------------------------------------------------------------* *& Form Select_all *&---------------------------------------------------------------------* * FUNC: 모두선택 *----------------------------------------------------------------------* * Parameter : Nothing *----------------------------------------------------------------------* form select_all.
* 방법1 - internal table의 checkbox의 값을 변경하고 새로 list write * loop at itab. * itab-check = 'X'. * modify itab. * endloop. * perform display_result.
* 방법2 - 직접 list의 값을 변경함. do. clear itab-check. read line sy-index field value itab-check. if sy-subrc ne 0. exit. endif. if itab-check is initial. itab-check = 'X'. modify line sy-index field value itab-check. endif. enddo.
endform. " Select_all
*&---------------------------------------------------------------------* *& Form deselect_all *&---------------------------------------------------------------------* * FUNC: 모두 선택취소 *----------------------------------------------------------------------* * Parameter : Nothing *----------------------------------------------------------------------* form deselect_all.
* 방법1 - internal table의 checkbox의 값을 변경하고 새로 list write * loop at itab. * clear itab-check. * modify itab. * endloop. * perform display_result.
* 방법2 - 직접 list의 값을 변경함. do. clear itab-check. read line sy-index field value itab-check. if sy-subrc ne 0. exit. endif. if itab-check = 'X'. clear itab-check. modify line sy-index field value itab-check. endif. enddo.
endform. " deselect_all
: 화면상의 checkbox필드를 check상태로 변경하는 Subroutine이다.
: 화면상의 모든 list의 checkbox를 변경시켜야 하므로 DO문으로 화면 첫 줄부터 끝 줄까지 순서대로 읽는다.
: 해당 라인의 화면 필드인 itab-check를 읽는다.
: 해당 라인을 읽은 결과 sy-subrc값이 0가 아닐 경우는 list의 끝이라는 의미이므로 이때는 DO문을 벗어난다.
: 화면 필드 itab-check의 check표시를 해주기 위하여 'X'값으로 변경시켜서 화면필드를 수정하여 준다.
: 화면상의 checkbox 필드를 space상태로 변경하는 Subroutine이다.
: 화면상의 모든 list의 checkbox를 변경시켜야 하므로 DO문으로 화면 첫줄부터 끝 줄까지 순서대로 읽는다.
: 해당 라인의 화면 필드인 itab-check를 읽는다.
: 화면 필드 itab-check를 space상태로 해주기 위하여 변수값을 clear시킨 다음 modify시킨다.
* 결과화면
- <Ascending>/<Descending> Command기능
소스보기.
*&---------------------------------------------------------------------* * Func:ASEN * Internal Table을 Ascending Sort하여 화면에 다시 Display한다. *----------------------------------------------------------------------* * Parameter : Nothing *----------------------------------------------------------------------* form sort_ascending.
sort itab by key1 ascending key2 ascending. perform display_result.
endform. " SORT_ASCENDING
*&---------------------------------------------------------------------* *& Form SORT_DESCENDING *&---------------------------------------------------------------------* * Func:DESC * Internal Table을 Descending Sort하여 화면에 다시 Display한다. *----------------------------------------------------------------------* * Parameter : Nothing *----------------------------------------------------------------------* form sort_descending.
sort itab by key1 descending key2 descending. perform display_result.
endform. " SORT_DESCENDING
: 지역/그룹 순서를 오름차순으로 정렬하여 화면을 다시 보여주는 Subroutine이다.
: 지역/그룹 코드를 Sort 구문으로 오름차순으로 Internal Table을 정렬한다.
: 정렬한 Internal Table로 다시 한번 기본화면을 출력한다.
: 지역/그룹 순서를 내림차순으로 정렬하여 화면을 다시 보여주는 Subroutine이다.
: 지역/그룹 코드를 SORT구문으로 내림차순으로 Internal Table을 정렬한다.
: 정렬한 Internal Table로 다시 한번 기본화면을 출력한다.
- <Download> Command기능
주소록 데이터를 PC파일로 Down받는 기능을 구현한다.즉 Internal Table의 모든 내용을 PC파일로 Down받는다.
소스보기.
*&---------------------------------------------------------------------* *& Form DOWNLOAD_TO_PC *&---------------------------------------------------------------------* * t ext * Internal Table의 데이타를 필드구분자 '|'를 이용하여 * Local PC로 Download한다. *----------------------------------------------------------------------* * Parameter : Nothing *----------------------------------------------------------------------* form download_to_pc.
data: l_answer type c, l_separator type c value '|', lkey1_text like dd07t-ddtext, lkey2_text like dd07t-ddtext, f_name like rlgrap-filename.
* download힐 데이터를 넣을 internal table data: begin of itab_down occurs 0. include structure itab. data: key1_text like dd07t-ddtext, key2_text like dd07t-ddtext, end of itab_down.
* download 함수 사용 call function 'DOWNLOAD' exporting filename = f_name filetype = 'DAT' importing cancel = l_answer tables data_tab = itab_down.
if l_answer eq 'x' or l_answer eq 'X'. message i000(zg) with 'Job was canceled!'. elseif sy-subrc = 0. message i000(zg) with 'Job was ended sucessfully!'. else. message e000(zg) with 'Error occured'. endif.
endform. " DOWNLOAD_TO_PC
: Internal Table의 내용을 PC 파일로 Down받는 Subroutine이다.
: Download할 내용을 저장할 Internal Table을 정의한다. itab을 그대로 Down받아도 되나 코드명이
없으므로 코드명 필드를 추가한 Internal Table을 만들어서 코드명까지 Down받도록 한다.
: Download용 Internal Table itab_down으로 itab 데이터를 옮긴다.
: APPEND 구문을 이용하여 Down용 Internal Table에 데이터를 저장한다.
: 'DOWNLOAD'를 사용하여 itab_down의 내용을 PC파일로 저장한다.
: Download 결과 여부를 사용자에게 Message를 사용하여 보여준다.
4) 상세 보고서 출력
- <Delete> Command기능
<Delete>기능 소스는 아래의 4단계로 구성된다.
첫째. 화면상에서 checkbox가 되어 있는 라인의 지역코드와 그룹코드로부터 해당되는 Internal Table의 데이더를 삭제용 Internal Table로 저장한다.
넷째.삭제된 데이터를 화면상에서 없애기 위하여 Internal Table itab의 데이터를 화면상에 다시 출력한다.
소스보기.
*&---------------------------------------------------------------------* *& Form delete_data *&---------------------------------------------------------------------* * check 된 데이터를 삭제처리한다. *----------------------------------------------------------------------* * parameter: Nothing *----------------------------------------------------------------------* form delete_data.
* 1. 화면상에서 check된 라인의 지역/그룹에 해당되는 데이터만 발췌하여 * 해당 internal table에서 해당 데이터만 삭제하고 itab_del에 * append 한다. * 2. 새로운 화면을 다시 뿌려준다.
* 해당 데이터를 삭제유무를 Confirm 한다. data: v_answer(1). call function 'POPUP_TO_CONFIRM_STEP' exporting * DEFAULTOPTION = 'Y' textline1 = '삭제하시겠습니까?' * TEXTLINE2 = ' ' titel = '삭제' * START_COLUMN = 25 * START_ROW = 6 * CANCEL_DISPLAY = 'X' importing answer = v_answer. if v_answer ne 'J'. exit. endif.
* 삭제용 internal table data: itab_del like ztkks02 occurs 0 with header line. refresh itab_del.
do. clear: itab-check, itab-key1, itab-key2. read line sy-index field value itab-check itab-key1 itab-key2. if sy-subrc ne 0. exit. endif. * check된 데이터만 삭제용 itab_del에 추가하고 itab에서는 삭제한다. if itab-check = 'X'. loop at itab where key1 = itab-key1 and key2 = itab-key2. clear itab_del. move-corresponding itab to itab_del. itab_del-deletion = sy-datum. append itab_del. delete itab. endloop. endif. enddo.
* 원래 table(ztkks01)에서는 삭제하고 * 삭제용 table(ztkks02)에 추가한다. delete ztkks01 from table itab_del. modify ztkks02 from table itab_del. if sy-subrc = 0. commit work. else. rollback work. endif.
* 새로 결과를 화면에 뿌린다.
perform display_result.
endform. " delete_data l
기본화면에서 삭제하고자 하는 지역/그룹을 check하고 <Delete>아이콘을 클릭하여 보세요. 그럼 결과 보기 화면처럼 Confirm 창이 뜨고 <Yes>버튼을 클릭하면 화면과 Table ztkks01 에서는 해당 데이터가 삭제되고 ztkks02 Table에는 해당 데이터가 저장되어 있음을 확인할 수 있다.
: 이 <Delete> 기능은 Table에서 데이터를 삭제하는 처리이므로 사용자에게 한번 더 확인을 하는 절차가 필요하다. 실수로 <Delete> 아이콘을 클릭할 수도 있다. 사용자에게 Confirm 받을 수 있는 창을 띄우는 Function을 사용하여
확인자업을 한다.
: 'POPUP_TO_CONFIRM_STEP'함수에서 <Yes>를 선택하면 그 return값은 'J'가 되며 그 이외의 값일때는 아래
Routine을 수행하지 않도록 한다.
: 삭제되는 데이터를 backup용 Internal Table로 저장하기 위하여 삭제용 Internal Table을 정의한다.
: 화면 필드 중 itab-check,itab-key1,itab-key2의 값을 읽는다.
: 화면 필드 itab-check='X'인 경우 ,check된 라인에 한해서만 작업을 한다.