TNAPR table — TNAPR table for output processing programs
TNAPR is the Customizing table behind transaction NACE that maps an application area and output type (KAPPL plus KSCHL) to the technical program used to produce that output: the ABAP driver program, the form routine inside it, and the SAPscript or Smart Form name. NAST reads TNAPR at processing time to find what to actually execute for a given message.
TNAPR holds the technical processing assignment for output types configured in NACE: print program, form routine, and form name for each application and output type combination. This page covers the key fields, the joins to NAST and the form-storage tables, and the failure patterns seen when output stops printing or picks up the wrong form.
Published 15 Sept 2026· 1,062 words
What it stores
One row in TNAPR represents the technical processing definition for one combination of application area and output type: which ABAP driver program is called, which form routine inside that program is executed, and which output form (SAPscript form or Smart Form) is used to render the result. It is Customizing, not transaction data. NAST does not know how to print anything by itself; when an output record in NAST is processed, the system looks up TNAPR using the application and output type from that record to find the program and form to call. Everything a functional consultant configures on the 'Processing routines' screen in NACE for an output type ends up as a row here.
Key fields
- KAPPL - application area, for example V1 for sales output, V2 for shipping, EF for invoice lists
- KSCHL - the output type code, matching the output type maintained in the condition technique (same value used in NAST-KSCHL)
- PROGN - name of the ABAP program (print program) called to produce the output
- ROUTI - name of the form routine inside PROGN that is actually invoked
- FORNAM - name of the SAPscript form used when the output is rendered classically
- SFORM - name of the Smart Form used when the output type is configured for Smart Forms instead of SAPscript
How it joins the data model
- NAST-KAPPL = TNAPR-KAPPL and NAST-KSCHL = TNAPR-KSCHL to resolve which program and form apply to a queued or processed message
- TNAPR-FORNAM = STXH-TDFORM with STXH-TDOBJECT = FORM to locate the SAPscript form header referenced by a processing routine
- STXH-TDNAME/TDOBJECT chain into STXL to reach the actual form text content once the form name is confirmed against TNAPR
- TNAPR-PROGN checked against the ABAP repository (program existence in SE38/SA38) to confirm the driver program has not been deleted or renamed
- TSTC entry for NACE to identify the maintenance transaction that writes rows into TNAPR
How to read it safely
TNAPR is a cross-client Customizing table, so a row is not scoped by client the way most master data tables are; a change made through NACE in one client is visible in every client sharing the underlying table pool, which is worth knowing before assuming a fix in a development client will not show up elsewhere. The table is small, at most a few thousand rows across all applications, so a scan with only KAPPL restricted is cheap; there is rarely a reason to query it without at least KAPPL, and almost always KSCHL as well, since the KAPPL/KSCHL pair is the natural key used everywhere else that references this table.
How to prove it in the data
Symptom: output type ZINV for application V3 is not producing a printed document even though NAST shows the record as processed. Select from TNAPR with KAPPL equal V3 and KSCHL equal ZINV. Check that PROGN and ROUTI are filled and that the program named in PROGN exists in the ABAP repository with that routine present in its source. If FORNAM is blank but SFORM is populated, the output is rendered via Smart Forms, not SAPscript, and looking for it in STXH will never find it.
ECC vs S/4HANA
TNAPR still exists in S/4HANA and NACE is still the transaction used to maintain it for classic, NAST-based output types. It has not been replaced by a CDS compatibility view. Certain document types in S/4HANA, notably billing and some logistics outputs, have moved to a newer output management approach built on the business rules framework rather than NAST, and those output types bypass TNAPR entirely; for anything still using classic message control, TNAPR remains the table read at processing time exactly as in ECC.
Common pitfalls
- Treating a TNAPR entry that looks complete as proof output will succeed. The row only says what should be called; a missing form routine inside PROGN, a syntax error in the program, or a deactivated Smart Form still causes a runtime failure that TNAPR alone will not reveal.
- Confusing TNAPR with NAST. TNAPR is static configuration; NAST is the actual queue of output instances. An output problem where nothing was ever created in NAST is an output-determination issue upstream of TNAPR, not a TNAPR issue, and changing TNAPR will not fix it.
- Assuming an empty FORNAM means the output type has no form configured, when in fact SFORM is populated and the output is going through Smart Forms. Checking only the SAPscript field gives a false negative.
- Editing TNAPR directly through table maintenance instead of through NACE, which skips consistency checks the transaction performs and can leave the row referencing a program or form that does not exist or was never transported together with the entry.
- Forgetting that TNAPR is effectively cross-client. A change tested in a sandbox client can already be live for other clients on the same system, which surprises people expecting client isolation.
- Chasing a print layout problem in the form itself when the real defect is that TNAPR points to the wrong form name entirely, for example an old form left behind after a form was renamed during a project.
Whose problem this is
The functional consultant who owns output determination for the relevant application, typically SD, MM, or FI depending on the output type, owns the NACE configuration and therefore the content of TNAPR. ABAP development owns the print program, form routine, and form referenced by a row, and gets involved whenever the diagnosis moves past configuration into why the called object fails at runtime.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/tnaprERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.