@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,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( )` |
|