SAP tableObjectBALHDRModuleBASIS

BALHDR table — Application Log Header Table

BALHDR stores one row per application log header created through the SBAL application log framework (transactions SLG0, SLG1, SLG2). Each row records the log's object and subobject classification, external number, creation date, time, user, program, and transaction code, plus a planned deletion date. It does not contain the log message text itself, which is serialized separately in BALDAT.

This page covers the header table behind the SAP application log, explaining what identifies a log instance versus where its actual messages live. It focuses on the recurring mistake of expecting message text in BALHDR, and on how to search a log correctly when the external number field is blank.

Published 15 Sept 2026· 1,084 words

What it stores

One row in BALHDR represents a single application log instance opened by a program or process through the log creation function of the SBAL framework. It carries the classification of the log (object and subobject, maintained in customizing for each application area), an optional external number used to tie the log to a business document or run, the creation timestamp, the user, the calling program and transaction code, and a planned deletion date used by log reorganization. The row is essentially an index card: it tells a reader that a log exists, who created it, when, and under what business classification, but the individual messages inside that log (severity, message class, message number, free text, variables) are not part of this table. Those are stored serialized under the same internal log handle in BALDAT and only decoded on display.

Key fields

  • MANDT - client
  • LOGNUMBER - internal unique log handle, the key that links the header to its message data, not a business-meaningful number
  • OBJECT - application log object, a customizing key identifying the application area that wrote the log
  • SUBOBJECT - subdivision of the object, narrowing the log to a specific process within that area
  • EXTNUMBER - external identifier, often a document number or run ID, populated only if the calling program set it
  • ALDATE - date the log was created
  • ALTIME - time the log was created
  • ALUSER - user under whose session the log was created
  • ALPROG - program that created the log
  • ALTCODE - transaction code active at creation time
  • ALDATE_DEL - planned deletion date, used by log expiry and reorganization

How it joins the data model

  • BALHDR-LOGNUMBER = BALDAT-LOGNUMBER, the only real technical join, used to fetch the serialized messages that belong to a given header
  • BALHDR-OBJECT and BALHDR-SUBOBJECT correspond to entries maintained in application log customizing, not to a table in this list
  • BALHDR-ALUSER, BALHDR-ALDATE and BALHDR-ALPROG can be cross-checked against TBTCO-AUTHCKMAN style job attributes to identify which background job step actually generated the log, useful when EXTNUMBER is empty
  • Where a job's output was routed to print, the resulting spool request in TSP01 can sometimes be correlated back to the same run window as the log, though there is no key relationship, only a time and user coincidence

How to read it safely

BALHDR is client-dependent, always restrict by MANDT implicitly through the transaction. Never select on ALDATE alone on a system with heavy interface or batch logging; always add OBJECT, and SUBOBJECT if known, first. EXTNUMBER lookups feel natural for consultants chasing a specific document but are only as selective as the calling program made them; many programs leave it blank, so a search that returns zero rows on EXTNUMBER does not prove the log was never created. Reading message content requires going through the log display function, not a direct SE16 join to BALDAT, because the payload there is a serialized cluster, not flat columns.

How to prove it in the data

Symptom: an interface run reportedly failed but nobody can find a log for it. Select BALHDR restricted to the OBJECT and SUBOBJECT owned by that interface, ALDATE equal to the run date, and ALUSER equal to the technical or batch user that executes the job. If a row exists, take its LOGNUMBER and read the log through the display transaction or the read function module to decode BALDAT. If no row exists at all, either the program never called the log-create step on that path, or a reorganization job already deleted it based on ALDATE_DEL.

ECC vs S/4HANA

BALHDR is unchanged in role and structure on S/4HANA. The application log framework is a basis technical service and was not part of the Simple Finance or logistics simplification scope, so the header and its companion data table continue to be written and read the same way, through the same log creation, display and reorganization transactions. No CDS compatibility view is required here because BALHDR is not a business data table subject to code pushdown or replacement logic.

Common pitfalls

  • Assuming BALHDR contains the message text: it only contains header metadata, the actual messages live serialized in BALDAT and are unreadable by a plain table browse
  • Concluding a process never ran because no BALHDR row is found for its EXTNUMBER: many callers never populate EXTNUMBER, so the correct search is by OBJECT, SUBOBJECT, date and user, not by external number alone
  • Treating LOGNUMBER as a sequential or business-meaningful number: it is an internal handle, gaps and apparent randomness are normal and carry no diagnostic meaning
  • Assuming a missing header row proves the underlying business process failed: the log reorganization job may simply have deleted expired entries per ALDATE_DEL before anyone looked
  • Running an unrestricted select on BALHDR in a production system with heavy application logging (frequent in IDoc processing, quality notifications, workflow) and causing a long-running or timed-out query, when the fix is to always lead with OBJECT
  • Expecting one BALHDR row per business document: some programs create one log per run covering many documents, others create one log per document, the granularity depends entirely on how the calling program used the framework

Whose problem this is

A missing or unreadable log is first a question for basis, since log volume, reorganization scheduling and archiving policy for this table are basis-owned. Whether a specific process should have logged something at all, and what OBJECT and SUBOBJECT it should appear under, is owned by the functional or development team responsible for the program that calls the log creation step.

Related SAP objects

Reviewed pages this object connects to in the ERPClimb knowledge graph.

Source: ERPClimb — https://erpclimb.com/sap-tables/balhdrERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.