33
BDC Programming 정정 by wono77. 2005.09.02정정정 정정정 정정정정 정정 정정 : 정정정 Guide to BDC (Batch Data Communication)정, 정정 정정정 정정 정정정정 정정정정 정정.

BDC Programming Bywono77

Embed Size (px)

Citation preview

Page 1: BDC Programming Bywono77

BDC Programming

정리 by wono77. 2005.09.02금요일

우리가 만들고자 하는 화면 :

다음은 Guide to BDC (Batch Data Communication)로, 화면 녹화를 하는 부분부터 차례대로 설명.

Page 2: BDC Programming Bywono77

1. 수행절차 요약

Transaction Recording

BDC Source 생성

Input File Layout 정의 BDC Source 수정

원시DATA작성 (Excel)

Text File로 변환

BDC 실행

DBMS

1단계

2단계

3단계

4단계

Page 3: BDC Programming Bywono77

2. 단계별 설명

1 단계 Transaction Recording

내용: 화면 입력 절차, 입력 요소 등을 Code화 하는 작업

메뉴: 시스템 -> 서비스 -> Batch 입력 -> 레코더

1. New Recording 버튼 clikc -> 레코딩,트랜잭션코드 지정 /nSHDB에서 -> Start recording버튼 click

New Recording을 눌러 나오는 다음 팝업창에서 다음과 같이 입력.

Page 4: BDC Programming Bywono77
Page 5: BDC Programming Bywono77

2. Start recording버튼 click하면 지정된 트랜잭션코드의 화면이 나타남

우리는 FK01에서 테스트하므로 /nFK01에서 다음과 같이 입력해보자.

구매처는 이전에 없는 아무번호나 넣고 시작하면 된다.

Page 6: BDC Programming Bywono77

(다음 화면)

나중에 구분을 쉽게 하기 위해 이름 필드에는 ‘이름’, 검색조건에 ‘검색조건’이라고 입력한다. 저장하고 빠져나온 후, 트랜잭션 SHDB에 다시 간다.

Page 7: BDC Programming Bywono77

-> 화면 입력작업을 수행하고 종료하면 다음과 같이 BDC 기본코드가생성된다 -> 저장후 화면을 빠져나온다

Page 8: BDC Programming Bywono77

2 단계 BDC Source 생성

1. SHDB 트랜잭션 화면에서 리스트 중 방금 저장한 recording을 선택하고 Program버튼을 click하여 BDC 프로그램 SOURCE를 생성한다

다음 화면에서 제목을 입력하고 소스코드 버튼을 클릭한다.

Page 9: BDC Programming Bywono77
Page 10: BDC Programming Bywono77

2. 위 화면에서 제목,유형등을 지정한 후 소스코드 버튼을 CLICK

-> Development class(또는 자신의 Package)를 지정하고 저장한다

Page 11: BDC Programming Bywono77

3 단계 BDC Source 수정

생성된 소스 코드는 그대로 두고, 또 하나의 프로그램을 띄워서 자동 생성된 소스 코드 중

필요한 부분을 가져와서 코딩 하도록 한다.

일단 자동 생성된 소스를 고쳐서 대강 완성된 소스를 먼저 보자.

*&-----------------------------------------------------------

-

*& Report ZBDC_AGAIN_WONO77

*

*&

*

*&-----------------------------------------------------------

*

REPORT zbdc_again_wono77

.

* it_bdc으로 하는 사람도 있음.

DATA : bdc_tab LIKE bdcdata OCCURS 0 WITH HEADER LINE.

*-----------------------------------------------------------*

* GLOBAL VALIABLE

*------------------------------------------------------------

*

DATA : gv_msgtab TYPE TABLE OF bdcmsgcoll,

gv_cnt TYPE i,

gv_value1(10).

DATA : gv_fullname LIKE rlgrap-filename,

gv_filename LIKE rlgrap-filename,

gv_filepath LIKE rlgrap-filename,

gv_file LIKE rcgfiletr-ftfront.

Page 12: BDC Programming Bywono77

* 왼쪽 하단에 WORK-TIME을 표시해 주는 변수

DATA : gv_wk_guk_msg(100),

gv_lines TYPE i,

gv_percent TYPE i.

***

DATA: BEGIN OF it_record OCCURS 0,

* data element: LIF16

lifnr(016),

* data element: KTOKK

ktokk(004),

* data element: NAME1_GP

name1(035),

* data element: SORTL

sortl(010),

* data element: LAND1_GP

land1(003),

END OF it_record.

***

* 원래 과정 : CALL Transaction --> Field value Input* BDC 는 거꾸로한다.

**

* ,첫번째

PERFORM bdc_dynpro USING 'SAPMF02K' '0105'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RF02K-KTOKK'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RF02K-LIFNR'

it_record-lifnr.

PERFORM bdc_field USING 'RF02K-KTOKK'

it_record-ktokk.

*두번째

PERFORM bdc_dynpro USING 'SAPMF02K' '0110'.

Page 13: BDC Programming Bywono77

PERFORM bdc_field USING 'BDC_CURSOR'

'LFA1-LAND1'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=UPDA'.

PERFORM bdc_field USING 'LFA1-NAME1'

it_record-name1.

PERFORM bdc_field USING 'LFA1-SORTL'

it_record-sortl.

PERFORM bdc_field USING 'LFA1-LAND1'

it_record-land1.

"perform bdc_transaction using 'FK01'.

**

*------------------------------------------------------------

*

* Selection-Screen

*------------------------------------------------------------

*

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-

b01.

PARAMETERS : pa_infil LIKE rlgrap-filename "업로드파일경로지정

DEFAULT 'c:\temp\' LOWER CASE,

pa_erfil LIKE rlgrap-filename. "Error 파일 다운로드 경로

PARAMETERS : pa_bmode LIKE ctu_params-dismode DEFAULT 'N'

"BDC Mode

AS LISTBOX VISIBLE LENGTH 20 OBLIGATORY.

SELECTION-SCREEN END OF BLOCK bl1.

*------------------------------------------------------------

*

* at Selection-Screen output

Page 14: BDC Programming Bywono77

*------------------------------------------------------------

*

AT SELECTION-SCREEN OUTPUT.

CONCATENATE 'c:\temp\' sy-datum '_error.xls' INTO pa_erfil.

LOOP AT SCREEN.

IF screen-name = 'PA_ERFIL'. "패쓰_에러파일 screen-input = 0. MODIFY SCREEN. ENDIF. ENDLOOP.

*------------------------------------------------------------** at Selection-Screen Value-Request*------------------------------------------------------------*

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_infil."패쓰_인풋파일 gv_value1 = 'c:\temp'. pa_bmode = 'O'. "열기(OPEN) PERFORM get_file_f4_help USING pa_infil gv_value1 pa_bmode.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_erfil.

gv_value1 = 'c:\temp\'.

pa_bmode = 'S'. "저장(SAVE)

PERFORM get_file_f4_help USING pa_erfil gv_value1 pa_bmode.

INCLUDE zbdc_again_wono77_fun.

*&-----------------------------------------------------------

*

*& Form get_file_f4_help

*&-----------------------------------------------------------

*

FORM get_file_f4_help USING pa_infile

Page 15: BDC Programming Bywono77

gv_value1

pa_bmode.

DATA : lv_pa LIKE rcgfiletr-ftfront.

DATA : lv_mask(120), "MSAK를 입력해야 대화상자가 뜬다(파일형식 지정함)

lv_x(50).

lv_mask = ',EXCEL file(*.XLS), *.XLS.'.

* lv_mask = ',텍스트문서(*.TXT), *.TXT.'.* lv_mask = ',모든파일(*.*), *.*.'.

***************************************************************** 함수 : Function 'WS_FILENAME_GET'* 설명 : Call File Selector** 예제 : CALL FUNCTION 'WS_FILENAME_GET'* EXPORTING

* DEF_FILENAME = EFN

* DEF_PATH = '/'

* MASK = ',*.*,*.*.'* MODE = 'O'* TITLE = 'Get filename'* IMPORTING* FILENAME = EFN** rc =

* EXCEPTIONS

* INV_WINSYS = 01

* NO_BATCH = 02

* SELECTION_CANCEL = 03* SELECTION_ERROR = 04.*

*************************************************************

**

Page 16: BDC Programming Bywono77

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

def_filename = pa_infil "업로드 파일 경로 def_path = gv_value1 "초기 PATH 설정 mask = lv_mask "파일 종류 mode = pa_bmode "BDC_M ODE 파일 OPEN

IMPORTING

filename = lv_pa

rc = lv_x

EXCEPTIONS

inv_winsys = 1

no_batch = 2

selection_cancel = 3

selection_error = 4

OTHERS = 5.

IF sy-subrc <> 0. EXIT. ENDIF.

IF pa_bmode = 'O'.

pa_infil = lv_pa.

ELSEIF pa_bmode = 'S'.

pa_erfil = lv_pa.

ENDIF.

gv_fullname = lv_pa.

IF NOT gv_fullname IS INITIAL.

* SO_SPLIT_FILE_AND_PATH Split a fully pathed filename into

a filename

* and a path.

CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'

EXPORTING

Page 17: BDC Programming Bywono77

full_name = gv_fullname

IMPORTING

stripped_name = gv_filename

file_path = gv_filepath.

* EXCEPTIONS

* X_ERROR = 1

* OTHERS = 2

ENDIF.

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_file_f4_help

Page 18: BDC Programming Bywono77

다음은 include문.

*&-----------------------------------------------------------**& Include ZBDC_AGAIN_WONO77_FUN

*&-----------------------------------------------------------

*

*&-----------------------------------------------------------

*

*& Form bdc_dynpro

*&-----------------------------------------------------------

*

* Start New Screen

*------------------------------------------------------------

*

* -->P_0035 text

* -->P_0036 text

*------------------------------------------------------------

*

FORM bdc_dynpro USING program dynpro.

CLEAR bdc_tab.

bdc_tab-program = program.

bdc_tab-dynpro = dynpro.

bdc_tab-dynbegin = 'X'.

APPEND bdc_tab.

ENDFORM. " bdc_dynpro

*&-----------------------------------------------------------

*

*& Form bdc_field

*&-----------------------------------------------------------

*

* text

*------------------------------------------------------------

*

Page 19: BDC Programming Bywono77

* -->FNAM FIELD NAME

* -->FVAL FIELD VALUE

*------------------------------------------------------------

*

FORM bdc_field USING fnam

fval.

"IF fval <> NODATA.

CLEAR bdc_tab.

bdc_tab-fnam = fnam.

bdc_tab-fval = fval.

APPEND bdc_tab.

"ENDIF.

ENDFORM. "bdc_field

Page 20: BDC Programming Bywono77

자동 생성된 원본 소스는 다음과 같다.

report ZBDC2_WONO77

no standard page heading line-size 255.

include bdcrecx1.

parameters: dataset(132) lower case.

*** DO NOT CHANGE - the generated data section - DO NOT

CHANGE ***

*

* If it is nessesary to change the data section use the

rules:

* 1.) Each definition of a field exists of two lines

* 2.) The first line shows exactly the comment

* '* data element: ' followed with the data element

* which describes the field.

* If you don't have a data element use the

* comment without a data element name

* 3.) The second line shows the fieldname of the

* structure, the fieldname must consist of

* a fieldname and optional the character '_' and

* three numbers and the field length in brackets

* 4.) Each field must be type C.

*

*** Generated data section with specific formatting - DO NOT

CHANGE ***

data: begin of record,

* data element: LIF16

LIFNR_001(016),

* data element: BUKRS

BUKRS_002(004),

* data element: KTOKK

KTOKK_003(004),

* data element: NAME1_GP

Page 21: BDC Programming Bywono77

NAME1_004(035),

* data element: SORTL

SORTL_005(010),

* data element: LAND1_GP

LAND1_006(003),

* data element: AKONT

AKONT_007(010),

* data element: FDGRV

FDGRV_008(010),

end of record.

*** End generated data section ***

start-of-selection.

perform open_dataset using dataset.

perform open_group.

do.

read dataset dataset into record.

if sy-subrc <> 0. exit. endif.

perform bdc_dynpro using 'SAPMF02K' '0105'.

perform bdc_field using 'BDC_CURSOR'

'RF02K-BUKRS'.

perform bdc_field using 'BDC_OKCODE'

'/00'.

perform bdc_field using 'RF02K-LIFNR'

record-LIFNR_001.

perform bdc_field using 'RF02K-BUKRS'

record-BUKRS_002.

perform bdc_field using 'RF02K-KTOKK'

record-KTOKK_003.

perform bdc_dynpro using 'SAPMF02K' '0110'.

perform bdc_field using 'BDC_CURSOR'

Page 22: BDC Programming Bywono77

'LFA1-ORT01'.

perform bdc_field using 'BDC_OKCODE'

'=UPDA'.

perform bdc_field using 'LFA1-NAME1'

record-NAME1_004.

perform bdc_field using 'LFA1-SORTL'

record-SORTL_005.

perform bdc_field using 'LFA1-LAND1'

record-LAND1_006.

perform bdc_dynpro using 'SAPMF02K' '0210'.

perform bdc_field using 'BDC_CURSOR'

'LFB1-FDGRV'.

perform bdc_field using 'BDC_OKCODE'

'UPDA'.

perform bdc_field using 'LFB1-AKONT'

record-AKONT_007.

perform bdc_field using 'LFB1-FDGRV'

record-FDGRV_008.

perform bdc_transaction using 'FK01'.

enddo.

perform close_group.

perform close_dataset using dataset.

여기서 include 부분은 따지 않기로 한다.

Page 23: BDC Programming Bywono77

1) 이 구조체를 다음과 같이 변화 시킨다.

원본 :

data: begin of record,

LIFNR_001(016),

BUKRS_002(004),

KTOKK_003(004),

NAME1_004(035),

SORTL_005(010),

LAND1_006(003),

AKONT_007(010),

FDGRV_008(010),

end of record.

(변경) 헤더가 있는 인터널 테이블로 바꿔주며 쓸데없는 뒤쪽의 번호는 삭제해준다.

DATA: BEGIN OF it_record OCCURS 0,

lifnr(016),

ktokk(004),

name1(035),

sortl(010),

land1(003),

END OF it_record.

2) 화면을 뜨는 스크립트 부분을 복사한다.

Bdc_dynpro에서 한 화면을 읽어 들일 때 마다 필드를 읽어들이는 작업이 수행되고 있음을 알

수 있다.

* 원래 과정 : CALL Transaction --> Field value Input* BDC 는 거꾸로한다.

**

* ,첫번째 화면

PERFORM bdc_dynpro USING 'SAPMF02K' '0105'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RF02K-KTOKK'.

PERFORM bdc_field USING 'BDC_OKCODE'

Page 24: BDC Programming Bywono77

'/00'.

PERFORM bdc_field USING 'RF02K-LIFNR'

it_record-lifnr.

PERFORM bdc_field USING 'RF02K-KTOKK'

it_record-ktokk.

*두번째 화면

PERFORM bdc_dynpro USING 'SAPMF02K' '0110'.

PERFORM bdc_field USING 'BDC_CURSOR'

'LFA1-LAND1'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=UPDA'.

PERFORM bdc_field USING 'LFA1-NAME1'

it_record-name1.

PERFORM bdc_field USING 'LFA1-SORTL'

it_record-sortl.

PERFORM bdc_field USING 'LFA1-LAND1'

it_record-land1.

"perform bdc_transaction using 'FK01'.

3) 다음의 함수를 추가한다.

Bdcdata형의 bdc 테이블을 다음과 같이 선언해준다.

DATA : bdc_tab LIKE bdcdata OCCURS 0 WITH HEADER LINE.

그리고 나서 perform을 클릭하여, 위의 perform 함수에 해당하는 form 함수를 만들어 준다.

Page 25: BDC Programming Bywono77

*&-----------------------------------------------------------

*

*& Form bdc_dynpro

*&-----------------------------------------------------------

*

* Start New Screen

*------------------------------------------------------------

*

* -->P_0035 text

* -->P_0036 text

*------------------------------------------------------------

*

FORM bdc_dynpro USING program dynpro.

CLEAR bdc_tab.

bdc_tab-program = program.

bdc_tab-dynpro = dynpro.

bdc_tab-dynbegin = 'X'.

APPEND bdc_tab.

ENDFORM. " bdc_dynpro

*&-----------------------------------------------------------

*

*& Form bdc_field

*&-----------------------------------------------------------

*

* text

*------------------------------------------------------------

*

* -->FNAM : FIELD NAME

* -->FVAL : FIELD VALUE

*------------------------------------------------------------

*

FORM bdc_field USING fnam

Page 26: BDC Programming Bywono77

fval.

"IF fval <> NODATA.

CLEAR bdc_tab.

bdc_tab-fnam = fnam.

bdc_tab-fval = fval.

APPEND bdc_tab. "ENDIF.ENDFORM. "bdc_field

4) 파일 업로드, 에러 경우의 파일을 저장하기 위한 전역 변수를 선언한다.

*------------------------------------------------------------

*

* G L O B A L V A L I A B L E

*------------------------------------------------------------

*

DATA : gv_msgtab TYPE TABLE OF bdcmsgcoll,

gv_cnt TYPE i,

gv_value1(10).

DATA : gv_fullname LIKE rlgrap-filename,

gv_filename LIKE rlgrap-filename,

gv_filepath LIKE rlgrap-filename,

gv_file LIKE rcgfiletr-ftfront.

* 프로그램이 실행되는 동안, 왼쪽 하단에 WORK-TIME(시계모양)을 표시해 * 주는 변수

DATA : gv_wk_guk_msg(100),

gv_lines TYPE i, gv_percent TYPE i.

* RLGRAP 구조체에 대하여.- SAP Graph에 관한 선언들. Upload, Download에사용

Page 27: BDC Programming Bywono77
Page 28: BDC Programming Bywono77

5) Selection-Screen 설정

화면을 생성한다.

*------------------------------------------------------------

*

* Selection-Screen

*------------------------------------------------------------

*

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-

b01.

PARAMETERS : pa_infil LIKE rlgrap-filename "업로드파일경로지정

DEFAULT 'c:\temp\' LOWER CASE,

pa_erfil LIKE rlgrap-filename. "Error 파일 다운로드 경로

PARAMETERS : pa_bmode LIKE ctu_params-dismode DEFAULT 'N'

"BDC Mode

AS LISTBOX VISIBLE LENGTH 20 OBLIGATORY.

SELECTION-SCREEN END OF BLOCK bl1.

Pa_bmode는 bdc ,mode로 CALL Transaction을 사용하는 BDC의 속성을 나타낸다. BDC

에는 Batch Input Session을 사용하는 방법과 CALL Transaction을 사용하는 2가지 방법이

있다. (성안당 책 P266)

여기서의 CTU_Params 구조체는 CALL Transaction문의 매개변수(Option)을 가지고 있는

Structure로 다음과 같다.

Page 29: BDC Programming Bywono77

Dismode는 Display Mode로

’A’ : 화면에 표시(Default)

‘E’ : 에러가 발생하는 경우만 화면에 표시

‘N’ : 화면에 표시 안함. –백그라운드 처리

위 프로그램에서는 화면에 표시하지 않는 백그라운드 처리를 Default로 사용하고 있다.

6) 화면에서 에러시 저장하는 필드를 잠그고, 파일열기, 에러파일 저장시에 해당하는 함수를

호출한다.

*------------------------------------------------------------

*

* at Selection-Screen output

*------------------------------------------------------------

*

AT SELECTION-SCREEN OUTPUT.

CONCATENATE 'c:\temp\' sy-datum '_error.xls' INTO pa_erfil.

LOOP AT SCREEN.

IF screen-name = 'PA_ERFIL'. "패쓰_에러파일 screen-input = 0. MODIFY SCREEN.

Page 30: BDC Programming Bywono77

ENDIF.

ENDLOOP.

*------------------------------------------------------------

*

* at Selection-Screen Value-Request

*------------------------------------------------------------

*

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_infil."패쓰_

인풋파일

gv_value1 = 'c:\temp'.

pa_bmode = 'O'. "열기(OPEN)

PERFORM get_file_f4_help USING pa_infil gv_value1 pa_bmode.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_erfil.

gv_value1 = 'c:\temp\'.

pa_bmode = 'S'. "저장(SAVE)

PERFORM get_file_f4_help USING pa_erfil gv_value1 pa_bmode.

INCLUDE zbdc_again_wono77_fun.

7) 호출되는 get_file_f4_help 사용자 함수를 만들어 준다.

*&-----------------------------------------------------------

*

*& Form get_file_f4_help

*&-----------------------------------------------------------

*

* text

*-----------------------------------------------------------*

* -->P_GV_FILE text

* -->P_GV_VALUE1 text

* -->P_PA_BMODE text

*------------------------------------------------------------

Page 31: BDC Programming Bywono77

*

FORM get_file_f4_help USING pa_infile

gv_value1

pa_bmode.

DATA : lv_pa LIKE rcgfiletr-ftfront.

DATA : lv_mask(120), "MSAK를 입력해야 대화상자가 뜬다(파일형식 지정함)

lv_x(50).

lv_mask = ',EXCEL file(*.XLS), *.XLS.'.

* lv_mask = ',텍스트문서(*.TXT), *.TXT.'.* lv_mask = ',모든파일(*.*), *.*.'.

***************************************************************** 함수 : Function 'WS_FILENAME_GET'* 설명 : Call File Selector** 예제 : CALL FUNCTION 'WS_FILENAME_GET'* EXPORTING* DEF_FILENAME = EFN* DEF_PATH = '/'

* MASK = ',*.*,*.*.'

* MODE = 'O'

* TITLE = 'Get filename'

* IMPORTING

* FILENAME = EFN

** rc =

* EXCEPTIONS

* INV_WINSYS = 01

* NO_BATCH = 02

* SELECTION_CANCEL = 03

* SELECTION_ERROR = 04.

*

*************************************************************

**

Page 32: BDC Programming Bywono77

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

def_filename = pa_infil "업로드 파일 경로 def_path = gv_value1 "초기 PATH 설정 mask = lv_mask "파일 종류 mode = pa_bmode "BDC_M ODE 파일 OPEN

IMPORTING

filename = lv_pa

rc = lv_x

EXCEPTIONS

inv_winsys = 1

no_batch = 2

selection_cancel = 3

selection_error = 4

OTHERS = 5.

IF sy-subrc <> 0.

EXIT.

ENDIF.

IF pa_bmode = 'O'.

pa_infil = lv_pa.

ELSEIF pa_bmode = 'S'.

pa_erfil = lv_pa.

ENDIF.

gv_fullname = lv_pa.

IF NOT gv_fullname IS INITIAL.

* SO_SPLIT_FILE_AND_PATH Split a fully pathed filename into

a filename

* and a path.

CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'

EXPORTING

full_name = gv_fullname

Page 33: BDC Programming Bywono77

IMPORTING

stripped_name = gv_filename

file_path = gv_filepath.

* EXCEPTIONS

* X_ERROR = 1

* OTHERS = 2

ENDIF.

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_file_f4_help