@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,216 @@
|
|
|
1
|
+
# RAP Business Events — event-driven architecture, async processing
|
|
2
|
+
|
|
3
|
+
## Define Event in BDEF
|
|
4
|
+
|
|
5
|
+
```abap
|
|
6
|
+
managed implementation in class ZBP_I_ORDER unique;
|
|
7
|
+
strict ( 2 );
|
|
8
|
+
|
|
9
|
+
define behavior for ZI_Order alias Order
|
|
10
|
+
persistent table ztab_order
|
|
11
|
+
lock master
|
|
12
|
+
{
|
|
13
|
+
create; update; delete;
|
|
14
|
+
|
|
15
|
+
" Event raised when order is created
|
|
16
|
+
event OrderCreated parameter ZA_OrderEventData;
|
|
17
|
+
|
|
18
|
+
" Event raised on status change
|
|
19
|
+
event OrderStatusChanged parameter ZA_OrderStatusEvent;
|
|
20
|
+
|
|
21
|
+
" Event without parameter (just notification)
|
|
22
|
+
event OrderDeleted;
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Define Event Parameter (Abstract Entity)
|
|
27
|
+
|
|
28
|
+
```abap
|
|
29
|
+
@EndUserText.label: 'Order Event Data'
|
|
30
|
+
define abstract entity ZA_OrderEventData
|
|
31
|
+
{
|
|
32
|
+
OrderID : abap.numc(10);
|
|
33
|
+
CustomerID : kunnr;
|
|
34
|
+
TotalAmount : abap.curr(17,2);
|
|
35
|
+
CurrencyCode : abap.cuky(5);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@EndUserText.label: 'Order Status Change Event'
|
|
39
|
+
define abstract entity ZA_OrderStatusEvent
|
|
40
|
+
{
|
|
41
|
+
OrderID : abap.numc(10);
|
|
42
|
+
OldStatus : abap.char(1);
|
|
43
|
+
NewStatus : abap.char(1);
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Raise Event in Handler
|
|
48
|
+
|
|
49
|
+
```abap
|
|
50
|
+
METHOD create FOR MODIFY IMPORTING entities FOR CREATE Order.
|
|
51
|
+
" ... create logic ...
|
|
52
|
+
|
|
53
|
+
" Raise event after creation
|
|
54
|
+
LOOP AT entities ASSIGNING FIELD-SYMBOL(<entity>).
|
|
55
|
+
RAISE ENTITY EVENT ZI_Order~OrderCreated
|
|
56
|
+
FROM VALUE #( (
|
|
57
|
+
%key = VALUE #( OrderID = <entity>-OrderID )
|
|
58
|
+
%param = VALUE ZA_OrderEventData(
|
|
59
|
+
OrderID = <entity>-OrderID
|
|
60
|
+
CustomerID = <entity>-CustomerID
|
|
61
|
+
TotalAmount = <entity>-TotalAmount
|
|
62
|
+
CurrencyCode = <entity>-CurrencyCode ) ) ).
|
|
63
|
+
ENDLOOP.
|
|
64
|
+
ENDMETHOD.
|
|
65
|
+
|
|
66
|
+
METHOD acceptOrder FOR MODIFY IMPORTING keys FOR ACTION Order~acceptOrder RESULT result.
|
|
67
|
+
" ... update status to 'A' ...
|
|
68
|
+
|
|
69
|
+
" Raise status change event
|
|
70
|
+
LOOP AT keys ASSIGNING FIELD-SYMBOL(<key>).
|
|
71
|
+
RAISE ENTITY EVENT ZI_Order~OrderStatusChanged
|
|
72
|
+
FROM VALUE #( (
|
|
73
|
+
%key = VALUE #( OrderID = <key>-OrderID )
|
|
74
|
+
%param = VALUE ZA_OrderStatusEvent(
|
|
75
|
+
OrderID = <key>-OrderID
|
|
76
|
+
OldStatus = 'O'
|
|
77
|
+
NewStatus = 'A' ) ) ).
|
|
78
|
+
ENDLOOP.
|
|
79
|
+
ENDMETHOD.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Consume Event — Local Handler
|
|
83
|
+
|
|
84
|
+
```abap
|
|
85
|
+
" In another behavior pool or same pool
|
|
86
|
+
CLASS lhc_event_handler DEFINITION INHERITING FROM cl_abap_behavior_handler.
|
|
87
|
+
PRIVATE SECTION.
|
|
88
|
+
METHODS on_order_created FOR ENTITY EVENT
|
|
89
|
+
OrderCreated FOR Order.
|
|
90
|
+
ENDCLASS.
|
|
91
|
+
|
|
92
|
+
CLASS lhc_event_handler IMPLEMENTATION.
|
|
93
|
+
METHOD on_order_created.
|
|
94
|
+
LOOP AT created ASSIGNING FIELD-SYMBOL(<event>).
|
|
95
|
+
" Process event
|
|
96
|
+
DATA(ls_data) = <event>-%param.
|
|
97
|
+
" Example: create follow-up document, send notification
|
|
98
|
+
ENDLOOP.
|
|
99
|
+
ENDMETHOD.
|
|
100
|
+
ENDCLASS.
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Consume Event — Event Consumption Model (Cross-BO)
|
|
104
|
+
|
|
105
|
+
```abap
|
|
106
|
+
" Separate BDEF for event consumption
|
|
107
|
+
abstract;
|
|
108
|
+
|
|
109
|
+
define behavior for ZA_OrderEventData alias OrderEvent
|
|
110
|
+
{
|
|
111
|
+
" Defines a consumer for the OrderCreated event
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Event Binding to SAP Event Mesh
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
// Communication arrangement for Event Mesh
|
|
119
|
+
// In the event binding (ADT), map RAP events to Event Mesh topics:
|
|
120
|
+
// ZI_Order.OrderCreated → sap/s4/beh/order/v1/Order/Created/v1
|
|
121
|
+
// ZI_Order.OrderStatusChanged → sap/s4/beh/order/v1/Order/StatusChanged/v1
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Event Mesh Topic Naming Convention
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
<namespace>/<bo>/<version>/<entity>/<event>/<event-version>
|
|
128
|
+
sap/s4/beh/order/v1/Order/Created/v1
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## CloudEvents Format (Event Mesh Payload)
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"specversion": "1.0",
|
|
136
|
+
"type": "sap.s4.beh.order.v1.Order.Created.v1",
|
|
137
|
+
"source": "/default/sap.s4.beh/S4H",
|
|
138
|
+
"id": "abc-123-def-456",
|
|
139
|
+
"time": "2026-03-15T14:30:00Z",
|
|
140
|
+
"datacontenttype": "application/json",
|
|
141
|
+
"data": {
|
|
142
|
+
"OrderID": "0000001234",
|
|
143
|
+
"CustomerID": "0000100000",
|
|
144
|
+
"TotalAmount": 5000.00,
|
|
145
|
+
"CurrencyCode": "EUR"
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Consume from External (CAP / Node.js)
|
|
151
|
+
|
|
152
|
+
```js
|
|
153
|
+
// CAP consuming SAP Event Mesh events
|
|
154
|
+
const messaging = await cds.connect.to('messaging');
|
|
155
|
+
|
|
156
|
+
messaging.on('sap/s4/beh/order/v1/Order/Created/v1', async (msg) => {
|
|
157
|
+
const { OrderID, CustomerID, TotalAmount } = msg.data;
|
|
158
|
+
console.log(`Order ${OrderID} created for customer ${CustomerID}`);
|
|
159
|
+
// Process event
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
// package.json — Event Mesh config
|
|
165
|
+
{
|
|
166
|
+
"cds": {
|
|
167
|
+
"requires": {
|
|
168
|
+
"messaging": {
|
|
169
|
+
"kind": "enterprise-messaging",
|
|
170
|
+
"format": "cloudevents"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Additional Save with Event Raising
|
|
178
|
+
|
|
179
|
+
```abap
|
|
180
|
+
" For managed BOs: raise events in additional save
|
|
181
|
+
managed implementation in class ZBP_I_ORDER unique;
|
|
182
|
+
with additional save;
|
|
183
|
+
|
|
184
|
+
" In saver class:
|
|
185
|
+
METHOD save_modified.
|
|
186
|
+
" Access created/updated/deleted records
|
|
187
|
+
LOOP AT create-order INTO DATA(ls_created).
|
|
188
|
+
RAISE ENTITY EVENT ZI_Order~OrderCreated
|
|
189
|
+
FROM VALUE #( (
|
|
190
|
+
%key = VALUE #( OrderID = ls_created-OrderID )
|
|
191
|
+
%param = VALUE ZA_OrderEventData(
|
|
192
|
+
OrderID = ls_created-OrderID
|
|
193
|
+
CustomerID = ls_created-CustomerID ) ) ).
|
|
194
|
+
ENDLOOP.
|
|
195
|
+
ENDMETHOD.
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Rules
|
|
199
|
+
- Events declared in BDEF with `event <name> parameter <abstract_entity>`
|
|
200
|
+
- Event parameter is an abstract entity (no persistence)
|
|
201
|
+
- `RAISE ENTITY EVENT` in handler or saver methods
|
|
202
|
+
- Events are transactional — raised only if save succeeds (COMMIT)
|
|
203
|
+
- Event Mesh: configure via communication arrangement + event binding in ADT
|
|
204
|
+
- CloudEvents format is the standard for Event Mesh payloads
|
|
205
|
+
- Event consumers can be: local handler, other RAP BO, CAP app, external system
|
|
206
|
+
- Events without parameter: just `event OrderDeleted;` (notification only)
|
|
207
|
+
|
|
208
|
+
## Anti-Patterns
|
|
209
|
+
| Anti-Pattern | Correct |
|
|
210
|
+
|---|---|
|
|
211
|
+
| Raising event before save completes | Events are transactional — only raised on COMMIT |
|
|
212
|
+
| Direct HTTP call instead of event | Use events for async, decoupled communication |
|
|
213
|
+
| Large payload in event parameter | Keep events lightweight — consumer reads details via API |
|
|
214
|
+
| Event without abstract entity when data needed | Define abstract entity with relevant fields |
|
|
215
|
+
| Hardcoded Event Mesh topic in code | Configure via event binding in ADT |
|
|
216
|
+
| Synchronous processing of events | Events are async by nature — design consumers accordingly |
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# RAP Draft — enable, edit, activate, discard, etag, lock
|
|
2
|
+
|
|
3
|
+
## Ciclo de vida
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
[Active] --Edit--> [Draft] --Activate--> [Active]
|
|
7
|
+
|
|
|
8
|
+
Discard --> [Deleted]
|
|
9
|
+
|
|
|
10
|
+
Resume --> [Draft restored]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Fiori Elements V4 exige draft para operacoes de escrita.
|
|
14
|
+
|
|
15
|
+
## BDEF Interface — habilitar draft
|
|
16
|
+
|
|
17
|
+
```abap
|
|
18
|
+
managed implementation in class ZBP_I_ROOT unique;
|
|
19
|
+
strict ( 2 );
|
|
20
|
+
with draft;
|
|
21
|
+
|
|
22
|
+
define behavior for ZI_Root alias Root
|
|
23
|
+
persistent table zroot
|
|
24
|
+
draft table zroot_d
|
|
25
|
+
etag master LocalLastChangedAt
|
|
26
|
+
lock master total etag LastChangedAt
|
|
27
|
+
authorization master ( global )
|
|
28
|
+
{
|
|
29
|
+
create; update; delete;
|
|
30
|
+
|
|
31
|
+
draft action Edit;
|
|
32
|
+
draft action Activate optimized;
|
|
33
|
+
draft action Discard;
|
|
34
|
+
draft action Resume;
|
|
35
|
+
draft determine action Prepare { validation val1; validation val2; }
|
|
36
|
+
|
|
37
|
+
association _Child { create; with draft; }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
define behavior for ZI_Child alias Child
|
|
41
|
+
persistent table zchild
|
|
42
|
+
draft table zchild_d
|
|
43
|
+
etag master LocalLastChangedAt
|
|
44
|
+
lock dependent by _Root
|
|
45
|
+
authorization dependent by _Root
|
|
46
|
+
{
|
|
47
|
+
update; delete;
|
|
48
|
+
association _Root { with draft; }
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## BDEF Projection — expor draft
|
|
53
|
+
|
|
54
|
+
```abap
|
|
55
|
+
projection;
|
|
56
|
+
strict ( 2 );
|
|
57
|
+
use draft;
|
|
58
|
+
|
|
59
|
+
define behavior for ZC_Root alias Root
|
|
60
|
+
use etag
|
|
61
|
+
{
|
|
62
|
+
use create; use update; use delete;
|
|
63
|
+
use action Edit; use action Activate; use action Discard;
|
|
64
|
+
use action Resume; use action Prepare;
|
|
65
|
+
use association _Child { create; with draft; }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
define behavior for ZC_Child alias Child
|
|
69
|
+
use etag
|
|
70
|
+
{
|
|
71
|
+
use update; use delete;
|
|
72
|
+
use association _Root { with draft; }
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Draft tables
|
|
77
|
+
|
|
78
|
+
Geradas automaticamente ao ativar o BDEF. Convencao: `<tabela>_d`.
|
|
79
|
+
Contem todos os campos da tabela ativa + `%is_draft`, `%draft_uuid`, `%draft_owner`.
|
|
80
|
+
|
|
81
|
+
## ETag
|
|
82
|
+
|
|
83
|
+
```abap
|
|
84
|
+
" Root — controle de concorrencia + total etag para draft
|
|
85
|
+
etag master LocalLastChangedAt
|
|
86
|
+
lock master total etag LastChangedAt
|
|
87
|
+
|
|
88
|
+
" Child — herda do root
|
|
89
|
+
etag master LocalLastChangedAt
|
|
90
|
+
lock dependent by _Root
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- `etag master` → campo `@Semantics.systemDateTime.lastChangedAt` — concorrencia otimista por registro
|
|
94
|
+
- `total etag` → campo `@Semantics.systemDateTime.localInstanceLastChangedAt` — detecta se ativo mudou desde criacao do draft
|
|
95
|
+
|
|
96
|
+
## Draft actions
|
|
97
|
+
|
|
98
|
+
| Action | Trigger | Efeito |
|
|
99
|
+
|--------|---------|--------|
|
|
100
|
+
| `Edit` | Usuario clica Edit | Copia ativo → draft table. Adquire lock |
|
|
101
|
+
| `Activate optimized` | Usuario clica Save | Valida + move draft → tabela ativa. So campos modificados |
|
|
102
|
+
| `Discard` | Usuario clica Cancel | Apaga draft. Libera lock |
|
|
103
|
+
| `Resume` | Usuario reabre draft | Restaura draft para edicao |
|
|
104
|
+
| `Prepare` | Antes do Activate | Executa validacoes listadas. Tambem trigado por side effects |
|
|
105
|
+
|
|
106
|
+
## Prepare — validacao pre-activate
|
|
107
|
+
|
|
108
|
+
```abap
|
|
109
|
+
draft determine action Prepare
|
|
110
|
+
{
|
|
111
|
+
validation validateDates;
|
|
112
|
+
validation validateCustomer;
|
|
113
|
+
determination calculateTotal;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Validacoes listadas em Prepare rodam quando:
|
|
118
|
+
1. Usuario clica Save (antes do Activate)
|
|
119
|
+
2. Side effect com `determine action Prepare executed on field X`
|
|
120
|
+
|
|
121
|
+
## EML com draft
|
|
122
|
+
|
|
123
|
+
```abap
|
|
124
|
+
" Criar draft a partir do ativo
|
|
125
|
+
MODIFY ENTITIES OF ZI_Travel ENTITY Travel
|
|
126
|
+
EXECUTE Edit FROM VALUE #( ( TravelID = '00000001' ) )
|
|
127
|
+
MAPPED DATA(mapped).
|
|
128
|
+
|
|
129
|
+
" Modificar draft
|
|
130
|
+
MODIFY ENTITIES OF ZI_Travel ENTITY Travel
|
|
131
|
+
UPDATE FIELDS ( Description )
|
|
132
|
+
WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on
|
|
133
|
+
TravelID = '00000001'
|
|
134
|
+
Description = 'Updated' ) ).
|
|
135
|
+
|
|
136
|
+
" Prepare (validar)
|
|
137
|
+
MODIFY ENTITIES OF ZI_Travel ENTITY Travel
|
|
138
|
+
EXECUTE Prepare FROM VALUE #( ( %is_draft = if_abap_behv=>mk-on TravelID = '00000001' ) )
|
|
139
|
+
REPORTED DATA(reported).
|
|
140
|
+
|
|
141
|
+
" Activate (salvar)
|
|
142
|
+
MODIFY ENTITIES OF ZI_Travel ENTITY Travel
|
|
143
|
+
EXECUTE Activate FROM VALUE #( ( %is_draft = if_abap_behv=>mk-on TravelID = '00000001' ) )
|
|
144
|
+
FAILED DATA(failed) REPORTED reported.
|
|
145
|
+
COMMIT ENTITIES.
|
|
146
|
+
|
|
147
|
+
" Ler draft
|
|
148
|
+
READ ENTITIES OF ZI_Travel ENTITY Travel ALL FIELDS
|
|
149
|
+
WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on TravelID = '00000001' ) )
|
|
150
|
+
RESULT DATA(drafts).
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Campos administrativos obrigatorios
|
|
154
|
+
|
|
155
|
+
```abap
|
|
156
|
+
@Semantics.user.createdBy: true
|
|
157
|
+
created_by as CreatedBy, " abp_creation_user
|
|
158
|
+
@Semantics.systemDateTime.createdAt: true
|
|
159
|
+
created_at as CreatedAt, " abp_creation_tstmpl
|
|
160
|
+
@Semantics.user.localInstanceLastChangedBy: true
|
|
161
|
+
last_changed_by as LastChangedBy, " abp_locinst_lastchange_user
|
|
162
|
+
@Semantics.systemDateTime.localInstanceLastChangedAt: true
|
|
163
|
+
last_changed_at as LastChangedAt, " abp_locinst_lastchange_tstmpl → total etag
|
|
164
|
+
@Semantics.systemDateTime.lastChangedAt: true
|
|
165
|
+
local_last_changed_at as LocalLastChangedAt, " abp_lastchange_tstmpl → etag master
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Draft lock
|
|
169
|
+
|
|
170
|
+
- Um draft por instancia por vez
|
|
171
|
+
- Outros usuarios veem "Locked by user X"
|
|
172
|
+
- Drafts orfaos: cleanup automatico (default 28 dias)
|
|
173
|
+
|
|
174
|
+
## Regras
|
|
175
|
+
- `with draft` no topo do BDEF interface
|
|
176
|
+
- `draft table` para cada entidade (root + filhos)
|
|
177
|
+
- Todas as 5 draft actions obrigatorias: Edit, Activate, Discard, Resume, Prepare
|
|
178
|
+
- `association _Child { create; with draft; }` — propaga draft para filhos
|
|
179
|
+
- `use draft` na projection BDEF
|
|
180
|
+
- Todas as draft actions expostas na projection BDEF
|
|
181
|
+
- `Activate optimized` — grava so campos modificados (melhor performance)
|
|
182
|
+
|
|
183
|
+
## Anti-patterns
|
|
184
|
+
| Errado | Correto |
|
|
185
|
+
|--------|---------|
|
|
186
|
+
| `with draft` sem `draft table` | Ambos obrigatorios |
|
|
187
|
+
| Esquecer `with draft` na association | `association _Child { create; with draft; }` |
|
|
188
|
+
| Esquecer `use draft` na projection | Draft nao funciona sem isso |
|
|
189
|
+
| Nao listar validacoes no Prepare | Validacoes nao rodam antes do Activate |
|
|
190
|
+
| `lock master` no child | `lock dependent by _Root` |
|
|
191
|
+
| `Activate` sem `optimized` | Funciona mas grava todos os campos (pior performance) |
|