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