CAFE

ABAP

ONLINE 프로그램 예제

작성자우승권|작성시간08.10.27|조회수1,198 목록 댓글 0

Dialog 프로그램이란 직접 화면상에서 데이터의 입력, 조회, 수정을 할 수 있도록
만들어진 프로그램을 말한다. 
 
Report 프로그램의 경우는 단순히 원하는 데이터를 출력하는 기능으로 한정이 되지만, Dialog 프로그램은 데이터를 수정, 조회까지 하기 때문에 독립된 Application으로서의 의미를 가진다.

1. 기본적인 Dialog 프로그램
1) 개발 가이드
   ○ Dialog 프로그램의 구성요소
      Dialog 프로그램은 screen, module pool, transction code등의 요소로
      구성되어 있다.
    - screen은 말 그대로 화면을 나타낸다. 입출력의 형태, 방식등을
      설정한다. dialog 프로그램에서는 screen flow에서 전체적인 작업의
      흐름을 정의한다.
    - module pool은 프로그램의 source code로 구성된다.
    - dialog 프로그램을 실행하기 위해서는 transaction code를 정의해야
      한다. transaction code까지 작성하면 기존의 일반 트랜잭션과 동일하게
      사용이 가능해진다(command field에서 tcode를 입력하여 실행이 가능
      하다).

   ○ Dialog 프로그램의 개발환경
      Dialog 프로그램의 개발환경은 data dictionary, screen painter,
      ABAP/4 menu painter 등으로 구성되어 있다.
    - screen painter와 menu painter는 화면과 기능을 설계 및
      작성하는 환경이다.
    - ABAP/4 program(module pool)에서 처리 logic을 정의한다.
    - 각 화면과 ABAP/4 소스코드내에서 사용되는 data의 structure는
      data dictionary에서 정의된다.

   ○ Dialog 프로그램의 작성 절차
      Dialog 프로그램을 작성하는 절차는 다음과 같다.
    - 화면을 설계한다. screen painter와 menu painter를 사용하여 원하는
      기능에 맞는 화면을 설계한다.
    - flow control을 정의한다. screen을 설계하면서 생성된 각각의 화면상의
      요소들이 어떻게 작동하는지, 또 작업의 흐름이 어떻게 진행되는지를
      정의한다.
    - ABAP/4 module pool을 작성한다. module pool은 작업의 세부적인 flow를
      지칭하는 source code의 묶음을 의미한다.
   ○ SCREEN 생성
      아래의 화면과 같이 자재번호를 입력하는 화면을 만든다.

 


 

이 화면과 관련된 screen flow는 아래와 같다.
     - PBO(Process Before Output)
        *---화면초기화 및 타이틀바 세팅
        module status_0100 output.
            set pf-status 'MENU100'.
            set titlebar '100'.
        endmodule.
     - PAI(Process After Input)
        *---사용자의 입력을 받으면 다음 화면으로 넘어감
        module user_command_0100 input.
           case okcode.
                when 'TEST'.
                      set screen 200.
                      leave screen.
                when others .
           endcase.
        endmodule.

아래의 그림은 자재번호를 입력하고 엔터키를 입력했을 경우에 해당 자재에
      대한 정보를 보여주는 두번째 화면이다(screen 200).

 


 

이 화면과 관련된 screen flow는 아래와 같다.
     - PBO(Process Before Output)
        module status_200 output.
           set pf-status 'MENU200'.
           set titlebar '200'.
        *---이전 화면에서 입력받은 값으로 자재정보를 찾아서 화면에
            보여줌.
           select single * from mara where matnr = mat-matnr.
              if sy-subrc = 0.
                  move mara-matnr to mat-matnr.
                  move mara-ersda to mat-ersda.
                  move mara-ernam to mat-ernam.
                  move mara-mtart to mat-mtart.
             endif.
        endmodule.                           
     - PAI(Process After Input)
        module user_command_0200 input.
           case okcode.
             when 'PRI'.
               leave to screen 100. "이전 화면으로 돌아감.
             when others.
           endcase.
        endmodule.
2. 샘플 프로그램(기본형)
*&---------------------------------------------------------------------*
*&  FILE NAME : ZDIALOG.TXT                                            *
*&  유효 버전 : 4.0B                                                   *
*&---------------------------------------------------------------------*
*& 이프로그램은 입금에 대한 거래선 및 운반비,보험료,LESS를 등록한다.   *
*&---------------------------------------------------------------------*

PROGRAM  ZDIALOG       MESSAGE-ID ZF.

TABLES:  ZF005,        "T/T 입금 정보
         ZF006,        "비용정보
         KNA1,         "General Data in Customer Master
         KNVP.         "Customer Master Partner Functions

DATA:    SAVE_FLAG(1),                           "저장여부확인
         MOD_FLAG(1),                            "수정여부확인용
         FIRST_FLAG(1),                          "처음작업여부
         TEMP_AMT1    LIKE  ZF005-AMT_PARTS,     "자재금액임시저장
         TEMP_AMT2    LIKE  ZF005-AMT_PAID,      "해외입금액임시저장
         TEMP_AMT3    LIKE  ZF005-AMT_FC,        "운송료 임시저장
         TEMP_AMT4    LIKE  ZF005-AMT_INSU,      "보험료 임시저장
         TEMP_AMT5    LIKE  ZF005-AMT_LESS,      "LESS 임시저장
         TEMP_AMT6    LIKE  ZF005-AMT_FC.        "보험료+운송료 합 임시

DATA:    ANSWER(1).                              "저장여부 확인
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       화면 SETTING                                                   *
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.

   IF  SAVE_FLAG     EQ 'Y'  OR
       ZF005-CURR_ST EQ '2'  OR
       ZF005-CURR_ST EQ '4'.
       SET PF-STATUS '1000' EXCLUDING 'SAVE'.
   ELSE.
       SET PF-STATUS '1000'.
   ENDIF.

   SET TITLEBAR '100'.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text                                                           *
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
       IF SY-UCOMM   EQ  'BACK' OR
          SY-UCOMM   EQ  'EXIT' OR
          SY-UCOMM   EQ  'CANC'.
*종료하기전에 저장여부를 확인한다.
          IF MOD_FLAG EQ 'Y'.
             MOVE SPACE  TO    ANSWER.
             PERFORM     SAVE_CHECK_RTN.
             IF ANSWER = 'A'.
                EXIT.
             ELSEIF ANSWER = 'J'.
                    MOVE 'Y'    TO SAVE_FLAG.
                    MOVE SPACE  TO MOD_FLAG.
                    IF ZF005-CUST_COD NE SPACE.
                       IF ZF005-CURR_ST EQ '1'.
                          MOVE '3'      TO ZF005-CURR_ST.
                       ELSEIF ZF005-CURR_ST EQ '2'.
                          MOVE '4'      TO ZF005-CURR_ST.
                       ENDIF.
                    ENDIF.
                    MODIFY ZF005.
             ENDIF.
          ENDIF.

          LEAVE.                                  "작업종료
          LEAVE TO TRANSACTION '    '.
       ENDIF.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  INITIAL_SELECT  OUTPUT
*&---------------------------------------------------------------------*
*       MAIN 프로그램에서 EXPORT한 입금번호로 데이터 발췌              *
*----------------------------------------------------------------------*
MODULE INITIAL_SELECT OUTPUT.
*MEMORY에 저장된 입금번호로 입금내역을 찾는다..
    IF  FIRST_FLAG EQ SPACE.
        IMPORT ZF005-REC_KEY FROM MEMORY ID 'RECV'.
        SELECT SINGLE * FROM ZF005 WHERE REC_KEY = ZF005-REC_KEY.
*값을 재계산 하기 위하여 값을 보관하고 있어야 한다.
        TEMP_AMT1 = ZF005-AMT_PARTS.
        TEMP_AMT2 = ZF005-AMT_PAID.
        TEMP_AMT3 = ZF005-AMT_FC.
        TEMP_AMT4 = ZF005-AMT_INSU.
        TEMP_AMT5 = ZF005-AMT_LESS.
*MEMORY BUFFER을 지운다.
        FREE MEMORY ID 'RECV'.
*입금내역에 거래선이 등록되었을때 거래선을 찾는다.
        CLEAR KNA1.
        IF NOT ZF005-CUST_COD IS INITIAL.
           SELECT SINGLE * FROM KNA1 WHERE KUNNR EQ ZF005-CUST_COD.
        ENDIF.
        FIRST_FLAG = 'Y'.
    ENDIF.
ENDMODULE.                 " INITIAL_SELECT  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  MOD_SCREEN  OUTPUT
*&---------------------------------------------------------------------*
*       입금데이터의 값을 CHECK하여 FILED의 상태를 변경한다.           *
*----------------------------------------------------------------------*
MODULE MOD_SCREEN OUTPUT.
   IF  SAVE_FLAG     EQ 'Y'    OR
       ZF005-CURR_ST EQ '2'    OR                  "입금내역이 이미 FI
       ZF005-CURR_ST EQ '4'.                       "로 전송되었다면
       LOOP AT SCREEN.                             "입력이 불가토록함
            IF SCREEN-NAME =  'ZF005-CUST_COD' OR
               SCREEN-NAME =  'ZF005-EX_CTLR'  OR
               SCREEN-NAME =  'ZF005-AMT_FC'   OR
               SCREEN-NAME =  'ZF005-AMT_INSU' OR
               SCREEN-NAME =  'ZF005-AMT_LESS'.
               SCREEN-INPUT   = 0.
               MODIFY SCREEN.
            ENDIF.
       ENDLOOP.
   ENDIF.
ENDMODULE.                 " MOD_SCREEN  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  CHECK_FUNC_100  INPUT
*&---------------------------------------------------------------------*
*       입력한 FUNCTION에 따라서 값을 변경한다.                        *
*----------------------------------------------------------------------*
MODULE CHECK_FUNC_100 INPUT.
*LESS 금액이 50$ 이상이면 ERROR 발생
       IF ZF005-AMT_LESS > 50.
          MOVE  TEMP_AMT1  TO ZF005-AMT_PARTS.
          MOVE  TEMP_AMT2  TO ZF005-AMT_PAID.
          MOVE  TEMP_AMT3  TO ZF005-AMT_FC.
          MOVE  TEMP_AMT4  TO ZF005-AMT_INSU.
          MOVE  TEMP_AMT5  TO ZF005-AMT_LESS.
          MESSAGE S834. EXIT.
       ENDIF.
*거래선명을 찾는다.
       CLEAR KNA1.
       SELECT SINGLE * FROM KNA1 WHERE KUNNR = ZF005-CUST_COD.
       IF SY-SUBRC = 0.
          MOVE KNA1-ANRED   TO   ZF005-CUST_NAME.
       ENDIF.
*수출담당자를 찾는다.
       IF ZF005-EX_CTLR IS INITIAL.
          CLEAR KNVP.
          SELECT SINGLE * FROM KNVP WHERE   KUNNR = ZF005-CUST_COD AND
                                            VKORG = 'SB00'       AND
                                            VTWEG = '60'         AND
                                            SPART = 'B'          AND
                                            PARVW = 'VE'         AND
                                            PARZA = 0.
          MOVE KNVP-PERNR      TO   ZF005-EX_CTLR.
       ENDIF.

       ZF005-AMT_PAID  = TEMP_AMT2 -
                         TEMP_AMT5 +
                         ZF005-AMT_LESS. "LESS금액합산(해외)
       ZF005-AMT_PARTS = TEMP_AMT1 -
                         TEMP_AMT5 +
                         ZF005-AMT_LESS. "LESS금액합산(자재)
*운송료,보험료의 합이 자재금액 보다 많은지 CHECK 한다.
       TEMP_AMT6 = ZF005-AMT_FC + ZF005-AMT_INSU.

       IF ZF005-AMT_PARTS < TEMP_AMT6.
          MOVE TEMP_AMT3  TO ZF005-AMT_FC.
          MOVE TEMP_AMT4  TO ZF005-AMT_INSU.
          MESSAGE S841. EXIT.
       ENDIF.
*자재대금 재계산한다.
       ZF005-AMT_PARTS = ZF005-AMT_PARTS +           "자재금액에서
                         TEMP_AMT3       +           "운송료
                         TEMP_AMT4       -           "보험료를 뺀다
                         ZF005-AMT_FC    -
                         ZF005-AMT_INSU.
       IF  ZF005-CURR_ST EQ '2'    OR
           ZF005-CURR_ST EQ '4'.
       ELSE.
           MOVE  'Y'         TO    MOD_FLAG.
       ENDIF.

ENDMODULE.                 " CHECK_FUNC_100  INPUT
*&---------------------------------------------------------------------*
*&      Form  SAVE_CHECK_RTN
*&---------------------------------------------------------------------*
*       저장여부를 확인한다.                                           *
*----------------------------------------------------------------------*
FORM SAVE_CHECK_RTN.
     MOVE SPACE TO ANSWER.
     CALL FUNCTION 'POPUP_TO_CONFIRM‎_STEP'
          EXPORTING
                TEXTLINE1 = '데이터를 저장하지 않았습니다.'
                TEXTLINE2 = '저장하시겠습니까?.'
                TITEL     = '저장확인'
          IMPORTING
                ANSWER    = ANSWER.
ENDFORM.                    " SAVE_CHECK_RTN
*&---------------------------------------------------------------------*
*&      Module  SAVE_RTN  INPUT
*&---------------------------------------------------------------------*
*       저장을 실행하는 작업임.                                        *
*----------------------------------------------------------------------*
MODULE SAVE_RTN INPUT.

       IF SY-UCOMM EQ 'SAVE'.
          IF MOD_FLAG EQ 'Y'.
             IF ZF005-CUST_COD NE SPACE.
                IF ZF005-CURR_ST EQ '1'.
                   MOVE '3'      TO ZF005-CURR_ST.
                ELSEIF ZF005-CURR_ST EQ '2'.
                   MOVE '4'      TO ZF005-CURR_ST.
                ENDIF.
             ENDIF.
             MODIFY ZF005.

             UPDATE ZF006   SET CURR_ST = ZF005-CURR_ST
                          WHERE REC_KEY = ZF005-REC_KEY.

             MOVE 'Y'    TO  SAVE_FLAG.
             MOVE SPACE  TO  MOD_FLAG.
             MESSAGE I803.
          ENDIF.
       ENDIF.

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼