@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.
Files changed (114) hide show
  1. package/README.md +384 -0
  2. package/dist/adt-client.js +364 -0
  3. package/dist/cli/activate.js +113 -0
  4. package/dist/cli/init.js +333 -0
  5. package/dist/cli/remove.js +80 -0
  6. package/dist/cli/status.js +229 -0
  7. package/dist/cli/systems.js +68 -0
  8. package/dist/cli.js +81 -0
  9. package/dist/index.js +1318 -0
  10. package/dist/knowledge/abap/abap-dictionary.md +199 -0
  11. package/dist/knowledge/abap/abap-sql.md +296 -0
  12. package/dist/knowledge/abap/amdp.md +273 -0
  13. package/dist/knowledge/abap/clean-code.md +293 -0
  14. package/dist/knowledge/abap/cloud-background-processing.md +250 -0
  15. package/dist/knowledge/abap/cloud-communication.md +265 -0
  16. package/dist/knowledge/abap/cloud-development.md +176 -0
  17. package/dist/knowledge/abap/cloud-extensibility.md +252 -0
  18. package/dist/knowledge/abap/cloud-released-apis.md +261 -0
  19. package/dist/knowledge/abap/constructor-expressions.md +289 -0
  20. package/dist/knowledge/abap/enhancements.md +232 -0
  21. package/dist/knowledge/abap/exceptions.md +271 -0
  22. package/dist/knowledge/abap/internal-tables.md +205 -0
  23. package/dist/knowledge/abap/object-orientation.md +298 -0
  24. package/dist/knowledge/abap/performance.md +216 -0
  25. package/dist/knowledge/abap/rap-abstract-entities.md +206 -0
  26. package/dist/knowledge/abap/rap-business-events.md +216 -0
  27. package/dist/knowledge/abap/rap-draft.md +191 -0
  28. package/dist/knowledge/abap/rap-eml.md +453 -0
  29. package/dist/knowledge/abap/rap-end-to-end.md +486 -0
  30. package/dist/knowledge/abap/rap-feature-control.md +185 -0
  31. package/dist/knowledge/abap/rap-numbering.md +280 -0
  32. package/dist/knowledge/abap/rap-service-exposure.md +163 -0
  33. package/dist/knowledge/abap/rap-unmanaged.md +468 -0
  34. package/dist/knowledge/abap/string-processing.md +180 -0
  35. package/dist/knowledge/abap/unit-testing.md +303 -0
  36. package/dist/knowledge/abap-cds/access-control.md +241 -0
  37. package/dist/knowledge/abap-cds/annotations.md +331 -0
  38. package/dist/knowledge/abap-cds/associations.md +254 -0
  39. package/dist/knowledge/abap-cds/expressions.md +230 -0
  40. package/dist/knowledge/abap-cds/functions.md +245 -0
  41. package/dist/knowledge/abap-cds/metadata-extensions.md +294 -0
  42. package/dist/knowledge/cap/authentication.md +278 -0
  43. package/dist/knowledge/cap/cdl-syntax.md +247 -0
  44. package/dist/knowledge/cap/cql-queries.md +266 -0
  45. package/dist/knowledge/cap/deployment.md +343 -0
  46. package/dist/knowledge/cap/event-handlers.md +287 -0
  47. package/dist/knowledge/cap/fiori-integration.md +303 -0
  48. package/dist/knowledge/cap/service-definitions.md +287 -0
  49. package/dist/knowledge/fiori/annotations.md +347 -0
  50. package/dist/knowledge/fiori/deployment.md +340 -0
  51. package/dist/knowledge/fiori/fiori-elements.md +332 -0
  52. package/dist/knowledge/fiori/fiori-side-effects.md +107 -0
  53. package/dist/knowledge/fiori/fiori-valuelist.md +144 -0
  54. package/dist/knowledge/fiori/ui5-controllers.md +358 -0
  55. package/dist/knowledge/fiori/ui5-data-binding.md +311 -0
  56. package/dist/knowledge/fiori/ui5-fragments-dialogs.md +330 -0
  57. package/dist/knowledge/fiori/ui5-manifest.md +411 -0
  58. package/dist/knowledge/fiori/ui5-routing.md +303 -0
  59. package/dist/knowledge/fiori/ui5-xml-views.md +294 -0
  60. package/dist/logger.js +114 -0
  61. package/dist/system-profile.js +207 -0
  62. package/dist/tools/abap-doc.js +72 -0
  63. package/dist/tools/abapgit.js +161 -0
  64. package/dist/tools/activate.js +68 -0
  65. package/dist/tools/atc-check.js +117 -0
  66. package/dist/tools/auth-object.js +56 -0
  67. package/dist/tools/breakpoints.js +76 -0
  68. package/dist/tools/call-hierarchy.js +84 -0
  69. package/dist/tools/cds-annotations.js +98 -0
  70. package/dist/tools/cds-dependencies.js +65 -0
  71. package/dist/tools/check.js +47 -0
  72. package/dist/tools/code-completion.js +70 -0
  73. package/dist/tools/code-coverage.js +111 -0
  74. package/dist/tools/create-amdp.js +111 -0
  75. package/dist/tools/create-dcl.js +81 -0
  76. package/dist/tools/create-transport.js +38 -0
  77. package/dist/tools/create.js +285 -0
  78. package/dist/tools/data-preview.js +37 -0
  79. package/dist/tools/delete.js +45 -0
  80. package/dist/tools/deploy-bsp.js +298 -0
  81. package/dist/tools/discovery.js +59 -0
  82. package/dist/tools/element-info.js +93 -0
  83. package/dist/tools/enhancements.js +186 -0
  84. package/dist/tools/extract-method.js +44 -0
  85. package/dist/tools/function-group.js +59 -0
  86. package/dist/tools/knowledge.js +275 -0
  87. package/dist/tools/lock-object.js +75 -0
  88. package/dist/tools/message-class.js +67 -0
  89. package/dist/tools/navigate.js +80 -0
  90. package/dist/tools/number-range.js +57 -0
  91. package/dist/tools/object-documentation.js +43 -0
  92. package/dist/tools/object-structure.js +78 -0
  93. package/dist/tools/object-versions.js +57 -0
  94. package/dist/tools/package-contents.js +60 -0
  95. package/dist/tools/pretty-printer.js +35 -0
  96. package/dist/tools/publish-binding.js +49 -0
  97. package/dist/tools/quick-fix.js +69 -0
  98. package/dist/tools/read.js +167 -0
  99. package/dist/tools/refactor-rename.js +60 -0
  100. package/dist/tools/release-transport.js +24 -0
  101. package/dist/tools/released-apis.js +51 -0
  102. package/dist/tools/repository-tree.js +90 -0
  103. package/dist/tools/scaffold-rap.js +642 -0
  104. package/dist/tools/search.js +73 -0
  105. package/dist/tools/shared/data-format.js +101 -0
  106. package/dist/tools/sql-console.js +17 -0
  107. package/dist/tools/system-info.js +270 -0
  108. package/dist/tools/traces.js +66 -0
  109. package/dist/tools/transport-contents.js +83 -0
  110. package/dist/tools/transports.js +67 -0
  111. package/dist/tools/unit-test.js +135 -0
  112. package/dist/tools/where-used.js +59 -0
  113. package/dist/tools/write.js +101 -0
  114. 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 |