본문 바로가기
SAP/ABAP

<ABAP> BDC(Batch Data Communication) - VKM1

by 승싱생숭 2024. 9. 19.
728x90

 

BDC는 흔히 우리가 알고 있는 매크로 혹은 RPA( Robotic Process Automation )와 같은 개념으로 SAP 프로그램을 사용자가 지정한 규칙대로 자동으로 실행하는 기능입니다.

 

사용자가 같은 작업을 반복해야하거나, 프로그램 개발까지는 갈 필요가 없을 때 사용하면 유용한 개발 기능입니다.

BDC를 사용하기 위해 자료를 찾아보고 배운 내용을 공유하고자 작성 해봅니다.

 


 

BDC를 통한 VKM1 처리 자동화

 

BDC에 대한 설명과 함께 예시로 들 작업은 VKM1에 대한 처리 자동화 입니다.

SD모듈에서 고객에게 주문을 받고 WM모듈에서 납품문서 생성을 할 때 주문에 해당하는 고객의 여신을 점검합니다.

이때 고객이 주문금액보다 부족한 여신 금액을 들고 있다면, 해당 문서는 보류상태에 들어가고 아래와 같은 메세지를 띄웁니다.

 

해당 메세지가 나온다면 보류상태에 들어간 오더를 VKM1에서 조회가 가능합니다.

또한, 고객의 여신 회복 시 여신 재점검을 하여 보류 상태를 해지시킬 수도 있습니다.

 

 

개발 목적

 

이러한 스탠다드 프로그램이 있다면, 보류문서가 생길때마다 해당 프로그램에서 재점검을 하라고 가이드하면 될 수도 있지만 개발을 하는 이유는 VKM1이라는 스탠다드 프로그램에는 강제 보류해제 (릴리즈) 기능이 있기 때문입니다.

 

릴리즈 (깃발)

 

여신이 부족한 상태에서 강제로 릴리즈한다는 것은 큰 위험으로 다가 올 수 있기 때문에, 해당 프로그램을 가이드하지않고 BDC를 통해 여신 재점검만 가능하도록 하는 것이 개발의 목적입니다.

 

 

 

BDC의 요소별 정의

 

각 필드 들의 사전적 정의, 확인 방법등을 숙지하고 개발하는 것이 좋다.

BDCDATA 테이블 - SE11

 

Field 명 설명
PROGRAM BDC 모듈 풀 - 현재 작업 중인 모듈(프로그램)명 → SY-REPID 통해 확인 가능
DYNPRO BDC 화면번호 - 현재 작업 중인 화면 번호 → SY-DYNNR 통해 확인 가능
DYNBEGIN BDC 화면의 시작
FNAM 필드 이름 → 프로그램 화면에서 단축키 F1을 통해 확인 가능
FVAL BDC 필드 값

 

 

 

사전 작업 (BDC 레코딩 - SHDB)

 

T-CODE : SHDB

 

1. SHDB 신규기록 클릭

2. 레코딩 정보 입력

기록 : 프로그램 녹화 명 (Z + 작업모듈 + 작업명)

트랜잭션 코드 : 레코딩 할 프로그램 명

3. 자동화 할 프로그램 사용 루틴 녹화

"VKM1 - 조회(F8) - 전체선택 - 재지정 - 저장 - 프로그램나가기" 순으로 레코딩을 진행했다.

 

vkm1 레코딩

레코딩을 하고나면 행별로 내가 작업한 내역이 기록되어있다.

이제 이 기록을 기반으로 프로그램을 만들 예정이다.

 

BDC 프로그램 개발

 

먼저 빈 REPORT화면 하나를 만들고 아래의 코드를 붙여넣기 하면 완성이다.

아래의 코드를 기반으로 하나 씩 설명할 예정이다.

더보기

*SHDB : Recording Overview
*BDC
DATActu_params LIKE ctu_params,
      gt_bdc     LIKE TABLE OF bdcdata    WITH HEADER LINE,
      gt_msg     LIKE TABLE OF bdcmsgcoll WITH HEADER LINE.




*BDC 처리모드(dismode)
* A : 모든화면 조회
* E : 오류 조회
* N : 백그라운드 처리
* P : 백그라운드 처리: 디버깅 가능

ctu_params-dismode 'N'.


*BDC Transcation Mode
*L : 로컬
*S : 동기
*A : 비동기

ctu_params-updmode 'L'.


PERFORM bdc_append_data USING 'X' 'RVKRED02' '1000',
                                ' ' 'BDC_CURSOR' 'CMNGV-LOW',
                                ' ' 'BDC_OKCODE' '=ONLI',
                                ' ' 'KKBER-LOW'  '1000'.


PERFORM bdc_append_data USING 'X' 'SAPMSSY0' '0120',
                                ' ' 'BDC_CURSOR' '04/03',
                                ' ' 'BDC_OKCODE' '=&ALL'.

PERFORM bdc_append_data USING 'X' 'SAPMSSY0' '0120',
                                ' ' 'BDC_CURSOR' '04/03',
                                ' ' 'BDC_OKCODE' '=PRKN'.

PERFORM bdc_append_data USING 'X' 'SAPMSSY0' '0120',
                                ' ' 'BDC_CURSOR' '04/03',
                                ' ' 'BDC_OKCODE' '=SAVE'.

PERFORM bdc_append_data USING 'X' 'SAPMSSY0' '0120',
                                ' ' 'BDC_OKCODE' '=BACK'.

PERFORM bdc_append_data USING 'X' 'SAPMSSY0' '0120',
                                ' ' 'BDC_OKCODE' '=&F03'.

PERFORM bdc_append_data USING 'X' 'SAPLSPO1' '0100',
                                ' ' 'BDC_OKCODE' '=YES'.

PERFORM bdc_append_data USING 'X' 'RVKRED02' '1000',
                                ' ' 'BDC_OKCODE' '/EE',
                                ' ' 'BDC_CURSOR'  'CMNGV-LOW'.


CALL TRANSACTION 'VKM1'  USING gt_bdc
                        OPTIONS FROM ctu_params   MESSAGES INTO gt_msg .


MESSAGE s000(zabapWITH '정상적으로 처리 되었습니다.'.


*&---------------------------------------------------------------------*
*&      Form  BDC_APPEND_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0010   text
*      -->P_0011   text
*      -->P_0012   text
*----------------------------------------------------------------------*
FORM bdc_append_data USING  p_dynbegin
                            p_name
                            p_value.

  CLEAR gt_bdc.

  IF p_dynbegin 'X'.
    gt_bdc-program  p_name.
    gt_bdc-dynpro   p_value.
    gt_bdc-dynbegin p_dynbegin.
  ELSE.
    gt_bdc-fnam p_name.
    gt_bdc-fval p_value.
  ENDIF.

  APPEND gt_bdc.

ENDFORM.

 

 

1. TOP - DATA 선언 부

 

프로그램 코드 내에서 사용할 파라미터와 테이블 변수들을 정의한다.

ctu_params를 통하여 BDC 프로그램의 처리방식이 어떻게 될지 정의하며,

gt_bdc에 BDC 레코딩 정보들을 순서대로 담는다.

gt_msg는 프로그램 실행 후 처리 메세지를 담는다.

 

2. 프로그램 처리로직

 

 

 

첫번쨰로 BDC의 처리모드를 정의한다. 

 

사용자가 처리되는 과정을 볼 수 있게하려면 'A'를 사용하면 되지만,

중간 과정을 생략하고 결과만 보여주기 위해 'N' 백그라운드 처리를 사용한다.

 

두번째로 BDC의 Update Mode에 대한 정의이다.

 

코드 상에는 'L'(로컬)로 지정해 두었으나,

목적에 따라 완료될때까지 기다리지않고 넘어가려면 'A' (비동기)

완료가 될때까지 기다리려면 'S' (동기)를 사용하면 된다.

 

반복작업의 경우라면 'S'를 권장한다.

 

세번째는 사전에 녹화한 레코딩을 코드화 하는 작업이다.

 

첫번쨰행은 화면의 시작을 정의 두번째행 부터는 각 화면에서 이루어진 작업을 나타낸다.

 

코드 상의 bdc_append_data로 각 화면작업별로 전달을 해주고 있는데 해당 PERFORM은 아래와 같이 정의 되어있다.

 

 

 

 bdc_append_data에 처음 담는 데이터를 예로 들면,

p_dynbegin = 'X'
p_name = 'RVKRED02'

p_value = '1000'

 

Using에 정의된 변수에는 위와 같이 정의되어 있을 것이다.

 

IF문을 보았을 때  p_dynbegin이 'X'라면 

gt_bdc 테이블의 program, dynpro, dynbegin의 변수에 각 데이터를 담는다.

 

 p_dynbegin이  'X'가 아니라면

gt_bdc 테이블의 fnam, fval 변수에 각 데이터를 담는다.

 

각 정보를 담은 후 APPEND하여 테이블에 저장한다.

 - 저장한 데이터를 테이블에 행추가 한다고 생각하면 된다.

 

두번째 행까지의 데이터로 예시를 들면,

p_dynbegin = ' '
p_name = 'BDC_CURSOR'
p_value = 'CMNGV-LOW'
PROGRAM DYNPRO DYNBEGIN FNAM FVAL
RVKRED02 1000 X    
      BDC_CURSOR CMNGV-LOW

gt_bdc 테이블 저장 구조

 

 

위의 표 형식으로 데이터가 저장되어 있을 것이다.

 

이 과정을 반복하여 마지막행까지 저장하는 것이 이 PERFORM문의 목적이다.

 

 

 

네번째는 저장한 값들을 기반으로 프로그램을 실행하는 것이다.

 

CALL TRANSCATION을 통하여 'VKM1' 프로그램을 실행하는데,

gt_bdc테이블의 데이터를 사용할 것이고,

ctu_params에 저장된 옵션을 기반으로 실행할 것이다라는 의미로 해석할 수 있다.


 

 

이렇게 BDC에 관하여 공부하며,  프로그램 개발까지 완료하였다.

 

프로그래밍에 익숙하지않은 초보자도 한번 익히고 나면 손쉽게 개발할 수 있다는 것이 큰 장점이다.

 

이렇게 개발에 익숙해진 후 CBO프로그램들을 분석해가며 만들면 큰 성장의 발판이 될 것이라 생각한다.

 

728x90

'SAP > ABAP' 카테고리의 다른 글

[SAP/ABAP] ST04 - SqlEditor 쿼리 실행  (1) 2024.10.08
<ABAP> cx_sy_conversion_no_num 에러  (1) 2024.09.30
[SAP/ABAP] 문자열검색 - RS_ABAP_SOURCE_SCAN  (0) 2024.09.24
<ABAP> ABAP EQ와 CP 문법  (0) 2024.08.23
<ABAP>가독성 좋은 개발  (0) 2024.08.22