abapgit-agent 1.14.5 → 1.15.1
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/abap/CLAUDE.md +34 -4
- package/abap/guidelines/abapgit-fugr.md +159 -0
- package/abap/guidelines/abapgit-xml-only.md +397 -0
- package/abap/guidelines/abapgit.md +29 -304
- package/abap/guidelines/abaplint-local.md +1 -1
- package/abap/guidelines/abaplint.md +1 -1
- package/abap/guidelines/branch-workflow.md +1 -1
- package/abap/guidelines/cds-testing.md +1 -1
- package/abap/guidelines/common-errors.md +1 -1
- package/abap/guidelines/debug-dump.md +1 -1
- package/abap/guidelines/debug-session.md +23 -24
- package/abap/guidelines/object-creation.md +1 -1
- package/abap/guidelines/probe-poc.md +1 -1
- package/abap/guidelines/run-probe-classes.md +1 -1
- package/abap/guidelines/unit-testable-code.md +1 -43
- package/abap/guidelines/workflow-detailed.md +1 -1
- package/package.json +2 -1
- package/src/commands/debug.js +48 -6
- package/src/commands/view.js +63 -2
- package/src/utils/abap-reference.js +2 -0
package/abap/CLAUDE.md
CHANGED
|
@@ -96,7 +96,7 @@ Never assume Z/Y prefix without checking.
|
|
|
96
96
|
```
|
|
97
97
|
❌ WRONG: Only write the .abap source file
|
|
98
98
|
✅ CORRECT: Every object needs both a source file AND an XML metadata file
|
|
99
|
-
XML-only objects (TABL, STRU, DTEL, TTYP) need ONLY the XML file
|
|
99
|
+
XML-only objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG) need ONLY the XML file
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
Use the object name from `objects.local.md` (or `objects.md` as fallback) in place of `<name>`:
|
|
@@ -107,10 +107,14 @@ Use the object name from `objects.local.md` (or `objects.md` as fallback) in pla
|
|
|
107
107
|
| Interface (INTF) | `<name>.intf.abap` | `<name>.intf.xml` |
|
|
108
108
|
| Program (PROG) | `<name>.prog.abap` | `<name>.prog.xml` |
|
|
109
109
|
| CDS View (DDLS) | `<name>.ddls.asddls` | `<name>.ddls.xml` |
|
|
110
|
+
| CDS Access Control (DCLS) | `<name>.dcls.asdcls` | `<name>.dcls.xml` |
|
|
111
|
+
| Function Group (FUGR) | `<name>.fugr.abap` + includes | `<name>.fugr.xml` |
|
|
110
112
|
| Table (TABL) | *(none)* | `<name>.tabl.xml` |
|
|
111
113
|
| Structure (STRU) | *(none)* | `<name>.stru.xml` |
|
|
112
114
|
| Data Element (DTEL) | *(none)* | `<name>.dtel.xml` |
|
|
113
115
|
| Table Type (TTYP) | *(none)* | `<name>.ttyp.xml` |
|
|
116
|
+
| Domain (DOMA) | *(none)* | `<name>.doma.xml` |
|
|
117
|
+
| Message Class (MSAG) | *(none)* | `<name>.msag.xml` |
|
|
114
118
|
|
|
115
119
|
**Package assignment — determine the package, then follow the confirmation rule below:**
|
|
116
120
|
|
|
@@ -155,7 +159,7 @@ Anything else (SAP namespace object, or SAP-delivered package)?
|
|
|
155
159
|
> **Tip for project setup**: Add package rules to `objects.local.md` so Claude never
|
|
156
160
|
> needs to ask. See `guidelines/objects.md` for examples.
|
|
157
161
|
|
|
158
|
-
→ For exact XML templates: `abapgit-agent ref --topic abapgit`
|
|
162
|
+
→ For exact XML templates: `abapgit-agent ref --topic abapgit` (CLAS/INTF/PROG/DDLS/DCLS/FUGR) or `abapgit-agent ref --topic abapgit-xml-only` (TABL/STRU/DTEL/TTYP/DOMA/MSAG)
|
|
159
163
|
→ For local helper/test-double class files: `abapgit-agent ref --topic object-creation`
|
|
160
164
|
|
|
161
165
|
---
|
|
@@ -288,6 +292,23 @@ abapgit-agent view --objects ZCL_UNKNOWN_CLASS --full
|
|
|
288
292
|
# View FULL source with dual line numbers (for setting breakpoints)
|
|
289
293
|
# G [N] code — G = global line for debug set, [N] = include-relative
|
|
290
294
|
abapgit-agent view --objects ZCL_UNKNOWN_CLASS --full --lines
|
|
295
|
+
|
|
296
|
+
# View table/structure fields
|
|
297
|
+
abapgit-agent view --objects SFLIGHT --type TABL
|
|
298
|
+
abapgit-agent view --objects MY_STRUC --type STRU
|
|
299
|
+
|
|
300
|
+
# View data element or domain
|
|
301
|
+
abapgit-agent view --objects S_CARR_ID --type DTEL
|
|
302
|
+
abapgit-agent view --objects XFELD --type DOMA
|
|
303
|
+
|
|
304
|
+
# View message class (all messages)
|
|
305
|
+
abapgit-agent view --objects SY --type MSAG
|
|
306
|
+
|
|
307
|
+
# View function group (function module list)
|
|
308
|
+
abapgit-agent view --objects SUSR --type FUGR
|
|
309
|
+
|
|
310
|
+
# View CDS access control source
|
|
311
|
+
abapgit-agent view --objects SEPM_E_SALESORDER --type DCLS
|
|
291
312
|
```
|
|
292
313
|
|
|
293
314
|
**Example workflow for AI:**
|
|
@@ -447,6 +468,12 @@ abapgit-agent view --objects ZCL_FOO --full --lines
|
|
|
447
468
|
* ---- Method: ZIF_BAR~DO_IT — breakpoint: debug set --objects ZCL_FOO:5 --include locals_imp ----
|
|
448
469
|
```
|
|
449
470
|
|
|
471
|
+
**Function module (FUGR) methods:** use `--full --fm <name> --lines` — the hint uses the include name as the object:
|
|
472
|
+
```bash
|
|
473
|
+
abapgit-agent view --objects SUSR --type FUGR --full --fm AUTHORITY_CHECK --lines
|
|
474
|
+
# Output: * ---- FM: AUTHORITY_CHECK (LSUSRU04) — breakpoint: debug set --objects LSUSRU04:50 ----
|
|
475
|
+
```
|
|
476
|
+
|
|
450
477
|
```bash
|
|
451
478
|
# Regular method:
|
|
452
479
|
abapgit-agent debug set --objects ZCL_FOO:90
|
|
@@ -454,6 +481,8 @@ abapgit-agent debug set --objects ZCL_FOO:90
|
|
|
454
481
|
abapgit-agent debug set --objects ZCL_FOO:12 --include testclasses
|
|
455
482
|
# Local class method:
|
|
456
483
|
abapgit-agent debug set --objects ZCL_FOO:5 --include locals_imp
|
|
484
|
+
# Function module (use include name, no --include flag needed):
|
|
485
|
+
abapgit-agent debug set --objects LSUSRU04:50
|
|
457
486
|
```
|
|
458
487
|
|
|
459
488
|
Minimal correct sequence:
|
|
@@ -677,7 +706,7 @@ Modified ABAP files?
|
|
|
677
706
|
│ └─ Dependent files (interface + class, class uses class)?
|
|
678
707
|
│ └─ ✅ Use: skip syntax → [abaplint] → commit → push → pull --sync-xml
|
|
679
708
|
└─ Other types (FUGR, TABL, STRU, DTEL, TTYP, etc.)?
|
|
680
|
-
├─ XML-only objects (TABL, STRU, DTEL, TTYP)?
|
|
709
|
+
├─ XML-only objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG)?
|
|
681
710
|
│ └─ ✅ Use: skip syntax → [abaplint] → commit → push → pull --files abap/ztable.tabl.xml --sync-xml
|
|
682
711
|
└─ FUGR and other complex objects?
|
|
683
712
|
└─ ✅ Use: skip syntax → [abaplint] → commit → push → pull --sync-xml → (if errors: inspect)
|
|
@@ -713,7 +742,8 @@ Detailed guidelines are available in the `guidelines/` folder:
|
|
|
713
742
|
| `guidelines/objects.md` | Object Naming Conventions (defaults) |
|
|
714
743
|
| `guidelines/objects.local.md` | **Project** Naming Conventions — overrides `objects.md` (created by `init`, never overwritten) |
|
|
715
744
|
| `guidelines/json.md` | JSON Handling |
|
|
716
|
-
| `guidelines/abapgit.md` | abapGit XML Metadata Templates |
|
|
745
|
+
| `guidelines/abapgit.md` | abapGit XML Metadata Templates — CLAS, INTF, PROG, DDLS, DCLS, FUGR |
|
|
746
|
+
| `guidelines/abapgit-xml-only.md` | abapGit XML Metadata Templates — XML-only objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG) |
|
|
717
747
|
| `guidelines/unit-testable-code.md` | Unit Testable Code Guidelines (Dependency Injection) |
|
|
718
748
|
| `guidelines/common-errors.md` | Common ABAP Errors - Quick Fixes |
|
|
719
749
|
| `guidelines/debug-session.md` | Debug Session Guide |
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
title: abapGit XML Metadata — Function Group (FUGR)
|
|
4
|
+
nav_order: 11
|
|
5
|
+
parent: ABAP Coding Guidelines
|
|
6
|
+
grand_parent: ABAP Development
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# abapGit XML Metadata — Function Group (FUGR)
|
|
10
|
+
|
|
11
|
+
**Searchable keywords**: function group xml, fugr, function module, fm, abapgit, sapl, lzmy
|
|
12
|
+
|
|
13
|
+
> **CRITICAL: Always write XML files with a UTF-8 BOM (`\ufeff`) as the very first character**, before `<?xml ...`.
|
|
14
|
+
> Without the BOM, abapGit shows the object as **"M" (modified)** after every pull.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
A FUGR with group name `ZMY_FUGR` and one FM `ZMY_MY_FUNCTION` requires these files:
|
|
19
|
+
|
|
20
|
+
| File | Purpose |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `zmy_fugr.fugr.xml` | Main XML: group description, includes list, FM interfaces |
|
|
23
|
+
| `zmy_fugr.fugr.lzmy_fugrtop.abap` | TOP include source |
|
|
24
|
+
| `zmy_fugr.fugr.lzmy_fugrtop.xml` | TOP include metadata (`SUBC=I`) |
|
|
25
|
+
| `zmy_fugr.fugr.saplzmy_fugr.abap` | Main include source |
|
|
26
|
+
| `zmy_fugr.fugr.saplzmy_fugr.xml` | Main include metadata (`SUBC=F`) |
|
|
27
|
+
| `zmy_fugr.fugr.zmy_my_function.abap` | FM source (one file per FM, named after FM in lowercase) |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### `zmy_fugr.fugr.xml`
|
|
32
|
+
|
|
33
|
+
```xml
|
|
34
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
35
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_FUGR" serializer_version="v1.0.0">
|
|
36
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
37
|
+
<asx:values>
|
|
38
|
+
<AREAT>My function group description</AREAT>
|
|
39
|
+
<INCLUDES>
|
|
40
|
+
<SOBJ_NAME>LZMY_FUGRTOP</SOBJ_NAME>
|
|
41
|
+
<SOBJ_NAME>SAPLZMY_FUGR</SOBJ_NAME>
|
|
42
|
+
</INCLUDES>
|
|
43
|
+
<FUNCTIONS>
|
|
44
|
+
<item>
|
|
45
|
+
<FUNCNAME>ZMY_MY_FUNCTION</FUNCNAME>
|
|
46
|
+
<SHORT_TEXT>Short description of the FM</SHORT_TEXT>
|
|
47
|
+
<IMPORT>
|
|
48
|
+
<RSIMP>
|
|
49
|
+
<PARAMETER>IV_INPUT</PARAMETER>
|
|
50
|
+
<TYP>STRING</TYP>
|
|
51
|
+
</RSIMP>
|
|
52
|
+
<RSIMP>
|
|
53
|
+
<PARAMETER>IV_OPTIONAL</PARAMETER>
|
|
54
|
+
<DEFAULT>''</DEFAULT>
|
|
55
|
+
<OPTIONAL>X</OPTIONAL>
|
|
56
|
+
<TYP>FLAG</TYP>
|
|
57
|
+
</RSIMP>
|
|
58
|
+
</IMPORT>
|
|
59
|
+
<EXPORT>
|
|
60
|
+
<RSEXP>
|
|
61
|
+
<PARAMETER>EV_RESULT</PARAMETER>
|
|
62
|
+
<TYP>STRING</TYP>
|
|
63
|
+
</RSEXP>
|
|
64
|
+
</EXPORT>
|
|
65
|
+
<EXCEPTION>
|
|
66
|
+
<RSEXC>
|
|
67
|
+
<EXCEPTION>ERROR</EXCEPTION>
|
|
68
|
+
</RSEXC>
|
|
69
|
+
</EXCEPTION>
|
|
70
|
+
</item>
|
|
71
|
+
</FUNCTIONS>
|
|
72
|
+
</asx:values>
|
|
73
|
+
</asx:abap>
|
|
74
|
+
</abapGit>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### `zmy_fugr.fugr.lzmy_fugrtop.abap`
|
|
78
|
+
|
|
79
|
+
```abap
|
|
80
|
+
FUNCTION-POOL zmy_fugr. "MESSAGE-ID ..
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `zmy_fugr.fugr.lzmy_fugrtop.xml`
|
|
84
|
+
|
|
85
|
+
```xml
|
|
86
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
87
|
+
<abapGit version="v1.0.0">
|
|
88
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
89
|
+
<asx:values>
|
|
90
|
+
<PROGDIR>
|
|
91
|
+
<NAME>LZMY_FUGRTOP</NAME>
|
|
92
|
+
<SUBC>I</SUBC>
|
|
93
|
+
<FIXPT>X</FIXPT>
|
|
94
|
+
<UCCHECK>X</UCCHECK>
|
|
95
|
+
</PROGDIR>
|
|
96
|
+
</asx:values>
|
|
97
|
+
</asx:abap>
|
|
98
|
+
</abapGit>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### `zmy_fugr.fugr.saplzmy_fugr.abap`
|
|
102
|
+
|
|
103
|
+
```abap
|
|
104
|
+
INCLUDE LZMY_FUGRTOP.
|
|
105
|
+
INCLUDE LZMY_FUGRU01.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
One `INCLUDE` line per FM (`U01`, `U02`, …), plus `LZMY_FUGRTOP` at the top.
|
|
109
|
+
|
|
110
|
+
### `zmy_fugr.fugr.saplzmy_fugr.xml`
|
|
111
|
+
|
|
112
|
+
```xml
|
|
113
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
114
|
+
<abapGit version="v1.0.0">
|
|
115
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
116
|
+
<asx:values>
|
|
117
|
+
<PROGDIR>
|
|
118
|
+
<NAME>SAPLZMY_FUGR</NAME>
|
|
119
|
+
<SUBC>F</SUBC>
|
|
120
|
+
<RLOAD>E</RLOAD>
|
|
121
|
+
<FIXPT>X</FIXPT>
|
|
122
|
+
<UCCHECK>X</UCCHECK>
|
|
123
|
+
</PROGDIR>
|
|
124
|
+
</asx:values>
|
|
125
|
+
</asx:abap>
|
|
126
|
+
</abapGit>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### `zmy_fugr.fugr.zmy_my_function.abap`
|
|
130
|
+
|
|
131
|
+
```abap
|
|
132
|
+
FUNCTION zmy_my_function.
|
|
133
|
+
*"----------------------------------------------------------------------
|
|
134
|
+
*"*"Local Interface:
|
|
135
|
+
*" IMPORTING
|
|
136
|
+
*" VALUE(IV_INPUT) TYPE STRING
|
|
137
|
+
*" EXPORTING
|
|
138
|
+
*" VALUE(EV_RESULT) TYPE STRING
|
|
139
|
+
*" EXCEPTIONS
|
|
140
|
+
*" ERROR
|
|
141
|
+
*"----------------------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
" implementation
|
|
144
|
+
|
|
145
|
+
ENDFUNCTION.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Key Rules
|
|
151
|
+
|
|
152
|
+
- **Include naming**: TOP = `L<GROUP>TOP`, main = `SAPL<GROUP>` — uppercase in XML and filenames
|
|
153
|
+
- **FM source file**: named after the FM in **lowercase** (`zmy_my_function.abap`, not `ZMY_MY_FUNCTION.abap`)
|
|
154
|
+
- **`INCLUDES` list** in the main XML: only lists TOP and SAPL includes — FM source includes are implicit
|
|
155
|
+
- **`REMOTE_CALL>R`**: add only for RFC-enabled FMs; omit for local FMs
|
|
156
|
+
- **Optional parameters**: include both `<OPTIONAL>X</OPTIONAL>` and `<DEFAULT>...</DEFAULT>`
|
|
157
|
+
- **`DOCUMENTATION` section**: omit entirely if no parameter descriptions needed — missing docs cause no diff
|
|
158
|
+
- **Screens/CUA**: omit `DYNPROS`/`CUA` sections for screenless function groups
|
|
159
|
+
- **Multiple FMs**: add one `<item>` per FM in `FUNCTIONS`; add one `INCLUDE` line per FM in the SAPL source
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
title: abapGit XML Metadata — XML-Only Objects
|
|
4
|
+
nav_order: 10
|
|
5
|
+
parent: ABAP Coding Guidelines
|
|
6
|
+
grand_parent: ABAP Development
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# abapGit XML Metadata — XML-Only Objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG)
|
|
10
|
+
|
|
11
|
+
XML templates for ABAP Dictionary objects that have no `.abap` source file — TABL, STRU, DTEL, TTYP, DOMA, and message classes (MSAG).
|
|
12
|
+
|
|
13
|
+
> **CRITICAL: Always write XML files with a UTF-8 BOM (`\ufeff`) as the very first character**, before `<?xml ...`.
|
|
14
|
+
> Without the BOM, abapGit shows the object as **"M" (modified)** after every pull.
|
|
15
|
+
|
|
16
|
+
> **CRITICAL: Only include fields that abapGit's serializer actually writes. Never add fields with
|
|
17
|
+
> default values.** Extra fields cause a permanent "M" (modified) diff.
|
|
18
|
+
|
|
19
|
+
> **For CLAS, INTF, PROG, DDLS, DCLS, FUGR** (have source files): see `abapgit-agent ref --topic abapgit`
|
|
20
|
+
> **For DDLS, DCLS** (CDS — have source files): also see `abapgit-agent ref --topic abapgit`
|
|
21
|
+
|
|
22
|
+
**Searchable keywords**: table xml, structure xml, data element xml, table type xml, domain xml, message class xml, tabl, stru, dtel, ttyp, doma, msag, dictionary
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
### Table (TABL)
|
|
27
|
+
|
|
28
|
+
**Filename**: `src/zmy_table.tabl.xml`
|
|
29
|
+
|
|
30
|
+
> Pull with: `pull --files src/zmy_table.tabl.xml`
|
|
31
|
+
|
|
32
|
+
```xml
|
|
33
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
34
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
|
|
35
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
36
|
+
<asx:values>
|
|
37
|
+
<DD02V>
|
|
38
|
+
<TABNAME>ZMY_TABLE</TABNAME>
|
|
39
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
40
|
+
<TABCLASS>TRANSP</TABCLASS>
|
|
41
|
+
<DDTEXT>Description of the table</DDTEXT>
|
|
42
|
+
<CONTFLAG>A</CONTFLAG>
|
|
43
|
+
</DD02V>
|
|
44
|
+
</asx:values>
|
|
45
|
+
</asx:abap>
|
|
46
|
+
</abapGit>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Key Fields**:
|
|
50
|
+
- `TABNAME`: Table name
|
|
51
|
+
- `DDTEXT`: Description (**not** `DESCRIPT`)
|
|
52
|
+
- `TABCLASS`: `TRANSP`=Transparent (most common), `POOL`, `CLUSTER`
|
|
53
|
+
- `CONTFLAG`: Delivery class — `A`=Application, `C`=Customizing, `S`=System, `G`=Customizing protected
|
|
54
|
+
|
|
55
|
+
**Note**: When abapGit serializes a table it also writes `<DD09L>` (technical settings) and `<DD03P_TABLE>` (field definitions). You only need the `<DD02V>` header when creating a new table; the rest is generated on pull.
|
|
56
|
+
|
|
57
|
+
**`DD03P` field-level rules** (apply when editing an existing table XML that includes `<DD03P_TABLE>`): include `<SHLPORIGIN>D</SHLPORIGIN>` on fields where the Dictionary provides value help (domain with fixed values or search help); omit otherwise. For raw-type fields (no `ROLLNAME`, e.g. `CHAR`, `NUMC`), the serializer writes `<MASK>` **before** `<DDTEXT>`. For fields with a `ROLLNAME`, only `ROLLNAME` appears. Wrong order or missing `SHLPORIGIN` causes a permanent diff.
|
|
58
|
+
|
|
59
|
+
#### Text Tables and Foreign Keys
|
|
60
|
+
|
|
61
|
+
A **text table** stores translatable texts for another table (the "main table"). It shares the same key fields plus a language field (`SPRAS`/`LANGU`).
|
|
62
|
+
|
|
63
|
+
**Recognition markers:** `<DD09L><UEBERSETZ>X</UEBERSETZ>` (text table) and `<DD08V><FRKART>TEXT</FRKART>` (text-table FK). Three required sections: `DD03P_TABLE` (fields), `DD05M_TABLE` (FK field mappings — one per main-table key, all anchored to `MANDT`), `DD08V_TABLE` (FK relationship).
|
|
64
|
+
|
|
65
|
+
**Example — text table `ZMY_TABLE_T` for main table `ZMY_TABLE` (keys: MANDT, ID1, ID2):**
|
|
66
|
+
|
|
67
|
+
```xml
|
|
68
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
69
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
|
|
70
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
71
|
+
<asx:values>
|
|
72
|
+
<DD02V>
|
|
73
|
+
<TABNAME>ZMY_TABLE_T</TABNAME>
|
|
74
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
75
|
+
<TABCLASS>TRANSP</TABCLASS>
|
|
76
|
+
<CLIDEP>X</CLIDEP>
|
|
77
|
+
<DDTEXT>My Table: Texts</DDTEXT>
|
|
78
|
+
<CONTFLAG>C</CONTFLAG>
|
|
79
|
+
</DD02V>
|
|
80
|
+
<DD09L>
|
|
81
|
+
<TABNAME>ZMY_TABLE_T</TABNAME>
|
|
82
|
+
<AS4LOCAL>A</AS4LOCAL>
|
|
83
|
+
<TABKAT>0</TABKAT>
|
|
84
|
+
<TABART>APPL0</TABART>
|
|
85
|
+
<UEBERSETZ>X</UEBERSETZ>
|
|
86
|
+
<BUFALLOW>N</BUFALLOW>
|
|
87
|
+
</DD09L>
|
|
88
|
+
<DD03P_TABLE>
|
|
89
|
+
<DD03P>
|
|
90
|
+
<FIELDNAME>MANDT</FIELDNAME>
|
|
91
|
+
<KEYFLAG>X</KEYFLAG>
|
|
92
|
+
<ROLLNAME>MANDT</ROLLNAME>
|
|
93
|
+
<CHECKTABLE>ZMY_TABLE</CHECKTABLE>
|
|
94
|
+
<ADMINFIELD>0</ADMINFIELD>
|
|
95
|
+
<NOTNULL>X</NOTNULL>
|
|
96
|
+
<SHLPORIGIN>P</SHLPORIGIN>
|
|
97
|
+
<COMPTYPE>E</COMPTYPE>
|
|
98
|
+
</DD03P>
|
|
99
|
+
<DD03P>
|
|
100
|
+
<FIELDNAME>ID1</FIELDNAME>
|
|
101
|
+
<KEYFLAG>X</KEYFLAG>
|
|
102
|
+
<ROLLNAME>ZMY_ID1</ROLLNAME>
|
|
103
|
+
<ADMINFIELD>0</ADMINFIELD>
|
|
104
|
+
<NOTNULL>X</NOTNULL>
|
|
105
|
+
<COMPTYPE>E</COMPTYPE>
|
|
106
|
+
</DD03P>
|
|
107
|
+
<DD03P>
|
|
108
|
+
<FIELDNAME>SPRAS</FIELDNAME>
|
|
109
|
+
<KEYFLAG>X</KEYFLAG>
|
|
110
|
+
<ROLLNAME>SPRAS</ROLLNAME>
|
|
111
|
+
<ADMINFIELD>0</ADMINFIELD>
|
|
112
|
+
<NOTNULL>X</NOTNULL>
|
|
113
|
+
<COMPTYPE>E</COMPTYPE>
|
|
114
|
+
</DD03P>
|
|
115
|
+
<DD03P>
|
|
116
|
+
<FIELDNAME>DESCRIPTION</FIELDNAME>
|
|
117
|
+
<ROLLNAME>ZMY_DESCRIPTION</ROLLNAME>
|
|
118
|
+
<ADMINFIELD>0</ADMINFIELD>
|
|
119
|
+
<COMPTYPE>E</COMPTYPE>
|
|
120
|
+
</DD03P>
|
|
121
|
+
</DD03P_TABLE>
|
|
122
|
+
<DD05M_TABLE>
|
|
123
|
+
<DD05M>
|
|
124
|
+
<FIELDNAME>MANDT</FIELDNAME>
|
|
125
|
+
<FORTABLE>ZMY_TABLE_T</FORTABLE>
|
|
126
|
+
<FORKEY>MANDT</FORKEY>
|
|
127
|
+
<CHECKTABLE>ZMY_TABLE</CHECKTABLE>
|
|
128
|
+
<CHECKFIELD>MANDT</CHECKFIELD>
|
|
129
|
+
<PRIMPOS>0001</PRIMPOS>
|
|
130
|
+
<DOMNAME>MANDT</DOMNAME>
|
|
131
|
+
<DATATYPE>CLNT</DATATYPE>
|
|
132
|
+
</DD05M>
|
|
133
|
+
<DD05M>
|
|
134
|
+
<FIELDNAME>MANDT</FIELDNAME>
|
|
135
|
+
<FORTABLE>ZMY_TABLE_T</FORTABLE>
|
|
136
|
+
<FORKEY>ID1</FORKEY>
|
|
137
|
+
<CHECKTABLE>ZMY_TABLE</CHECKTABLE>
|
|
138
|
+
<CHECKFIELD>ID1</CHECKFIELD>
|
|
139
|
+
<PRIMPOS>0002</PRIMPOS>
|
|
140
|
+
<DATATYPE>CHAR</DATATYPE>
|
|
141
|
+
</DD05M>
|
|
142
|
+
<!-- repeat for each remaining key field (ID2, etc.) -->
|
|
143
|
+
</DD05M_TABLE>
|
|
144
|
+
<DD08V_TABLE>
|
|
145
|
+
<DD08V>
|
|
146
|
+
<FIELDNAME>MANDT</FIELDNAME>
|
|
147
|
+
<CHECKTABLE>ZMY_TABLE</CHECKTABLE>
|
|
148
|
+
<FRKART>TEXT</FRKART>
|
|
149
|
+
<CARD>CN</CARD>
|
|
150
|
+
<CARDLEFT>1</CARDLEFT>
|
|
151
|
+
</DD08V>
|
|
152
|
+
</DD08V_TABLE>
|
|
153
|
+
</asx:values>
|
|
154
|
+
</asx:abap>
|
|
155
|
+
</abapGit>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Key rules:**
|
|
159
|
+
- Always activate the main table **before** the text table — foreign key check requires the main table to exist
|
|
160
|
+
- Language field can be `SPRAS` (data element `SPRAS`) or `LANGU` (data element `LANGU`)
|
|
161
|
+
- For an **ordinary foreign key**: same structure, but omit `<FRKART>TEXT</FRKART>` from `DD08V`
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### Data Element (DTEL)
|
|
168
|
+
|
|
169
|
+
**Filename**: `src/zmy_dtel.dtel.xml`
|
|
170
|
+
|
|
171
|
+
> Pull with: `pull --files src/zmy_dtel.dtel.xml`
|
|
172
|
+
|
|
173
|
+
```xml
|
|
174
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
175
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
|
|
176
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
177
|
+
<asx:values>
|
|
178
|
+
<DD04V>
|
|
179
|
+
<ROLLNAME>ZMY_DTEL</ROLLNAME>
|
|
180
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
181
|
+
<DDTEXT>Description of data element</DDTEXT>
|
|
182
|
+
<REPTEXT>Description</REPTEXT>
|
|
183
|
+
<SCRTEXT_S>Short text</SCRTEXT_S>
|
|
184
|
+
<SCRTEXT_M>Medium text</SCRTEXT_M>
|
|
185
|
+
<SCRTEXT_L>Long description text</SCRTEXT_L>
|
|
186
|
+
<DTELMASTER>E</DTELMASTER>
|
|
187
|
+
<DATATYPE>CHAR</DATATYPE>
|
|
188
|
+
<LENG>000010</LENG>
|
|
189
|
+
</DD04V>
|
|
190
|
+
</asx:values>
|
|
191
|
+
</asx:abap>
|
|
192
|
+
</abapGit>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Key Fields**:
|
|
196
|
+
- `ROLLNAME`: Data element name
|
|
197
|
+
- `DDTEXT`: Description (**not** `DESCRIPT`)
|
|
198
|
+
- `REPTEXT` / `SCRTEXT_S` / `SCRTEXT_M` / `SCRTEXT_L`: Field labels (report heading, short, medium, long)
|
|
199
|
+
- `DTELMASTER`: Language key for label master (`E` for English)
|
|
200
|
+
- `DATATYPE`: Data type (`CHAR`, `NUMC`, `DATS`, `TIMS`, `INT4`, etc.)
|
|
201
|
+
- `LENG`: Length padded to 6 digits (e.g. `000010` for 10 characters)
|
|
202
|
+
|
|
203
|
+
**Omit `<PARAMID>`** unless you specifically need a SET/GET parameter ID — the serializer omits it when empty.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
### Structure (STRU)
|
|
208
|
+
|
|
209
|
+
**Filename**: `src/zmy_struct.stru.xml`
|
|
210
|
+
|
|
211
|
+
> abapGit uses the same TABL serializer for STRU.
|
|
212
|
+
> Pull with: `pull --files src/zmy_struct.stru.xml`
|
|
213
|
+
|
|
214
|
+
```xml
|
|
215
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
216
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
|
|
217
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
218
|
+
<asx:values>
|
|
219
|
+
<DD02V>
|
|
220
|
+
<TABNAME>ZMY_STRUCT</TABNAME>
|
|
221
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
222
|
+
<TABCLASS>INTTAB</TABCLASS>
|
|
223
|
+
<DDTEXT>Description of the structure</DDTEXT>
|
|
224
|
+
<CONTFLAG>A</CONTFLAG>
|
|
225
|
+
</DD02V>
|
|
226
|
+
</asx:values>
|
|
227
|
+
</asx:abap>
|
|
228
|
+
</abapGit>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Key difference from TABL**: `TABCLASS` is `INTTAB` (internal table / structure) instead of `TRANSP`.
|
|
232
|
+
|
|
233
|
+
**Note**: Like TABL, after the first pull abapGit expands the XML with `<DD03P_TABLE>` field definitions.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
### Table Type (TTYP)
|
|
238
|
+
|
|
239
|
+
**Filename**: `src/zmy_ttyp.ttyp.xml`
|
|
240
|
+
|
|
241
|
+
> Pull with: `pull --files src/zmy_ttyp.ttyp.xml`
|
|
242
|
+
|
|
243
|
+
```xml
|
|
244
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
245
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TTYP" serializer_version="v1.0.0">
|
|
246
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
247
|
+
<asx:values>
|
|
248
|
+
<DD40V>
|
|
249
|
+
<TYPENAME>ZMY_TTYP</TYPENAME>
|
|
250
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
251
|
+
<DDTEXT>Description of table type</DDTEXT>
|
|
252
|
+
<ROWTYPE>ZMY_STRUCT</ROWTYPE>
|
|
253
|
+
<ROWKIND>S</ROWKIND>
|
|
254
|
+
<DATATYPE>TABLE_T</DATATYPE>
|
|
255
|
+
<ACCESSMODE>T</ACCESSMODE>
|
|
256
|
+
<KEYDEF>D</KEYDEF>
|
|
257
|
+
<KEYKIND>N</KEYKIND>
|
|
258
|
+
</DD40V>
|
|
259
|
+
</asx:values>
|
|
260
|
+
</asx:abap>
|
|
261
|
+
</abapGit>
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Key Fields**:
|
|
265
|
+
- `TYPENAME`: Table type name
|
|
266
|
+
- `ROWTYPE`: Row type (a structure or data element name)
|
|
267
|
+
- `ROWKIND`: Row kind — `S`=Structure/Type, `D`=Data element, `R`=Reference
|
|
268
|
+
- `DATATYPE`: Always `TABLE_T` for table types
|
|
269
|
+
- `ACCESSMODE`: Table kind — `T`=Standard, `S`=Sorted, `H`=Hashed
|
|
270
|
+
- `KEYDEF`: Key definition — `D`=Default (standard key), `K`=User-defined
|
|
271
|
+
- `KEYKIND`: Key uniqueness — `N`=Non-unique, `U`=Unique
|
|
272
|
+
|
|
273
|
+
**Note**: After the first pull abapGit may expand the XML with `<DD42V>` (key field definitions).
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
### Domain (DOMA)
|
|
278
|
+
|
|
279
|
+
**Filename**: `src/zmy_domain.doma.xml`
|
|
280
|
+
|
|
281
|
+
> Pull with: `pull --files src/zmy_domain.doma.xml`
|
|
282
|
+
|
|
283
|
+
abapGit uses the view `DD01V` as the root element (not `DD01L`). The serializer reads from the system view.
|
|
284
|
+
|
|
285
|
+
**Simple domain (no fixed values):**
|
|
286
|
+
|
|
287
|
+
```xml
|
|
288
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
289
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
|
|
290
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
291
|
+
<asx:values>
|
|
292
|
+
<DD01V>
|
|
293
|
+
<DOMNAME>ZMY_DOMAIN</DOMNAME>
|
|
294
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
295
|
+
<DATATYPE>CHAR</DATATYPE>
|
|
296
|
+
<LENG>000030</LENG>
|
|
297
|
+
<OUTPUTLEN>000030</OUTPUTLEN>
|
|
298
|
+
<DDTEXT>My domain description</DDTEXT>
|
|
299
|
+
</DD01V>
|
|
300
|
+
</asx:values>
|
|
301
|
+
</asx:abap>
|
|
302
|
+
</abapGit>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**Domain with fixed values** (add `<VALEXI>X</VALEXI>` and `<DD07V_TAB>`):
|
|
306
|
+
|
|
307
|
+
```xml
|
|
308
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
309
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
|
|
310
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
311
|
+
<asx:values>
|
|
312
|
+
<DD01V>
|
|
313
|
+
<DOMNAME>ZMY_STATUS</DOMNAME>
|
|
314
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
315
|
+
<DATATYPE>CHAR</DATATYPE>
|
|
316
|
+
<LENG>000001</LENG>
|
|
317
|
+
<OUTPUTLEN>000001</OUTPUTLEN>
|
|
318
|
+
<VALEXI>X</VALEXI>
|
|
319
|
+
<DDTEXT>Status</DDTEXT>
|
|
320
|
+
</DD01V>
|
|
321
|
+
<DD07V_TAB>
|
|
322
|
+
<DD07V>
|
|
323
|
+
<VALPOS>0001</VALPOS>
|
|
324
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
325
|
+
<DOMVALUE_L>A</DOMVALUE_L>
|
|
326
|
+
<DDTEXT>Active</DDTEXT>
|
|
327
|
+
</DD07V>
|
|
328
|
+
<DD07V>
|
|
329
|
+
<VALPOS>0002</VALPOS>
|
|
330
|
+
<DDLANGUAGE>E</DDLANGUAGE>
|
|
331
|
+
<DOMVALUE_L>I</DOMVALUE_L>
|
|
332
|
+
<DDTEXT>Inactive</DDTEXT>
|
|
333
|
+
</DD07V>
|
|
334
|
+
</DD07V_TAB>
|
|
335
|
+
</asx:values>
|
|
336
|
+
</asx:abap>
|
|
337
|
+
</abapGit>
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Key Fields**:
|
|
341
|
+
- `DOMNAME`: Domain name
|
|
342
|
+
- `DDTEXT`: Description (**not** `DESCRIPT`)
|
|
343
|
+
- `DATATYPE`: ABAP data type (`CHAR`, `NUMC`, `DATS`, `TIMS`, `INT4`, `STRG`, etc.)
|
|
344
|
+
- `LENG`: Length padded to 6 digits (omit for `STRG`/`INT4` — no fixed length)
|
|
345
|
+
- `OUTPUTLEN`: Output length (usually same as `LENG`; omit for `STRG`)
|
|
346
|
+
- `LOWERCASE`: `X` if lowercase input is allowed (omit if not)
|
|
347
|
+
- `VALEXI`: `X` if the domain has fixed values — required when `DD07V_TAB` is present
|
|
348
|
+
- `ENTITYTAB`: Value table name (check table for valid values — omit if none)
|
|
349
|
+
|
|
350
|
+
**Note**: After pull the serializer may add `<I18N_LANGS>`, `<DD01_TEXTS>`, `<DD07_TEXTS>` for translations — do not write these manually.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
### Message Class (MSAG)
|
|
355
|
+
|
|
356
|
+
**Filename**: `src/zmy_msgs.msag.xml`
|
|
357
|
+
|
|
358
|
+
> Pull with: `pull --files src/zmy_msgs.msag.xml`
|
|
359
|
+
|
|
360
|
+
```xml
|
|
361
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
362
|
+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_MSAG" serializer_version="v1.0.0">
|
|
363
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
364
|
+
<asx:values>
|
|
365
|
+
<T100A>
|
|
366
|
+
<ARBGB>ZMY_MSGS</ARBGB>
|
|
367
|
+
<MASTERLANG>E</MASTERLANG>
|
|
368
|
+
<STEXT>My message class description</STEXT>
|
|
369
|
+
</T100A>
|
|
370
|
+
<T100>
|
|
371
|
+
<T100>
|
|
372
|
+
<SPRSL>E</SPRSL>
|
|
373
|
+
<ARBGB>ZMY_MSGS</ARBGB>
|
|
374
|
+
<MSGNR>000</MSGNR>
|
|
375
|
+
<TEXT>Object &1 not found</TEXT>
|
|
376
|
+
</T100>
|
|
377
|
+
<T100>
|
|
378
|
+
<SPRSL>E</SPRSL>
|
|
379
|
+
<ARBGB>ZMY_MSGS</ARBGB>
|
|
380
|
+
<MSGNR>001</MSGNR>
|
|
381
|
+
<TEXT>Operation completed successfully</TEXT>
|
|
382
|
+
</T100>
|
|
383
|
+
</T100>
|
|
384
|
+
</asx:values>
|
|
385
|
+
</asx:abap>
|
|
386
|
+
</abapGit>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**Key Fields**:
|
|
390
|
+
- `T100A/ARBGB`: Message class name (same as filename stem)
|
|
391
|
+
- `T100A/MASTERLANG`: Master language (`E` for English)
|
|
392
|
+
- `T100A/STEXT`: Short description of the message class
|
|
393
|
+
- `T100/SPRSL`: Language key
|
|
394
|
+
- `T100/MSGNR`: 3-digit message number (`000`–`999`)
|
|
395
|
+
- `T100/TEXT`: Message text — use `&1`–`&4` for placeholders (serialized as `&1`–`&4` in XML)
|
|
396
|
+
|
|
397
|
+
**Note**: The `<T100>` wrapper contains repeated `<T100>` child elements — one per message.
|