@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,280 @@
|
|
|
1
|
+
# RAP Numbering — early, late, unmanaged numbering
|
|
2
|
+
|
|
3
|
+
## Early Numbering (Default for Managed)
|
|
4
|
+
|
|
5
|
+
Key assigned at CREATE time, before save. Simplest approach.
|
|
6
|
+
|
|
7
|
+
### BDEF
|
|
8
|
+
|
|
9
|
+
```abap
|
|
10
|
+
managed implementation in class ZBP_I_ORDER unique;
|
|
11
|
+
strict ( 2 );
|
|
12
|
+
|
|
13
|
+
define behavior for ZI_Order alias Order
|
|
14
|
+
persistent table ztab_order
|
|
15
|
+
lock master
|
|
16
|
+
{
|
|
17
|
+
field ( readonly ) OrderID;
|
|
18
|
+
|
|
19
|
+
create;
|
|
20
|
+
update;
|
|
21
|
+
delete;
|
|
22
|
+
|
|
23
|
+
determination setOrderID on modify { create; }
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Handler — MAX + 1 Pattern
|
|
28
|
+
|
|
29
|
+
```abap
|
|
30
|
+
METHOD setOrderID.
|
|
31
|
+
READ ENTITIES OF ZI_Order IN LOCAL MODE
|
|
32
|
+
ENTITY Order FIELDS ( OrderID ) WITH CORRESPONDING #( keys )
|
|
33
|
+
RESULT DATA(orders).
|
|
34
|
+
|
|
35
|
+
SELECT SINGLE FROM ztab_order FIELDS MAX( order_id ) INTO @DATA(lv_max).
|
|
36
|
+
|
|
37
|
+
MODIFY ENTITIES OF ZI_Order IN LOCAL MODE
|
|
38
|
+
ENTITY Order UPDATE FIELDS ( OrderID )
|
|
39
|
+
WITH VALUE #( FOR order IN orders WHERE ( OrderID IS INITIAL )
|
|
40
|
+
LET lv_next = lv_max + 1 IN
|
|
41
|
+
( %tky = order-%tky OrderID = lv_next ) ).
|
|
42
|
+
ENDMETHOD.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Handler — UUID Pattern
|
|
46
|
+
|
|
47
|
+
```abap
|
|
48
|
+
METHOD setOrderID.
|
|
49
|
+
READ ENTITIES OF ZI_Order IN LOCAL MODE
|
|
50
|
+
ENTITY Order FIELDS ( OrderID ) WITH CORRESPONDING #( keys )
|
|
51
|
+
RESULT DATA(orders).
|
|
52
|
+
|
|
53
|
+
MODIFY ENTITIES OF ZI_Order IN LOCAL MODE
|
|
54
|
+
ENTITY Order UPDATE FIELDS ( OrderID )
|
|
55
|
+
WITH VALUE #( FOR order IN orders WHERE ( OrderID IS INITIAL )
|
|
56
|
+
( %tky = order-%tky
|
|
57
|
+
OrderID = cl_system_uuid=>create_uuid_x16_static( ) ) ).
|
|
58
|
+
ENDMETHOD.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Handler — Number Range Pattern
|
|
62
|
+
|
|
63
|
+
```abap
|
|
64
|
+
METHOD setOrderID.
|
|
65
|
+
READ ENTITIES OF ZI_Order IN LOCAL MODE
|
|
66
|
+
ENTITY Order FIELDS ( OrderID ) WITH CORRESPONDING #( keys )
|
|
67
|
+
RESULT DATA(orders).
|
|
68
|
+
|
|
69
|
+
DATA(lt_no_id) = FILTER #( orders WHERE OrderID IS INITIAL ).
|
|
70
|
+
IF lt_no_id IS INITIAL. RETURN. ENDIF.
|
|
71
|
+
|
|
72
|
+
TRY.
|
|
73
|
+
cl_numberrange_runtime=>number_get(
|
|
74
|
+
EXPORTING nr_range_nr = '01'
|
|
75
|
+
object = 'ZORDER_NR'
|
|
76
|
+
quantity = CONV #( lines( lt_no_id ) )
|
|
77
|
+
IMPORTING number = DATA(lv_number) ).
|
|
78
|
+
CATCH cx_number_ranges.
|
|
79
|
+
RETURN.
|
|
80
|
+
ENDTRY.
|
|
81
|
+
|
|
82
|
+
DATA(lv_next) = CONV numc10( lv_number ).
|
|
83
|
+
MODIFY ENTITIES OF ZI_Order IN LOCAL MODE
|
|
84
|
+
ENTITY Order UPDATE FIELDS ( OrderID )
|
|
85
|
+
WITH VALUE #( FOR order IN lt_no_id
|
|
86
|
+
( %tky = order-%tky OrderID = lv_next ) ).
|
|
87
|
+
ENDMETHOD.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Late Numbering
|
|
91
|
+
|
|
92
|
+
Key assigned during SAVE phase (adjust_numbers). Used when key comes from external system or number range that should only be consumed on commit.
|
|
93
|
+
|
|
94
|
+
### BDEF
|
|
95
|
+
|
|
96
|
+
```abap
|
|
97
|
+
managed implementation in class ZBP_I_ORDER unique;
|
|
98
|
+
strict ( 2 );
|
|
99
|
+
with draft;
|
|
100
|
+
|
|
101
|
+
define behavior for ZI_Order alias Order
|
|
102
|
+
persistent table ztab_order
|
|
103
|
+
draft table ztab_order_d
|
|
104
|
+
lock master total etag LastChangedAt
|
|
105
|
+
etag master LocalLastChangedAt
|
|
106
|
+
late numbering
|
|
107
|
+
{
|
|
108
|
+
field ( readonly ) OrderID;
|
|
109
|
+
|
|
110
|
+
create;
|
|
111
|
+
update;
|
|
112
|
+
delete;
|
|
113
|
+
|
|
114
|
+
draft action Edit;
|
|
115
|
+
draft action Activate optimized;
|
|
116
|
+
draft action Discard;
|
|
117
|
+
draft action Resume;
|
|
118
|
+
draft determine action Prepare;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Saver Class — adjust_numbers
|
|
123
|
+
|
|
124
|
+
```abap
|
|
125
|
+
CLASS lsc_order DEFINITION INHERITING FROM cl_abap_behavior_saver.
|
|
126
|
+
PROTECTED SECTION.
|
|
127
|
+
METHODS adjust_numbers REDEFINITION.
|
|
128
|
+
ENDCLASS.
|
|
129
|
+
|
|
130
|
+
CLASS lsc_order IMPLEMENTATION.
|
|
131
|
+
METHOD adjust_numbers.
|
|
132
|
+
DATA(lt_orders) = mapped-order.
|
|
133
|
+
|
|
134
|
+
LOOP AT lt_orders ASSIGNING FIELD-SYMBOL(<order>).
|
|
135
|
+
" Only assign to records without key
|
|
136
|
+
IF <order>-OrderID IS INITIAL.
|
|
137
|
+
TRY.
|
|
138
|
+
cl_numberrange_runtime=>number_get(
|
|
139
|
+
EXPORTING nr_range_nr = '01'
|
|
140
|
+
object = 'ZORDER_NR'
|
|
141
|
+
IMPORTING number = DATA(lv_number) ).
|
|
142
|
+
CATCH cx_number_ranges.
|
|
143
|
+
CONTINUE.
|
|
144
|
+
ENDTRY.
|
|
145
|
+
<order>-OrderID = lv_number.
|
|
146
|
+
ENDIF.
|
|
147
|
+
ENDLOOP.
|
|
148
|
+
ENDMETHOD.
|
|
149
|
+
ENDCLASS.
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Late Numbering — EML with %tmp and %pid
|
|
153
|
+
|
|
154
|
+
```abap
|
|
155
|
+
" During draft / before save, records use temporary keys
|
|
156
|
+
" %tmp — temporary key (system-generated during create)
|
|
157
|
+
" %pid — persistent identifier (maps temp to final key)
|
|
158
|
+
|
|
159
|
+
" The framework automatically maps %tmp to the final key after adjust_numbers
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Early Numbering vs Late Numbering
|
|
163
|
+
|
|
164
|
+
| Aspect | Early | Late |
|
|
165
|
+
|--------|-------|------|
|
|
166
|
+
| When key assigned | On CREATE (before save) | During SAVE (adjust_numbers) |
|
|
167
|
+
| BDEF keyword | (none — default) | `late numbering` |
|
|
168
|
+
| Draft support | Key available in draft | Temp key until activate |
|
|
169
|
+
| Implementation | Determination on modify | Saver class adjust_numbers |
|
|
170
|
+
| Number consumption | May waste numbers on discard | Only consumed on commit |
|
|
171
|
+
| Complexity | Simple | More complex |
|
|
172
|
+
| Typical use | UUID keys, simple sequences | Number ranges, external IDs |
|
|
173
|
+
|
|
174
|
+
## Unmanaged Numbering
|
|
175
|
+
|
|
176
|
+
For unmanaged BOs where the application fully controls key assignment.
|
|
177
|
+
|
|
178
|
+
### BDEF
|
|
179
|
+
|
|
180
|
+
```abap
|
|
181
|
+
unmanaged implementation in class ZBP_I_ORDER unique;
|
|
182
|
+
strict ( 2 );
|
|
183
|
+
|
|
184
|
+
define behavior for ZI_Order alias Order
|
|
185
|
+
lock master
|
|
186
|
+
{
|
|
187
|
+
create;
|
|
188
|
+
update;
|
|
189
|
+
delete;
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Handler — CREATE with Key Assignment
|
|
194
|
+
|
|
195
|
+
```abap
|
|
196
|
+
METHOD create.
|
|
197
|
+
LOOP AT entities ASSIGNING FIELD-SYMBOL(<entity>).
|
|
198
|
+
" Application assigns key
|
|
199
|
+
DATA(lv_id) = get_next_order_id( ).
|
|
200
|
+
|
|
201
|
+
INSERT VALUE #(
|
|
202
|
+
order_id = lv_id
|
|
203
|
+
customer_id = <entity>-CustomerID
|
|
204
|
+
amount = <entity>-Amount
|
|
205
|
+
) INTO TABLE buffer_orders.
|
|
206
|
+
|
|
207
|
+
INSERT VALUE #(
|
|
208
|
+
%cid = <entity>-%cid
|
|
209
|
+
order_id = lv_id
|
|
210
|
+
) INTO TABLE mapped-order.
|
|
211
|
+
ENDLOOP.
|
|
212
|
+
ENDMETHOD.
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Child Numbering
|
|
216
|
+
|
|
217
|
+
```abap
|
|
218
|
+
" BDEF — child with determination for numbering
|
|
219
|
+
define behavior for ZI_OrderItem alias Item
|
|
220
|
+
persistent table ztab_order_item
|
|
221
|
+
lock dependent by _Order
|
|
222
|
+
{
|
|
223
|
+
field ( readonly ) OrderID, ItemID;
|
|
224
|
+
|
|
225
|
+
update;
|
|
226
|
+
delete;
|
|
227
|
+
|
|
228
|
+
determination setItemID on modify { create; }
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
" Handler
|
|
232
|
+
METHOD setItemID.
|
|
233
|
+
READ ENTITIES OF ZI_Order IN LOCAL MODE
|
|
234
|
+
ENTITY Item FIELDS ( OrderID ItemID ) WITH CORRESPONDING #( keys )
|
|
235
|
+
RESULT DATA(items).
|
|
236
|
+
|
|
237
|
+
" Get max item ID per order
|
|
238
|
+
TYPES: BEGIN OF ty_max,
|
|
239
|
+
order_id TYPE numc10,
|
|
240
|
+
max_item TYPE numc6,
|
|
241
|
+
END OF ty_max.
|
|
242
|
+
DATA lt_max TYPE SORTED TABLE OF ty_max WITH UNIQUE KEY order_id.
|
|
243
|
+
|
|
244
|
+
LOOP AT items INTO DATA(item) WHERE ItemID IS INITIAL.
|
|
245
|
+
IF NOT line_exists( lt_max[ order_id = item-OrderID ] ).
|
|
246
|
+
SELECT SINGLE FROM ztab_order_item
|
|
247
|
+
FIELDS MAX( item_id )
|
|
248
|
+
WHERE order_id = @item-OrderID
|
|
249
|
+
INTO @DATA(lv_max_item).
|
|
250
|
+
INSERT VALUE #( order_id = item-OrderID max_item = lv_max_item ) INTO TABLE lt_max.
|
|
251
|
+
ENDIF.
|
|
252
|
+
|
|
253
|
+
DATA(lv_next) = lt_max[ order_id = item-OrderID ]-max_item + 10.
|
|
254
|
+
lt_max[ order_id = item-OrderID ]-max_item = lv_next.
|
|
255
|
+
|
|
256
|
+
MODIFY ENTITIES OF ZI_Order IN LOCAL MODE
|
|
257
|
+
ENTITY Item UPDATE FIELDS ( ItemID )
|
|
258
|
+
WITH VALUE #( ( %tky = item-%tky ItemID = lv_next ) ).
|
|
259
|
+
ENDLOOP.
|
|
260
|
+
ENDMETHOD.
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Rules
|
|
264
|
+
- Early numbering: simplest, key available immediately — use for UUID or simple sequences
|
|
265
|
+
- Late numbering: key assigned at save — use for number ranges or external IDs
|
|
266
|
+
- `late numbering` keyword in BDEF activates late numbering
|
|
267
|
+
- Late numbering uses saver class `adjust_numbers` method
|
|
268
|
+
- Child numbering: typically MAX+10 pattern (increment by 10 for insertion gaps)
|
|
269
|
+
- Always filter `WHERE KeyField IS INITIAL` before assigning — skip records that already have keys
|
|
270
|
+
- UUID keys: `cl_system_uuid=>create_uuid_x16_static( )` for RAP-safe UUID generation
|
|
271
|
+
|
|
272
|
+
## Anti-Patterns
|
|
273
|
+
| Anti-Pattern | Correct |
|
|
274
|
+
|---|---|
|
|
275
|
+
| Number range in early numbering determination | Wastes numbers on draft discard — use late numbering |
|
|
276
|
+
| `MAX + 1` without lock in concurrent system | Use number range object or UUID |
|
|
277
|
+
| Late numbering without `late numbering` in BDEF | Framework doesn't call adjust_numbers |
|
|
278
|
+
| Assigning key to records that already have one | Filter `WHERE KeyField IS INITIAL` |
|
|
279
|
+
| Item numbering by +1 | Use +10 for insertion gaps (SAP convention) |
|
|
280
|
+
| Hardcoded key in test data | Use dynamic generation or %cid |
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# RAP Service Exposure — Projection CDS, Projection BDEF, Service Definition, Service Binding
|
|
2
|
+
|
|
3
|
+
## Camadas
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Service Binding (OData V4 UI) ← endpoint
|
|
7
|
+
Service Definition ← quais entidades expor
|
|
8
|
+
Projection BDEF ← quais operacoes expor
|
|
9
|
+
Projection CDS ← consumption layer
|
|
10
|
+
Interface BDEF ← business logic
|
|
11
|
+
Interface CDS ← data model
|
|
12
|
+
Database Tables ← persistencia
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Projection CDS — Root
|
|
16
|
+
|
|
17
|
+
```abap
|
|
18
|
+
@AccessControl.authorizationCheck: #CHECK
|
|
19
|
+
@Metadata.allowExtensions: true
|
|
20
|
+
@Search.searchable: true
|
|
21
|
+
define root view entity ZC_Order
|
|
22
|
+
provider contract transactional_query
|
|
23
|
+
as projection on ZI_Order
|
|
24
|
+
{
|
|
25
|
+
key OrderID,
|
|
26
|
+
@Search.defaultSearchElement: true
|
|
27
|
+
CustomerID,
|
|
28
|
+
OrderDate,
|
|
29
|
+
@Semantics.amount.currencyCode: 'CurrencyCode'
|
|
30
|
+
TotalAmount,
|
|
31
|
+
CurrencyCode,
|
|
32
|
+
Status,
|
|
33
|
+
CreatedBy, CreatedAt, LastChangedBy, LastChangedAt, LocalLastChangedAt,
|
|
34
|
+
_Item : redirected to composition child ZC_OrderItem,
|
|
35
|
+
_Customer,
|
|
36
|
+
_Currency
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- `provider contract transactional_query` — obrigatorio para Fiori Elements com CRUD
|
|
41
|
+
- `redirected to composition child ZC_OrderItem` — redireciona association para projection
|
|
42
|
+
|
|
43
|
+
## Projection CDS — Child
|
|
44
|
+
|
|
45
|
+
```abap
|
|
46
|
+
@AccessControl.authorizationCheck: #CHECK
|
|
47
|
+
@Metadata.allowExtensions: true
|
|
48
|
+
define view entity ZC_OrderItem
|
|
49
|
+
as projection on ZI_OrderItem
|
|
50
|
+
{
|
|
51
|
+
key OrderID,
|
|
52
|
+
key ItemID,
|
|
53
|
+
ProductID, Quantity,
|
|
54
|
+
@Semantics.amount.currencyCode: 'CurrencyCode'
|
|
55
|
+
ItemPrice,
|
|
56
|
+
CurrencyCode, LocalLastChangedAt,
|
|
57
|
+
_Order : redirected to parent ZC_Order,
|
|
58
|
+
_Product
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- `redirected to parent ZC_Order` — filho aponta para projection do pai
|
|
63
|
+
- Sem `provider contract` no filho (so root precisa)
|
|
64
|
+
|
|
65
|
+
## provider contract
|
|
66
|
+
|
|
67
|
+
| Contract | Uso |
|
|
68
|
+
|----------|-----|
|
|
69
|
+
| `transactional_query` | Fiori Elements com CRUD |
|
|
70
|
+
| `transactional_interface` | Consumo programatico (API) |
|
|
71
|
+
|
|
72
|
+
## Projection BDEF
|
|
73
|
+
|
|
74
|
+
```abap
|
|
75
|
+
projection;
|
|
76
|
+
strict ( 2 );
|
|
77
|
+
use draft;
|
|
78
|
+
|
|
79
|
+
define behavior for ZC_Order alias Order
|
|
80
|
+
use etag
|
|
81
|
+
{
|
|
82
|
+
use create; use update; use delete;
|
|
83
|
+
use action Edit; use action Activate; use action Discard;
|
|
84
|
+
use action Resume; use action Prepare;
|
|
85
|
+
use action acceptOrder;
|
|
86
|
+
use association _Item { create; with draft; }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
define behavior for ZC_OrderItem alias Item
|
|
90
|
+
use etag
|
|
91
|
+
{
|
|
92
|
+
use update; use delete;
|
|
93
|
+
use association _Order { with draft; }
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- `projection;` na primeira linha (nao `managed`)
|
|
98
|
+
- `use draft;` obrigatorio se interface usa `with draft`
|
|
99
|
+
- `use action` expoe operacoes da interface — deve expor TODAS as draft actions
|
|
100
|
+
- Pode ter multiplas projections para o mesmo BO (admin vs viewer)
|
|
101
|
+
|
|
102
|
+
## Service Definition
|
|
103
|
+
|
|
104
|
+
```abap
|
|
105
|
+
@EndUserText.label: 'Order Service'
|
|
106
|
+
define service ZUI_ORDER {
|
|
107
|
+
expose ZC_Order as Order;
|
|
108
|
+
expose ZC_OrderItem as OrderItem;
|
|
109
|
+
expose /DMO/I_Customer as Customer; " value help
|
|
110
|
+
expose /DMO/I_Product as Product; " value help
|
|
111
|
+
expose I_Currency as Currency; " value help
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
- Expor **projections** (ZC_*), nunca interfaces (ZI_*)
|
|
116
|
+
- Expor toda entidade referenciada em `@Consumption.valueHelpDefinition`
|
|
117
|
+
- Aliases definem nome no OData $metadata
|
|
118
|
+
|
|
119
|
+
## Service Binding
|
|
120
|
+
|
|
121
|
+
Criado no ADT como objeto SRVB:
|
|
122
|
+
- Tipo: `OData V4 - UI` (Fiori Elements)
|
|
123
|
+
- Service Definition: `ZUI_ORDER`
|
|
124
|
+
- Convencao: `ZUI_ORDER_O4` (V4) ou `ZUI_ORDER_O2` (V2)
|
|
125
|
+
- Apos criar: **Publish** para ativar endpoint OData
|
|
126
|
+
|
|
127
|
+
| Tipo | Uso | Draft UI |
|
|
128
|
+
|------|-----|:--------:|
|
|
129
|
+
| OData V4 - UI | Fiori Elements (recomendado) | SIM |
|
|
130
|
+
| OData V4 - Web API | APIs programaticas | NAO |
|
|
131
|
+
| OData V2 - UI | Apps Fiori legados | SIM |
|
|
132
|
+
|
|
133
|
+
URL apos publish:
|
|
134
|
+
```
|
|
135
|
+
V4: /sap/opu/odata4/sap/zui_order_o4/0001/
|
|
136
|
+
V2: /sap/opu/odata/sap/ZUI_ORDER_O2/
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Multiplos bindings para o mesmo service definition:
|
|
140
|
+
```
|
|
141
|
+
ZUI_ORDER (Service Definition)
|
|
142
|
+
├── ZUI_ORDER_O4 (OData V4 - UI) → Fiori Elements
|
|
143
|
+
├── ZUI_ORDER_O2 (OData V2 - UI) → Apps legados
|
|
144
|
+
└── ZAPI_ORDER (OData V4 - Web API) → APIs externas
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Regras
|
|
148
|
+
- Projection CDS root: sempre `provider contract transactional_query`
|
|
149
|
+
- Associations: `redirected to composition child` / `redirected to parent`
|
|
150
|
+
- Projection BDEF: expor TODAS as 5 draft actions
|
|
151
|
+
- Service Definition: expor projections + entidades de value help
|
|
152
|
+
- Service Binding: sempre publicar apos criar
|
|
153
|
+
- OData V4 UI para apps novos, V2 so para legado
|
|
154
|
+
|
|
155
|
+
## Anti-patterns
|
|
156
|
+
| Errado | Correto |
|
|
157
|
+
|--------|---------|
|
|
158
|
+
| Expor ZI_* no Service Definition | Expor ZC_* |
|
|
159
|
+
| Esquecer `provider contract transactional_query` | Fiori Elements nao funciona sem isso |
|
|
160
|
+
| Nao redirecionar associations na projection | `redirected to composition child` obrigatorio |
|
|
161
|
+
| Service Binding sem Publish | Endpoint nao fica acessivel |
|
|
162
|
+
| OData V2 para app novo | OData V4 UI |
|
|
163
|
+
| Nao expor entidade de value help | Value help nao aparece no Fiori |
|