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