DD03L table — DD03L Table Field Catalog
DD03L holds one row per field of every table or structure defined in the ABAP Dictionary, giving field name, position, key flag, data element, domain, and technical type. It is the table SE11 and SE16 read from behind the scenes to build the field list of any table. It does not hold actual business data, only the field-level metadata that describes structure.
DD03L is the ABAP Dictionary's field catalog, one row per field per table or structure. This page covers the fields worth trusting, how it joins to the table header and data element text tables, and the mistakes consultants make when using it to answer questions about live data instead of structure.
Published 15 Sept 2026· 1,188 words
What it stores
One row in DD03L represents one field belonging to one table, structure, or view in the ABAP Dictionary, as delivered or as activated in the system. It records where that field sits in the structure (its position), whether it forms part of the primary key, which data element it is typed against, which domain governs its value range, and its technical length and data type. It exists purely to describe the shape of dictionary objects, not to hold any business content. When someone asks what fields a table has, what the key is, or which data element a field points to, DD03L is the authoritative source, and it is exactly what transaction SE11 displays on the Fields tab and what SE16 uses to render the selection screen and the field list of any table.
Key fields
- TABNAME - the table or structure name the row belongs to, first part of the key
- FIELDNAME - the field name within that table, second part of the key
- POSITION - the field's sequential position within the structure
- KEYFLAG - marks the field as part of the primary key when set
- ROLLNAME - the data element assigned to the field, links to the data element's own metadata and texts
- DOMNAME - the domain underlying the data element, governs technical type and value range
- DATATYPE - the ABAP data type derived for the field, for example CHAR, NUMC, DATS
- LENG - the field length in characters as activated
- DECIMALS - number of decimal places for numeric fields
- CHECKTABLE - the check table enforced for foreign key validation, if any
- COMPTYPE - component type, distinguishes an ordinary field from an include or a reference to another structure
How it joins the data model
The most common join is from DD03L back to the table's own header record and forward to the human-readable text of the data element each field is typed against.
- DD03L-TABNAME = DD02L-TABNAME to reach the table header, its delivery class, and short description
- DD03L-ROLLNAME = DD04T-ROLLNAME to reach the field label and description text in a given language
- DD03L-TABNAME plus DD03L-FIELDNAME used together as the composite key when joining to any table that stores field-level annotations or documentation
- DD03L-DOMNAME used to look up the domain's fixed values when a field is a code field constrained to a short list
How to read it safely
DD03L is cross-client, delivered once per system landscape rather than per client, so there is no client field to restrict on. The table is large because every active table and structure in the system contributes its full field list, so an unrestricted select is expensive and pointless. Always restrict on TABNAME first; that alone typically returns a handful of rows. Restricting on FIELDNAME alone across the whole table is a common mistake because the same field name (MATNR, BUKRS, WERKS) recurs in thousands of tables, and the result set is not what anyone actually wants. If searching by data element instead of table, restrict on ROLLNAME and expect many matches, since one data element is reused across many tables by design.
How to prove it in the data
To confirm which fields make up a table's key, select DD03L where TABNAME equals the table name and KEYFLAG equals 'X', ordered by POSITION. This returns the exact key sequence used for buffering, sorting, and unique access, which is often different from the order fields appear on a screen. To confirm what data element a suspicious field is typed against, select DD03L for that TABNAME and FIELDNAME and read ROLLNAME, then look that value up in the data element's own metadata for the domain and value range.
ECC vs S/4HANA
DD03L continues to exist and function the same way on S/4HANA; it is core ABAP Dictionary infrastructure and is not tied to any particular application module that got restructured or replaced. What changed around it, not in it, is the volume and shape of business tables it now describes, since several classic tables were replaced by compatibility views over transparent database tables in S/4HANA. DD03L faithfully reflects whatever structure is currently active, whether that structure is a classic table or a CDS-based replacement, so it remains the correct place to check field-level metadata regardless of release.
Common pitfalls
- DD03L shows the field's definition as delivered or activated, not what actually exists in the database right now if a transport containing a structure change has not yet been imported or activated; comparing DD03L to the runtime table can be misleading during a transport window
- Reading DD03L to determine a table's current key is unreliable if the table was ever converted or adjusted outside a clean transport, since active runtime structure and DD03L can drift apart in poorly managed systems, though this is rare in a well-run landscape
- Treating FIELDNAME uniqueness assumptions as global is wrong; the same field name appears in many tables with different data elements and lengths, so a query without TABNAME restriction produces a meaningless mixed result
- Assuming DD03L holds any business data is a beginner mistake; it never contains values, only the definition of where values would go
- Using DD03L to infer authorization relevance is unsafe; a field's presence in an authorization object or check is governed by activation elsewhere in the dictionary, not by anything stored directly in DD03L itself
- Confusing DOMNAME with DATATYPE; the domain can carry its own value range and conversion routine while DATATYPE only reflects the technical ABAP type, so two fields with the same DATATYPE and LENG can behave very differently at input validation
- Forgetting that append structures and includes show up as separate COMPTYPE entries rather than as flattened fields, which trips up anyone trying to count a table's real field total by counting DD03L rows naively
Whose problem this is
Questions about what a field means or which data element governs it belong to whoever owns the ABAP Dictionary object, typically the development or data model lead for that functional area, not the functional consultant configuring the module. Disputes about a missing or unexpected field almost always trace back to a transport that has or has not been imported, which is a basis or change management question, not a DD03L data question.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/dd03lERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.