Button/Function 생성
Button/Function 생성
1. Web개발 vs SAP RAP Framework
| **개발 요소** | **일반 웹 개발 (Java / JavaScript)** | **SAP RAP Framework** |
| **버튼 정의** | HTML `` | MDE의 `@UI.lineItem: [{ type: #FOR_ACTION }]` |
| **함수 선언** | JavaScript `function createCategory(param) { ... }` | BDEF의 **`factory action createCategory ...`** |
| **DTO (파라미터)** | Java RequestBody DTO 객체 | Abstract Entity (`ZC_TWBS_CATEGORY_CREATE`) |
| **라우팅 / API** | Spring `@PostMapping("/api/category")` | OData V4 서비스 바인딩이 자동 생성 및 매핑 |
2. 개발 순서(카테고리 콤보박스 데이터 추가/삭제 시나리오)
2-1. 가상 엔티티(Abstract Entity)생성(New > DataDefinition)
1
2
3
4
5
6
7
8
@EndUserText.label: '카테고리 추가 팝업'
define abstract entity ZC_TWBS_CATEGORY_CREATE
{
@EndUserText.label: '카테고리 타입'
CategoryType : abap.char( 20 );
@EndUserText.label: '카테고리 명'
CategoryName : abap.char( 30 );
}
1
2
3
4
5
6
7
8
9
@EndUserText.label: '카테고리 삭제 팝업'
define abstract entity ZC_TWBS_CATEGORY_DELETE
{
@EndUserText.label: '삭제할 카테고리'
// 💡 카테고리 마스터 뷰(ZR_TWBS_CATEGORY)와 밸류헬프를 바인딩하여 콤보박스 형태로 고르게 만듭니다.
@Consumption.valueHelpDefinition: [{ entity: { name: 'ZR_TWBS_CATEGORY', element: 'CategoryUUID' } }]
CategoryUUID : sysuuid_x16;
}
2-2. 함수선언
- Behavior Definition에 아래 소스 입력
- Projection View에 USE 명시
- 카테고리 테이블은 TASK2 테이블과 별개의 독립된 마스터 테이블이므로,
특정 행의 키 값(ProgKey등)을 백엔드로 넘겨줄 필요가 없음.- 행 선택 여부와 관계없이 버튼을 무조건 100% 활성화 상태로 두려면 구문을
static액션 형태로 선언을 바꾸거나 제한을 풀어주어야 합니다. ```abap define behavior for ZI_TWBS_TASK2 alias WbsTask … { // 기존 로직 유지…
// 기존 카테고리 저장/삭제 로직을 트리거할 액션 선언 static action createCategory parameter ZC_TWBS_CATEGORY_CREATE; static action deleteCategory parameter ZC_TWBS_CATEGORY_DELETE; } …
1
2
3
4
5
6
7
8
9
10
11
```abap
define behavior for ZC_TWBS_TASK2 alias ZcTwbsTask2
...
{
...
// 카테고리 추가/삭제 버튼
use action createCategory;
use action deleteCategory;
}
2-3. Behavior Implementation 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
METHOD createCategory.
// 1. 사용자가 팝업창에서 입력한 파라미터 가져오기
READ TABLE keys INTO DATA(ls_key) INDEX 1.
IF sy-subrc = 0.
// 2. 이미 존재하는 카테고리 마스터 테이블에 다이렉트 INSERT
// (테이블명과 필드명은 실제 기구축하신 명칭으로 매핑하세요)
INSERT ztwbs_category FROM @( VALUE #(
category_id = cl_system_uuid=>create_uuid_x16_static( ) " UUID 자동 생성
category_name = ls_key-%param-CategoryName
category_type = ls_key-%param-CategoryType
) ).
IF sy-subrc = 0.
// 성공 시 OData 프레임워크가 화면의 콤보박스(Value Help) 세션을 자동 리프레시하도록 리턴
APPEND VALUE #( %cid = ls_key-%cid ) TO mapped-wbstask;
ENDIF.
ENDIF.
ENDMETHOD.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
METHOD deleteCategory.
" 1. 팝업창에서 사용자가 선택한 카테고리 파라미터 행 읽기
READ TABLE keys INTO DATA(ls_key) INDEX 1.
IF sy-subrc = 0 AND ls_key-%param-CategoryUUID IS NOT INITIAL.
" 💡 [EML 정석 삭제] 카테고리 엔티티에 직접 DELETE 명령을 전파합니다.
MODIFY ENTITIES OF zr_twbs_category
ENTITY ZrTwbsCategory
DELETE VALUE #( ( CategoryUUID = ls_key-%param-CategoryUUID ) )
FAILED DATA(ls_failed_cat)
REPORTED DATA(ls_reported_cat).
IF ls_failed_cat IS INITIAL.
" 2. 성공 시 화면 튕김 방지를 위해 mapped는 비워두고, 이쁜 초록색 토스트 알림만 브로드캐스팅합니다.
APPEND VALUE #(
%cid = ls_key-%cid
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-success
text = '선택하신 카테고리가 안전하게 삭제되었습니다!'
)
) TO reported-zrtwbstask2.
ELSE.
" 3. 실패 시 에러 메시지 매핑 전파
LOOP AT ls_reported_cat-zrtwbscategory INTO DATA(ls_cat_report).
APPEND VALUE #(
%cid = ls_key-%cid
%msg = ls_cat_report-%msg
) TO reported-zrtwbstask2.
ENDLOOP.
ENDIF.
ENDIF.
ENDMETHOD.
2-4. MDE(Metadata Extension)에 버튼 배치
1
2
3
4
5
6
7
8
9
10
11
12
annotate view ZC_TWBS_TASK2 with
{
// ... 기존 필드 설정 유지 ...
@UI.lineItem: [
{ position: 10 },
// 툴바 좌측 상단에 '카테고리 추가' 버튼 배치 및 1단계의 액션 바인딩
{ type: #FOR_ACTION, dataAction: 'createCategory', label: '카테고리 추가', position: 1 }
{ type: #FOR_ACTION, dataAction: 'deleteCategory', label: '카테고리 삭제', position: 2, invocationGrouping: #ISOLATED }
]
ProgKey;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
