@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,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 |