|
|
. Batch Input Processing.
1. batch input 이란?
외부의 DATA를 SAP R/3 시스템안으로 이동하는 작업이다. 이러한경우 데이터를 직접 데이터베이스에 이동하지 않고 반드시 필요한 처리를 거친후에 받아들여야 한다.
방대한 양의 데이터는 BATCH INPUT을 통해서 SAP system내로 이동된다. Batch input은 자동으로 실행되는 작업이며 때때로 BDC(Batch Data Communication)을 참조한다. 데이터의 일관성을 보장하기 위해 입력되는 데이터는 같은 check와 update를 거쳐야 한다. 이동중인 데이터는 batch input session형태로 queue file에 임시저장된다.
Batch processing의 모든 dialog는 dynpro(dynamic program)에 의해 통제되며 dynpro는 모든 step을 하나씩 체크한다.
Dialog는 PBO(Process Before Output), user input, PAI(Process After Input)으로 구성되어 있다.
2. batch input processing.
Batch input Processing은 non-online상의 데이터를 SAP system으로 이동시키는 자동 프로세스이다. 일관적인 check와 update를 수행하기 위해서는 이 프로세스를 통한 simulation을 거쳐야 한다. 이 프로세스의 중심은 부분은 queue file로 존재하며 이 file은 batch input program으로부터 받아들인 데이터를 그룹지어 session으로 만든다. 이렇게 만들어진 session을 function batch input(Systems -> services -> Batch Input)으로 SAP database로 이동한다.
3. Batch Input Program.
Batch input program은 internal table(BDC table)의 형태로 이동할 데이터의 구조적 작업영역을 제공, 데이터 import, 읽은 데이터의 BDC table 입력, BDC table의 queue file로의 이동등을 수행한다.
4. Batch-Input Queue Dataset.
Queue file은 각각의 screeen과 group을 합쳐 session을 만든다. 이렇게 만들어진 session들을 function batch input(Systems -> Services -> Batch Input, transaction code SM35)을통해 편집을 할수있다. 이 데이터들은 대응되는 application function을 실행하기위해 log file을 거쳐 SAP databese에 update된다. 이 작업을하기위해 batch input function은 각각의 session에 application function을 기동시켜야한다. 이런 모든 작업이 끝나면 데이터는 online transaction의 screen에 포함되게된다.
5. Batch input processing과 Call Transaction의 비교
Batch input procedure와는 다르게 CALL TRANSACTION을 이용해서 dialog interface에 데이터를 이동하는 방법도 있다. Call transaction은 queue file을 사용하지 않는다. Call Transaction은 빠른 데이터의 저장을 위해 batch input과 같은 구조의 internal table(BDC table)을 사용한다. Internal taable에 데이터를 저장한 후에 필요한 transaction을 불러 사용하며, BDC table에 저장되어있는 데이터들을 적절히 조합하여 해당 transaction의 screen으로 보내준다.
- 샘플 프로그램(기본형)
*&---------------------------------------------------------------------*
*& 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.
ENDMODULE. " SAVE_RTN INPUT
