-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathzcl_mcp_validation_demo.clas.abap
More file actions
201 lines (173 loc) · 6.93 KB
/
Copy pathzcl_mcp_validation_demo.clas.abap
File metadata and controls
201 lines (173 loc) · 6.93 KB
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
CLASS zcl_mcp_validation_demo DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS run_validation_demo.
PROTECTED SECTION.
PRIVATE SECTION.
METHODS call_mcp_validation_service
IMPORTING
iv_class_name TYPE string
iv_class_code TYPE string
iv_method_name TYPE string OPTIONAL
it_parameters TYPE string_table OPTIONAL
RETURNING
VALUE(rv_result) TYPE string.
ENDCLASS.
CLASS zcl_mcp_validation_demo IMPLEMENTATION.
METHOD run_validation_demo.
DATA: lv_class_code TYPE string,
lv_result TYPE string,
lt_parameters TYPE string_table.
" Define the class code for zcl_metadata_demo
lv_class_code = |CLASS zcl_metadata_demo DEFINITION| &&
| PUBLIC| &&
| FINAL| &&
| CREATE PUBLIC .| &&
|| &&
| PUBLIC SECTION.| &&
| METHODS run_demo.| &&
| METHODS get_mara_record| &&
| RETURNING| &&
| VALUE(rs_mara) TYPE mara.| &&
| METHODS get_material_number| &&
| RETURNING| &&
| VALUE(rv_matnr) TYPE matnr.| &&
|| &&
| PROTECTED SECTION.| &&
| PRIVATE SECTION.| &&
| TYPES ty_title TYPE c LENGTH 50.| &&
| DATA mo_metadata_service TYPE REF TO zcl_metadata_service.| &&
|| &&
| METHODS demo_cds_fields.| &&
| METHODS demo_table_fields.| &&
| METHODS demo_class_methods.| &&
| METHODS demo_functions.| &&
| METHODS test_mara_selection.| &&
| METHODS write_results| &&
| IMPORTING| &&
| iv_title TYPE ty_title| &&
| it_results TYPE ANY TABLE.| &&
|ENDCLASS.| &&
|| &&
|CLASS zcl_metadata_demo IMPLEMENTATION.| &&
|| &&
| METHOD run_demo.| &&
| " Initialize metadata service| &&
| CREATE OBJECT mo_metadata_service.| &&
|| &&
| " Run demonstrations| &&
| demo_cds_fields( ).| &&
| demo_table_fields( ).| &&
| demo_class_methods( ).| &&
| demo_functions( ).| &&
| test_mara_selection( ).| &&
| ENDMETHOD.| &&
|| &&
| METHOD get_mara_record.| &&
| " Select one record from MARA table with all fields| &&
| SELECT SINGLE *| &&
| FROM mara| &&
| INTO rs_mara.| &&
| ENDMETHOD.| &&
|| &&
| METHOD get_material_number.| &&
| " Select one material number from MARA table| &&
| SELECT SINGLE matnr| &&
| FROM mara| &&
| INTO rv_matnr.| &&
| ENDMETHOD.| &&
|| &&
| METHOD test_mara_selection.| &&
| " Test the MARA selection method| &&
| DATA: lv_matnr TYPE matnr.| &&
| lv_matnr = get_mara_record( )-matnr.| &&
| IF lv_matnr IS NOT INITIAL.| &&
| " Record found| &&
| ELSE.| &&
| " No record found| &&
| ENDIF.| &&
| ENDMETHOD.| &&
|| &&
|ENDCLASS.|.
" Prepare parameters for get_mara_record method call
APPEND '{"name": "rs_mara", "direction": "RETURNING", "type": "mara", "value": ""}' TO lt_parameters.
" Call the MCP validation service for syntax check first
WRITE: / '=== Syntax Validation ==='.
lv_result = call_mcp_validation_service(
iv_class_name = 'zcl_metadata_demo'
iv_class_code = lv_class_code
).
WRITE: / 'Syntax Result:', lv_result.
" Call the MCP validation service for method execution
WRITE: / '=== Method Execution ==='.
lv_result = call_mcp_validation_service(
iv_class_name = 'zcl_metadata_demo'
iv_class_code = lv_class_code
iv_method_name = 'get_mara_record'
it_parameters = lt_parameters
).
WRITE: / 'Execution Result:', lv_result.
ENDMETHOD.
METHOD call_mcp_validation_service.
DATA: lo_http_client TYPE REF TO if_http_client,
lv_url TYPE string,
lv_request_body TYPE string,
lv_response TYPE string,
lv_status_code TYPE i.
" Build the request URL (adjust to your system)
lv_url = '/sap/opu/odata4/sap/zsb_mcp_method_validate/srvd_a2x/sap/zsd_mcp_method_validate/0001/ZMCP_VALIDATE_RESULT'.
" Build JSON request body
lv_request_body = |{|.
lv_request_body = lv_request_body && |"CLASS_NAME": "| && iv_class_name && |",|.
lv_request_body = lv_request_body && |"CLASS_CODE": "| && iv_class_code && |"|.
IF iv_method_name IS NOT INITIAL.
lv_request_body = lv_request_body && |,"METHOD_NAME": "| && iv_method_name && |"|.
ENDIF.
IF lines( it_parameters ) > 0.
lv_request_body = lv_request_body && |,"PARAMETERS": [|.
LOOP AT it_parameters INTO DATA(lv_param).
IF sy-tabix > 1.
lv_request_body = lv_request_body && |,|.
ENDIF.
lv_request_body = lv_request_body && lv_param.
ENDLOOP.
lv_request_body = lv_request_body && |]|.
ENDIF.
lv_request_body = lv_request_body && |}|.
TRY.
" Create HTTP client
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_url
IMPORTING
client = lo_http_client.
" Set request method and headers
lo_http_client->request->set_method( 'POST' ).
lo_http_client->request->set_header_field(
name = 'Content-Type'
value = 'application/json'
).
lo_http_client->request->set_header_field(
name = 'Accept'
value = 'application/json'
).
" Set request body
lo_http_client->request->set_cdata( lv_request_body ).
" Send request
lo_http_client->send( ).
" Receive response
lo_http_client->receive( ).
" Get response
lv_response = lo_http_client->response->get_cdata( ).
lv_status_code = lo_http_client->response->get_status( )-code.
" Close connection
lo_http_client->close( ).
" Return result
rv_result = |Status: { lv_status_code }, Response: { lv_response }|.
CATCH cx_root INTO DATA(lx_error).
rv_result = |Error: { lx_error->get_text( ) }|.
ENDTRY.
ENDMETHOD.
ENDCLASS.