【BOPF】Action 구현

소개



CDS + BOPF로 Fiori 응용 프로그램을 만드는 시리즈의 연속입니다.
이번에는 Action을 사용하여 선택한 데이터를 복사하는 기능을 추가합니다.

마지막 기사
【BOPF】Determination, Validation 구현

이번 목표


  • UI에 복사 버튼이 표시되도록합니다
  • 복사 버튼을 누르면 선택한 행의 데이터가 복사됩니다.

    단계


  • BOPF에 Action 추가
  • UI 어노테이션 추가

  • BOPF에 Action 추가



    Action 등록



    지난번 과 같은 방식으로 BOPF의 루트 노드에 작업을 추가합니다.



    여기에서 활성화합니다.


    지금이지만, 기능 마다 다른 클래스가 되므로, 같은 BOPF에 속하는 클래스를 식별할 수 있는 명명으로 하는 것이 좋네요.

    생성된 클래스의 구조



    /BOBF/CL_LIB_A_SUPERCL_SIMPLE이라는 클래스를 상속합니다.

    /BOBF/IF_FRW_ACTION이라는 인터페이스가 구현되었습니다.

    Determination, Validation과 같이 메소드는 3개 있어, EXECUTE라고 하는 메소드를 재정의하게 되어 있습니다.


    Action 로직 구현



    이번에는 복사 기능을 만들기 때문에 다음 단계로 구현합니다.
    1. 처리 대상의 데이터(선택된 행)를 취득한다
    2. 선택한 행을 복사하고 새 데이터를 등록합니다.

    처리 대상의 데이터(선택된 행)를 취득한다



    Determination과 유사한 방식으로 처리할 데이터를 검색합니다.
        DATA: lt_data TYPE ztmob58_c_students.
    
        io_read->retrieve(
          EXPORTING
            iv_node                 = is_ctx-node_key        " Node Name
            it_key                  = it_key                 " Key Table
          IMPORTING
            et_data                 = lt_data                " Data Return Structure
        ).
    

    선택한 행을 복사하고 새 데이터를 등록합니다.



    먼저 두 개의 변수를 추가합니다.
        DATA: lt_data TYPE ztmob58_c_students,
              ls_copy TYPE zsmob58_c_students,
              lo_copy TYPE REF TO data.
    

    처리할 행을 복사하여 create 메서드에 전달합니다.
        LOOP AT lt_data INTO DATA(lw_data).
          "行をコピー
          ls_copy = VALUE #(
                             first_name = | { lw_data-first_name } _copy |  "コピーしたことがわかるように、末尾に_copyとつける
                             last_name  = lw_data-last_name
                             birthday   = lw_data-birthday
                             region     = lw_data-region
                             city       = lw_data-city
                             street     = lw_data-street
                             location   = lw_data-location
                            ).
    
          "データオブジェクトを登録      
          CREATE DATA lo_copy TYPE zsmob58_c_students.
          "データオブジェクトにコピーした行を参照させる
          ASSIGN lo_copy->* TO FIELD-SYMBOL(<fs_copy>).
          IF <fs_copy> IS ASSIGNED.
            <fs_copy> = ls_copy.
          ENDIF.
    
          io_modify->create(
            EXPORTING
              iv_node            = is_ctx-node_key   " Node to Create
              is_data            = lo_copy           " Data
            IMPORTING
              ev_key             = DATA(lv_key)
          ).
    
        ENDLOOP.
    

    데이터 객체와 필드 심볼이 나오고 복잡하지만 다음과 같은 작업을 수행합니다.
    ① 처리 대상 행을 복사하여 구조 ls_copy에 저장
    ②데이터 오브젝트를 등록(create 메소드의 인수 is_data가 오브젝트형이므로, 오브젝트형을 건네주기 위해)
    ③ 데이터 객체가 ls_copy의 내용을 참조하게 한다(필드 심볼을 경유하여)

    참고로 한 것은 다음 기사입니다.
    htps : // 에 prs. 안녕하세요 / 2019/04/06 / 에 2 에- 아 푸보 pf-에서 ぇ

    UI 어노테이션 추가



    화면에 COPY 버튼을 표시하려면 다음 UI 어노테이션을 추가합니다.@UI.lineItem: [{type:#FOR_ACTION, dataAction: 'BOPF:<ACTIONの名称>', label:'ボタンのテキスト'}]
    Metadata Extension은 전체적으로 다음과 같습니다.
    @Metadata.layer: #CORE
    annotate view ZMOB58_C_STUDENTS
        with 
    {
        @UI.selectionField: [{position: 10 }]
        @UI.lineItem: [{position: 10 }]
        @UI.identification: [{position: 10, label: 'First Name'}]
        first_name; 
        @UI.selectionField: [{position: 20 }]
        @UI.lineItem: [{position: 20 }]
        @UI.identification: [{position: 20, label: 'Last Name'}]
        last_name; 
        @UI.lineItem: [{position: 30 }]
        @UI.identification: [{position: 30, label: 'Birthday'}]
        birthday; 
        @UI.selectionField: [{position: 30 }]
        @UI.lineItem: [{position: 40}]
        @UI.identification: [{position: 40, label: 'Region'}]
        region; 
        @UI.lineItem: [{position: 50, type:#FOR_ACTION, dataAction: 'BOPF:COPY', label:'Copy'}]
        @UI.identification: [{position: 50, label: 'City'}]
        city; 
        @UI.identification: [{position: 60, label: 'Street'}]
        street; 
        @UI.identification: [{position: 70, label: 'Location'}]
        location;
    }
    

    문제



    이번에는 city라는 항목에 대해 action을 추가했지만 어떤 항목에 붙여도 동작은 변하지 않습니다. (행에 대한 액션이므로)
    다만, action을 부여한 항목은 리스트상에 표시되지 않게 된다는 거동을 합니다. 해결 방법은 조사할 수 없습니다.
    잠정책으로 표시되지 않아도 곤란하지 않은 항목에 action을 설정했습니다.

    2020/12/8 업데이트 : 다음과 같이 하나의 항목에 여러 lineItem 주석을 붙일 수 있습니다. 이렇게 하면 해당 항목이 목록에도 표시됩니다.
        @UI.lineItem: [
            { position: 10 },
            { position: 10, type:#FOR_ACTION, dataAction: 'BOPF:COPY', label:'Copy'}]
        first_name;
    

    실행 결과



    Copy 버튼을 누르면

    아무 일도 일어나지 않습니다.

    Go 버튼을 누르면 복사된 행이 표시됩니다.


    액션 후의 리프레쉬나, 메세지를 내는 등의 기능에 대해서는 연구가 필요할 것 같습니다. 우선, 액션이 동작하고 있는 것을 확인할 수 있었습니다.

    좋은 웹페이지 즐겨찾기