728x90
반응형

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 등을 선언한다.
 샘플 프로젝트에서는 초기화면에서 지역과 그룹을 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.

 

***************************************************
* Event End-of-Page
***************************************************
  end-of-page. 
      write: at /1 'Page: ', 6 sy-pagno right-justified.

 

 : 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를 선택할 경우 그에 적절한 기능을 수행할 수 있도록 구현

 

 

 소스보기.  

 **************************************************
* Event Start-of-Selection
***************************************************
start-of-selection.
   perform init. 
   perform retrieve_data. 
   perform set_key_field. 

*&---------------------------------------------------------------------*
* 사용자가 선택한 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에 각각 지역/그룹

,그룹/지역코드를 settting하고 key1, key2순서대로 Internal Table을 sort한다.

 

 

3) 보고서 출력

 

 소스보기.

 ***************************************************
* Event End-of-Selection
***************************************************
  end-of-selection. 
       perform display_result.

***************************************************
* Event Top-of-Page
***************************************************
  top-of-page. 

* 그룹별 인원현황을 보여주는 1ST 보고서의 머릿말 부분

* 보고서의 제목/일자/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.

 

***************************************************
* Event End-of-Page
***************************************************
   end-of-page. 
       write: at /1 'Page: ', 6 sy-pagno right-justified.

 

*&---------------------------------------------------------------------*
*& 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.

*&---------------------------------------------------------------------*
*& Form SHOW_DETAIL
*&---------------------------------------------------------------------*
* 세부내역을 Display
*----------------------------------------------------------------------*
* Parameter: Nothing
*----------------------------------------------------------------------*

   form show_detail. 

     data:l_group like itab-zgroup, "그룹코드
            l_area like itab-area, "지역코드
            lkey1_text like dd07t-ddtext, "그룹명
            lkey2_text like dd07t-ddtext. "지역명,

* 선택된 라인의 그룹이 space이면 빠져나감.
   if itab-zgroup is initial. 
      message s000(zg) with 'Choose Valid Line'.
      stop.
   endif.

 

* 세부내역의 Menu Setting
    set pf-status 'MENU02'. 

* 세부내역의 페이지 사이즈 Setting
    new-page line-size 150 line-count 65. 

 

* 메모리에 저장되었던 지역/그룹코드를 변수에 move
   move:itab-zgroup to l_group, 
      itab-area to l_area.

 

* 해당라인의 지역/그룹코드의 값들만을 Loop돌리면서 출력함.
   loop at itab where zgroup eq l_group 
          and area eq l_area.

 

          perform get_domain_value changing:itab-key1 
                     gkey1_domain
                     lkey1_text.

 

          perform get_domain_value changing:itab-key2
                     gkey2_domain
                     lkey2_text.


         write: at /1 sy-vline, 2 itab-name,12 sy-vline,13 lkey1_text, 
                     23 sy-vline,24 lkey2_text,
                     31 sy-vline,32 itab-hometel,
                     47 sy-vline,48 itab-mobile, 63 sy-vline,64 itab-email,
                     79 sy-vline,80 itab-address,
                    142 sy-vline.
            new-line.
       endloop.
       write: at 1(142) sy-uline.

 

   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. 
    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.

 

   refresh itab_down.
   loop at itab.

 

       clear itab_down.
          move-corresponding itab to itab_down. 
       perform get_domain_value changing:itab-key1
                  gkey1_domain
                 itab_down-key1_text.

 

       perform get_domain_value changing:itab-key2
                  gkey2_domain
       itab_down-key2_text.

          append itab_down. 

 

   endloop.

 

 * 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로 저장한다.

 

 

 둘째. check된 라인의 데이터는 해당 Internal Table에서 삭제한다.

 

 

 세째. 삭제용 Internal Table에 저장된 데이터는 backup용 Table ztkks02 Table에 저장한다.

 

 

  넷째. 삭제된 데이터를 화면상에서 없애기 위하여 Internal Table itab의 데이터를 화면상에 다시 출력한다.

 

 

 

 소스보기. 
    
 *&---------------------------------------------------------------------*
*& Form delete_data
*&---------------------------------------------------------------------*
* check 된 데이터를 삭제처리한다.
*----------------------------------------------------------------------*
* parameter: Nothing
*----------------------------------------------------------------------*
   form delete_data.

* 화면상에서 check된 라인의 지역/그룹에 해당되는 데이터만 화면상에서는
* 없애주며 ztkks02라는 backup용 table에 반영한다.

* 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된 라인에 한해서만 작업을 한다.

 : 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

+ Recent posts