client/media/skills/abap-research/SKILL.md
Techniques for navigating and finding objects in SAP systems. Use when searching for transactions, programs, FMs, classes, error messages, BAPIs, tables, custom objects, or anything in an unfamiliar SAP system. Teaches the mindset and metadata knowledge a senior ABAP developer uses to find anything in any system. Load this skill when the user asks to find something and direct search doesn't work, or when investigating errors, screenshots, or unknown functionality.
npx skillsauth add marcellourbani/vscode_abap_remote_fs abap-researchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You're a senior ABAP developer dropped into an unfamiliar SAP system. You need to find things, understand how they connect, and trace problems to their source. You have two main tools: object search (by name/pattern) and SQL (query metadata tables). Use both creatively.
Your mindset: Be curious. Be a detective. SAP catalogs EVERYTHING in metadata tables. If something exists in the system, there's a table that knows about it. Your job is to figure out which table, read its structure with get_object_lines, and then query it.
CRITICAL: Never hardcode field names from memory. Always read a table's structure first with get_object_lines to see its actual fields before querying it.
CRITICAL: Text fields in SAP are often case-sensitive. When searching by text, use wildcards aggressively — skip the first letter of words, put % between key phrases. %rticle%aint% finds "Article Maintenance", "article maint.", but WILL NOT find "ARTICLE MAINTENANCE."
These tables are the backbone of SAP's self-documentation. Before querying any of them, read their structure first to get correct field names.
| Table | What it catalogs | |-------|-----------------| | TADIR | Master directory of ALL development objects — every class, program, FM, table, etc. Links objects to packages, authors, creation dates | | TRDIR | Program directory — all ABAP programs with their type (report, include, class pool, function pool, module pool) | | TRDIRT | Program short texts (descriptions) |
| Table | What it catalogs | |-------|-----------------| | TSTC | Transaction code → program mapping | | TSTCT | Transaction code descriptions/titles (language-dependent) |
| Table | What it catalogs | |-------|-----------------| | T100 | All system messages — message class, number, text (language-dependent and case-sensitive) |
| Table | What it catalogs | |-------|-----------------| | DD02L | Table/structure definitions (metadata) | | DD02T | Table/structure descriptions (language-dependent) | | DD03L | Table field list — every field in every table, with data type, length, key flag | | DD04L | Data element definitions | | DD04T | Data element descriptions (language-dependent) | | DD01L | Domain definitions | | DD01T | Domain descriptions | | DD07L | Domain fixed values (dropdown values, value ranges) |
| Table | What it catalogs | |-------|-----------------| | SEOCLASSTX | Class/interface descriptions (language-dependent) | | SEOMETAREL | Interface implementations — which class implements which interface | | SEOCOMPO | Class/interface components (methods, attributes, events) |
| Table | What it catalogs | |-------|-----------------| | TFDIR | Function module directory | | TFTIT | Function module short texts (language-dependent) | | ENLFDIR | FM → function group mapping | | FUPARAREF | Function module parameters (name, type, direction) |
| Table | What it catalogs | |-------|-----------------| | E070 | Transport request headers — owner, description, status, type | | E071 | Transport object list — which objects are in which transport |
| Table | What it catalogs | |-------|-----------------| | SXS_ATTR | BAdI definitions | | SXC_ATTR | BAdI implementations | | MODSAP | Classic enhancement exits (SMOD/CMOD) |
These are not step-by-step procedures. They're ways of thinking about research problems. Adapt them to the situation.
You have a title or description. TSTCT maps descriptions to tcodes. TSTC maps tcodes to programs. Chain them: title → tcode → program → now you can read the code.
The message text is your clue. T100 stores every message in the system with its class and number. Find it there (wildcard aggressively). Then search code for that message class + number to find where it's raised. Read the surrounding code to understand the trigger condition.
BAPIs follow naming conventions: BAPI_<object>_<action>. Try the object search tool with patterns like BAPI_*_CREATE*, BAPI_*_GETDETAIL*, BAPI_*_GETLIST*, BAPI_*_CHANGE*. Also search TFTIT for FM descriptions matching your task.
Package clustering. Every development object lives in a package. Query TADIR to find the object's package. Then query TADIR again for ALL objects in that same package. You'll discover the classes, tables, FMs, reports, message classes — everything that was built together as a unit.
Reverse lookup via DD03L. Query it for the field name to find every table containing that field. This reveals the data model — which are master data tables, which are transaction tables, which are config tables.
TADIR has the author of every object. E070 has transport request owners. E071 links transports to their objects. Transports show what was changed together — revealing functional groupings.
Read its structure with get_object_lines. Check DD02T for its description. Look at field names and their data elements — data element names often reveal purpose. Check DD04T for the data element descriptions. Run where-used to see which programs read/write it.
Search within the program's code for: CALL CUSTOMER-FUNCTION (old exits), GET BADI / CALL BADI (new BADIs), ENHANCEMENT-POINT / ENHANCEMENT-SECTION (implicit enhancement points). Also check MODSAP for classic exits and SXS_ATTR for BAdI definitions related to the program.
Screen labels often match data element descriptions. Query DD04T for text matching the label. Then use DD03L to find which tables use those data elements. Now you know the underlying tables.
Start from the transaction (TSTC → program). Read the top-level flow. Follow the calls — which classes, which FMs? Use where-used and code search to trace the chain. Check the package for siblings. Build the picture incrementally.
Start with what you have. A name, a screenshot, an error, a vague description — anything is a starting point.
Read table structures before querying. Never assume field names. Use get_object_lines on any table to see its fields first. Then query.
Cast a wide net with wildcards. Case sensitivity kills searches. Skip first letters: %rticle not Article. Put % between words: %rder%rocess% not Order Processing. Over-wildcard first, narrow down later.
Follow the chain. Nothing in SAP exists in isolation. Object → package → siblings. Message → code → program → transaction. Table → programs that use it → business process. Always ask: "what's connected to this?"
Use packages as clusters. A package is a developer's grouping of things that belong together. Finding the package is often more valuable than finding the individual object.
Cross-reference and verify. Found something? Verify from another angle. Found a tcode via text? Check TSTC to confirm the program. Found a message? Search code to confirm it's raised where you expect.
Think about who and when. TADIR stores authors and creation dates. Transports show change history. This context helps judge purpose, quality, and relevance.
Be creative. Object search and SQL are not your only tools. Where-used analysis, code search within objects, version history — combine tools however the problem demands. If one approach hits a wall, try another angle entirely.
Search within, don't read everything. Don't read a 5000-line program top to bottom. Search within it for the specific pattern, message, or variable you're tracing.
Know when to ask the user. If you've tried multiple approaches and can't find it, explain what you tried and ask. The user may have context that changes your strategy completely.
development
Create SAP Data Workbooks (.sapwb) for SAP data analysis. Use when the user asks to analyze SAP data, create data quality checks, build reports, compare tables, profile data, or any multi-step SAP data exploration. Workbooks have ABAP SQL cells (queries against SAP) and JavaScript cells (process results). They save as files and can be re-run.
tools
Investigate SAP ADT REST API endpoints. Use when the user asks about ADT API endpoints, request/response XML formats, content types, or how a specific ADT feature works under the hood. Teaches how to trace from discovery documents → RES_APP classes → handler classes → Simple Transformations → XML schemas. Requires the adt_discovery_export tool output files and standard ABAP tools (get_abap_object_lines, search_abap_objects, search_abap_object_lines).
development
Generate a comprehensive SAP System Personality Report. Analyzes custom code landscape, functional footprint, development activity, health metrics, and package breakdown. Use when a user asks to characterize a system, understand a system, get a system overview, system report, system personality, or "what does this system do?" Collects data via SQL queries and presents results in a structured webview.
data-ai
Navigate and understand SAP Customizing (SPRO/IMG). Use when the user asks about customizing settings, SPRO activities, configuration tables, maintenance views, view clusters, or needs to read/understand any customizing data. This skill teaches how to systematically trace from an SPRO activity to the actual tables where config data is stored, and how to find the SPRO menu path for any activity. Load this skill whenever customizing, SPRO, IMG, configuration, or settings maintenance is involved.