포스트

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 라이센스를 따릅니다.