@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,289 @@
|
|
|
1
|
+
# Constructor Expressions — VALUE, NEW, CONV, COND, REDUCE, FILTER
|
|
2
|
+
|
|
3
|
+
## VALUE — Structures and Tables
|
|
4
|
+
|
|
5
|
+
```abap
|
|
6
|
+
" Structure
|
|
7
|
+
DATA(zs_item) = VALUE zs_order_item( id = 1 name = `Widget` qty = 10 ).
|
|
8
|
+
|
|
9
|
+
" Clear to initial
|
|
10
|
+
zs_item = VALUE #( ).
|
|
11
|
+
|
|
12
|
+
" Table with rows
|
|
13
|
+
DATA(zt_items) = VALUE zt_order_items(
|
|
14
|
+
( id = 1 name = `Alpha` )
|
|
15
|
+
( id = 2 name = `Beta` )
|
|
16
|
+
( id = 3 name = `Gamma` ) ).
|
|
17
|
+
|
|
18
|
+
" BASE — append to existing
|
|
19
|
+
zt_items = VALUE #( BASE zt_items ( id = 4 name = `Delta` ) ).
|
|
20
|
+
|
|
21
|
+
" LINES OF — merge tables
|
|
22
|
+
zt_items = VALUE #( BASE zt_items ( LINES OF zt_other ) ).
|
|
23
|
+
|
|
24
|
+
" FOR with counter
|
|
25
|
+
DATA(zt_gen) = VALUE zt_int_tab(
|
|
26
|
+
FOR i = 1 UNTIL i > 100 ( i ) ).
|
|
27
|
+
|
|
28
|
+
" FOR from source
|
|
29
|
+
DATA(zt_names) = VALUE string_table(
|
|
30
|
+
FOR wa IN zt_items ( |{ wa-id }: { wa-name }| ) ).
|
|
31
|
+
|
|
32
|
+
" FOR with WHERE
|
|
33
|
+
DATA(zt_active) = VALUE zt_order_items(
|
|
34
|
+
FOR wa IN zt_items WHERE ( status = 'A' ) ( wa ) ).
|
|
35
|
+
|
|
36
|
+
" FOR with INDEX INTO
|
|
37
|
+
DATA(zt_numbered) = VALUE zt_numbered_tab(
|
|
38
|
+
FOR wa IN zt_items INDEX INTO idx
|
|
39
|
+
( line_no = idx data = wa ) ).
|
|
40
|
+
|
|
41
|
+
" Nested FOR
|
|
42
|
+
DATA(zt_cross) = VALUE zt_pair_tab(
|
|
43
|
+
FOR a IN zt_x FOR b IN zt_y
|
|
44
|
+
( x = a y = b ) ).
|
|
45
|
+
|
|
46
|
+
" Deep structure
|
|
47
|
+
DATA(zs_doc) = VALUE zs_document(
|
|
48
|
+
header = VALUE #( doc_id = '100' title = `Order` )
|
|
49
|
+
items = VALUE #(
|
|
50
|
+
( item_id = 10 desc = `Item A` )
|
|
51
|
+
( item_id = 20 desc = `Item B` ) ) ).
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## OPTIONAL and DEFAULT
|
|
55
|
+
|
|
56
|
+
```abap
|
|
57
|
+
" OPTIONAL — returns initial value if not found (no exception)
|
|
58
|
+
DATA(zs_safe) = VALUE #( zt_items[ id = 999 ] OPTIONAL ).
|
|
59
|
+
|
|
60
|
+
" DEFAULT — returns specified value if not found
|
|
61
|
+
DATA(zs_def) = VALUE #( zt_items[ id = 999 ]
|
|
62
|
+
DEFAULT VALUE #( id = 0 name = `Not found` ) ).
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## NEW — Objects and Data References
|
|
66
|
+
|
|
67
|
+
```abap
|
|
68
|
+
" Object instantiation
|
|
69
|
+
DATA(zo_proc) = NEW zcl_processor( iv_mode = 'A' ).
|
|
70
|
+
|
|
71
|
+
" Inline chain
|
|
72
|
+
DATA(lv_valid) = NEW zcl_validator( )->is_valid( lv_input ).
|
|
73
|
+
|
|
74
|
+
" Data references
|
|
75
|
+
DATA(zr_int) = NEW i( 42 ).
|
|
76
|
+
DATA(zr_str) = NEW string( `Hello` ).
|
|
77
|
+
DATA(zr_struc) = NEW zs_order_item( id = 1 name = `Test` ).
|
|
78
|
+
DATA(zr_tab) = NEW zt_order_items( ( id = 1 ) ( id = 2 ) ).
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## CONV — Type Conversion
|
|
82
|
+
|
|
83
|
+
```abap
|
|
84
|
+
DATA(lv_str) = CONV string( 12345 ).
|
|
85
|
+
DATA(lv_int) = CONV i( '999' ).
|
|
86
|
+
DATA(lv_dec) = CONV decfloat34( 1 / 3 ).
|
|
87
|
+
|
|
88
|
+
" In method call
|
|
89
|
+
zo_obj->process( CONV string( lv_number ) ).
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## CORRESPONDING — Structure/Table Mapping
|
|
93
|
+
|
|
94
|
+
```abap
|
|
95
|
+
" Basic — map matching component names
|
|
96
|
+
zs_target = CORRESPONDING #( zs_source ).
|
|
97
|
+
|
|
98
|
+
" BASE — keep existing values, overwrite matches
|
|
99
|
+
zs_target = CORRESPONDING #( BASE ( zs_target ) zs_source ).
|
|
100
|
+
|
|
101
|
+
" MAPPING — explicit field renaming
|
|
102
|
+
zs_target = CORRESPONDING #( zs_source MAPPING
|
|
103
|
+
target_field = source_field
|
|
104
|
+
name = description ).
|
|
105
|
+
|
|
106
|
+
" EXCEPT — exclude specific fields
|
|
107
|
+
zs_target = CORRESPONDING #( zs_source EXCEPT field1 field2 ).
|
|
108
|
+
|
|
109
|
+
" DEEP — handle nested structures/tables
|
|
110
|
+
zs_target = CORRESPONDING #( DEEP zs_source ).
|
|
111
|
+
|
|
112
|
+
" DISCARDING DUPLICATES — for unique key targets
|
|
113
|
+
zt_sorted_target = CORRESPONDING #( zt_source DISCARDING DUPLICATES ).
|
|
114
|
+
|
|
115
|
+
" RAP entity mapping
|
|
116
|
+
zs_db = CORRESPONDING #( zs_bdef MAPPING FROM ENTITY ).
|
|
117
|
+
zs_bdef = CORRESPONDING #( zs_db MAPPING TO ENTITY ).
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## COND — Conditional Expressions
|
|
121
|
+
|
|
122
|
+
```abap
|
|
123
|
+
" Simple
|
|
124
|
+
DATA(lv_text) = COND string( WHEN lv_flag = abap_true THEN `Yes` ELSE `No` ).
|
|
125
|
+
|
|
126
|
+
" Multi-branch
|
|
127
|
+
DATA(lv_grade) = COND string(
|
|
128
|
+
WHEN lv_score >= 90 THEN `A`
|
|
129
|
+
WHEN lv_score >= 80 THEN `B`
|
|
130
|
+
WHEN lv_score >= 70 THEN `C`
|
|
131
|
+
ELSE `F` ).
|
|
132
|
+
|
|
133
|
+
" With THROW
|
|
134
|
+
DATA(lv_val) = COND #(
|
|
135
|
+
WHEN lv_valid = abap_true THEN lv_result
|
|
136
|
+
ELSE THROW zcx_validation_error( ) ).
|
|
137
|
+
|
|
138
|
+
" With LET
|
|
139
|
+
DATA(lv_size) = COND string(
|
|
140
|
+
LET len = strlen( lv_text ) IN
|
|
141
|
+
WHEN len > 100 THEN `Large`
|
|
142
|
+
WHEN len > 50 THEN `Medium`
|
|
143
|
+
ELSE `Small` ).
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## SWITCH — Value-Based Branching
|
|
147
|
+
|
|
148
|
+
```abap
|
|
149
|
+
DATA(lv_label) = SWITCH string( lv_code
|
|
150
|
+
WHEN 'A' THEN `Active`
|
|
151
|
+
WHEN 'I' THEN `Inactive`
|
|
152
|
+
WHEN 'D' THEN `Deleted`
|
|
153
|
+
ELSE `Unknown` ).
|
|
154
|
+
|
|
155
|
+
" With THROW
|
|
156
|
+
DATA(lv_mapped) = SWITCH #( lv_code
|
|
157
|
+
WHEN 1 THEN `One`
|
|
158
|
+
WHEN 2 THEN `Two`
|
|
159
|
+
ELSE THROW zcx_invalid_code( ) ).
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## REDUCE — Aggregation
|
|
163
|
+
|
|
164
|
+
```abap
|
|
165
|
+
" Sum
|
|
166
|
+
DATA(lv_total) = REDUCE i( INIT s = 0
|
|
167
|
+
FOR wa IN zt_items
|
|
168
|
+
NEXT s = s + wa-amount ).
|
|
169
|
+
|
|
170
|
+
" Concatenation
|
|
171
|
+
DATA(lv_csv) = REDUCE string( INIT str = ``
|
|
172
|
+
FOR wa IN zt_items
|
|
173
|
+
NEXT str = str && |{ wa-name },| ).
|
|
174
|
+
|
|
175
|
+
" Max
|
|
176
|
+
DATA(lv_max) = REDUCE i( INIT m = 0
|
|
177
|
+
FOR wa IN zt_items
|
|
178
|
+
NEXT m = COND #( WHEN wa-value > m THEN wa-value ELSE m ) ).
|
|
179
|
+
|
|
180
|
+
" Conditional count
|
|
181
|
+
DATA(lv_active_count) = REDUCE i( INIT c = 0
|
|
182
|
+
FOR wa IN zt_items WHERE ( status = 'A' )
|
|
183
|
+
NEXT c = c + 1 ).
|
|
184
|
+
|
|
185
|
+
" Multiple accumulators
|
|
186
|
+
DATA(lv_stats) = REDUCE #(
|
|
187
|
+
INIT sum = 0 cnt = 0
|
|
188
|
+
FOR wa IN zt_items
|
|
189
|
+
NEXT sum = sum + wa-amount
|
|
190
|
+
cnt = cnt + 1 ).
|
|
191
|
+
|
|
192
|
+
" Build table
|
|
193
|
+
DATA(zt_filtered) = REDUCE string_table(
|
|
194
|
+
INIT result = VALUE string_table( )
|
|
195
|
+
FOR wa IN zt_items WHERE ( status = 'A' )
|
|
196
|
+
NEXT result = VALUE #( BASE result ( wa-name ) ) ).
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## FILTER — Table Filtering
|
|
200
|
+
|
|
201
|
+
```abap
|
|
202
|
+
" Basic (requires sorted/hashed key on filter field)
|
|
203
|
+
DATA(zt_active) = FILTER #( zt_items WHERE status = 'A' ).
|
|
204
|
+
|
|
205
|
+
" Using secondary key
|
|
206
|
+
DATA(zt_by_cat) = FILTER #( zt_items USING KEY by_category
|
|
207
|
+
WHERE category = 'X' ).
|
|
208
|
+
|
|
209
|
+
" EXCEPT — exclude matching
|
|
210
|
+
DATA(zt_rest) = FILTER #( zt_items EXCEPT WHERE status = 'D' ).
|
|
211
|
+
|
|
212
|
+
" IN with filter table
|
|
213
|
+
DATA zt_vals TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.
|
|
214
|
+
zt_vals = VALUE #( ( `A` ) ( `B` ) ).
|
|
215
|
+
DATA(zt_matched) = FILTER #( zt_items IN zt_vals WHERE status = table_line ).
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## CAST — Type Casting
|
|
219
|
+
|
|
220
|
+
```abap
|
|
221
|
+
DATA(zo_child) = CAST zcl_child( zo_parent_ref ).
|
|
222
|
+
DATA(zo_intf) = CAST zif_processable( zo_ref ).
|
|
223
|
+
|
|
224
|
+
" RTTI
|
|
225
|
+
DATA(zo_cls) = CAST cl_abap_classdescr(
|
|
226
|
+
cl_abap_typedescr=>describe_by_object_ref( zo_ref ) ).
|
|
227
|
+
|
|
228
|
+
" Safe cast
|
|
229
|
+
TRY.
|
|
230
|
+
DATA(zo_spec) = CAST zcl_specific( zo_general ).
|
|
231
|
+
CATCH cx_sy_move_cast_error.
|
|
232
|
+
ENDTRY.
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## REF — Data References
|
|
236
|
+
|
|
237
|
+
```abap
|
|
238
|
+
DATA lv_text TYPE string VALUE `Hello`.
|
|
239
|
+
DATA(zr_ref) = REF #( lv_text ).
|
|
240
|
+
|
|
241
|
+
" In method call
|
|
242
|
+
zo_obj->process( REF #( zs_structure ) ).
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## LET — Local Variables in Expressions
|
|
246
|
+
|
|
247
|
+
```abap
|
|
248
|
+
DATA(lv_result) = LET a = 10 b = 20 IN a + b.
|
|
249
|
+
|
|
250
|
+
DATA(zt_offset) = VALUE zt_item_tab(
|
|
251
|
+
LET base = 1000 IN
|
|
252
|
+
( id = base + 1 name = `First` )
|
|
253
|
+
( id = base + 2 name = `Second` ) ).
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## ALPHA Conversion in String Templates
|
|
257
|
+
|
|
258
|
+
```abap
|
|
259
|
+
DATA(lv_padded) = |{ '1234' ALPHA = IN WIDTH = 10 }|. " '0000001234'
|
|
260
|
+
DATA(lv_clean) = |{ '00001234' ALPHA = OUT }|. " '1234'
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Rules
|
|
266
|
+
|
|
267
|
+
- Use `VALUE #( )` with type inference when target type is clear
|
|
268
|
+
- Use OPTIONAL/DEFAULT for safe table expression access
|
|
269
|
+
- Use CORRESPONDING over manual field-by-field assignment
|
|
270
|
+
- Use REDUCE for functional-style aggregation
|
|
271
|
+
- FILTER requires sorted or hashed key on the filter field
|
|
272
|
+
- Use LET to avoid repeated calculations in expressions
|
|
273
|
+
- NEW for objects, REF for references to existing data
|
|
274
|
+
- COND for if/else chains, SWITCH for value matching
|
|
275
|
+
|
|
276
|
+
## Anti-Patterns
|
|
277
|
+
|
|
278
|
+
| Anti-Pattern | Correct Approach |
|
|
279
|
+
|---|---|
|
|
280
|
+
| Manual field-by-field `target-f1 = source-f1` | `CORRESPONDING #( source )` |
|
|
281
|
+
| `IF/ELSEIF` chain to set one variable | `COND #( WHEN ... )` |
|
|
282
|
+
| `CASE` statement to set one variable | `SWITCH #( var WHEN ... )` |
|
|
283
|
+
| `LOOP AT + APPEND` to build derived table | `VALUE #( FOR wa IN source ( ... ) )` |
|
|
284
|
+
| `LOOP AT + sum variable` for aggregation | `REDUCE i( INIT s = 0 FOR ... )` |
|
|
285
|
+
| `LOOP AT + IF + APPEND` for filtering | `FILTER #( itab WHERE ... )` |
|
|
286
|
+
| `CREATE OBJECT oref` | `NEW zcl_class( )` |
|
|
287
|
+
| `MOVE-CORRESPONDING source TO target` | `target = CORRESPONDING #( source )` |
|
|
288
|
+
| Catching table expression exception for existence check | `VALUE #( itab[ ... ] OPTIONAL )` |
|
|
289
|
+
| Nested `IF` for complex conditions | `COND #( LET ... IN WHEN ... )` |
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# Enhancements & Extensibility — BAdI, customer exit, screen exit, modifications, pre-flight checks
|
|
2
|
+
|
|
3
|
+
## Regra de ouro: verificar ANTES de desenvolver
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
ANTES de criar qualquer extensão SAP, verificar restrições de slot:
|
|
7
|
+
1. abap_enhancement_spot(name:'SPOT') → single-use? filter? implementações existentes?
|
|
8
|
+
2. Se single-use E já tem implementação ativa → NÃO criar nova, MODIFICAR a existente
|
|
9
|
+
3. Se filter-dependent → verificar se valor de filtro já está ocupado
|
|
10
|
+
4. Se customer exit (SMOD) → verificar se já está em um projeto CMOD
|
|
11
|
+
5. Se transaction code → abap_search para verificar se nome já existe
|
|
12
|
+
6. Se objeto Z com mesmo nome → abap_search antes de abap_create
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Mecanismos de extensão SAP — slots e restrições
|
|
16
|
+
|
|
17
|
+
| Mecanismo | Restrição de slot | Verificação |
|
|
18
|
+
|-----------|------------------|-------------|
|
|
19
|
+
| BAdI single-use | Apenas 1 implementação ativa | abap_enhancement_spot → ver implementações |
|
|
20
|
+
| BAdI filter-dependent | 1 implementação por valor de filtro | abap_enhancement_spot → ver filtros usados |
|
|
21
|
+
| BAdI multi-use | Sem limite | Pode criar livremente |
|
|
22
|
+
| Customer Exit (SMOD/CMOD) | Function exit só pode estar em 1 projeto CMOD | Verificar em SMOD se já está atribuído |
|
|
23
|
+
| Screen Exit (subscreen) | 1 programa por subscreen area | Verificar se subscreen já está ocupada |
|
|
24
|
+
| Substitution (GGB1) | Limite de steps por evento | Verificar steps existentes na área |
|
|
25
|
+
| Validation (GGB4) | Limite de steps por evento | Verificar steps existentes na área |
|
|
26
|
+
| Modification (SSCR) | 1 correção por include + precisa chave de objeto | Verificar SM04/SSCR, conflito com notas SAP |
|
|
27
|
+
| Transaction code (SE93) | Nome único no sistema | abap_search(query:'TCODE_NAME') |
|
|
28
|
+
| Qualquer objeto Z | Nome único no sistema | abap_search antes de abap_create |
|
|
29
|
+
|
|
30
|
+
## BAdI — Single-Use vs Multi-Use
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Single-Use (apenas 1 implementação ativa):
|
|
34
|
+
- Apenas UMA implementação pode existir e estar ativa
|
|
35
|
+
- Se já existir → MODIFICAR a existente, NÃO criar nova
|
|
36
|
+
- Exemplo: J_1BNF_ADD_DATA (NF-e), BADI_FDCB_SUBBAS01
|
|
37
|
+
|
|
38
|
+
Multi-Use (múltiplas implementações):
|
|
39
|
+
- Várias implementações podem coexistir
|
|
40
|
+
- Ordem de execução não garantida (exceto com filtro)
|
|
41
|
+
- Exemplo: BADI_MATERIAL_CHECK, BADI_ACC_DOCUMENT
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## BAdI — Filter-Dependent
|
|
45
|
+
|
|
46
|
+
```abap
|
|
47
|
+
" BAdI com filtro: cada implementação responde a um valor de filtro
|
|
48
|
+
" Exemplo: filtro por país (LAND1), tipo de documento (BLART)
|
|
49
|
+
|
|
50
|
+
" Na definição do BAdI (SE18):
|
|
51
|
+
" Filter Type: LAND1
|
|
52
|
+
" Filter Values por implementação: 'BR', 'US', 'DE'
|
|
53
|
+
|
|
54
|
+
" Na implementação (SE19):
|
|
55
|
+
" Filter Value = 'BR' → só executa para Brasil
|
|
56
|
+
|
|
57
|
+
" RESTRIÇÃO: 2 implementações NÃO podem ter o mesmo valor de filtro
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Customer Exit (SMOD/CMOD)
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Tipos de customer exit:
|
|
64
|
+
- Function exit: CALL CUSTOMER-FUNCTION 'NNN' no código standard
|
|
65
|
+
- Screen exit: subscreen area reservada no dynpro standard
|
|
66
|
+
- Menu exit: item de menu adicional
|
|
67
|
+
|
|
68
|
+
Verificação SMOD:
|
|
69
|
+
1. SMOD → informar nome do exit (ex: SAPMV45A, EXIT_SAPMM06E_001)
|
|
70
|
+
2. Ver se já está atribuído a um projeto CMOD
|
|
71
|
+
3. Se sim → usar o projeto existente ou negociar com o dono
|
|
72
|
+
4. Se não → criar novo projeto CMOD e atribuir
|
|
73
|
+
|
|
74
|
+
RESTRIÇÃO: um function exit só pode estar em 1 projeto CMOD por vez.
|
|
75
|
+
Se já estiver em outro projeto, precisa remover de lá primeiro.
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```abap
|
|
79
|
+
" Exemplo: Customer Exit em SD (USEREXIT)
|
|
80
|
+
" Include: MV45AFZZ (user exits de VA01/VA02)
|
|
81
|
+
|
|
82
|
+
FORM USEREXIT_SAVE_DOCUMENT_PREPARE.
|
|
83
|
+
" Validação customizada antes de salvar pedido
|
|
84
|
+
IF gv_vbak-auart = 'ZOR1'.
|
|
85
|
+
" lógica customizada
|
|
86
|
+
ENDIF.
|
|
87
|
+
ENDFORM.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Screen Exit (Subscreen)
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Verificação:
|
|
94
|
+
1. No dynpro standard, identificar a subscreen area (ex: SAPLXM06 0100)
|
|
95
|
+
2. Verificar se já tem programa atribuído
|
|
96
|
+
3. Se sim → modificar o existente
|
|
97
|
+
4. Se não → criar novo e atribuir via CMOD
|
|
98
|
+
|
|
99
|
+
RESTRIÇÃO: apenas 1 programa pode preencher uma subscreen area.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Substitution & Validation (OBBH/GGB1/GGB4)
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
Substitution (GGB1): substitui valor de campo automaticamente
|
|
106
|
+
Validation (GGB4): valida dados e bloqueia gravação se inválido
|
|
107
|
+
|
|
108
|
+
Verificação:
|
|
109
|
+
1. OBBH (FI) ou GGB1/GGB4 → ver área (ex: Document Header, Line Item)
|
|
110
|
+
2. Ver steps existentes por evento (ex: Document, Before Posting)
|
|
111
|
+
3. Verificar se há limite de steps (normalmente 30-50 por combinação)
|
|
112
|
+
4. Se atingiu limite → consolidar steps existentes
|
|
113
|
+
|
|
114
|
+
Cada step tem: pré-condição + ação (substitution) ou check (validation)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Modification (SSCR)
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
Modificação direta de código SAP standard. ÚLTIMO RECURSO.
|
|
121
|
+
|
|
122
|
+
Verificação:
|
|
123
|
+
1. Precisa de chave de objeto (Access Key) via SAP Marketplace
|
|
124
|
+
2. Verificar se já existe modificação no mesmo include (SM04, SE95)
|
|
125
|
+
3. Conflita com SAP Notes — a cada nota/SP precisa revalidar
|
|
126
|
+
|
|
127
|
+
RESTRIÇÃO:
|
|
128
|
+
- 1 correção por include por vez
|
|
129
|
+
- Notas SAP podem sobrescrever a modificação
|
|
130
|
+
- Precisa chave de registro (developer key + object key)
|
|
131
|
+
|
|
132
|
+
Preferência (do mais seguro ao menos):
|
|
133
|
+
BAdI > Enhancement Point > Customer Exit > Implicit Enhancement > Modification
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Fluxo correto — Implementar BAdI
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
1. Identificar o BAdI (documentation, debugging, search)
|
|
140
|
+
2. abap_enhancement_spot(name:'BADI_NAME')
|
|
141
|
+
→ Verificar: single-use? filter-dependent? implementações existentes?
|
|
142
|
+
3a. Se single-use COM implementação:
|
|
143
|
+
→ abap_read a implementação existente
|
|
144
|
+
→ abap_write para modificar
|
|
145
|
+
3b. Se single-use SEM implementação:
|
|
146
|
+
→ Criar nova via SE19 ou abap_create
|
|
147
|
+
3c. Se multi-use:
|
|
148
|
+
→ Criar nova implementação
|
|
149
|
+
→ Se filter-dependent: definir valor de filtro
|
|
150
|
+
4. Implementar a interface do BAdI na classe
|
|
151
|
+
5. Ativar
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Implementação BAdI — Estrutura da Classe
|
|
155
|
+
|
|
156
|
+
```abap
|
|
157
|
+
CLASS zcl_badi_impl DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
158
|
+
PUBLIC SECTION.
|
|
159
|
+
INTERFACES if_ex_j_1bnf_add_data.
|
|
160
|
+
ENDCLASS.
|
|
161
|
+
|
|
162
|
+
CLASS zcl_badi_impl IMPLEMENTATION.
|
|
163
|
+
METHOD if_ex_j_1bnf_add_data~add_data.
|
|
164
|
+
" Parâmetros vêm da interface do BAdI
|
|
165
|
+
" Implementação aqui
|
|
166
|
+
ENDMETHOD.
|
|
167
|
+
ENDCLASS.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Enhancement Point — Inserir código
|
|
171
|
+
|
|
172
|
+
```abap
|
|
173
|
+
" Código SAP standard contém:
|
|
174
|
+
ENHANCEMENT-POINT ep_name SPOTS es_name.
|
|
175
|
+
|
|
176
|
+
" Sua implementação (via SE19 → Enhancement Implementation):
|
|
177
|
+
ENHANCEMENT 1 z_my_enhancement.
|
|
178
|
+
" Seu código inserido aqui
|
|
179
|
+
lv_custom_field = 'X'.
|
|
180
|
+
ENDENHANCEMENT.
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Enhancement Section — Substituir bloco
|
|
184
|
+
|
|
185
|
+
```abap
|
|
186
|
+
" Código SAP standard contém:
|
|
187
|
+
ENHANCEMENT-SECTION es_name SPOTS es_spot.
|
|
188
|
+
" Código original SAP
|
|
189
|
+
END-ENHANCEMENT-SECTION.
|
|
190
|
+
|
|
191
|
+
" Sua implementação SUBSTITUI o bloco inteiro:
|
|
192
|
+
ENHANCEMENT 1 z_my_enhancement.
|
|
193
|
+
" Seu código substituto (documentar original em comentário!)
|
|
194
|
+
END-ENHANCEMENT.
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Encontrar BAdIs de um processo
|
|
198
|
+
|
|
199
|
+
```abap
|
|
200
|
+
" Método 1: Debugging
|
|
201
|
+
" Breakpoint em CL_EXITHANDLER=>GET_INSTANCE → executar transação
|
|
202
|
+
|
|
203
|
+
" Método 2: Search
|
|
204
|
+
" abap_search(query:'BADI*MATERIAL*', object_type:'ENHS/ES')
|
|
205
|
+
|
|
206
|
+
" Método 3: Documentação SAP
|
|
207
|
+
" SE18 → procurar por área funcional
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Regras
|
|
211
|
+
|
|
212
|
+
- SEMPRE verificar slot antes de desenvolver (single-use, filtro, CMOD, subscreen)
|
|
213
|
+
- Single-use com implementação existente → modificar, NUNCA criar nova
|
|
214
|
+
- Filter-dependent: cada implementação precisa de filtro único
|
|
215
|
+
- Customer exit: verificar se function exit já está em projeto CMOD
|
|
216
|
+
- Enhancement Points/Sections: código SAP muda em upgrades — testar após SP/EHP
|
|
217
|
+
- Preferir BAdI > Enhancement Point > Customer Exit > Modification
|
|
218
|
+
- Documentar qual mecanismo foi usado (comentário no código + transport description)
|
|
219
|
+
- Testar com `abap_unit_test` após implementar — extensões afetam processos críticos
|
|
220
|
+
|
|
221
|
+
## Anti-Patterns
|
|
222
|
+
|
|
223
|
+
| Anti-Pattern | Correto |
|
|
224
|
+
|---|---|
|
|
225
|
+
| Criar implementação de BAdI single-use sem verificar se já existe | Sempre abap_enhancement_spot ANTES |
|
|
226
|
+
| Criar customer exit sem verificar SMOD/CMOD | Verificar atribuição antes |
|
|
227
|
+
| Usar Modification quando BAdI existe | BAdI é mais seguro e upgrade-safe |
|
|
228
|
+
| Modificar Enhancement Section sem documentar original | Comentar código original substituído |
|
|
229
|
+
| Ignorar filtro em BAdI filter-dependent | Definir filtro correto ou executa para TUDO |
|
|
230
|
+
| Implementar sem testar processo completo | Testar cenário end-to-end |
|
|
231
|
+
| Deixar implementação inativa sem documentar por quê | Ativar ou deletar |
|
|
232
|
+
| Desenvolver extensão sem verificar versão PRD | abap_object_versions antes de modificar |
|