SAP에서 자체 프로그램을 만들다 보면 "이 데이터로 표준 트랜잭션 화면을 열어 사용자에게 후속 작업을 시킨다" 거나 "표준 트랜잭션을 화면 없이 백그라운드로 자동 입력시킨다" 같은 요구가 자주 발생합니다.
이때 표준 ABAP에서 사용하는 명령어가 CALL TRANSACTION 입니다. 이름 그대로 다른 트랜잭션(T-Code) 을 호출하는 명령으로, 사용자가 화면을 직접 조작하게 하는 모드와 프로그램이 입력값을 미리 채워 자동으로 진행시키는 BDC 모드를 모두 지원합니다.
이 글은 CALL TRANSACTION 의 기본 정의와 옵션, 비슷한 이름의 LEAVE TO TRANSACTION · SUBMIT 과의 차이, 그리고 BDC 모드에서 표준 트랜잭션을 자동 입력하는 4단계 패턴까지 정리한 메모입니다.
핵심 — CALL TRANSACTION 은 호출 시점에 새 LUW 를 만듭니다
비슷해 보이는 세 명령어(CALL TRANSACTION · LEAVE TO TRANSACTION · SUBMIT) 은 호출 대상의 종류 · 호출 후 흐름 · LUW 경계가 모두 다릅니다.
| 항목 | CALL TRANSACTION | LEAVE TO TRANSACTION | SUBMIT |
|---|---|---|---|
| 호출 대상 | 트랜잭션 (T-Code) | 트랜잭션 (T-Code) | 실행 가능한 리포트 프로그램 |
| 호출 후 복귀 | 복귀함 (다음 줄부터 계속 실행) | 복귀 안 함 (호출과 동시에 종료) | AND RETURN 절 유무에 따라 |
| LUW 경계 | 새 LUW 시작 — 호출 트랜잭션 종료 시 COMMIT | 호출자 LUW 종료 후 새 LUW 시작 | 같은 LUW 안에서 실행 |
| 입력값 전달 | SPA/GPA 또는 USING bdcdata |
SPA/GPA 만 | WITH 절로 Selection-screen 옵션 전달 |
| BDC 자동 입력 | 지원 (BDCDATA 테이블) | 미지원 | 미지원 |
| 일반 용도 | 표준 화면을 자체 프로그램에서 호출 · 자동 입력 | 현재 흐름 종료 후 다른 T-Code 로 이동 | 리포트 프로그램 실행 · 결과 회수 |
CALL TRANSACTION 의 가장 중요한 특징은 호출 시점에 새 LUW(Logical Unit of Work) 가 시작된다는 점입니다. 호출자의 COMMIT WORK 와 호출된 트랜잭션 내부의 COMMIT WORK 가 서로 다른 LUW 에 묶이기 때문에, 호출자 입장에서 표준 트랜잭션의 성공·실패만 받아 보고 본인의 다른 작업과 묶어 처리하기에 편합니다.
같이 등장하는 BDC(Batch Data Communication) 는 별개 개념이 아니라 CALL TRANSACTION 의 USING bdcdata 옵션에 채울 데이터를 만드는 기법입니다. 표준 BAPI 가 없는 트랜잭션을 자동 입력해야 할 때 주로 사용합니다.
1단계 — 가장 단순한 호출
옵션 없이 트랜잭션 코드만 넘기면 호출된 트랜잭션의 초기 화면이 사용자에게 그대로 보입니다. 사용자가 후속 작업을 직접 진행하고, 트랜잭션을 종료하면 호출자의 다음 줄로 돌아옵니다.
CALL TRANSACTION 'MM01'.
WRITE: / '자재 생성 트랜잭션이 종료되었습니다.'.
이 형태는 자체 프로그램에서 "여기서 자재 마스터 만들어 두고 다음 단계 진행" 같은 흐름을 안내할 때 사용합니다. 다만 호출자가 미리 채워준 입력값이 없으므로 SPA/GPA 메모리를 활용해 초기 필드를 채워두기도 합니다.
SET PARAMETER ID 'MAT' FIELD 'TEST-MAT-001'.
SET PARAMETER ID 'WRK' FIELD '0001'.
CALL TRANSACTION 'MM02'.
SPA/GPA 메모리 ID 가 트랜잭션 초기 화면의 필드와 연결되어 있으면, 위처럼 SET PARAMETER 로 값을 먼저 박아두는 방식으로 사용자 입력을 줄일 수 있습니다.
2단계 — MODE · UPDATE · OPTIONS 옵션
자동 입력 시 필요한 옵션은 다음과 같습니다.
CALL TRANSACTION 'MM01'
USING lt_bdcdata
MODE 'N'
UPDATE 'S'
MESSAGES INTO lt_messtab.
각 옵션의 의미는 다음과 같습니다.
| 옵션 | 값 | 의미 |
|---|---|---|
MODE |
A | All — 모든 화면 표시 (디버깅 · 데모용) |
| E | Error — 에러 발생 시점에만 화면 멈춤 (실무 디버깅용) | |
| N | No display — 화면 미표시 (운영 · 배치용) | |
UPDATE |
S | Synchronous — DB 업데이트 완료 후 복귀 (결과 즉시 확인 가능) |
| A | Asynchronous — 업데이트 요청 후 즉시 복귀 (성능 우선) | |
| L | Local — 호출 워크 프로세스에서 직접 업데이트 | |
MESSAGES INTO |
— | BDCMSGCOLL 타입 인터널 테이블에 메시지 수집 |
실무에서 가장 자주 쓰는 조합은 다음 두 가지입니다.
- 운영 자동 입력:
MODE 'N' UPDATE 'S'— 화면 미표시 + 동기 업데이트로 결과 즉시 회수 - 개발·검증:
MODE 'E' UPDATE 'S'— 에러 발생 시에만 화면이 멈춰 디버깅 가능
호출 결과는 sy-subrc 로 판단합니다. 0 이면 정상, 1001 이상이면 BDC 처리 중 에러가 발생한 상태입니다.
3단계 — BDC 모드 (USING bdcdata)
자동 입력값은 BDCDATA(SAP 표준 구조체, 패키지 SBDC) 타입 인터널 테이블에 채워서 USING 절로 전달합니다.
BDCDATA 의 주요 필드는 다음과 같습니다.
| 필드 | 의미 |
|---|---|
PROGRAM |
호출할 화면의 모듈 풀 프로그램명 (예: SAPLMGMM) |
DYNPRO |
화면 번호 (예: 0060) |
DYNBEGIN |
새 화면 시작 표시 ('X') |
FNAM |
필드명 또는 명령(BDC_OKCODE) |
FVAL |
해당 필드에 입력할 값 |
화면 단위로 한 줄(DYNBEGIN='X') 을 시작하고, 그 아래로 필드별 입력값을 한 줄씩 채우는 식입니다. 자체로 만들기보다 SHDB 트랜잭션에서 실제 입력 과정을 레코딩해 자동 생성된 코드를 가져다 쓰는 방식이 표준입니다.
SHDB → New recording → 트랜잭션 코드 입력 (예: MM01) → 실제 입력 진행 후 저장
→ "Program" 버튼 → 자동 생성된 ABAP 코드 확보
→ 코드에서 BDC_SUBSCR 같은 불필요 행 제거 → 자체 프로그램에 이식
레코딩 결과의 BDC_SUBSCR 같은 서브스크린 관련 행은 화면에 따라 노이즈일 수 있으므로 제거 후 깔끔하게 정리해서 사용합니다.
4단계 — MESSAGES INTO 로 에러 수집
자동 입력 결과 메시지는 BDCMSGCOLL(SAP 표준 구조체) 타입 인터널 테이블로 받습니다.
DATA: lt_messtab TYPE STANDARD TABLE OF bdcmsgcoll,
ls_messtab TYPE bdcmsgcoll,
lv_msg TYPE string.
CALL TRANSACTION 'MM01'
USING lt_bdcdata
MODE 'N'
UPDATE 'S'
MESSAGES INTO lt_messtab.
LOOP AT lt_messtab INTO ls_messtab WHERE msgtyp CA 'EAX'.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_messtab-msgid
lang = sy-langu
no = ls_messtab-msgnr
v1 = ls_messtab-msgv1
v2 = ls_messtab-msgv2
v3 = ls_messtab-msgv3
v4 = ls_messtab-msgv4
IMPORTING
msg = lv_msg.
WRITE: / ls_messtab-msgtyp, lv_msg.
ENDLOOP.
MSGTYP 컬럼은 메시지 타입을 나타내며, E(Error) · A(Abort) · X(Exit) · W(Warning) · S(Success) · I(Information) 가 들어옵니다. 에러 판정은 보통 CA 'EAX'(Error/Abort/Exit 중 하나) 로 처리합니다.
메시지 텍스트 자체는 메시지 클래스(MSGID) + 번호(MSGNR) + 변수(MSGV1~MSGV4) 로 분해되어 들어오므로, 사용자에게 보여줄 때는 FORMAT_MESSAGE 함수로 한 문장으로 조립합니다.
흔히 빠뜨리는 함정
COMMIT WORK 가 따로 동작
CALL TRANSACTION 은 새 LUW 를 만들기 때문에 호출자의 COMMIT WORK 와 호출 트랜잭션의 COMMIT WORK 가 따로 동작합니다. 두 처리를 하나의 트랜잭션 단위로 묶고 싶다면 BAPI 같이 같은 LUW 안에서 동작하는 방식을 선택합니다.
UPDATE 'A' 직후 결과 SELECT
UPDATE 'A'(비동기) 모드에서 호출 직후 결과 테이블을 SELECT 하면, DB 반영이 아직 끝나지 않아 빈 결과가 나올 수 있습니다. 결과를 바로 확인해야 한다면 UPDATE 'S'(동기) 로 변경합니다.
sy-subrc 만 보고 정상 판정
sy-subrc = 0 이라도 메시지 테이블에 Warning · Information 이 들어오는 경우가 있습니다. 더 안전한 판정은 MESSAGES INTO 결과를 MSGTYP CA 'EAX' 로 한 번 더 확인하는 방식입니다.
MODE 'N' 으로만 운영, 디버깅 안 됨
운영에서는 MODE 'N' 이 표준이지만, 개발·검증 단계에서 같은 모드를 쓰면 에러 화면이 보이지 않아 원인 파악이 어렵습니다. 셀렉션 화면에 모드 파라미터를 두고 개발 환경에서는 'E', 운영에서는 'N' 으로 동적 분기합니다.
BDC_OKCODE 누락
화면 단위 종료 시점에 BDC_OKCODE(예: '/00'·'=SAVE') 가 빠지면 다음 화면으로 넘어가지 못해 멈춥니다. 화면마다 마지막 줄에 BDC_OKCODE 한 줄이 들어가야 합니다.
표준 BAPI 가 있는데 BDC 로 구현
자재 마스터 · 구매 오더 · 송장 같이 표준 BAPI 가 잘 정의된 객체는 BDC 보다 BAPI 가 안정적입니다. SAP 화면이 버전 업데이트되면 BDC 가 깨질 수 있지만 BAPI 는 시그니처가 유지됩니다. 표준 BAPI 우선 검토 후 없는 경우에만 BDC 를 사용합니다.
SHDB 레코딩의 서브스크린 행 미정리
SHDB 레코딩 결과에 포함되는 BDC_SUBSCR 행은 화면에 따라 동적 영역이라 그대로 두면 다른 데이터에서 실패할 수 있습니다. 이식 시 불필요한 서브스크린 행을 제거하고 필수 필드만 남깁니다.
전체 코드 — 복사용 통합본
자재 마스터(MM01) 를 자동 입력으로 생성하는 표준 흐름입니다. 실무에서는 표준 BAPI(BAPI_MATERIAL_SAVEDATA) 사용이 권장되며, 본 예제는 CALL TRANSACTION + BDC 패턴 자체를 익히는 용도입니다.
REPORT z_call_transaction_demo.
* ★ 사전 작업
* 1) SHDB 트랜잭션에서 MM01 레코딩 → ABAP 코드 자동 생성
* 2) 코드에서 BDC_SUBSCR 같은 불필요 행 제거
* 3) 본 프로그램의 perform fill_bdcdata 안에 핵심 행만 이식
PARAMETERS:
p_matnr TYPE matnr DEFAULT 'TEST-MAT-001',
p_mtart TYPE mtart DEFAULT 'FERT',
p_mbrsh TYPE mbrsh DEFAULT 'M',
p_mode TYPE c DEFAULT 'N'. " A · E · N
DATA: lt_bdcdata TYPE STANDARD TABLE OF bdcdata,
ls_bdcdata TYPE bdcdata,
lt_messtab TYPE STANDARD TABLE OF bdcmsgcoll,
ls_messtab TYPE bdcmsgcoll,
lv_msg TYPE string.
* 1) BDCDATA 채우기 — 화면 단위로 DYNBEGIN='X' 시작 후 필드 입력
PERFORM add_screen USING 'SAPLMGMM' '0060'.
PERFORM add_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM add_field USING 'RMMG1-MATNR' p_matnr.
PERFORM add_field USING 'RMMG1-MBRSH' p_mbrsh.
PERFORM add_field USING 'RMMG1-MTART' p_mtart.
PERFORM add_screen USING 'SAPLMGMM' '0070'.
PERFORM add_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM add_field USING 'MSICHTAUSW-DYTXT(01)' 'X'. " 첫 번째 view 선택
PERFORM add_screen USING 'SAPLMGMM' '4004'.
PERFORM add_field USING 'BDC_OKCODE' '=BU'. " 저장
PERFORM add_field USING 'MAKT-MAKTX' 'Sample Material'.
PERFORM add_field USING 'MARA-MEINS' 'EA'.
PERFORM add_field USING 'MARA-MATKL' '01'.
* 2) ★ 핵심: CALL TRANSACTION 호출 — MODE p_mode · UPDATE 'S'
CALL TRANSACTION 'MM01'
USING lt_bdcdata
MODE p_mode
UPDATE 'S'
MESSAGES INTO lt_messtab.
* 3) 결과 판정 — sy-subrc 만 보지 말고 메시지 테이블에서 E/A/X 확인
IF sy-subrc <> 0.
WRITE: / '실행 중 에러가 발생했습니다. sy-subrc =', sy-subrc.
ENDIF.
LOOP AT lt_messtab INTO ls_messtab.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_messtab-msgid
lang = sy-langu
no = ls_messtab-msgnr
v1 = ls_messtab-msgv1
v2 = ls_messtab-msgv2
v3 = ls_messtab-msgv3
v4 = ls_messtab-msgv4
IMPORTING
msg = lv_msg.
WRITE: / ls_messtab-msgtyp, lv_msg.
ENDLOOP.
* 4) 정상 판정 보조 — E/A/X 한 건도 없으면 성공
READ TABLE lt_messtab WITH KEY msgtyp = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
WRITE: / '자재 생성 처리가 정상 완료되었습니다:', p_matnr.
ENDIF.
*&---------------------------------------------------------------------*
*& Form ADD_SCREEN — 새 화면 시작 줄 추가
*&---------------------------------------------------------------------*
FORM add_screen USING p_program TYPE any
p_dynpro TYPE any.
CLEAR ls_bdcdata.
ls_bdcdata-program = p_program.
ls_bdcdata-dynpro = p_dynpro.
ls_bdcdata-dynbegin = 'X'.
APPEND ls_bdcdata TO lt_bdcdata.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ADD_FIELD — 필드 입력 줄 추가
*&---------------------------------------------------------------------*
FORM add_field USING p_fnam TYPE any
p_fval TYPE any.
CLEAR ls_bdcdata.
ls_bdcdata-fnam = p_fnam.
ls_bdcdata-fval = p_fval.
APPEND ls_bdcdata TO lt_bdcdata.
ENDFORM.
같이 보면 좋은 글은 "BAPI나 BDC 시 MESSAGE 함수를 통해 에러 확인 법" 입니다. BDCMSGCOLL 메시지를 사용자에게 ALV · POPUP 형태로 보여주는 후속 처리를 상세히 다룹니다.
요약
| 단계 | 구문 | 핵심 |
|---|---|---|
| 1 | CALL TRANSACTION 'XX' |
단순 호출 — SPA/GPA 로 초기값 전달 가능 |
| 2 | MODE · UPDATE |
화면 표시 모드(A/E/N) + 업데이트 동기 여부(S/A/L) |
| 3 | USING bdcdata |
BDCDATA 인터널 테이블에 화면·필드 입력 자동화 |
| 4 | MESSAGES INTO |
BDCMSGCOLL 수집 → MSGTYP CA 'EAX' 로 에러 판정 |
CALL TRANSACTION 은 표준 화면을 자체 프로그램에서 호출하거나 자동 입력할 때 사용하는 ABAP 표준 명령어입니다. 호출 시점에 새 LUW 가 시작되어 호출자와 호출 대상의 트랜잭션 경계가 분리되며, USING bdcdata 와 결합하면 BDC 자동 입력까지 가능합니다. 표준 BAPI 가 있는 객체에는 BAPI 를 우선 검토하고, BAPI 가 없는 화면 기반 트랜잭션에 한해 CALL TRANSACTION + BDC 패턴을 사용하는 것이 안정적인 선택입니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
CALL TRANSACTION · LEAVE TO TRANSACTION · SUBMIT 구문과 BDCDATA · BDCMSGCOLL 표준 구조체(패키지 SBDC), SHDB · MM01 · FORMAT_MESSAGE 트랜잭션·함수는 SAP NetWeaver 표준 기능으로 ECC 6.0 · S/4HANA on-premise 환경 공통으로 동작합니다. BDC 자동 입력은 화면 레이아웃 변경 시 깨질 수 있으므로 운영 전 MODE 'E' 로 검증 후 MODE 'N' 으로 전환하시기 바랍니다.