포스트

Cloud Release가 안된 View를 사용해야될 경우

Cloud Release가 안된 View를 사용해야될 경우

참고자료: HFB0011

1. 사용자 정의 CDS 뷰 생성

관련 이미지

  • 레이블을 입력하면 이름이 자동으로 입력 됨.
  • 외부 API로 생성(경고창이 뜨는 경우, 무시하고 진행해도 됨.) 관련 이미지

2. 요소 추가

관련 이미지

3. 사용자 정의 통신 시나리오 생성

  • 네이밍 패턴:YY1_[비즈니스영역]_[목적]
  • 시나리오 ID: PRODN_ROUTING_API (Communication Scenario)
  • 내역: 제품 라우팅 API 시나리오

관련 이미지

  1. 인바운드 서비스 등록
  2. 검색 > 사용자 정의 CDS뷰 이름(ZI_ProdnRoutingOpSubor) 입력
  3. 저장 > 게시 ※ 게시 후, [규약생성] 가능

사용자 정의 CDS뷰 검색하면, 앞서 정한 레이블에 접두가 YY1이 붙은 형태로 나옴

관련 이미지

관련 이미지

4. 규약생성

관련 이미지 규약생성을 누르면 자동으로 입력 됨.

관련 이미지

  1. 통신 시스템 > [신규]
  2. 정보입력
    1. 시스템 ID:YY1_[상대시스템명]_[비즈니스영역] 또는 Z_[상대시스템명]_[목적]
    2. 시스템 이름:(시스템 ID와 동일하게 입력하여 식별성 유지)
    3. Z_CLD_EXT_BYPASS_API : 클라우드 외부 API 라는 의미로 생성

관련 이미지

  1. 일반 > 호스트 이름 : 현재 URL(myXXXXXX.s4hana.cloud.sap)

관련 이미지

  1. 인바운드 통신 사용자 등록
  2. [신규 사용자] 등록

관련 이미지

  1. 정보입력 후, 생성 (비밀번호 최소 길이: 20자) - ZEXT_BYPASS_USERitm0526!@

관련 이미지

  1. 확인

관련 이미지

  1. 신규 아웃바운드 사용자 등록 (인바운드 사용자와 동일하게) 후, 저

관련 이미지

5. 통신규약 복귀 후, 앞서 등록한 통신시스템 및 사용자 등록

  1. 등록 후, 서비스 URL/서비스 인터페이스 [복사]
  2. WSDL/서비스 메타데이터 [다운로드]

관련 이미지

6. 사용자 정의 통신 시나리오 > 아웃바운드 서비스 등록

  1. 편집 > 추가
  2. 통신규약 인바운드 서비스와 동일한 이름/URL 로 지정
  3. 저장 후, 게시

관련 이미지 관련 이미지

7. 통신규약 설정

  1. 아웃바운드 통신 사용자 선택
  2. 아웃바운드 서비스 활성화 관련 이미지

8. Service Consumption Model (SRVC) 생성

  1. New > Business Services > Service Consumption Model 을 생성합니다.
  2. Remote Consumption Mode: OData

관련 이미지

9. 다운로드 받은 xml 임포트 후 [Next]

관련 이미지

10. 확인

관련 이미지

11. Custom Entity 생성

1
2
3
4
5
6
7
8
9
10
11
@EndUserText.label: '공정 하위 작업 외부 API 매핑 엔티티'
@ObjectModel.query.implementedBy: 'ZCL_PRODN_ROUTING_PROVIDER'
define custom entity ZI_PRODNROUTINGOPSUBORD
{
  key BillOfOperationsType : abap.char(1);
  key ProductionRoutingGroup : abap.char(8);
  key ProductionRoutingOpIntID : abap.char(8);
  key ProductionRoutingOpIntVersion : abap.char(8);
  Operation : abap.char(4);
  Plant : abap.char(4);
}

12. Class 생성

  • ZCL_PRODN_ROUTING_PROVIDER 이름으로 CLASS 생성
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
CLASS zcl_prodn_routing_provider DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_rap_query_provider.

    TYPES tt_result TYPE STANDARD TABLE OF zi_prodnroutingopsubord WITH EMPTY KEY.

    CLASS-METHODS get_data
      IMPORTING
        io_filter      TYPE REF TO if_rap_query_filter OPTIONAL
        iv_top         TYPE int8 OPTIONAL
        iv_skip        TYPE int8 OPTIONAL
      RETURNING
        VALUE(rt_data) TYPE tt_result.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_prodn_routing_provider IMPLEMENTATION.

  METHOD get_data.
    DATA: lo_http_client  TYPE REF TO if_web_http_client,
          lo_client_proxy TYPE REF TO /iwbep/if_cp_client_proxy,
          lo_request      TYPE REF TO /iwbep/if_cp_request_read_list,
          lo_response     TYPE REF TO /iwbep/if_cp_response_read_lst.

    DATA lt_business_data TYPE TABLE OF zsc_prodn_routing_subor=>tys_yy_1_zi_prodn_routing_op_2.

    TRY.
        DATA(lo_destination) = cl_http_destination_provider=>create_by_comm_arrangement(
          comm_scenario = 'YY1_ZCS_PRODN_ROUTING'
        ).
        lo_http_client = cl_web_http_client_manager=>create_by_http_destination( lo_destination ).

        lo_client_proxy = /iwbep/cl_cp_factory_remote=>create_v2_remote_proxy(
          EXPORTING
            is_proxy_model_key       = VALUE #(
              repository_id       = 'DEFAULT'
              proxy_model_id      = 'ZSC_PRODN_ROUTING_SUBOR'
              proxy_model_version = '0001' )
            io_http_client         = lo_http_client
            iv_relative_service_root = '' ).

        lo_request = lo_client_proxy->create_resource_for_entity_set( 'YY_1_ZI_PRODN_ROUTING_OP_S' )->create_request_for_read( ).

        IF io_filter IS BOUND.
          DATA(lt_all_filters) = io_filter->get_as_ranges( ).
          DATA(lo_filter_factory) = lo_request->create_filter_factory( ).
          DATA lo_root_node TYPE REF TO /iwbep/if_cp_filter_node.

          LOOP AT lt_all_filters INTO DATA(ls_filter).
            DATA lv_property_path TYPE string.
            CLEAR lv_property_path.

            CASE to_upper( ls_filter-name ).
              WHEN 'BILLOFOPERATIONSTYPE'.
                lv_property_path = 'BILL_OF_OPERATIONS_TYPE'.
              WHEN 'PRODUCTIONROUTINGGROUP'.
                lv_property_path = 'PRODUCTION_ROUTING_GROUP'.
              WHEN 'PRODUCTIONROUTINGOPINTID'.
                lv_property_path = 'PRODUCTION_ROUTING_OP_INT_ID'.
              WHEN 'PRODUCTIONROUTINGOPINTVERSION'.
                lv_property_path = 'PRODUCTION_ROUTING_OP_INT_VERSION'.
              WHEN 'OPERATION'.
                lv_property_path = 'OPERATION'.
              WHEN 'PLANT'.
                lv_property_path = 'PLANT'.
              WHEN OTHERS.
                CONTINUE.
            ENDCASE.

            DATA(lo_node) = lo_filter_factory->create_by_range(
              iv_property_path = lv_property_path
              it_range         = ls_filter-range ).

            IF lo_root_node IS NOT BOUND.
              lo_root_node = lo_node.
            ELSE.
              lo_root_node = lo_root_node->and( lo_node ).
            ENDIF.
          ENDLOOP.

          IF lo_root_node IS BOUND.
            lo_request->set_filter( lo_root_node ).
          ENDIF.
        ENDIF.

        IF iv_top > 0.
          lo_request->set_top( CONV i( iv_top ) ).
        ENDIF.

        IF iv_skip > 0.
          lo_request->set_skip( CONV i( iv_skip ) ).
        ENDIF.

        lo_response = lo_request->execute( ).
        lo_response->get_business_data( IMPORTING et_business_data = lt_business_data ).

        LOOP AT lt_business_data INTO DATA(ls_business).
          DATA lv_op_int_id TYPE string.
          DATA lv_op_int_ver TYPE string.
          FIELD-SYMBOLS <lv_any> TYPE any.

          ASSIGN COMPONENT 'PRODUCTION_ROUTING_OP_INT_ID' OF STRUCTURE ls_business TO <lv_any>.
          IF sy-subrc = 0.
            lv_op_int_id = <lv_any>.
          ELSE.
            ASSIGN COMPONENT 'PRODUCTION_ROUTING_OP_INT' OF STRUCTURE ls_business TO <lv_any>.
            IF sy-subrc = 0.
              lv_op_int_id = <lv_any>.
            ENDIF.
          ENDIF.

          ASSIGN COMPONENT 'PRODUCTION_ROUTING_OP_INT_VERSION' OF STRUCTURE ls_business TO <lv_any>.
          IF sy-subrc = 0.
            lv_op_int_ver = <lv_any>.
          ELSE.
            ASSIGN COMPONENT 'PRODUCTION_ROUTING_OP_IN_2' OF STRUCTURE ls_business TO <lv_any>.
            IF sy-subrc = 0.
              lv_op_int_ver = <lv_any>.
            ENDIF.
          ENDIF.

          APPEND VALUE #(
            billofoperationstype          = ls_business-bill_of_operations_type
            productionroutinggroup        = ls_business-production_routing_group
            productionroutingopintid      = lv_op_int_id
            productionroutingopintversion = lv_op_int_ver
            operation                     = ls_business-operation
            plant                         = ls_business-plant ) TO rt_data.
        ENDLOOP.

      CATCH /iwbep/cx_cp_remote.
        CLEAR rt_data.
      CATCH /iwbep/cx_gateway.
        CLEAR rt_data.
      CATCH cx_web_http_client_error.
        CLEAR rt_data.
      CATCH cx_root.
        CLEAR rt_data.
    ENDTRY.
  ENDMETHOD.

  METHOD if_rap_query_provider~select.
    DATA lv_top  TYPE int8.
    DATA lv_skip TYPE int8.

    DATA(lo_paging) = io_request->get_paging( ).
    IF lo_paging IS BOUND.
      IF lo_paging->get_page_size( ) <> if_rap_query_paging=>page_size_unlimited.
        lv_top = lo_paging->get_page_size( ).
      ENDIF.
      IF lo_paging->get_offset( ) > 0.
        lv_skip = lo_paging->get_offset( ).
      ENDIF.
    ENDIF.

    DATA(lo_filter) = io_request->get_filter( ).
    DATA(lt_result) = get_data(
      io_filter = lo_filter
      iv_top    = lv_top
      iv_skip   = lv_skip ).

    IF io_request->is_total_numb_of_rec_requested( ).
      DATA(lt_count_result) = get_data( io_filter = lo_filter ).
      io_response->set_total_number_of_records( lines( lt_count_result ) ).
    ENDIF.

    IF io_request->is_data_requested( ).
      io_response->set_data( lt_result ).
    ENDIF.
  ENDMETHOD.
ENDCLASS.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.