BDC는 사용자가 매크로를 사용하여 SAP 프로그램을 자동으로 수행하는 것과 같은 형태의 기능과 유사하다.
ㅁ
SAP 스탠다드를 사용자가 매크로처럼 100번~1000번 반복 해야할 작업을 BDC 프로그램으로 한번에 실행될 수 있도록 구현하는 프로그램이다.
즉 단순 반복작업을 최소화하여 Background로 수행 가능하도록 해준다. 주로 마스터 정보 생성, 변경 작업 시 BDC프로그램을 사용한다.
실습
먼저 T-CODE SHDB
에서 레코딩을 떠준다. 자재의 내역만을 변경해보는 실습을 진행할거고 MM02
의 기본데이터1에서 내역 필드값만 변경해주는 레코딩을 뜬다. 이후 저장하면 이렇게 뜬다. 프로그램 짤때 복사해서 코딩할거다.
옵션
에서 빠른 잘라내기/붙여넣기
를 선택한뒤 컨트롤 + 드래그 하면 복사가 된다.
[프로그램 로직]
INCLUDE zs1d11_024_top.
INCLUDE zs1d11_024_o01.
INCLUDE zs1d11_024_i01.
INCLUDE zs1d11_024_f01.
INITIALIZATION.
AT SELECTION-SCREEN.
START-OF-SELECTION.
PERFORM bdc_run. "BDC 실행부분
END-OF-SELECTION.
WRITE gv_message. "처리결과 메세지
<TOP>
REPORT zs1d11_024 MESSAGE-ID zm11.
TYPES : gty_bdc TYPE bdcdata,
gty_msg TYPE bdcmsgcoll.
DATA: gt_bdc TYPE STANDARD TABLE OF gty_bdc, "레코딩 담을 int
gs_bdc LIKE LINE OF gt_bdc, "레코딩 데이터 입력 위한 wa
gt_msg TYPE STANDARD TABLE OF gty_msg, "처리결과 담을 int
gs_msg LIKE LINE OF gt_msg. "처리 결과 메세지 입력 위한 wa
DATA: gs_opt TYPE ctu_params,"call transaction 옵션을 넣어줄 wa
gv_move LIKE ctu_params-dismode VALUE 'N', "display 메세지 옵션,메세지 옵션 주려고
gv_message LIKE bapireturn-message. "실질적으로 메세지 담기는 변수
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS : p_matnr LIKE mara-matnr OBLIGATORY, "자재 번호
p_maktx LIKE makt-maktx OBLIGATORY. "자재 내역
SELECTION-SCREEN END OF BLOCK b1.
TYPES로 선언하지 않고 바로 BDC_DATA를 참조한 GT_BDC를 선언해줘도 된다. DATA: GT_BDC TYPE TABLE OF BDC_DATA. 이런식으로!
<FORM> BDC_RUN
FORM bdc_run .
DATA: lv_index TYPE sy-index. "카운트를 위한 변수, 레코드가 몇건인지 확인할수 있는 변수
CLEAR: gs_bdc, gt_bdc, gs_opt, gt_msg, gs_msg. "찌거기 데이터를 제거하기 위해 데이터 오브젝트 클리어
*옵션 설정
gs_opt-dismode = 'A'. "E 에러가 발생할 때 화면 표시, A는 전체
gs_opt-updmode = 'A'. "비동기
gs_opt-defsize = 'X'. "기본 윈도우
*bdc 프로세스 시작
*SHDB의 레코딩 CTRL + 드래그
PERFORM bdc_data USING: 'X' 'SAPLMGMM' '0060' , "시작, 프로그램명, 화면번호
'' 'BDC_OKCODE' '=ENTR' ,
'' 'RMMG1-MATNR' p_matnr , "레코딩 자재번호아닌 파라미터에서 받은 자재번호
'X' 'SAPLMGMM' '0070' ,
'' 'BDC_OKCODE' '=ENTR' ,
'' 'MSICHTAUSW-KZSEL(01)' 'X',
'X' 'SAPLMGMM' '4004' ,
'' 'BDC_OKCODE' '=BU' ,
'' 'BDC_SUBSCR' 'SAPLMGMM',
'' 'BDC_SUBSCR' 'SAPLMGD1 ',
'' 'BDC_CURSOR' 'MAKT-MAKTX',
'' 'MAKT-MAKTX' p_maktx, "파라미터에서 받은 자재내역
'' 'BDC_SUBSCR' 'SAPLMGD1',
'' 'MARA-MEINS' 'EA',
'' 'MARA-MATKL' 'P010',
'' 'MARA-SPART' '10'.
"트랜잭션 호출
CALL TRANSACTION 'MM02'
USING gt_bdc "BDC레코딩 데이터
OPTIONS FROM gs_opt "옵션
MESSAGES INTO gt_msg. "처리결과 메세지
* 메세지INT 마지막 라인 읽기
CLEAR: lv_index.
DESCRIBE TABLE gt_msg LINES lv_index. "INT 라인수
READ TABLE gt_msg INTO gs_msg INDEX lv_index. "마지막 라인의 값 읽기
CHECK sy-subrc = 0.
* 메세지 생성 펑션
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = gs_msg-msgid
msgnr = gs_msg-msgnr
msgv1 = gs_msg-msgv1
msgv2 = gs_msg-msgv2
msgv3 = gs_msg-msgv3
msgv4 = gs_msg-msgv4
IMPORTING
message_text_output = gv_message . "처리결과 메세지
.
ENDFORM.
- 조회모드설정 dismode
E
로 설정시 화면을 에러가 났을때만 표시하고`A`로 설정시 전체 표시하고 `N`는 화면을 표시하지 않는다.
<FORM> BDC_DATA
PV_CHECK에 값이 있으면 SCREEN에대한 정보를, 없으면 필드속성과 Value 값을 받을 수 있도록 한다.
*실제 BDC 서브루틴 인수들을 처리 할 수 있는 함수
FORM bdc_data USING pv_check pv_name pv_value. "using : perform using 상수값 메모리 같이씀
CLEAR: gs_bdc. "work area 클리어
IF pv_check EQ 'X'. "bdc 시작 체크
gs_bdc-program = pv_name. "프로그램 명
gs_bdc-dynpro = pv_value. "화면 번호
gs_bdc-dynbegin = pv_check. "시작
ELSE.
gs_bdc-fnam = pv_name. "입력 필드 이름
gs_bdc-fval = pv_value. "입력 값
ENDIF.
APPEND gs_bdc TO gt_bdc. "bdc 인터널 테이블 append
ENDFORM.
[실행화면]
A
모드
자재 내역 필드값에 변경할 내용을 입력하고 실행을 누르면
현재 A모드이기 때문에 화면을 모두 표시해준다. =ENTR
는 사용자가 화면에서 수행하는 액션을 말하는데 이화면에서 엔터를 치기때문에 ENTR로 나온다.
변경된 것을 확인해볼 수 있다.
WRITE로 GV_MESSAGE를 띄워준다.
자재내역이 아닌 다른 필드로 변경하고 싶다면, 파라미터를 변경하려는 필드로 바꿔주고 bdc_data USING의 레코드 뜬걸 로직으로 입력해주는곳에서 해당 필드의 필드값만 파라미터로 선언한 변수를 입력해주면 된다.
'ABAP' 카테고리의 다른 글
엑셀 업로드 + BDC (0) | 2023.02.16 |
---|---|
엑셀 업로드 (2) | 2023.02.16 |
Field-symbols 2 (0) | 2023.02.16 |
Field-symbols 1 (0) | 2023.02.16 |
RFC 6 (0) | 2023.02.16 |
댓글