본문 바로가기
ABAP

BDC 프로그램

by clode 2023. 2. 16.
728x90
반응형

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의 레코드 뜬걸 로직으로 입력해주는곳에서 해당 필드의 필드값만 파라미터로 선언한 변수를 입력해주면 된다.

728x90
반응형

'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

댓글