@linkup-ai/abap-ai 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +384 -0
- package/dist/adt-client.js +364 -0
- package/dist/cli/activate.js +113 -0
- package/dist/cli/init.js +333 -0
- package/dist/cli/remove.js +80 -0
- package/dist/cli/status.js +229 -0
- package/dist/cli/systems.js +68 -0
- package/dist/cli.js +81 -0
- package/dist/index.js +1318 -0
- package/dist/knowledge/abap/abap-dictionary.md +199 -0
- package/dist/knowledge/abap/abap-sql.md +296 -0
- package/dist/knowledge/abap/amdp.md +273 -0
- package/dist/knowledge/abap/clean-code.md +293 -0
- package/dist/knowledge/abap/cloud-background-processing.md +250 -0
- package/dist/knowledge/abap/cloud-communication.md +265 -0
- package/dist/knowledge/abap/cloud-development.md +176 -0
- package/dist/knowledge/abap/cloud-extensibility.md +252 -0
- package/dist/knowledge/abap/cloud-released-apis.md +261 -0
- package/dist/knowledge/abap/constructor-expressions.md +289 -0
- package/dist/knowledge/abap/enhancements.md +232 -0
- package/dist/knowledge/abap/exceptions.md +271 -0
- package/dist/knowledge/abap/internal-tables.md +205 -0
- package/dist/knowledge/abap/object-orientation.md +298 -0
- package/dist/knowledge/abap/performance.md +216 -0
- package/dist/knowledge/abap/rap-abstract-entities.md +206 -0
- package/dist/knowledge/abap/rap-business-events.md +216 -0
- package/dist/knowledge/abap/rap-draft.md +191 -0
- package/dist/knowledge/abap/rap-eml.md +453 -0
- package/dist/knowledge/abap/rap-end-to-end.md +486 -0
- package/dist/knowledge/abap/rap-feature-control.md +185 -0
- package/dist/knowledge/abap/rap-numbering.md +280 -0
- package/dist/knowledge/abap/rap-service-exposure.md +163 -0
- package/dist/knowledge/abap/rap-unmanaged.md +468 -0
- package/dist/knowledge/abap/string-processing.md +180 -0
- package/dist/knowledge/abap/unit-testing.md +303 -0
- package/dist/knowledge/abap-cds/access-control.md +241 -0
- package/dist/knowledge/abap-cds/annotations.md +331 -0
- package/dist/knowledge/abap-cds/associations.md +254 -0
- package/dist/knowledge/abap-cds/expressions.md +230 -0
- package/dist/knowledge/abap-cds/functions.md +245 -0
- package/dist/knowledge/abap-cds/metadata-extensions.md +294 -0
- package/dist/knowledge/cap/authentication.md +278 -0
- package/dist/knowledge/cap/cdl-syntax.md +247 -0
- package/dist/knowledge/cap/cql-queries.md +266 -0
- package/dist/knowledge/cap/deployment.md +343 -0
- package/dist/knowledge/cap/event-handlers.md +287 -0
- package/dist/knowledge/cap/fiori-integration.md +303 -0
- package/dist/knowledge/cap/service-definitions.md +287 -0
- package/dist/knowledge/fiori/annotations.md +347 -0
- package/dist/knowledge/fiori/deployment.md +340 -0
- package/dist/knowledge/fiori/fiori-elements.md +332 -0
- package/dist/knowledge/fiori/fiori-side-effects.md +107 -0
- package/dist/knowledge/fiori/fiori-valuelist.md +144 -0
- package/dist/knowledge/fiori/ui5-controllers.md +358 -0
- package/dist/knowledge/fiori/ui5-data-binding.md +311 -0
- package/dist/knowledge/fiori/ui5-fragments-dialogs.md +330 -0
- package/dist/knowledge/fiori/ui5-manifest.md +411 -0
- package/dist/knowledge/fiori/ui5-routing.md +303 -0
- package/dist/knowledge/fiori/ui5-xml-views.md +294 -0
- package/dist/logger.js +114 -0
- package/dist/system-profile.js +207 -0
- package/dist/tools/abap-doc.js +72 -0
- package/dist/tools/abapgit.js +161 -0
- package/dist/tools/activate.js +68 -0
- package/dist/tools/atc-check.js +117 -0
- package/dist/tools/auth-object.js +56 -0
- package/dist/tools/breakpoints.js +76 -0
- package/dist/tools/call-hierarchy.js +84 -0
- package/dist/tools/cds-annotations.js +98 -0
- package/dist/tools/cds-dependencies.js +65 -0
- package/dist/tools/check.js +47 -0
- package/dist/tools/code-completion.js +70 -0
- package/dist/tools/code-coverage.js +111 -0
- package/dist/tools/create-amdp.js +111 -0
- package/dist/tools/create-dcl.js +81 -0
- package/dist/tools/create-transport.js +38 -0
- package/dist/tools/create.js +285 -0
- package/dist/tools/data-preview.js +37 -0
- package/dist/tools/delete.js +45 -0
- package/dist/tools/deploy-bsp.js +298 -0
- package/dist/tools/discovery.js +59 -0
- package/dist/tools/element-info.js +93 -0
- package/dist/tools/enhancements.js +186 -0
- package/dist/tools/extract-method.js +44 -0
- package/dist/tools/function-group.js +59 -0
- package/dist/tools/knowledge.js +275 -0
- package/dist/tools/lock-object.js +75 -0
- package/dist/tools/message-class.js +67 -0
- package/dist/tools/navigate.js +80 -0
- package/dist/tools/number-range.js +57 -0
- package/dist/tools/object-documentation.js +43 -0
- package/dist/tools/object-structure.js +78 -0
- package/dist/tools/object-versions.js +57 -0
- package/dist/tools/package-contents.js +60 -0
- package/dist/tools/pretty-printer.js +35 -0
- package/dist/tools/publish-binding.js +49 -0
- package/dist/tools/quick-fix.js +69 -0
- package/dist/tools/read.js +167 -0
- package/dist/tools/refactor-rename.js +60 -0
- package/dist/tools/release-transport.js +24 -0
- package/dist/tools/released-apis.js +51 -0
- package/dist/tools/repository-tree.js +90 -0
- package/dist/tools/scaffold-rap.js +642 -0
- package/dist/tools/search.js +73 -0
- package/dist/tools/shared/data-format.js +101 -0
- package/dist/tools/sql-console.js +17 -0
- package/dist/tools/system-info.js +270 -0
- package/dist/tools/traces.js +66 -0
- package/dist/tools/transport-contents.js +83 -0
- package/dist/tools/transports.js +67 -0
- package/dist/tools/unit-test.js +135 -0
- package/dist/tools/where-used.js +59 -0
- package/dist/tools/write.js +101 -0
- package/package.json +49 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
# RAP & EML — behavior definition, CRUD, actions, draft
|
|
2
|
+
|
|
3
|
+
## Behavior Definition (BDEF)
|
|
4
|
+
|
|
5
|
+
```cds
|
|
6
|
+
managed implementation in class zbp_z_order unique;
|
|
7
|
+
strict ( 2 );
|
|
8
|
+
|
|
9
|
+
define behavior for ZI_Order alias Order
|
|
10
|
+
persistent table ztab_order
|
|
11
|
+
lock master
|
|
12
|
+
authorization master ( instance )
|
|
13
|
+
etag master changed_at
|
|
14
|
+
{
|
|
15
|
+
create;
|
|
16
|
+
update;
|
|
17
|
+
delete;
|
|
18
|
+
|
|
19
|
+
field ( readonly ) order_id;
|
|
20
|
+
field ( readonly : update ) order_id;
|
|
21
|
+
field ( mandatory ) customer, amount;
|
|
22
|
+
|
|
23
|
+
association _Item { create; }
|
|
24
|
+
|
|
25
|
+
action confirm result [1] $self;
|
|
26
|
+
static action recalculate_all;
|
|
27
|
+
internal action set_defaults;
|
|
28
|
+
factory action copy [1];
|
|
29
|
+
|
|
30
|
+
determination set_number on save { create; }
|
|
31
|
+
determination calc_total on modify { field quantity, price; }
|
|
32
|
+
|
|
33
|
+
validation check_customer on save { create; update; field customer; }
|
|
34
|
+
validation check_amount on save { create; field amount; }
|
|
35
|
+
|
|
36
|
+
mapping for ztab_order corresponding;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
define behavior for ZI_OrderItem alias Item
|
|
40
|
+
persistent table ztab_order_item
|
|
41
|
+
lock dependent by _Order
|
|
42
|
+
authorization dependent by _Order
|
|
43
|
+
{
|
|
44
|
+
update;
|
|
45
|
+
delete;
|
|
46
|
+
|
|
47
|
+
field ( readonly ) order_id, item_id;
|
|
48
|
+
|
|
49
|
+
association _Order;
|
|
50
|
+
|
|
51
|
+
mapping for ztab_order_item corresponding;
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## BDEF Specifications
|
|
56
|
+
|
|
57
|
+
```cds
|
|
58
|
+
" Standard operations
|
|
59
|
+
create;
|
|
60
|
+
update;
|
|
61
|
+
delete( precheck );
|
|
62
|
+
|
|
63
|
+
" Associations
|
|
64
|
+
association _Child { create; }
|
|
65
|
+
|
|
66
|
+
" Actions and functions
|
|
67
|
+
action act1 result [1] $self;
|
|
68
|
+
static action act2;
|
|
69
|
+
internal action act3;
|
|
70
|
+
factory action act4 [1];
|
|
71
|
+
function get_items result [0..*] ZI_OrderItem;
|
|
72
|
+
|
|
73
|
+
" Field characteristics
|
|
74
|
+
field ( readonly ) field1;
|
|
75
|
+
field ( readonly : update ) key_field;
|
|
76
|
+
field ( mandatory ) field2, field3;
|
|
77
|
+
field ( features : instance ) field4;
|
|
78
|
+
|
|
79
|
+
" Determinations
|
|
80
|
+
determination det1 on save { create; }
|
|
81
|
+
determination det2 on modify { field field1, field2; }
|
|
82
|
+
|
|
83
|
+
" Validations
|
|
84
|
+
validation val1 on save { create; update; field field1; }
|
|
85
|
+
|
|
86
|
+
" Lock and authorization
|
|
87
|
+
lock master
|
|
88
|
+
lock dependent by _Parent
|
|
89
|
+
authorization master ( instance )
|
|
90
|
+
authorization dependent by _Parent
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## ABAP Behavior Pool — Global Class
|
|
94
|
+
|
|
95
|
+
```abap
|
|
96
|
+
CLASS zbp_z_order DEFINITION PUBLIC ABSTRACT FINAL
|
|
97
|
+
FOR BEHAVIOR OF zi_order.
|
|
98
|
+
ENDCLASS.
|
|
99
|
+
|
|
100
|
+
CLASS zbp_z_order IMPLEMENTATION.
|
|
101
|
+
ENDCLASS.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Handler Class (Local)
|
|
105
|
+
|
|
106
|
+
```abap
|
|
107
|
+
CLASS lhc_order DEFINITION INHERITING FROM cl_abap_behavior_handler.
|
|
108
|
+
PRIVATE SECTION.
|
|
109
|
+
METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION
|
|
110
|
+
IMPORTING keys REQUEST requested_authorizations
|
|
111
|
+
FOR Order RESULT result.
|
|
112
|
+
|
|
113
|
+
METHODS create FOR MODIFY
|
|
114
|
+
IMPORTING entities FOR CREATE Order.
|
|
115
|
+
|
|
116
|
+
METHODS update FOR MODIFY
|
|
117
|
+
IMPORTING entities FOR UPDATE Order.
|
|
118
|
+
|
|
119
|
+
METHODS delete FOR MODIFY
|
|
120
|
+
IMPORTING keys FOR DELETE Order.
|
|
121
|
+
|
|
122
|
+
METHODS read FOR READ
|
|
123
|
+
IMPORTING keys FOR READ Order RESULT result.
|
|
124
|
+
|
|
125
|
+
METHODS confirm FOR MODIFY
|
|
126
|
+
IMPORTING keys FOR ACTION Order~confirm RESULT result.
|
|
127
|
+
|
|
128
|
+
METHODS set_number FOR DETERMINE ON SAVE
|
|
129
|
+
IMPORTING keys FOR Order~set_number.
|
|
130
|
+
|
|
131
|
+
METHODS check_customer FOR VALIDATE ON SAVE
|
|
132
|
+
IMPORTING keys FOR Order~check_customer.
|
|
133
|
+
ENDCLASS.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Saver Class (Unmanaged/Additional Save)
|
|
137
|
+
|
|
138
|
+
```abap
|
|
139
|
+
CLASS lsc_order DEFINITION INHERITING FROM cl_abap_behavior_saver.
|
|
140
|
+
PROTECTED SECTION.
|
|
141
|
+
METHODS finalize REDEFINITION.
|
|
142
|
+
METHODS check_before_save REDEFINITION.
|
|
143
|
+
METHODS adjust_numbers REDEFINITION.
|
|
144
|
+
METHODS save REDEFINITION.
|
|
145
|
+
METHODS cleanup REDEFINITION.
|
|
146
|
+
METHODS cleanup_finalize REDEFINITION.
|
|
147
|
+
ENDCLASS.
|
|
148
|
+
|
|
149
|
+
CLASS lsc_order IMPLEMENTATION.
|
|
150
|
+
METHOD save.
|
|
151
|
+
" Persist transactional buffer to database
|
|
152
|
+
ENDMETHOD.
|
|
153
|
+
METHOD cleanup.
|
|
154
|
+
" Clear transactional buffer
|
|
155
|
+
ENDMETHOD.
|
|
156
|
+
ENDCLASS.
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## BDEF Derived Types
|
|
160
|
+
|
|
161
|
+
```abap
|
|
162
|
+
" Table types
|
|
163
|
+
DATA zt_create TYPE TABLE FOR CREATE zi_order.
|
|
164
|
+
DATA zt_update TYPE TABLE FOR UPDATE zi_order.
|
|
165
|
+
DATA zt_delete TYPE TABLE FOR DELETE zi_order.
|
|
166
|
+
DATA zt_read TYPE TABLE FOR READ IMPORT zi_order.
|
|
167
|
+
DATA zt_result TYPE TABLE FOR READ RESULT zi_order.
|
|
168
|
+
DATA zt_action TYPE TABLE FOR ACTION IMPORT zi_order~confirm.
|
|
169
|
+
|
|
170
|
+
" Response types
|
|
171
|
+
DATA zs_mapped TYPE RESPONSE FOR MAPPED zi_order.
|
|
172
|
+
DATA zs_failed TYPE RESPONSE FOR FAILED zi_order.
|
|
173
|
+
DATA zs_reported TYPE RESPONSE FOR REPORTED zi_order.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Special Components (% Prefixed)
|
|
177
|
+
|
|
178
|
+
```abap
|
|
179
|
+
" %cid — content ID for new instances (before key assignment)
|
|
180
|
+
zt_create = VALUE #( (
|
|
181
|
+
%cid = 'new_order_1'
|
|
182
|
+
customer = 'CUST100'
|
|
183
|
+
amount = 500 ) ).
|
|
184
|
+
|
|
185
|
+
" %cid_ref — reference %cid of parent in deep create
|
|
186
|
+
" %key — primary key fields only
|
|
187
|
+
" %tky — primary key + draft indicator (preferred)
|
|
188
|
+
zt_delete = VALUE #( ( %tky = VALUE #( order_id = '1000' ) ) ).
|
|
189
|
+
|
|
190
|
+
" %control — flags which fields are provided
|
|
191
|
+
zt_update = VALUE #( (
|
|
192
|
+
order_id = '1000'
|
|
193
|
+
status = 'C'
|
|
194
|
+
%control = VALUE #(
|
|
195
|
+
order_id = if_abap_behv=>mk-off
|
|
196
|
+
status = if_abap_behv=>mk-on ) ) ).
|
|
197
|
+
|
|
198
|
+
" %data — all key + data fields
|
|
199
|
+
zt_create = VALUE #( (
|
|
200
|
+
%cid = 'cid1'
|
|
201
|
+
%data = VALUE #( customer = 'CUST100' amount = 500 ) ) ).
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## EML CREATE
|
|
205
|
+
|
|
206
|
+
```abap
|
|
207
|
+
" Short form — FIELDS list
|
|
208
|
+
MODIFY ENTITY zi_order
|
|
209
|
+
CREATE FIELDS ( customer amount )
|
|
210
|
+
WITH VALUE #(
|
|
211
|
+
( %cid = 'cid1' customer = 'CUST100' amount = 500 )
|
|
212
|
+
( %cid = 'cid2' customer = 'CUST200' amount = 300 ) )
|
|
213
|
+
MAPPED DATA(mapped)
|
|
214
|
+
FAILED DATA(failed)
|
|
215
|
+
REPORTED DATA(reported).
|
|
216
|
+
|
|
217
|
+
" Long form — %control
|
|
218
|
+
MODIFY ENTITIES OF zi_order
|
|
219
|
+
ENTITY Order
|
|
220
|
+
CREATE FROM VALUE #( (
|
|
221
|
+
%cid = 'cid1'
|
|
222
|
+
customer = 'CUST100'
|
|
223
|
+
amount = 500
|
|
224
|
+
%control = VALUE #(
|
|
225
|
+
customer = if_abap_behv=>mk-on
|
|
226
|
+
amount = if_abap_behv=>mk-on ) ) )
|
|
227
|
+
MAPPED DATA(m) FAILED DATA(f) REPORTED DATA(r).
|
|
228
|
+
|
|
229
|
+
" AUTO FILL CID
|
|
230
|
+
MODIFY ENTITIES OF zi_order
|
|
231
|
+
ENTITY Order
|
|
232
|
+
CREATE AUTO FILL CID
|
|
233
|
+
WITH VALUE #( ( customer = 'CUST100' amount = 500
|
|
234
|
+
%control = VALUE #(
|
|
235
|
+
customer = if_abap_behv=>mk-on
|
|
236
|
+
amount = if_abap_behv=>mk-on ) ) )
|
|
237
|
+
MAPPED DATA(m2) FAILED DATA(f2) REPORTED DATA(r2).
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## EML UPDATE
|
|
241
|
+
|
|
242
|
+
```abap
|
|
243
|
+
" Short form
|
|
244
|
+
MODIFY ENTITY zi_order
|
|
245
|
+
UPDATE FIELDS ( status )
|
|
246
|
+
WITH VALUE #( ( order_id = '1000' status = 'C' ) )
|
|
247
|
+
FAILED DATA(f) REPORTED DATA(r).
|
|
248
|
+
|
|
249
|
+
" Long form
|
|
250
|
+
MODIFY ENTITIES OF zi_order
|
|
251
|
+
ENTITY Order
|
|
252
|
+
UPDATE FROM VALUE #( (
|
|
253
|
+
order_id = '1000'
|
|
254
|
+
status = 'C'
|
|
255
|
+
%control = VALUE #(
|
|
256
|
+
status = if_abap_behv=>mk-on ) ) )
|
|
257
|
+
FAILED DATA(f2) REPORTED DATA(r2).
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## EML DELETE
|
|
261
|
+
|
|
262
|
+
```abap
|
|
263
|
+
MODIFY ENTITY zi_order
|
|
264
|
+
DELETE FROM VALUE #(
|
|
265
|
+
( order_id = '1000' )
|
|
266
|
+
( order_id = '2000' ) )
|
|
267
|
+
FAILED DATA(f) REPORTED DATA(r).
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## EML READ
|
|
271
|
+
|
|
272
|
+
```abap
|
|
273
|
+
" Specific fields
|
|
274
|
+
READ ENTITY zi_order
|
|
275
|
+
FIELDS ( customer amount status )
|
|
276
|
+
WITH VALUE #( ( order_id = '1000' ) )
|
|
277
|
+
RESULT DATA(zt_result)
|
|
278
|
+
FAILED DATA(f) REPORTED DATA(r).
|
|
279
|
+
|
|
280
|
+
" All fields
|
|
281
|
+
READ ENTITY zi_order
|
|
282
|
+
ALL FIELDS
|
|
283
|
+
WITH VALUE #( ( order_id = '1000' ) )
|
|
284
|
+
RESULT DATA(zt_all).
|
|
285
|
+
|
|
286
|
+
" Read by association
|
|
287
|
+
READ ENTITIES OF zi_order
|
|
288
|
+
ENTITY Order
|
|
289
|
+
BY \_Item
|
|
290
|
+
FIELDS ( item_id description quantity )
|
|
291
|
+
WITH VALUE #( ( order_id = '1000' ) )
|
|
292
|
+
RESULT DATA(zt_items)
|
|
293
|
+
FAILED DATA(f2) REPORTED DATA(r2).
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Deep Create (Parent + Children)
|
|
297
|
+
|
|
298
|
+
```abap
|
|
299
|
+
MODIFY ENTITIES OF zi_order
|
|
300
|
+
ENTITY Order
|
|
301
|
+
CREATE FIELDS ( customer amount )
|
|
302
|
+
WITH VALUE #( (
|
|
303
|
+
%cid = 'cid_order'
|
|
304
|
+
customer = 'CUST100'
|
|
305
|
+
amount = 800 ) )
|
|
306
|
+
|
|
307
|
+
CREATE BY \_Item
|
|
308
|
+
FIELDS ( item_id description quantity )
|
|
309
|
+
WITH VALUE #( (
|
|
310
|
+
%cid_ref = 'cid_order'
|
|
311
|
+
%target = VALUE #(
|
|
312
|
+
( %cid = 'cid_item1' item_id = 10 description = `Widget` quantity = 5 )
|
|
313
|
+
( %cid = 'cid_item2' item_id = 20 description = `Gadget` quantity = 3 ) ) ) )
|
|
314
|
+
|
|
315
|
+
MAPPED DATA(mapped) FAILED DATA(failed) REPORTED DATA(reported).
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Action Execution
|
|
319
|
+
|
|
320
|
+
```abap
|
|
321
|
+
MODIFY ENTITY zi_order
|
|
322
|
+
EXECUTE confirm
|
|
323
|
+
FROM VALUE #( ( order_id = '1000' ) )
|
|
324
|
+
RESULT DATA(zt_action_result)
|
|
325
|
+
FAILED DATA(f) REPORTED DATA(r).
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## COMMIT and ROLLBACK
|
|
329
|
+
|
|
330
|
+
```abap
|
|
331
|
+
" Persist all changes
|
|
332
|
+
COMMIT ENTITIES
|
|
333
|
+
RESPONSE OF zi_order
|
|
334
|
+
MAPPED DATA(mapped)
|
|
335
|
+
FAILED DATA(failed)
|
|
336
|
+
REPORTED DATA(reported).
|
|
337
|
+
|
|
338
|
+
" Check for errors
|
|
339
|
+
IF failed IS NOT INITIAL.
|
|
340
|
+
" Handle failures
|
|
341
|
+
ENDIF.
|
|
342
|
+
|
|
343
|
+
" Discard all changes
|
|
344
|
+
ROLLBACK ENTITIES.
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## IN LOCAL MODE
|
|
348
|
+
|
|
349
|
+
```abap
|
|
350
|
+
" Bypass authorization and feature control within ABP
|
|
351
|
+
MODIFY ENTITY zi_order IN LOCAL MODE
|
|
352
|
+
CREATE FIELDS ( customer amount )
|
|
353
|
+
WITH VALUE #( ( %cid = 'cid1' customer = 'SYS' amount = 0 ) )
|
|
354
|
+
MAPPED DATA(m) FAILED DATA(f) REPORTED DATA(r).
|
|
355
|
+
|
|
356
|
+
READ ENTITY zi_order IN LOCAL MODE
|
|
357
|
+
ALL FIELDS WITH VALUE #( ( order_id = '1000' ) )
|
|
358
|
+
RESULT DATA(zt_data).
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## Validation Implementation
|
|
362
|
+
|
|
363
|
+
```abap
|
|
364
|
+
METHOD check_customer.
|
|
365
|
+
READ ENTITIES OF zi_order IN LOCAL MODE
|
|
366
|
+
ENTITY Order
|
|
367
|
+
FIELDS ( customer )
|
|
368
|
+
WITH CORRESPONDING #( keys )
|
|
369
|
+
RESULT DATA(zt_orders).
|
|
370
|
+
|
|
371
|
+
LOOP AT zt_orders INTO DATA(zs_order).
|
|
372
|
+
IF zs_order-customer IS INITIAL.
|
|
373
|
+
APPEND VALUE #(
|
|
374
|
+
%tky = zs_order-%tky
|
|
375
|
+
%msg = new_message_with_text(
|
|
376
|
+
severity = if_abap_behv_message=>severity-error
|
|
377
|
+
text = 'Customer is required' ) )
|
|
378
|
+
TO reported-order.
|
|
379
|
+
APPEND VALUE #( %tky = zs_order-%tky ) TO failed-order.
|
|
380
|
+
ENDIF.
|
|
381
|
+
ENDLOOP.
|
|
382
|
+
ENDMETHOD.
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Determination Implementation
|
|
386
|
+
|
|
387
|
+
```abap
|
|
388
|
+
METHOD set_number.
|
|
389
|
+
READ ENTITIES OF zi_order IN LOCAL MODE
|
|
390
|
+
ENTITY Order
|
|
391
|
+
FIELDS ( order_id )
|
|
392
|
+
WITH CORRESPONDING #( keys )
|
|
393
|
+
RESULT DATA(zt_orders).
|
|
394
|
+
|
|
395
|
+
MODIFY ENTITIES OF zi_order IN LOCAL MODE
|
|
396
|
+
ENTITY Order
|
|
397
|
+
UPDATE FIELDS ( order_id )
|
|
398
|
+
WITH VALUE #( FOR zs_order IN zt_orders
|
|
399
|
+
( %tky = zs_order-%tky
|
|
400
|
+
order_id = cl_uuid_factory=>create_system_uuid(
|
|
401
|
+
)->create_uuid_x16( ) ) )
|
|
402
|
+
REPORTED DATA(reported).
|
|
403
|
+
ENDMETHOD.
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Response Handling
|
|
407
|
+
|
|
408
|
+
```abap
|
|
409
|
+
" MAPPED — key mapping for created instances
|
|
410
|
+
mapped-order = VALUE #( ( %cid = 'cid1' order_id = '1000' ) ).
|
|
411
|
+
|
|
412
|
+
" FAILED — failed instances with cause
|
|
413
|
+
failed-order = VALUE #( (
|
|
414
|
+
%cid = 'cid1'
|
|
415
|
+
%fail-cause = if_abap_behv=>cause-unspecific ) ).
|
|
416
|
+
|
|
417
|
+
" REPORTED — messages
|
|
418
|
+
reported-order = VALUE #( (
|
|
419
|
+
%tky = VALUE #( order_id = '1000' )
|
|
420
|
+
%msg = new_message_with_text(
|
|
421
|
+
severity = if_abap_behv_message=>severity-error
|
|
422
|
+
text = 'Validation failed' ) ) ).
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## Rules
|
|
428
|
+
|
|
429
|
+
- Always use %tky over %key — includes draft indicator
|
|
430
|
+
- Use %cid for new instances, %cid_ref for parent references in deep create
|
|
431
|
+
- Use IN LOCAL MODE inside ABP to bypass auth/feature control
|
|
432
|
+
- Use COMMIT ENTITIES to persist, always check failed response
|
|
433
|
+
- Use CORRESPONDING with MAPPING FROM/TO ENTITY for BDEF-DB mapping
|
|
434
|
+
- Short form (FIELDS list) is cleaner; long form (%control) for dynamic scenarios
|
|
435
|
+
- Validations report errors via reported + failed, never raise exceptions
|
|
436
|
+
- Determinations run IN LOCAL MODE by default
|
|
437
|
+
- One handler class per entity, one saver class per BO root
|
|
438
|
+
- Use `new_message_with_text( )` or message class for reported-%msg
|
|
439
|
+
|
|
440
|
+
## Anti-Patterns
|
|
441
|
+
|
|
442
|
+
| Anti-Pattern | Correct Approach |
|
|
443
|
+
|---|---|
|
|
444
|
+
| Direct DB access in managed BO | Use EML (MODIFY/READ ENTITIES) |
|
|
445
|
+
| RAISE EXCEPTION in validation | Append to `reported` and `failed` |
|
|
446
|
+
| Using %key instead of %tky | Always use %tky (draft-safe) |
|
|
447
|
+
| Forgetting COMMIT ENTITIES after MODIFY | Always COMMIT or use auto-commit in OData |
|
|
448
|
+
| Hardcoded strings in %msg | Use message class via `new_message( )` |
|
|
449
|
+
| READ ENTITIES without IN LOCAL MODE inside ABP | Use IN LOCAL MODE to avoid auth loops |
|
|
450
|
+
| Missing `IS NOT INITIAL` check on failed after COMMIT | Always check failed response |
|
|
451
|
+
| Creating handler for child entity in root class | Separate handler class per entity |
|
|
452
|
+
| Using MODIFY ENTITY (short) mixing multiple entities | Use MODIFY ENTITIES OF (long) for multi-entity |
|
|
453
|
+
| Skipping %control in dynamic updates | Always set %control flags for partial updates |
|