SAP 에서 표준 트랜잭션(MM01 자재마스터 생성·VA01 영업오더 생성·FB01 회계 전표 등) 을 자동화해야 할 때 가장 먼저 떠올리는 도구가 BDC(Batch Data Communication) 입니다. BAPI 가 있으면 BAPI 가 표준이지만, 회사 특정 화면이나 BAPI 가 지원하지 않는 화면 흐름을 자동화해야 한다면 BDC 가 사실상 유일한 선택지가 됩니다.
BDC 의 개념은 단순합니다. 사용자가 SAP 화면에서 직접 키보드를 두드리며 진행하는 과정을 BDCDATA 구조체에 화면 번호 + 필드명 + 필드값으로 풀어놓는 것이 전부입니다. SAP 는 그 데이터를 받아 화면을 실제로 그리지 않고도 같은 트랜잭션을 자동 실행해 줍니다. 어려운 부분은 BDC 코드 자체가 아니라 "어떤 화면에서 어떤 필드를 어떤 순서로 채워야 하는지" 를 알아내는 부분인데, 그것이 SHDB(Transaction Recorder) 의 역할.
이 글은 BDC 의 표준 패턴을 SHDB 레코딩(저장 전 BDC_SUBSCR 정리 포함) → 레코딩 결과를 보고 BDC 코드 직접 작성 → CALL TRANSACTION 호출 → 메시지 수집 → 에러 처리 흐름으로 한 번에 정리한 메모입니다. 실무에서는 SHDB 의 "Program" 버튼으로 자동 변환된 코드를 그대로 쓰기보다, 레코딩 결과의 화면·필드 정보를 참고해 SE38 에서 ABAP 코드를 직접 작성하는 방식 이 깔끔하고 유지보수도 쉽습니다.
핵심 — BDCDATA 구조체 5개 필드 한눈 비교
BDC 의 모든 동작은 BDCDATA 구조체 한 줄로 표현됩니다.
| 필드 | 의미 | 예시 |
|---|---|---|
PROGRAM |
화면이 소속된 모듈풀 프로그램명 | SAPMM06E · SAPLMGMM |
DYNPRO |
화면 번호 | 0100 · 0200 |
DYNBEGIN |
새 화면 시작 표시 | 'X' (화면 줄에만) / ' ' (필드 줄) |
FNAM |
필드 기술명 | RM06E-BSART · EKKO-LIFNR |
FVAL |
필드값 | 'NB' · '0000100001' |
핵심 한 줄: 화면 한 개 = DYNBEGIN='X' 한 줄(PROGRAM + DYNPRO) + 그 화면의 필드들(FNAM + FVAL) 여러 줄. 다음 화면으로 넘어갈 때 다시 DYNBEGIN='X' 한 줄을 추가하는 패턴이 반복됩니다.
1단계 — SHDB 트랜잭션 레코딩 + BDC_SUBSCR 정리
레코딩 트랜잭션 SHDB 에서 자동화하고 싶은 표준 트랜잭션을 한 번 손으로 실행해 그 과정을 기록합니다.
/n SHDB → New Recording 클릭
→ 팝업
Recording : ZTEST_BDC_001 (자유 이름)
Transaction : MM01 (자동화하려는 T-Code)
→ Start Recording → MM01 화면이 새로 뜸
→ MM01 화면에서 실제 자재 한 건을 손으로 끝까지 입력
자재번호 · 산업분야 · 자재유형 · 자재 그룹 · 단위 · 자재내역 등
→ 마지막에 저장(Ctrl+S)
→ 자동으로 SHDB 결과 화면으로 돌아오며
화면 줄(DYNBEGIN='X') + 필드 줄(FNAM/FVAL) 이 순서대로 표시됨


★ 저장 전에 BDC_SUBSCR 라인 직접 삭제
여기서 가장 중요한 작업. 레코딩 결과에는 화면 안의 서브스크린 영역을 가리키는 BDC_SUBSCR 라인(보통 SAPLMGD1 같은 프로그램명과 함께 표시) 이 같이 들어 있습니다. 이 줄들은 실제 입력 동작이 아니라 "현재 보고 있는 서브스크린 정보" 라서 BDC 실행 시 화면 전환을 거꾸로 깨뜨리는 원인 이 됩니다.
SHDB 결과 화면에서:
1) BDC_SUBSCR 으로 시작하는 라인을 하나씩 클릭해 선택
(Ctrl 누르면서 여러 라인 동시 선택 가능)
2) 상단 툴바의 휴지통 아이콘 또는 메뉴의 Edit → Delete Line
3) 해당 라인들이 화면에서 사라짐
4) ★ 모든 BDC_SUBSCR 라인 제거 확인 후 → Save (Ctrl + S)



저장 전에 SHDB 화면에서 미리 정리해 두는 이유: 한 번 저장된 레코딩은 BDC_SUBSCR 라인을 그대로 머금은 채 보관됩니다. 나중에 그 레코딩을 다시 활용하거나 다른 사람이 참고할 때 같은 정리 작업을 반복해야 합니다.
SHDB 결과 화면에서 미리 깨끗하게 정리한 뒤 저장하는 패턴 이 가장 효율적이며, 노트에 기록해 둔 핵심 팁이기도 합니다.
저장된 레코딩은 SHDB 메뉴에서 다시 열어 화면 번호·필드 정보를 참고하는 "설계도" 로 사용합니다.
2단계 — 레코딩 결과를 보고 BDC 코드 직접 작성
SHDB 의 "Program" 버튼으로 ABAP 코드를 자동 변환하는 기능이 있긴 합니다. 다만 자동 변환된 코드는 BDC_CURSOR 같은 보조 라인이 잔뜩 끼어 있고 변수명 명명 규칙도 회사 표준과 안 맞는 경우가 많아 실무에서는 레코딩 결과를 "참고용 화면 사전" 으로 두고 SE38 에서 BDC 코드를 직접 작성 하는 패턴이 일반적입니다.
직접 작성하면 다음 장점이 있습니다.
- 변수명·구조체를 회사 표준에 맞게 깔끔히 정리
- 입력값 부분만 LOOP 안에서 동적으로 받게 설계
- 불필요한 BDC_CURSOR 라인 자연스럽게 생략
- BDC_OKCODE 만 명확히 남겨 다음 화면 전환 의도 가시화
작성 흐름
1) SE38 → 신규 프로그램 생성 (예: ZBDC_MM01_TEST)
2) DATA 선언:
gt_bdcdata TYPE TABLE OF bdcdata
gs_bdcdata TYPE bdcdata
gt_messages TYPE TABLE OF bdcmsgcoll
3) 화면 흐름 따라가는 표준 서브루틴 두 개 작성
FORM bdc_dynpro USING program dynpro. " 새 화면 시작
FORM bdc_field USING fnam fval. " 필드값 한 줄
4) SHDB 결과 화면을 옆에 띄워 두고 순서대로 옮겨 적기:
각 DYNBEGIN='X' 줄 → PERFORM bdc_dynpro USING '...' '...'.
그 화면의 FNAM/FVAL 줄들 → PERFORM bdc_field USING '...' '...'.
5) 화면별 BDC_OKCODE 줄 챙기기 (다음 화면 트리거)
PERFORM bdc_field USING 'BDC_OKCODE' '/00'. " Enter
PERFORM bdc_field USING 'BDC_OKCODE' '=BU'. " 저장
PERFORM bdc_field USING 'BDC_OKCODE' '=BACK'. " 뒤로
직접 작성이라고 해서 어려운 게 아닙니다. SHDB 결과 화면이 사실상 "이 화면 → 이 필드 → 이 값" 을 줄별로 명세해 둔 설계도라서, 옆에 띄워 놓고 PERFORM bdc_dynpro · PERFORM bdc_field 만 순서대로 호출하면 됩니다. 변환 버튼이 만든 자동 생성 코드보다 가독성·유지보수가 훨씬 좋고, 본인이 어디서 무엇을 했는지 명확하게 추적 가능.
BDC_OKCODE 는 절대 빠뜨리지 말기
각 화면 줄(bdc_dynpro) 직후에 그 화면을 어떻게 빠져나갈지 결정하는 BDC_OKCODE 한 줄이 필수입니다.
| BDC_OKCODE 값 | 동작 |
|---|---|
'/00' |
Enter — 다음 화면으로 |
'=BU' |
저장 (Save) |
'=ENTR' |
Enter — '/00' 과 동일 |
'=BACK' |
뒤로 (F3) |
'/N' |
현재 트랜잭션 종료 |
BDC_OKCODE 가 빠진 화면 줄은 다음 화면으로 못 넘어가 같은 화면에서 무한 대기 상태가 됩니다. SHDB 결과를 그대로 옮길 때 화면 사이의 OKCODE 줄을 빠뜨리지 않도록 주의.
3단계 — 표준 서브루틴 두 개: BDC_DYNPRO · BDC_FIELD
자동 생성된 코드의 골격은 표준 패턴이라 두 개의 FORM 으로 압축됩니다.
* 새 화면 시작 추가
FORM bdc_dynpro USING program dynpro.
CLEAR gs_bdcdata.
gs_bdcdata-program = program.
gs_bdcdata-dynpro = dynpro.
gs_bdcdata-dynbegin = 'X'.
APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.
* 필드 한 줄 추가
FORM bdc_field USING fnam fval.
IF fval IS NOT INITIAL OR fnam CP 'BDC_*'. " 빈 값은 스킵 (BDC_OKCODE 등은 항상 추가)
CLEAR gs_bdcdata.
gs_bdcdata-fnam = fnam.
gs_bdcdata-fval = fval.
APPEND gs_bdcdata TO gt_bdcdata.
ENDIF.
ENDFORM.
이 두 개의 FORM 으로 모든 화면·필드를 풀어놓을 수 있습니다. 본문 코드는 그저 두 FORM 을 화면 순서대로 호출하는 단순한 흐름.
4단계 — BDC 데이터 채우기 (MM01 예제)
자재 한 건을 생성하는 흐름. SHDB 가 자동 생성해 준 코드에서 BDC_SUBSCR 정리한 결과입니다.
* === 화면 1: 자재번호 입력 ===
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING 'RMMG1-MATNR' p_matnr. " 자재번호
PERFORM bdc_field USING 'RMMG1-MBRSH' 'M'. " 산업분야
PERFORM bdc_field USING 'RMMG1-MTART' 'FERT'. " 자재유형
* === 화면 2: 뷰 선택 ===
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING 'MSICHTAUSW-DYTXT(01)' 'X'. " Basic Data 1
* === 화면 3: Basic Data 1 ===
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE' '=BU'. " 저장
PERFORM bdc_field USING 'MAKT-MAKTX' p_maktx. " 자재내역
PERFORM bdc_field USING 'MARA-MEINS' 'EA'. " 단위
PERFORM bdc_field USING 'MARA-MATKL' '001'. " 자재 그룹
각 화면의 첫 줄은 bdc_dynpro, 그 안의 필드들은 bdc_field 로. 마지막 화면에 도달하면 '=BU'(저장) 같은 펑션 코드를 BDC_OKCODE 에 넣어 트랜잭션을 종료시킵니다.
5단계 — CALL TRANSACTION 실행 + 메시지 수집
데이터를 다 채웠으면 CALL TRANSACTION 한 줄로 실행. 결과 메시지는 별도 ITAB 에 수집합니다.
DATA: gt_messages TYPE TABLE OF bdcmsgcoll,
gv_subrc TYPE sy-subrc.
CALL TRANSACTION 'MM01'
USING gt_bdcdata
MODE 'N' " A=All / E=Errors / N=No display
UPDATE 'S' " A=Async / S=Sync / L=Local
MESSAGES INTO gt_messages.
gv_subrc = sy-subrc.
" 메시지 변환 — 사람이 읽을 수 있는 텍스트로
LOOP AT gt_messages INTO DATA(ls_msg).
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_msg-msgid
msgnr = ls_msg-msgnr
msgv1 = ls_msg-msgv1
msgv2 = ls_msg-msgv2
msgv3 = ls_msg-msgv3
msgv4 = ls_msg-msgv4
IMPORTING
message_text_output = DATA(lv_text).
WRITE: / |[{ ls_msg-msgtyp }] { lv_text }|.
ENDLOOP.
IF gv_subrc = 0.
WRITE: / '✅ BDC 처리 성공'.
ELSE.
WRITE: / '❌ BDC 처리 실패'.
ENDIF.
MODE / UPDATE 옵션 선택 기준:
| 옵션 | 동작 | 언제 사용 |
|---|---|---|
MODE 'A' |
모든 화면 표시 | 디버깅 — 어느 화면에서 막히는지 눈으로 확인 |
MODE 'E' |
에러 화면만 표시 | 초기 운영 — 에러 발생 시 사용자가 보정 |
MODE 'N' |
화면 표시 안 함 (백그라운드) | 정식 운영 — 가장 빠름 |
UPDATE 'S' |
동기 업데이트 — DB 반영 완료 후 다음 코드 실행 | 후속 코드가 DB 결과를 즉시 봐야 할 때 |
UPDATE 'A' |
비동기 업데이트 — 호출 즉시 다음 진행 | 대량 처리 — 성능 우선 |
6단계 — 세션 방식 vs Call Transaction 방식
BDC 는 두 가지 실행 방식이 있습니다.
" 방식 1: Call Transaction — 즉시 실행
CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'N' UPDATE 'S'
MESSAGES INTO gt_messages.
" 방식 2: 세션 — SM35 큐에 적재 후 사용자가 별도 실행
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING client = sy-mandt
group = 'ZTEST_SESSION'
user = sy-uname.
CALL FUNCTION 'BDC_INSERT'
EXPORTING tcode = 'MM01'
TABLES dynprotab = gt_bdcdata.
CALL FUNCTION 'BDC_CLOSE_GROUP'.
" → SM35 트랜잭션에서 그룹 'ZTEST_SESSION' 실행
선택 기준:
CALL TRANSACTION— 결과를 즉시 보고 후속 처리 / 한 건씩 빠르게- 세션 — 대량 처리 시 사용자가
SM35에서 모니터링·재처리 가능 / 에러 건만 골라 다시 실행
대부분의 자동화는 CALL TRANSACTION 이 편하고, 사용자가 직접 모니터링하면서 처리해야 하는 대량 업로드는 세션 방식이 적합.
흔히 빠뜨리는 함정
BDC_SUBSCR 라인 남김
레코딩 결과의 BDC_SUBSCR 라인은 SHDB 결과 화면에서 저장하기 전에 직접 선택해 삭제. SE38 에서 코드를 작성한 뒤 발견하면 늦습니다 — BDC_SUBSCR 정보가 이미 머릿속에 있어야 다음 화면 진행 라인을 어디에 두는지 정리하기 쉬워서, SHDB 결과를 보기 전에 한 번에 청소 해 두는 패턴이 가장 깔끔합니다. 노트의 핵심 팁.
BDC_OKCODE 누락
" ❌ BDC_OKCODE 없이 다음 화면 시도
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'RMMG1-MATNR' p_matnr.
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'. " ❌ 이 화면으로 못 넘어감
각 화면 줄 직후 BDC_OKCODE 한 줄('=ENTR' · '/00' · '=BU') 필수.
운영 환경에서 MODE 'A' 실행
CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'A' ... " ❌ 운영 사용자 화면 떠버림
'A' 는 디버깅용. 운영 배포 직전에 반드시 'N'(백그라운드) 으로 변경. 잊으면 사용자가 BDC 호출할 때마다 화면이 떴다가 사라지는 현상 발생.
UPDATE 'A' (비동기) + 즉시 후속 조회
CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'N' UPDATE 'A' ...
SELECT SINGLE * FROM mara INTO ls_mara WHERE matnr = p_matnr. " ❌ 아직 안 들어가 있을 수 있음
비동기 업데이트는 호출 즉시 리턴하지만 DB 반영은 백그라운드. 후속 코드가 그 결과를 봐야 한다면 UPDATE 'S'(동기) 필수.
필드값 형식 변환 누락
PERFORM bdc_field USING 'RMMG1-MATNR' '12345'. " ❌ 자재번호는 18자리 0 패딩 필요
PERFORM bdc_field USING 'EKKO-AEDAT' '2026-01-15'. " ❌ SAP 화면은 'DD.MM.YYYY' 또는 사용자 형식
BDC 는 화면 입력을 그대로 흉내내는 것이라 사용자 화면에 보이는 형식 그대로 채워야 합니다. 자재번호 18자리 패딩(CONVERSION_EXIT_MATN1_INPUT)·날짜 사용자 형식 변환(WRITE date TO lv_date) 등 미리 처리.
메시지 수집 안 함
CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'N' UPDATE 'S'. " ❌ MESSAGES INTO 없음
IF sy-subrc <> 0.
MESSAGE 'BDC 실패' TYPE 'E'. " 무슨 에러인지 모름
ENDIF.
MESSAGES INTO gt_messages 로 수집해야 어느 필드에서 어떤 메시지가 떴는지 확인 가능. 메시지 텍스트는 MESSAGE_TEXT_BUILD 같은 FM 으로 풀어내거나 직접 T100 테이블 조회.
화면 흐름 변경에 BDC 깨짐
SAP 패치 후 MM01 화면의 필드 순서/번호가 바뀜
→ 기존 BDC 가 "RMMG1-MTART" 필드를 못 찾아 에러
BDC 는 화면 구조에 강하게 의존하므로 SAP 업데이트·EHP 적용 시 화면 변경 가능성 확인 필요. 가능하면 BAPI 가 있는 트랜잭션은 BAPI 로 마이그레이션.
BAPI 있는데 BDC 사용
" ❌ BAPI_MATERIAL_SAVEDATA 가 있는데 MM01 BDC 작성
CALL TRANSACTION 'MM01' USING ...
자재마스터(BAPI_MATERIAL_SAVEDATA) · PO(BAPI_PO_CREATE1) · 영업오더(BAPI_SALESORDER_CREATEFROMDAT2) 같이 BAPI 가 표준으로 제공되는 트랜잭션은 BAPI 가 우선. BDC 는 BAPI 가 없거나 회사 특정 커스텀 화면 자동화 때만 사용.
전체 코드 — 복사용 통합본
자재 한 건을 생성하는 BDC 미니 리포트. SHDB 레코딩 결과에서 BDC_SUBSCR 정리한 형태입니다.
REPORT zr_bdc_mm01_demo.
PARAMETERS: p_matnr TYPE matnr OBLIGATORY,
p_maktx TYPE makt-maktx OBLIGATORY.
DATA: gt_bdcdata TYPE TABLE OF bdcdata,
gs_bdcdata TYPE bdcdata,
gt_messages TYPE TABLE OF bdcmsgcoll.
* === BDC 데이터 채우기 ===
" 화면 1: 초기화면 (자재번호·산업분야·자재유형)
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING 'RMMG1-MATNR' p_matnr.
PERFORM bdc_field USING 'RMMG1-MBRSH' 'M'.
PERFORM bdc_field USING 'RMMG1-MTART' 'FERT'.
" 화면 2: 뷰 선택 (Basic Data 1)
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING 'MSICHTAUSW-DYTXT(01)' 'X'.
" 화면 3: Basic Data 1 + 저장
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE' '=BU'.
PERFORM bdc_field USING 'MAKT-MAKTX' p_maktx.
PERFORM bdc_field USING 'MARA-MEINS' 'EA'.
PERFORM bdc_field USING 'MARA-MATKL' '001'.
* === CALL TRANSACTION 실행 ===
CALL TRANSACTION 'MM01'
USING gt_bdcdata
MODE 'N' " 운영 = N / 디버깅 = A
UPDATE 'S'
MESSAGES INTO gt_messages.
DATA(gv_subrc) = sy-subrc.
* === 메시지 출력 ===
LOOP AT gt_messages INTO DATA(ls_msg).
DATA lv_text TYPE string.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING msgid = ls_msg-msgid
msgnr = ls_msg-msgnr
msgv1 = ls_msg-msgv1
msgv2 = ls_msg-msgv2
msgv3 = ls_msg-msgv3
msgv4 = ls_msg-msgv4
IMPORTING message_text_output = lv_text.
WRITE: / |[{ ls_msg-msgtyp }] { lv_text }|.
ENDLOOP.
IF gv_subrc = 0.
WRITE: /, / |✅ 자재 { p_matnr } 생성 완료|.
ELSE.
WRITE: /, / |❌ 자재 { p_matnr } 생성 실패 (sy-subrc = { gv_subrc })|.
ENDIF.
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO — 새 화면 시작 한 줄 추가
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR gs_bdcdata.
gs_bdcdata-program = program.
gs_bdcdata-dynpro = dynpro.
gs_bdcdata-dynbegin = 'X'.
APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BDC_FIELD — 필드 한 줄 추가 (빈 값은 스킵, BDC_* 는 항상 추가)
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
IF fval IS NOT INITIAL OR fnam CP 'BDC_*'.
CLEAR gs_bdcdata.
gs_bdcdata-fnam = fnam.
gs_bdcdata-fval = fval.
APPEND gs_bdcdata TO gt_bdcdata.
ENDIF.
ENDFORM.
이 미니 리포트를 그대로 SE38 에 넣고 실행하면 자재번호 + 자재내역만 입력해도 자재마스터 한 건이 자동으로 생성됩니다. 대량 처리는 SELECT-OPTIONS 또는 엑셀 업로드로 LOOP 만들고 안에서 REFRESH gt_bdcdata + 같은 패턴 반복.
요약
| 단계 | 작업 | 핵심 |
|---|---|---|
| 1 | SHDB 레코딩 + BDC_SUBSCR 정리 | T-Code 한 건 손으로 진행 → 저장 전 BDC_SUBSCR 라인 직접 삭제 → 저장 |
| 2 | 레코딩 보고 BDC 코드 직접 작성 | SE38 에서 bdc_dynpro / bdc_field 서브루틴 + 화면별 OKCODE 옮겨 적기 |
| 3 | BDCDATA 채우기 | 화면 순서대로 bdc_dynpro + bdc_field 반복 호출 |
| 4 | CALL TRANSACTION | MODE 'N' + UPDATE 'S' + MESSAGES INTO |
| 5 | 메시지 분석 | MESSAGE_TEXT_BUILD 로 텍스트 변환 후 로그 |
| 6 | 대량 처리 | CALL TRANSACTION 반복 또는 세션(SM35) 방식 |
BDC 는 들었을 때보다 패턴이 훨씬 단순합니다. SHDB 결과 화면에서 BDC_SUBSCR 라인을 미리 정리한 뒤, 그 결과를 옆에 띄워 두고 SE38 에서 bdc_dynpro · bdc_field 두 개의 서브루틴만 화면 순서대로 호출하면 됩니다. 함정 몇 가지(MODE 'A' 운영 배포·UPDATE 'A' + 즉시 조회·필드값 형식)만 피하면 안정적으로 돌아가며, 같은 패턴을 다른 트랜잭션 자동화(VA01·FB01·ME21N 등)에도 그대로 재사용할 수 있습니다.
다만 BAPI 가 있는 트랜잭션은 항상 BAPI 가 우선임을 기억하기. BDC 는 화면 의존성이 강해 시스템 패치에 약한 단점이 있으므로 표준 BAPI 가 가능하다면 그쪽이 안전한 선택입니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
BDC(Batch Data Communication) · SHDB(Transaction Recorder) · CALL TRANSACTION ... USING ... MESSAGES INTO 구문 · BDC_OPEN_GROUP / BDC_INSERT / BDC_CLOSE_GROUP FM 은 SAP 표준 기능으로 ECC 6.0 / S/4HANA on-premise 환경에서 동일하게 동작합니다.
MODE 옵션(A/E/N) 과 UPDATE 옵션(A/S/L) 의 의미는 SAP NetWeaver 표준 문서 기준이며, BDC 는 화면 흐름에 강하게 의존하므로 SAP EHP 업그레이드나 패치 적용 시 화면 변경 여부 확인이 필요합니다.
가능한 경우 BAPI(BAPI_MATERIAL_SAVEDATA · BAPI_PO_CREATE1 등) 가 권장되며, BDC 는 BAPI 가 없거나 회사 특정 커스텀 화면 자동화에 한정해 사용하시기 바랍니다. S/4HANA Cloud(ABAP Cloud / Steampunk) 환경에서는 BDC 사용이 제한되므로 RAP / BAPI / OData 기반 대안을 검토해야 합니다.