@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,252 @@
1
+ # ABAP Cloud Extensibility — extending standard RAP BOs, behavior extensions
2
+
3
+ ## Extension Types
4
+
5
+ | Type | Who | What |
6
+ |------|-----|------|
7
+ | **Key User Extensibility** | Business user (no coding) | Custom fields, custom logic (BAdI), custom CDS views |
8
+ | **Developer Extensibility** | ABAP developer | Behavior extensions, CDS view extensions, new RAP BOs |
9
+ | **Side-by-Side Extensibility** | BTP developer | New app on BTP consuming S/4 APIs |
10
+
11
+ ## Behavior Extension — Add Logic to Standard BO
12
+
13
+ ```abap
14
+ " Extend SAP standard behavior definition
15
+ " File: ZBX_I_SALESORDER (Behavior Extension)
16
+
17
+ extension using interface /sap/s4/api/salesorder/I_SalesOrder
18
+ implementation in class ZBP_BX_I_SALESORDER unique;
19
+
20
+ extend behavior for SalesOrder
21
+ {
22
+ " Add validation
23
+ validation zz_validateCustomCredit on save
24
+ { create; update; field OverallSDProcessStatus; }
25
+
26
+ " Add determination
27
+ determination zz_setCustomField on modify
28
+ { create; field SalesOrganization; }
29
+
30
+ " Add side effects
31
+ side effects {
32
+ field SalesOrganization affects field ZZ_CustomRegion;
33
+ }
34
+ }
35
+ ```
36
+
37
+ ### Handler Class for Behavior Extension
38
+
39
+ ```abap
40
+ CLASS zbp_bx_i_salesorder DEFINITION PUBLIC ABSTRACT FINAL
41
+ FOR BEHAVIOR OF /sap/s4/api/salesorder/I_SalesOrder.
42
+ ENDCLASS.
43
+
44
+ CLASS zbp_bx_i_salesorder IMPLEMENTATION.
45
+ ENDCLASS.
46
+
47
+ " Local handler
48
+ CLASS lhc_salesorder DEFINITION INHERITING FROM cl_abap_behavior_handler.
49
+ PRIVATE SECTION.
50
+ METHODS zz_validateCustomCredit FOR VALIDATE ON SAVE
51
+ IMPORTING keys FOR SalesOrder~zz_validateCustomCredit.
52
+
53
+ METHODS zz_setCustomField FOR DETERMINE ON MODIFY
54
+ IMPORTING keys FOR SalesOrder~zz_setCustomField.
55
+ ENDCLASS.
56
+
57
+ CLASS lhc_salesorder IMPLEMENTATION.
58
+ METHOD zz_validateCustomCredit.
59
+ READ ENTITIES OF /sap/s4/api/salesorder/I_SalesOrder IN LOCAL MODE
60
+ ENTITY SalesOrder
61
+ FIELDS ( SoldToParty TotalNetAmount TransactionCurrency )
62
+ WITH CORRESPONDING #( keys )
63
+ RESULT DATA(lt_orders).
64
+
65
+ LOOP AT lt_orders INTO DATA(ls_order).
66
+ " Custom credit check logic
67
+ IF ls_order-TotalNetAmount > 100000.
68
+ APPEND VALUE #(
69
+ %tky = ls_order-%tky
70
+ %msg = new_message_with_text(
71
+ severity = if_abap_behv_message=>severity-warning
72
+ text = |Order exceeds credit limit for { ls_order-SoldToParty }| )
73
+ ) TO reported-salesorder.
74
+ ENDIF.
75
+ ENDLOOP.
76
+ ENDMETHOD.
77
+
78
+ METHOD zz_setCustomField.
79
+ READ ENTITIES OF /sap/s4/api/salesorder/I_SalesOrder IN LOCAL MODE
80
+ ENTITY SalesOrder
81
+ FIELDS ( SalesOrganization )
82
+ WITH CORRESPONDING #( keys )
83
+ RESULT DATA(lt_orders).
84
+
85
+ MODIFY ENTITIES OF /sap/s4/api/salesorder/I_SalesOrder IN LOCAL MODE
86
+ ENTITY SalesOrder
87
+ UPDATE FIELDS ( ZZ_CustomRegion )
88
+ WITH VALUE #( FOR ls_order IN lt_orders
89
+ ( %tky = ls_order-%tky
90
+ ZZ_CustomRegion = SWITCH #( ls_order-SalesOrganization
91
+ WHEN '1000' THEN 'EMEA'
92
+ WHEN '2000' THEN 'AMER'
93
+ ELSE 'APAC' ) ) ).
94
+ ENDMETHOD.
95
+ ENDCLASS.
96
+ ```
97
+
98
+ ## CDS View Extension — Add Fields to Standard View
99
+
100
+ ```abap
101
+ " Extend standard CDS view with custom fields
102
+ extend view entity I_SalesOrderTP with
103
+ {
104
+ salesorder.zz_custom_region as ZZ_CustomRegion,
105
+ salesorder.zz_priority as ZZ_Priority
106
+ }
107
+ ```
108
+
109
+ ## Custom CDS View on Standard Tables
110
+
111
+ ```abap
112
+ " Create read-only view consuming released CDS views
113
+ @AccessControl.authorizationCheck: #CHECK
114
+ @EndUserText.label: 'Custom Sales Analysis'
115
+ define view entity ZI_SalesAnalysis
116
+ as select from I_SalesOrder as so
117
+ inner join I_SalesOrderItem as soi
118
+ on so.SalesOrder = soi.SalesOrder
119
+ association [0..1] to I_Customer as _Customer
120
+ on $projection.SoldToParty = _Customer.Customer
121
+ {
122
+ key so.SalesOrder,
123
+ key soi.SalesOrderItem,
124
+ so.SoldToParty,
125
+ so.SalesOrganization,
126
+ soi.Material,
127
+ @Semantics.amount.currencyCode: 'TransactionCurrency'
128
+ soi.NetAmount,
129
+ so.TransactionCurrency,
130
+ so.CreationDate,
131
+
132
+ " Custom calculated field
133
+ case
134
+ when soi.NetAmount > 10000 then 'HIGH'
135
+ when soi.NetAmount > 1000 then 'MEDIUM'
136
+ else 'LOW'
137
+ end as ValueCategory,
138
+
139
+ _Customer
140
+ }
141
+ ```
142
+
143
+ ## Custom RAP BO on Custom Table (with Standard BO Association)
144
+
145
+ ```abap
146
+ " Custom table
147
+ define table ztab_order_comment {
148
+ key client : abap.clnt not null;
149
+ key comment_id : sysuuid_x16 not null;
150
+ sales_order : vbeln;
151
+ comment_text : abap.string;
152
+ created_by : abp_creation_user;
153
+ created_at : abp_creation_tstmpl;
154
+ }
155
+
156
+ " CDS with association to released view
157
+ @AccessControl.authorizationCheck: #CHECK
158
+ define root view entity ZI_OrderComment
159
+ as select from ztab_order_comment
160
+ association [0..1] to I_SalesOrder as _SalesOrder
161
+ on $projection.SalesOrder = _SalesOrder.SalesOrder
162
+ {
163
+ key comment_id as CommentID,
164
+ sales_order as SalesOrder,
165
+ comment_text as CommentText,
166
+ @Semantics.user.createdBy: true
167
+ created_by as CreatedBy,
168
+ @Semantics.systemDateTime.createdAt: true
169
+ created_at as CreatedAt,
170
+ _SalesOrder
171
+ }
172
+ ```
173
+
174
+ ## Key User Extensibility — Custom Fields
175
+
176
+ ```
177
+ 1. Fiori app "Custom Fields and Logic" (F1481)
178
+ 2. Select business context (e.g., Sales Order)
179
+ 3. Add field:
180
+ - Field name: ZZ_Priority
181
+ - Type: Code list / Text / Number / Date
182
+ - Label: Priority
183
+ 4. Publish → field available in standard UIs
184
+ 5. Optional: add custom logic via BAdI implementation
185
+ ```
186
+
187
+ Custom fields created this way are automatically:
188
+ - Added to the database table
189
+ - Exposed in OData services
190
+ - Available in CDS views (extension include)
191
+ - Editable in Fiori Elements UIs
192
+
193
+ ## Key User BAdI Implementation
194
+
195
+ ```
196
+ 1. Fiori app "Custom Logic" (F1960)
197
+ 2. Select BAdI definition (e.g., BADI_SD_SLS_DOC_BEFORESAVE)
198
+ 3. Write ABAP Cloud logic:
199
+ ```
200
+
201
+ ```abap
202
+ " Inside BAdI implementation (key user editor)
203
+ IF salesorder-zz_priority IS INITIAL.
204
+ salesorder-zz_priority = 'MEDIUM'.
205
+ ENDIF.
206
+
207
+ IF salesorder-totalnetamount > 50000.
208
+ salesorder-zz_priority = 'HIGH'.
209
+ ENDIF.
210
+ ```
211
+
212
+ ## Extension Naming Convention
213
+
214
+ | Prefix | Use |
215
+ |--------|-----|
216
+ | `ZZ_` | Custom fields on standard objects (key user + developer) |
217
+ | `Z` | Custom objects (tables, classes, CDS views) |
218
+ | `ZBX_` | Behavior extensions |
219
+ | `ZBP_BX_` | Behavior extension handler class |
220
+
221
+ ## Finding Extensible BOs
222
+
223
+ ```abap
224
+ " In ADT: search for released behavior definitions
225
+ " Filter: Release State = Released, Object Type = BDEF
226
+
227
+ " Or query:
228
+ SELECT * FROM I_CustABAPObjDirectoryEntry
229
+ WHERE ABAPObjectType = 'BDEF'
230
+ AND ReleaseState = 'RELEASED'
231
+ INTO TABLE @DATA(lt_extensible_bos).
232
+ ```
233
+
234
+ ## Rules
235
+ - Behavior extensions: `extension using interface` — not `managed`/`unmanaged`
236
+ - Prefix custom fields with `ZZ_` on standard objects
237
+ - Use IN LOCAL MODE in extension handlers (same as regular RAP)
238
+ - Only extend released BOs (check release state in ADT)
239
+ - Custom validations/determinations in extensions use `zz_` prefix
240
+ - Key user fields are automatically available in OData — no manual CDS extension needed
241
+ - Side-by-side: new app on BTP calling S/4 APIs via communication scenario
242
+
243
+ ## Anti-Patterns
244
+ | Anti-Pattern | Correct |
245
+ |---|---|
246
+ | Modifying standard SAP code | Use behavior extension or BAdI |
247
+ | Custom field without `ZZ_` prefix | Always prefix with `ZZ_` on standard objects |
248
+ | Extending unreleased BO | Only extend released BOs |
249
+ | Direct DB access to standard tables | Use released CDS views (I_*) or EML |
250
+ | `MODIFY ENTITIES` without IN LOCAL MODE in extension | Always use IN LOCAL MODE |
251
+ | Key user logic with complex DB access | Keep key user logic simple — use developer extensibility for complex cases |
252
+ | Behavior extension without `extension using interface` | Required keyword for extensions |
@@ -0,0 +1,261 @@
1
+ # ABAP Cloud Released APIs — XCO, released classes, I_* CDS views
2
+
3
+ ## XCO Library (Cloud-Ready Utilities)
4
+
5
+ ### XCO String
6
+
7
+ ```abap
8
+ " Split
9
+ DATA(lt_parts) = xco_cp=>string( 'A,B,C' )->split( ',' )->value.
10
+ " lt_parts = string_table: 'A', 'B', 'C'
11
+
12
+ " Join
13
+ DATA(lv_joined) = xco_cp=>strings( lt_parts )->join( ',' )->value.
14
+ " lv_joined = 'A,B,C'
15
+
16
+ " Case conversion
17
+ DATA(lv_upper) = xco_cp=>string( 'hello' )->to_upper_case( )->value.
18
+ DATA(lv_lower) = xco_cp=>string( 'HELLO' )->to_lower_case( )->value.
19
+
20
+ " Camel case
21
+ DATA(lv_camel) = xco_cp=>string( 'SALES_ORDER_ITEM' )->to_camel_case( )->value.
22
+ " lv_camel = 'salesOrderItem'
23
+
24
+ DATA(lv_pascal) = xco_cp=>string( 'sales_order' )->to_pascal_case( )->value.
25
+ " lv_pascal = 'SalesOrder'
26
+
27
+ " Snake case
28
+ DATA(lv_snake) = xco_cp=>string( 'SalesOrderItem' )->to_snake_case( )->value.
29
+ " lv_snake = 'sales_order_item'
30
+
31
+ " Compose / decompose
32
+ DATA(lv_composed) = xco_cp=>string( 'hello world' )->compose(
33
+ xco_cp_string=>composition->pascal_case )->value.
34
+ " lv_composed = 'HelloWorld'
35
+
36
+ " Substring
37
+ DATA(lv_sub) = xco_cp=>string( 'ABCDEF' )->from( 3 )->to( 5 )->value.
38
+ " lv_sub = 'CDE'
39
+
40
+ " Trim
41
+ DATA(lv_trim) = xco_cp=>string( ' hello ' )->trim( )->value.
42
+
43
+ " Contains
44
+ DATA(lv_has) = xco_cp=>string( 'hello world' )->contains( 'world' ).
45
+ " lv_has = abap_true
46
+
47
+ " Prepend / append
48
+ DATA(lv_pre) = xco_cp=>string( 'world' )->prepend( 'hello ' )->value.
49
+ ```
50
+
51
+ ### XCO UUID
52
+
53
+ ```abap
54
+ " Generate UUID (X16 — 16 bytes hex)
55
+ DATA(lv_uuid) = xco_cp=>uuid( )->value.
56
+ " lv_uuid = '550E8400E29B41D4A716446655440000' (RAW16)
57
+
58
+ " As string
59
+ DATA(lv_uuid_str) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->abap_32 )->value.
60
+ ```
61
+
62
+ ### XCO Date / Time
63
+
64
+ ```abap
65
+ " Current date/time
66
+ DATA(lv_date) = xco_cp=>sy->date( )->as( xco_cp_time=>date_format->iso_8601_basic )->value.
67
+ " lv_date = '20260315'
68
+
69
+ DATA(lv_time) = xco_cp=>sy->time( )->as( xco_cp_time=>time_format->iso_8601_basic )->value.
70
+ " lv_time = '143022'
71
+
72
+ " Date calculation
73
+ DATA(lv_tomorrow) = xco_cp_time=>date( sy-datum )->add( iv_day = 1 )->value.
74
+ DATA(lv_next_month) = xco_cp_time=>date( sy-datum )->add( iv_month = 1 )->value.
75
+ DATA(lv_last_year) = xco_cp_time=>date( sy-datum )->add( iv_year = -1 )->value.
76
+
77
+ " Difference
78
+ DATA(lv_diff) = xco_cp_time=>date( lv_start )->difference( xco_cp_time=>date( lv_end ) ).
79
+ DATA(lv_days) = lv_diff->in_days( ).
80
+ ```
81
+
82
+ ### XCO Random
83
+
84
+ ```abap
85
+ " Random integer
86
+ DATA(lv_rand) = xco_cp=>random->integer(
87
+ iv_min = 1 iv_max = 100 )->value.
88
+
89
+ " Random string
90
+ DATA(lv_rand_str) = xco_cp=>random->string(
91
+ iv_length = 10
92
+ iv_content = xco_cp_random_string=>content->alphanumeric )->value.
93
+
94
+ " Random UUID
95
+ DATA(lv_uuid2) = xco_cp=>uuid( )->value.
96
+ ```
97
+
98
+ ### XCO JSON
99
+
100
+ ```abap
101
+ " Serialize structure/table to JSON
102
+ DATA(lv_json) = xco_cp_json=>data->from_abap( ls_structure )->to_string( ).
103
+
104
+ " Deserialize JSON to ABAP
105
+ xco_cp_json=>data->from_string( lv_json )->write_to( REF #( ls_target ) ).
106
+
107
+ " Pretty print
108
+ DATA(lv_pretty) = xco_cp_json=>data->from_abap( ls_data )->to_string(
109
+ xco_cp_json=>format->pretty_print ).
110
+ ```
111
+
112
+ ## Released Classes (Common)
113
+
114
+ ### UUID Generation
115
+
116
+ ```abap
117
+ " Preferred in Cloud (also works on-premise 7.55+)
118
+ DATA(lv_uuid) = cl_system_uuid=>create_uuid_x16_static( ).
119
+ " Returns RAW16
120
+
121
+ " For SYSUUID_C32 format
122
+ DATA(lv_uuid32) = cl_system_uuid=>create_uuid_c32_static( ).
123
+ " Returns CHAR32
124
+ ```
125
+
126
+ ### Timestamp
127
+
128
+ ```abap
129
+ " Current UTC timestamp
130
+ GET TIME STAMP FIELD DATA(lv_ts).
131
+ " lv_ts type TIMESTAMPL = 20260315143022.1234567
132
+
133
+ " Using cl_abap_tstmp
134
+ DATA(lv_diff_secs) = cl_abap_tstmp=>subtract(
135
+ tstmp1 = lv_ts_end tstmp2 = lv_ts_start ).
136
+
137
+ cl_abap_tstmp=>add(
138
+ EXPORTING tstmp = lv_ts_start secs = 3600
139
+ IMPORTING r_tstmp = DATA(lv_plus_1h) ).
140
+ ```
141
+
142
+ ### Number Range
143
+
144
+ ```abap
145
+ " Cloud-compatible number range
146
+ TRY.
147
+ cl_numberrange_runtime=>number_get(
148
+ EXPORTING nr_range_nr = '01'
149
+ object = 'ZORDER_NR'
150
+ quantity = 1
151
+ IMPORTING number = DATA(lv_number)
152
+ returncode = DATA(lv_rc) ).
153
+ CATCH cx_number_ranges INTO DATA(lx).
154
+ " handle
155
+ ENDTRY.
156
+ ```
157
+
158
+ ### Logging
159
+
160
+ ```abap
161
+ " Application log (BAL) — released wrapper
162
+ DATA(lo_log) = cl_bali_log=>create_with_header(
163
+ cl_bali_header_setter=>create(
164
+ iv_object = 'ZORDER'
165
+ iv_subobject = 'PROCESS' ) ).
166
+
167
+ lo_log->add_item( cl_bali_message_setter=>create(
168
+ iv_severity = if_bali_constants=>c_severity_error
169
+ iv_message_text = |Order { lv_id } failed: { lv_reason }| ) ).
170
+
171
+ cl_bali_log_db=>get_instance( )->save_log( lo_log ).
172
+ ```
173
+
174
+ ### HTTP Client (Cloud)
175
+
176
+ ```abap
177
+ " → see cloud-communication.md for full HTTP client reference
178
+ ```
179
+
180
+ ## Released CDS Views (I_* Catalog)
181
+
182
+ ### Common Released Views
183
+
184
+ | View | Content |
185
+ |------|---------|
186
+ | `I_Currency` | Currency codes |
187
+ | `I_CurrencyText` | Currency descriptions |
188
+ | `I_Country` | Country codes |
189
+ | `I_CountryText` | Country descriptions |
190
+ | `I_Language` | Language codes |
191
+ | `I_UnitOfMeasure` | Units of measure |
192
+ | `I_UnitOfMeasureText` | UoM descriptions |
193
+ | `I_CompanyCode` | Company codes |
194
+ | `I_CompanyCodeText` | Company code descriptions |
195
+ | `I_BusinessPartner` | Business partners |
196
+ | `I_Customer` | Customers |
197
+ | `I_Supplier` | Suppliers |
198
+ | `I_Product` | Products (S/4) |
199
+ | `I_PurchaseOrder` | Purchase orders |
200
+ | `I_PurchaseOrderItem` | PO items |
201
+ | `I_SalesOrder` | Sales orders |
202
+ | `I_SalesOrderItem` | SO items |
203
+ | `I_BillingDocument` | Billing docs |
204
+ | `I_JournalEntry` | Accounting docs |
205
+ | `I_GLAccountLineItem` | GL line items |
206
+ | `I_CostCenter` | Cost centers |
207
+ | `I_ProfitCenter` | Profit centers |
208
+ | `I_Plant` | Plants |
209
+ | `I_StorageLocation` | Storage locations |
210
+
211
+ ### Querying Released APIs
212
+
213
+ ```abap
214
+ " Find all released CDS views for a domain
215
+ SELECT * FROM I_CustABAPObjDirectoryEntry
216
+ WHERE ABAPObjectType = 'DDLS'
217
+ AND ReleaseState = 'RELEASED'
218
+ AND ABAPObjectCategory = 'R3TR'
219
+ INTO TABLE @DATA(lt_released_views)
220
+ UP TO 100 ROWS.
221
+
222
+ " Find released classes
223
+ SELECT * FROM I_CustABAPObjDirectoryEntry
224
+ WHERE ABAPObjectType = 'CLAS'
225
+ AND ReleaseState = 'RELEASED'
226
+ INTO TABLE @DATA(lt_released_classes)
227
+ UP TO 100 ROWS.
228
+ ```
229
+
230
+ ## Released Interfaces (Common)
231
+
232
+ | Interface | Purpose |
233
+ |-----------|---------|
234
+ | `if_oo_adt_classrun` | Console output (replaces WRITE/REPORT) |
235
+ | `if_rap_query_provider` | Custom query for unmanaged RAP |
236
+ | `if_abap_behv_message` | RAP behavior messages |
237
+ | `if_t100_message` | Message class integration for exceptions |
238
+ | `if_bali_log` | Application logging |
239
+ | `if_apj_dt_exec_object` | Application job execution |
240
+ | `if_http_client` | HTTP client |
241
+
242
+ ## Rules
243
+ - XCO is the primary utility library in Cloud — replaces many classic FMs
244
+ - Always check release state in ADT before using a class/CDS view
245
+ - I_* views are SAP-released read-only views — use in associations and value helps
246
+ - `cl_system_uuid=>create_uuid_x16_static()` is the standard UUID generation
247
+ - GET TIME STAMP works in Cloud — no replacement needed
248
+ - `cl_bali_*` replaces classic `BAL_*` function modules for logging
249
+ - XCO string methods are chainable: `xco_cp=>string( )->method1( )->method2( )->value`
250
+
251
+ ## Anti-Patterns
252
+ | Anti-Pattern | Correct |
253
+ |---|---|
254
+ | `CALL FUNCTION 'GUID_CREATE'` | `cl_system_uuid=>create_uuid_x16_static( )` |
255
+ | `CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'` | `\|{ lv_val ALPHA = IN }\|` |
256
+ | `CALL FUNCTION 'BAPI_*'` | Use released RAP APIs or I_* views |
257
+ | `CL_SALV_TABLE` for output | `if_oo_adt_classrun~main` + `out->write()` |
258
+ | `CL_HTTP_CLIENT=>create_by_url` | Communication scenario + `cl_http_destination_provider` |
259
+ | `cl_gui_frontend_services` | Not available in Cloud — use cloud file APIs |
260
+ | Direct DB access to SAP tables | Use released I_* CDS views |
261
+ | `CALL FUNCTION 'BAL_LOG_CREATE'` | `cl_bali_log=>create_with_header( )` |