SAP R3 ABAP 프로그램 정리.
ABAP 프로그램 시작. |
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 등을 선언한다. |
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문에 대하여 학습하였다. |
상세화면 출력 |
기본화면에서 상세내역을 보고자 하는 라인을 더블클릭할 경우의 상세보고서를 출력하는 법에 대하여 학습하였니다. 기본화면에서 상세내역으로 데이터를 넘겨주는 방법 및 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를 선택할 경우 그에 적절한 기능을 수행할 수 있도록 구현 |
소스보기. |
tables:ztkks01, "주소록 관리 테이블
data:gkey1_text like dd07t-ddtext,
data:begin of itab occurs 0,
data:$ztkks02 like ztkks02 occurs 0 with header line.
selection-screen begin of block p2 with frame title text-002. ***************************************************
*************************************************** |
: Report문은 프로그램명, 프로그램 내에서 사용할 Message Class,Page Layout을 지정한다.
<message-id zg>는 message class중 'zg'를 쓴다. <line-size 73>은 프로그램 결과화면인 보고서의 가로길이
가 73 column이라는 얘기다. <line-count 65(1)>는 프로그램 결과화면인 보고서의 새로길이가 65줄이며 이중(1)의
1줄이 꼬리말로 출력된다는 의미이다.
: 프로그램 내에서 사용될 Global Data를 정의한다 프로그램 앞부분에서 정의한 변수는 모든 프로그램 내에서
전역변수로 사용할 수 있다.
: sy-ucomm=<DSEL>는 <DeSelect> 아이콘을 클릭하였을 경우이며 checkbox를 모두 space로 만드는 Form문
을 수행하게 한다.
: 프로그램내에서 사용될 Internal Table을 정의한다. 데이터를 발췌한 후 정의될 Internal Table를 정의한다.
: SELECTION_SCREEN 절에서는 보고서의 기본화면을 작성한다. 사용자가 원하는 입력값을 받는 화면을 작성하는 부분이다. 샘플소스에서는 SELECT-OPTION으로 지역과 그룹코드를 입력받는다.
: 보고서 결과화면에서 지역/그룹 또는 그룹/지역코드 형식으로 보여줄 것인지 parameter로 radio button형식으로 선택하게 한다.
: START-OF-SELECTION절에서는 해당 테이블에서 입력 받은 조건에 맞는 데이터를 발췌하여 Internal Table에 저장한다.
: END-OF-SELECTION 절에서는 지정된 보고서의 양식대로 메인 화면을 출력한다. 지역코드,지역명,그룹명을 출력하고 각 항목의 인원수를 Summary하여 인원수로 출력한다.
: AT USER-COMMAND절에서는 기본화면에서 User가 선택한 기능들을 수행하도록 프로그램을 작성한다.
<SelectAll> , <DeSelect> , <Ascending> , <Descending> , <Download> , <Delete>기능을 구현한다.
: 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에 따른 변수 지정을 하는 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에 각각 지역/그룹
,그룹/지역코드를 settting하고 key1, key2순서대로 Internal Table을 sort한다.
3) 보고서 출력
소스보기. |
***************************************************
***************************************************
*&---------------------------------------------------------------------*
data:l_key1_total type i, "key1의 인원수 합계
* 메뉴바와 첫번째 OUTPUT 화면 Setting
* 초기화면에서 지역/그룹별을 선택시
* 지역코드명 추출및 화면에 출력
* 그룹코드명 추출및 화면에 출력
hide itab.
* 지역별/그룹별 인원수 출력
* 지역이 바뀔경우 밑줄을 그음.
clear:itab. * 꼬릿말을 출력하기 위하여 제일 마지막 장에선 꼬릿말 위치로 커서 이동 endform. " DISPLAY_RESULT
*&---------------------------------------------------------------------*
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, 주소 등을 출력 |
소스보기. |
if sy-lsind ne 0.
else data:l_group like itab-zgroup, "그룹코드
* 세부내역의 Menu Setting * 세부내역의 페이지 사이즈 Setting
* 메모리에 저장되었던 지역/그룹코드를 변수에 move
* 해당라인의 지역/그룹코드의 값들만을 Loop돌리면서 출력함.
perform get_domain_value changing:itab-key1
perform get_domain_value changing:itab-key2
endform. " SHOW_DETAIL |
: 보고서의 결과 화면에서 라인을 더블 클릭할 경우에 AT LINE-SELECTION Event절을 수행하게 된다.
이부분에서 상세내역을 출력하는 Subroutine을 호출하낟.
: 기본보고서가 아니라 AT LINE-SELECTION에서 출력된 상세화면의 머리말은 TOP-OF-PAGE DURING
LINE-SELECTION절에 기술한다.
: SY-LSIND는 시스템 변수로서 화면 Page Depth를 나타낸다 따라서 SY-LSIND가 0가 아닐때 즉,
기본화면이 아닌 상세 화면일 때의 머리말을 작성한다. 상세화면 제목, 이름, 지역, 그룹, 전화번호 , 핸드폰 ,
E-Mail, 주소라는 항목명을 출력한다.
: 상세내역을 출력하는 Subroutine이다. 더블 클릭한 라인의 지역/그룹의 데이터만 Internal Table에서 뽑아서
이름,지역,그룹,전화번호,핸드폰,E-Mail,주소를 출력한다.
: 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. |
: 기본 보고서의 상단의 아이콘 즉 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 * 방법2 - 직접 list의 값을 변경함.
endform. " Select_all
*&---------------------------------------------------------------------*
* 방법1 - internal table의 checkbox의 값을 변경하고 새로 list write 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.
endform. " SORT_ASCENDING
*&---------------------------------------------------------------------*
sort itab by key1 descending key2 descending.
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,
* download힐 데이터를 넣을 internal table
refresh itab_down.
clear itab_down.
perform get_domain_value changing:itab-key2 append itab_down.
endloop.
* download 함수 사용
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로 저장한다. |
둘째. check된 라인의 데이터는 해당 Internal Table에서 삭제한다. |
세째. 삭제용 Internal Table에 저장된 데이터는 backup용 Table ztkks02 Table에 저장한다. |
넷째. 삭제된 데이터를 화면상에서 없애기 위하여 Internal Table itab의 데이터를 화면상에 다시 출력한다. |
소스보기. |
*&---------------------------------------------------------------------* *& Form delete_data *&---------------------------------------------------------------------* * check 된 데이터를 삭제처리한다. *----------------------------------------------------------------------* * parameter: Nothing *----------------------------------------------------------------------* form delete_data. * 화면상에서 check된 라인의 지역/그룹에 해당되는 데이터만 화면상에서는 * 1. 화면상에서 check된 라인의 지역/그룹에 해당되는 데이터만 발췌하여
* 해당 데이터를 삭제유무를 Confirm 한다. * 삭제용 internal table data: itab_del like ztkks02 occurs 0 with header line. refresh itab_del. do.
* 원래 table(ztkks01)에서는 삭제하고
* 새로 결과를 화면에 뿌린다. perform display_result.
endform. " delete_data |
기본화면에서 삭제하고자 하는 지역/그룹을 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된 라인에 한해서만 작업을 한다.
: Internal Table <itab>에서 화면필드의 지역코드(itab-key1),그룹코드 (itab-key2)인 데이터만을 발췌한다.
: 해당 데이터를 bakcup용 Internal Table로 옮긴다.
: backup용 Internal Table에 저장한다.
: 윈 Internal Tabe에서는 해당 데이터를 삭제한다.
: 원래의 주소록 데이터가 들어있는 ztkks01 Table에서는 삭제한다.
: backup용 Internal Table의 데이터를 ztkks02 Table에 저장한다.
: 정상적으로 Table에 반영이 된 경우는 Table의 Commit 작업을 하고 비정상적인 경우는 이전의 모든 Table 작업을 취소 처리한다.
: 해당 Internal Table에는 check된 데이터가 삭제되었으므로 이름 화면상에 반영하기 위하여 다시 한번 화면 출력을 한다.
Dictionary Object <SE11> or <SE16> 으로 들어가서 테이블 데이터 확인.
결과화면
'5. SAP' 카테고리의 다른 글
[PowerBuilder] - P.B 와 SAP 연결 (0) | 2022.12.14 |
---|---|
[1th] SAP 공부 해보자 - 1일차 (0) | 2022.02.23 |
SAP HANA 장점 (0) | 2020.10.01 |
SAP 중복 로그인 방지 Source (0) | 2020.10.01 |
SAP S/4 HANA이란? (0) | 2020.10.01 |