ME51N Custom field 추가 (2). BADI
지난 시간에 PR 발행하는 화면에 필드를 추가해달라는 요청을 받아서 해당 스크린에 필드를 추가하는 것까지 진행하였다.
이번에는 실제 PR 발행하면서 로직이 들어가는 BADI를 추가하여 스크린에서 입력한 값이 최종적으로 EBAN 테이블에 저장되도록 구현할 예정이다.
우선 PR발행하는 BADI를 생성해야하므로 SE19 BADI 실행하여
Create Implementation > Classic BAdI > ME_PROCESS_REQ_CUST > CREATE
이름은 앞에 본인이 원하는대로 만들면 된다. 여기서는 접두사 Z 만 덧붙였다.
생성을 완료하였으면 액티브를 해야 해당 BADI가 정상적으로 실행된다. ▼
우선 METHOD-OPEN을 열어 PR발행하는 화면(ME51N, ME52N, ME53N 등)이 처음 열릴때마다 스크린에 추가한 필드의 인풋 가능 여부를 제어하기 위해 내부 값 LV_ACTIVITY를 ABAP 메모리로 던져준다.
LV_ACTIVITY 값에 따라 현재 스크린이 수정 또는 조회인지 알 수 있다.
A : Display / H : Create / V : Change ▼
DATA: LV_TRTYP TYPE TRTYP,
LV_ACTIVITY TYPE AKTVT.
LV_TRTYP = IM_TRTYP.
LV_ACTIVITY = LV_TRTYP.
EXPORT LV_ACTIVITY FROM LV_ACTIVITY TO MEMORY ID 'LV_ACTIVITY_PR_SCREEN3320'.
다음 새로 추가한 스크린은 Item 항목이 변하는 것이므로 METHOD-ITEM을 연다.
ITEM 항목에도 사용자가 값을 입력하거나 조회할 때마다 스크린을 제어하기 위해 메모리를 EXPORT 해준다.
이 때는 IM_ITEM 클래스의 GET_ACTIVITY를 이용하여 값을 받을 수 있다. ▼
( CHECK 이하는 참고용 로직. IM_ITEM 클래스를 사용하여 데이터를 불러와 원하는 로직을 코딩할 수 있다.)
DATA: LV_ACTIVITY TYPE AKTVT,
LS_PRE_DATA TYPE MEREQ_ITEM,
LS_CUR_DATA TYPE MEREQ_ITEM,
LO_HEADER TYPE REF TO IF_PURCHASE_REQUISITION,
LS_HEADER TYPE MEREQ_HEADER.
LV_ACTIVITY = IM_ITEM->GET_ACTIVITY( ).
EXPORT LV_ACTIVITY FROM LV_ACTIVITY TO MEMORY ID 'LV_ACTIVITY_PR_SCREEN3320'.
CHECK LV_ACTIVITY = 'V'.
LS_PRE_DATA = IM_ITEM->GET_PREVIOUS_DATA( ).
LS_CUR_DATA = IM_ITEM->GET_DATA( ).
"FRGKZ: Release indicator
IF LS_PRE_DATA-FRGKZ = 'R' AND LS_CUR_DATA-FRGKZ = '1'.
SELECT SINGLE ZCM_CODE1
FROM ZCMT0011
WHERE ZMODULE EQ 'MM'
AND ZCLASS EQ 'MM000'
INTO @DATA(LV_ZCM_CODE1).
IF NOT SY-UNAME = LV_ZCM_CODE1.
LO_HEADER = IM_ITEM->GET_REQUISITION( ).
LS_HEADER = LO_HEADER->GET_DATA( ).
ENDIF.
ENDIF.
다음은 PR 발행을 최종 저장 시 한번 더 스크린을 제어하기 위해 METHOD-POST을 연다.
마찬가지로 ACTIVITY 값을 받아 메모리에 적재시켜 던져준다. ▼
(위의 주석문은 POST 실행 시 헤더 데이터를 통해 아이템 데이터를 가져오는 참고용 로직)
* DATA :LT_ITEMS TYPE MMPUR_REQUISITION_ITEMS,
* WA_ITEM LIKE LINE OF LT_ITEMS,
* LV_IF_ITEM TYPE REF TO IF_PURCHASE_REQUISITION_ITEM,
* LS_ITM_DATA TYPE MEREQ_ITEM.
*
* CALL METHOD IM_HEADER->GET_ITEMS
* RECEIVING
* RE_ITEMS = LT_ITEMS.
*
* LOOP AT LT_ITEMS INTO WA_ITEM.
*
* LV_IF_ITEM = WA_ITEM-ITEM.
*
* CALL METHOD LV_IF_ITEM->GET_DATA
* RECEIVING
* RE_DATA = LS_ITM_DATA.
*
*
* BREAK-POINT.
***Implement your own check here
*
* ENDLOOP.
"Funtion group MEGUI, Screen 3320, Modify screen
DATA: LV_ACTIVITY TYPE AKTVT.
CALL METHOD IM_HEADER->GET_ACTIVITY
RECEIVING
RE_AKTVT = LV_ACTIVITY.
EXPORT LV_ACTIVITY FROM LV_ACTIVITY TO MEMORY ID 'LV_ACTIVITY_PR_SCREEN3320'.
아래는 이전 포스팅의 스크린 화면의 로직인데 스크린을 제어하기 전에 IMPORT MEMORY를 한 이유가 지금까지 EXPORT MEMORY한 LV_ACTIVITY 값을 받기 위해서 작성했던 것이다.
조회모드(LV_ACTIVITY = 'A')일 때는 필드에 값을 입력하지 못하게 막는 것이고 그 외는 입력 가능하게 만들었던 것이다. ▼
끝.