2편에선 Structure를 사용하여 ODATA를 진행했다면,
이번에는 Deep Structure를 사용하여 ODATA 실습을 어떤식으로 진행하는지 정리할 예정입니다.
아마 프로젝트에서 ODATA를 쓰시면 Deep을 쓸 경우가 생각보다 더 많이 있을거라
하시는 김에 Deep까지 마스터해서 가시면 매우 도움이 되실겁니다 !
시작하기전에 다들 아시겠지만, Deep structure의 개념에 대해 먼저 살펴본 후 진행하겠습니다.
내부적으로 구조체를 하나 더 갖고있는 형태 = Deep Structure.
구조체 안에 Table 형태를 Reference 하여 선언하는 형태가 바로 Deep Structure 입니다.
제가 예시로 만든 Deep Structure 입니다.
*중간 과정까진 Structure과 방법이 똑같고, 미리 Deep Structure를 생성해주세요.
6+1편의 방법에 따라 새로운 프로젝트를 생성해주세요.
동일하게 Data Model 우클릭 - [임포트] - [DDIC 구조] 클릭해줍니다.
이름을 입력해주시고, 생성하신 Structure 이름 넣어주세요.
Deep 구조로 잘 불러와졌는지 확인하고,
odata에 쓰고싶은 필드들만 체크해주시면 됩니다.
Test_Header와 Detailist 각각 키값을 하나씩 잡아준 것처럼
딥구조는 키 값을 각각 한개씩은 필수로 잡아줘야 합니다.
키값을 설정 후 Finish를 눌러 설정을 마무리 해주시면 됩니다.
DDIC 구조 설정을 완료 한 후 Properties를 확인하면 생성된 것을 확인할 수 있다.
이때 Properties의 필드 이름들을 대소문자를 구분하여 설정해줘야합니다. 대소문자 틀리면 인식이 안됩니다.
저는 앞글자만 대문자로 지정하여 진행하였는데, 이전 프로젝트에선 중간글자를 대문자로 해주었었습니다.
( 이건 협의 잘 보시는걸 추천드려요. 은근 헷갈려서 ... )
그리고 나서 Associations을 우클릭 해준 후 [생성] 으로 들어가주세요.
연관성 설정을 해주어야 하는데, 이는 Test_Header와 Detaillist를 연관시켜주기 위해서 하는 것입니다.
Deep Structure를 ODATA에서 사용하려면 필수로 진행해야 합니다.
그 후 Principal Key와 종속등록정보를 동일하게 작성해줘야합니다.
이때도 대소문자를 구분하기 때문에 대소문자 정확하게 작성해주시면 됩니다.
다음과 같은 창이 뜨면 [Finish] 를 눌러 마무리 해주시면 됩니다.
하단에 다음과 같은 성공 메세지가 뜨면 완료입니다.
이후 런타임 오브젝트 진행해주세요.
CLASS 생성 메세지가 뜨시면 됩니다.
이제 앞에서 진행하셨던 서비스 등록 해주시면 됩니다.
T-CODE : /IWFND/MAINT_SERVICE
서비스 등록 부분은 생략 하겠습니다 :)
다시 SEGW로 돌아오셔서 DPC_EXT으로 들어가주세요.
Structure와 달리 Deep Structure는 [Inherited Methods] - [/IWBEP/IF_MGW_APPL_SRV_RUNTIME]에서 CREATE_DEEP_ENTITY를 Redifine 해주셔야 합니다.
Redefinitions 폴더 들어가시면 Create Deep Entity가 Redifine 된 것을 확인할 수 있는데,
여기다 코드를 작성하시면 됩니다.
[ 예시코드 ]
TYPES : BEGIN OF TS_DATA,
WRITEDATE TYPE YTEST_STR01-WRITEDATE,
NAME1 TYPE YTEST_STR01-NAME1,
DOCNUM TYPE YTEST_STR01-DOCNUM,
DETAILLISTSET TYPE STANDARD TABLE OF YTEST_DETAIL WITH DEFAULT KEY,
END OF TS_DATA.
data : ls_deep type ts_data.
DATA : ls_header TYPE YTEST_DEEP01,
ls_item TYPE YTEST_DETAIL,
lt_item TYPE TABLE OF YTEST_DETAIL.
DATA : ls_hd00 TYPE ytest_header,
ls_item00 TYPE ytest_item,
lt_item00 TYPE TABLE OF ytest_item.
IF iv_source_name = 'TEST_HEADER'. "DATA를 받아주기 위한 METHOD
TRY.
CALL METHOD io_data_provider->read_entry_data
IMPORTING
es_data = ls_deep.
CATCH /iwbep/cx_mgw_tech_exception.
ENDTRY.
MOVE-CORRESPONDING ls_deep TO ls_hd00.
MOVE-CORRESPONDING ls_deep-DETAILLISTSET TO lt_item00.
ENDIF.
MODIFY ytest_header FROM ls_hd00.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
MODIFY ytest_item FROM TABLE lt_item00.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
CALL METHOD me->copy_data_to_ref "RETURN METHOD
EXPORTING
is_data = ls_deep
CHANGING
cr_data = er_deep_entity.
**TRY.
*CALL METHOD SUPER->/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY
* EXPORTING
** iv_entity_name =
** iv_entity_set_name =
** iv_source_name =
* IO_DATA_PROVIDER =
** it_key_tab =
** it_navigation_path =
* IO_EXPAND =
** io_tech_request_context =
** IMPORTING
** er_deep_entity =
* .
** CATCH /iwbep/cx_mgw_busi_exception.
** CATCH /iwbep/cx_mgw_tech_exception.
**ENDTRY.
endmethod.
결과를 담아줄 header과 item log 테이블을 만들어서 값을 담아줬습니다.
IF iv_source_name = 'TEST_HEADER'.
TRY.
CALL METHOD io_data_provider->read_entry_data
IMPORTING
es_data = ls_deep.
CATCH /iwbep/cx_mgw_tech_exception.
ENDTRY.
외부에서 API를 받기 위해서 이 METHOD로 받아줘야합니다. ( ls_deep 형태로 받는 것)
CALL METHOD me->copy_data_to_ref
EXPORTING
is_data = ls_deep
CHANGING
cr_data = er_deep_entity.
ls_deep 형태로 받은 API 데이터를 er_deep_entity에 넣어준다.
return값 받아주는건데, DEEP의 경우 필수이다.
Create deep entity method의 경우 er_deep_entity가 필수값으로 지정되어있기 때문.
copy_data_to_ref method를 사용하여 Return값을 받아주는 형식입니다.
저 두개 method는 필수적으로 로직에 추가해주시면 됩니다.
그리고 런타임 오브젝트를 해주시고
값을 확인하기 위해 External Debugging을 걸어주세요.
SAP GATEWAY로 들어가주시면 됩니다.
이전과 동일하게 Entityset 설정을 해주고 post 방식으로 진행하겠습니다.
DEEP구조는 JSON 코드 방식을 이렇게 자주셔야 합니다.
JSON 코드로 변환해주는 프로그램 하나 짜두시면 편하실거에요.
예시 코드로 드리겠습니다 :)
{
"Writedate" : "20230305",
"Name1" : "모늘",
"Docnum" : "2023030501",
"DetaillistSet" : [
{
"Writedate" : "20230305",
"Itemnum" : "123456",
"Itemname" : "커피",
"Itemmade" : "모늘나라" },
{
"Writedate" : "20230305",
"Itemnum" : "123456",
"Itemname" : "커피",
"Itemmade" : "모늘나라"
}
]
}
이때 대소문자 구분하시는거 주의하세요 !
이후 실행시켜주시면 됩니다.
그럼 이제 디버깅이 타지실텐데
LS_DEEP에 DEEP 구조로 데이터가 예쁘게 담기신걸 확인할 수 있습니다.
성공메세지가 뜨시면 성공입니다.
데이터가 LOG 테이블에 잘 담겼는지 HEADER TABLE과 ITEM TABLE을 확인해보겠습니다.
HEADER와 ITEM에 값이 잘 들어간 것을 확인할 수 있습니다.
설명을 잘 못하기도 했고 부족하기도 하겠지만
도움이 되셨으면 좋겠습니다.
언제든 궁금하신점 댓글로 달아주시면 답변 드리겠습니다!
[ABAP]SAP ODATA(1) (tistory.com)
[ABAP]SAP ODATA(1)
ABAP 개발자가 된지 6개월이 되었을 때 참여한 유지보수에서 ODATA라는 것을 처음 접하였습니다. 관련 자료도 한정적이고, 공부할 때 꽤나 애 먹었던 부분이라 공부 했던 것을 다시 정리할겸, ODATA
hsto.tistory.com
[ABAP]SAP ODATA(2) (tistory.com)
[ABAP]SAP ODATA(2)
ODATA를 공부하면서 가장 엥 스러웠던 부분들이 CLASS 부분이였다. 사실 아직까지도 정확하게 파악을 못했지만 .. 진행해보겠습니다 :) 1편의 내용대로 잘 따라하셨다면 6개의 CLASS들이 생성되어진
hsto.tistory.com
'ABAP > STUDY' 카테고리의 다른 글
[ABAP] 조회조건 동적변경(변수에 따른 TEXT 변경) (0) | 2023.03.21 |
---|---|
[ABAP] 조회화면 TEXT 변경 (TO/종료) (0) | 2023.03.21 |
[ABAP]SAP ODATA(2) (4) | 2023.03.13 |
[ABAP]SAP ODATA(1) (2) | 2023.03.13 |
댓글