ABAP-PRC
A framework for custom multi-step ABAP processes: a process class declares the states, and the framework runs each document through them and monitors the run.
A custom ABAP process that walks a document through several steps answers the same questions every time: what happens when a BAPI fails in step 3 of 5, where COMMIT WORK goes, what to do about read caches and lock errors, and how to explain any of it to a business user days later. ABAP-PRC answers them once as a framework: a process class declares its states and transitions, one local class per transition carries the business logic, and the engine runs each processed object and each step as its own transactionally decoupled unit. Three Fiori apps show the run, every object's position in the state chain and every message in the step it came from, while the run is still going; a retry job re-runs the objects that failed on a lock or a race condition, and a resumed object continues on the failed step rather than from the start. The entry point into all of it is zcl_prc_processing_api=>get_instance( )->create_processed_objects( ), called from wherever the process is triggered — a RAP action, an event handler, an application job, a Web-API implementation. It stops at the framework: the business logic in each transition handler is the application's, the state chain is authored per process, and documentation of the individual interfaces is deferred until the API has settled.
Facts
Where it sits
Who is behind it
In the atlas: maintains 1@brandeis-consultingmaintainermarcelhermanns-createContributes to this
In the atlas: contributes to 1@marcelhermanns-create1 contributor
Before choosing this
Conditions
PracticalFunctional boundary
Only on SAP S/4HANA 2023 and 2025, on premise or private cloud: SAP S/4HANA Cloud, Public EditionSAP S/4HANA Cloud Public EditionSAP's cloud ERP, run by SAP as software as a service. For the things here it is the business system a side-by-side application on BTP reads from and writes to over its published OData APIs. and the SAP BTP ABAP environmentSAP BTP ABAP environmentSAP's ABAP runtime on BTP: ABAP systems developed in the ABAP Cloud model on SAP HANA Cloud, for cloud apps, OData services and side-by-side extensions of SAP S/4HANA.sap official, btp are listed as coming soon, and a 2023 system has to leave out ZABAP_PRC_EVENTS_SE_2025, whose event-based side effects rely on APIs released with S/4HANA 2025. Not for a system that already carries a copy, because object names are global and two versions cannot live side by side, and not for a productive system by way of the ZABAP_PRC_DEMO* packages, which the README states are not intended for one and whose init classes delete and rebuild their own tables on every run. While the major version is 0 the public API is not stable: minor bumps carry breaking changes with no deprecation period, so productive use means pinning a tag and reading the CHANGELOG before every upgrade.
What it declares
Every artifact
- Type
- Package
- Origin
- Independently maintained
As a package
- Where it runs
- does not say
- Distributed through
- abapGit
Connections
Doing work outside the request that triggered it, with retries
Turning a failure into a response a client can act on
Seeing what a running service did, in a readable form
Telling a person something happened when they are not looking
Git client written in ABAP that runs inside the system
SAP's ERP suite, run on-premise or as a private cloud edition, with its business data and processes reached over OData, RFC and the ABAP platform. For the things here it is the system a tool reads from or writes to. The public cloud edition is its own entry.
Download
Learn more
- S/4HANA Custom Development - What happens in case of errors in BAPIs or RAP BOs?S/4HANA Custom Development - What happens in case of errors in BAPIs or RAP BOs?A Devtoberfest 2026 session on what a custom S/4HANA process does when a BAPI or a RAP business object fails. It is framed from project work rather than product development, with the same issues and challenges turning up on project after project, and it offers the ABAP Processing Center, ABAP-PRC, as what fills the gap it names in modern ABAP development. The edges rest on the opening, which states the session's subject as errors in S/4HANA custom development, read as error handling on the ABAP door, and names that framework.SAP Developers, published 2026-09-21SAP Developers, YouTube — SAP Developers playlists
README
quoted from brandeis-consulting/abap-prc under MIT, readABAP-PRC — ABAP Processing Center
Build. Execute. Monitor. Retry.
A standardised ABAP framework for custom business processes: one way to build them, a runtime that executes each business object and each step independently, a live view of what is happening, and a precise way back after a failure — without missing or duplicate records.
⚠️ Status: Beta (0.x)
ABAP-PRC is under active development and the public API is not stable yet. Minor version bumps (0.1 → 0.2) will contain breaking changes without a deprecation period. Object names, interfaces, method signatures and database structures may change.
- Use it for evaluation, prototypes and internal pilots.
- If you use it productively, pin a specific tag and read the CHANGELOG before every upgrade.
- There is no migration tooling and no support commitment. Use at your own risk.
The API will be frozen with version 1.0.0.
Why
Custom ABAP processes run horizontally across existing SAP building blocks. Every project
solves the same problems again: how to handle a BAPI that fails in step 3 of 5, how to
deal with COMMIT WORK, read caches, lock errors, RAP save failures — and how to explain
all of that to a business user, days later, from an application log.
ABAP-PRC answers those questions once, in a reusable way.
| Phase | What it does |
|---|---|
| Build | A clear application pattern for implementing custom processes. Focus on the business logic instead of the technical plumbing. |
| Execute | Each business object and each step is processed independently and transactionally decoupled. Parallelisation and "as much as possible" semantics are built in. |
| Monitor | Live progress while the run is still going. Every step of every document, with the error shown in its context. Notifications on failure. |
| Retry | Self-healing for lock and race-condition errors via the built-in retry job. Resume on the failed step after the root cause is fixed. No duplicates, no gaps. |
Entry points: mass processing, selection from a Fiori app, business event handlers, Web-API backends, user exits, Excel upload, application jobs. Different triggers — the same processing center.
Supported stacks
| Stack | Status | Notes |
|---|---|---|
| SAP S/4HANA 2023 (on premise / private cloud) | Supported | Without ZABAP_PRC_EVENTS_SE_2025 |
| SAP S/4HANA 2025 (on premise / private cloud) | Supported | Full scope |
| SAP S/4HANA Cloud, Public Edition | Coming soon | |
| SAP BTP, ABAP Environment | Coming soon |
The framework core is written in ABAP for Cloud Development and uses released APIs only. The UI layer is not: the Fiori apps are deployed as BSP applications, which are classic ABAP objects. The repository therefore contains both language versions, split across packages.
ZABAP_PRC_EVENTS_SE_2025 holds event-based side effects that rely on APIs released
with S/4HANA 2025. It is called dynamically and is optional — on a 2023 system you exclude
it from the pull and the core runs without it.
1. Install
1.1 Install abapGit (standalone version)
Skip this if abapGit is already installed.
- Download the latest build of the standalone report:
zabapgit_standalone.prog.abapfrom the abapGit build repository. - Create a report
ZABAPGIT_STANDALONEin a local package ($ABAPGITor similar), paste the source and activate it. - Set up the SSL certificates in
STRUSTso that abapGit can reachgithub.com.
The full instructions are in the abapGit installation guide. Use a current build — older versions do not know all object types used here.
1.2 Create the target package
Create the package ZABAP_PROCESSING_CENTER in ADT as a development package with the
ABAP language version ABAP for Cloud Development. The subpackages come with the pull
and carry their own language version where they differ.
1.3 Clone the repository
In abapGit: New Online Repository.
| Setting | Value |
|---|---|
| URL | https://github.com/brandeis-consulting/abap-prc |
| Package | ZABAP_PROCESSING_CENTER |
| Branch / Tag | main |
| Folder logic | FULL |
Pull all packages. On S/4HANA 2023 the developer excludes
ZABAP_PRC_EVENTS_SE_2025 during installation — it builds on APIs released with
S/4HANA 2025.
The demo packages (ZABAP_PRC_DEMO*) are optional — see Demo.
Two versions of ABAP-PRC cannot live side by side in one system — object names are global. Install into one package only.
Pull, then activate.
1.4 Activate the services
All services are OData V4.
- Activate the ICF nodes of the BSP applications (
SICF, below/sap/bc/ui5_ui5/sap/). - Publish the service groups in
/IWFND/V4_ADMIN(Publish Service Groups). This is not transported and has to be repeated in every system.
1.5 The three apps
Delivered with the repository: the technical catalog ZABAP_PROCESSING_CENTER (UIAC),
the app descriptors with their target mappings and default tiles (UIAD), and the
authorisation defaults (SUSH).
| Tile | App ID | BSP application | Service group | Semantic object | Action |
|---|---|---|---|---|---|
| Run | abap.processing_center.run | ZUIPRCRUN | ZUI_PRC_RUN_O4 | ABAP_PRC_Run | show |
| Processed Object | abap.processing_center.processed_object | ZUIPRCPROCOBJ | ZUI_PRC_PROCESSED_OBJECT_O4 | ABAP_PRC_ProcessedObject | show |
| Processed Messages | abap.processing_center.processed_message | ZUIPRCPROCMSG | ZUI_PRC_PROCESSED_MESSAGES_O4 | ABAP_PRC_ProcessedMessage | show |
The service group carries the name of the service binding; the number in brackets is the service version.
Authorisation object
Beyond the standard Fiori authorisations the business role needs ZPRC_PROC:
| Field | Meaning |
|---|---|
ZPRCNAME | Process name — the co_process_name of the process implementation class |
ACTVT | 03 grants display of runs, processed objects and messages |
1.6 The two application jobs
Catalog entries and templates come with the repository. Neither job takes parameters.
| Job | Job catalog entry | Job template | Class |
|---|---|---|---|
| Retry job | ZAJC_PRC_RETRY_JOB | ZAJT_PRC_RETRY_JOB | ZCL_PRC_RETRY_JOB |
| Error mail job | ZAJC_PRC_ERROR_MAIL | ZAJT_PRC_ERROR_MAIL | ZCL_PRC_ERROR_MAIL_JOB |
The retry job picks up objects that failed on locks or race conditions and runs them
again — this is what makes the framework self-healing for transient errors. The error mail
job notifies about failures; the recipient is taken from the MailAddress of the
processed object.
2. Demo (for developers)
The demo packages are not intended for productive systems. They create their own tables, apps and test data, and the init classes delete and rebuild that data on every run. Install them in a development system if you want to see the framework work before you build anything with it.
2.1 Demo content
| Tile | App ID | BSP application | Service group | Semantic object | Action |
|---|---|---|---|---|---|
| Demo: Equipment | abap.demo.processingcenter.demoequi | ZPRCDEMOEQUI | ZUI_PRC_DEMO_EQUIPMENT_O4 | ABAP_PRC_Demo_Equipment | show |
| Demo: Service Contracts | abap.demo.processingcenter.demosrvctr | ZPRCDEMOSRVCTR | ZUI_PRC_DEMO_SRVCTR_O4 | ABAP_PRC_Demo_ServiceContract | show |
Plus one application job: ZAJC_PRC_DEMO_ADJUST_RUN / ZAJT_PRC_DEMO_ADJUST_RUN
(ZCL_PRC_DEMO_ADJUST_RUN_JOB).
2.2 Run the demo
Both init classes implement if_oo_adt_classrun: open them in ADT and press F9.
Step 1 — initialise the test data
Run ZCL_PRC_DEMO_ADJ_RUN_INIT (F9). It rebuilds the demo tables: business partners,
equipment categories, materials, equipments, and service contracts with items. Some
contracts carry an error status from the start, so a later run has something to fail on.
This deletes every row in the
ZPRC_DEMO_*tables.
Step 2 — watch a process run
Run ZCL_PRC_DEMO_CREATE_EQUI_INIT (F9). It creates 20 processed objects for the
process DEMO_EQUI_TRANSITION and hands them straight to the engine.
Open the Processed Object app and filter on the process name. Each step waits a second on purpose, so you can watch the objects move through the state chain while the run is still going:
START → CREATE_EQUI → LINK_SERIAL → CHECK_INSTALL → INSTALL_EQUI → FINISHED
└──────────────────────→ FINISHED
What to look for:
- Not every object takes the same path.
CHECK_INSTALLdecides per object whether the installation step is needed. A state can have more than one outgoing transition. - Some objects fail on purpose. The message hangs on the step where it happened, not on the run as a whole, and the object stays on that step.
- Failed objects come back. The retry job picks them up, or you resume them from the app. Processing continues on the failed step — what already succeeded is not repeated.
The Processed Messages app shows the same data message-first instead of object-first.
The other two demos
- Demo: Service Contracts — the run pattern: selection criteria, progress and result
across many objects. Started from the app or via the job template
ZAJT_PRC_DEMO_ADJUST_RUN, and monitored in the Run app. - Equipment assignment (
ZCL_PRC_DEMO_EQUI_ASSIGN_PROC) — the event-driven entry point. The handlerZCL_PRC_DEMO_EQUI_EVT_HDLreacts to theequipmentCreatedevent of the Equipment BO. This is the scenario where an object typically fails on a lock and is then healed by the retry job.
3. Getting started
To build your own process, copy the equipment demo and strip it down:
| Copy | Role |
|---|---|
ZCL_PRC_DEMO_CREATE_EQUI_PROC | The process: states, transitions, step implementations |
ZCL_PRC_DEMO_CREATE_EQUI_INIT | Creates processed objects and hands them to the engine |
In the process class (implements ZIF_PRC_PROCESS), adjust:
co_class_name— must match the class's own name; the engine instantiates through it.co_process_name— the key under which runs, processed objects and messages are stored, and the value checked againstZPRC_PROC-ZPRCNAME. Pick it deliberately; changing it later orphans everything already processed.- The state constants,
get_transitions(the state chain) andget_transition_handler. get_url_for_processed_object— the intent the monitor links to, so a user can jump from a processed object to the business document behind it.
A single-step process is legitimate — not every process needs a chain.
In the local classes (CCIMP): one class per transition, inheriting from
ZCL_PRC_TRANSITION_HANDLR_BASE. Put your business logic in perform_transition and the
log texts in get_success_message / get_failure_message. Business errors are not
exceptions here: you raise a message and collect it with
get_message_handler( )->add_message_from_sy( ), and the framework decides from the
collected messages whether the step failed.
In the init class: zcl_prc_processing_api=>get_instance( )->create_processed_objects( )
is the entry point. Its i_trigger_processing parameter decides where the work happens —
synchronously, via the background processing framework, or as an application job. In your
own scenario this call moves out of the init class into wherever the process is triggered:
a RAP action, an event handler, an application job, a Web-API implementation.
Documentation of the individual interfaces will follow once the API has settled.
Versioning and compatibility
This project follows Semantic Versioning.
While the major version is 0:
- Minor releases (
0.1.0→0.2.0) may contain breaking changes. - Patch releases (
0.1.0→0.1.1) contain fixes only and stay compatible.
Every breaking change is listed under a Breaking changes heading in the
CHANGELOG, with a short migration note. Read the entries for every
version between your current one and the target before upgrading.
Contributing
ABAP-PRC is currently developed by a single maintainer and does not accept external code contributions. Bug reports, questions and ideas as GitHub issues are very welcome. See CONTRIBUTING.md for details.
Licence
MIT — free to use, also commercially. No warranty of any kind.
Links
- ABAP-PRC on GitHub
- ABAP Processing Center — the official Landing Page is and what it is for
- Full-Stack Development with modern ABAP and AI — training and project support
ABAP-PRC is free and you can use it entirely without us.
History
Features 4, Other 2
Notes
First public beta release.
Added
- Process definition and execution runtime
- Monitoring of running and completed processes, down to step and message level per object.
- Retry: automatic retry job for lock and race-condition errors, manual resume on the failed step after the root cause has been fixed.
- Installation via abapGit.
Known limitations
- The public API is not stable. Expect breaking changes in
0.2.0. - No migration path between 0.x versions.
Others providing
- ABAP-LoggerABAP-LoggerA logging library for ABAP that records messages into the standard Application Log (BC-SRV-BAL) and displays them from there, installed through abapGit on ABAP 702 or higher.independent, abapLogging library for ABAP over the Application Log
- abap-log-exporterabap-log-exporterExports SAP NetWeaver logs from the Business Application Log to an external log system such as Graylog or Loki, converting entries to GELF or Loki format through a separately configured reader, converter and connector.independent, abapExports Business Application Log entries to Graylog or Loki
- abap-logabap-logA logging library for ABAP with one logger interface in front of several targets, from the Application Log and the job log to database tables, files and the Eclipse console.independent, abapABAP logging library with one interface across output targets
- ABAP_LOGGINGABAP_LOGGINGAn object-oriented wrapper around SAP's Business Application Log (BAL) for ABAP NetWeaver, chaining texts, messages and exceptions onto a log header that persists in its own or the same connection.independent, abapObject-oriented wrapper around the Business Application Log
- abap-cloud-loggerabap-cloud-loggerA logging library for ABAP Cloud that wraps the released class CL_BALI_LOG in a chainable logger, collecting exceptions, messages and tables, with a stopwatch and a sticky context tag.independent, abapChainable logger for ABAP Cloud around CL_BALI_LOG
- abap-fm-loggerabap-fm-loggerA logger for ABAP function modules (RFC) that stores each call's parameters as JSON in one table, with a viewer report to search the log and reprocess a record, akin to WE10 and WE19.independent, abapLogger storing RFC function module call parameters as JSON
- open-abap-balopen-abap-balApplication logging for ABAP code transpiled to JavaScript and run on Node.js, one of the runtime libraries open-abap.org lists.community org, abapApplication logging for ABAP transpiled to JavaScript on Node.js
- abap-fluentdabap-fluentdA Fluentd client written in ABAP for sending log lines from an ABAP system to a Fluentd collector, where entries are flushed with an explicit COMMIT WORK.independent, abapFluentd client in ABAP for sending log lines to a collector
- sap-usi-logging-apisap-usi-logging-apiAn object-oriented encapsulation around SAP's Application Log (transaction SLG1), controlled by customizing, with attachable data containers that SLG1 shows behind a detail button.independent, abapObject-oriented wrapper around SAP's Application Log (SLG1)
- abap-message-loggerabap-message-loggerA message logger for ABAP Cloud that collects T100 messages, BAPIRET2 structures, exceptions and plain text before saving them to the Application Log.independent, abapMessage logger for ABAP Cloud that saves to the Application Log
- throwthrowA minimalistic way to raise an ABAP exception, from a text passed directly or, with no argument, from the system fields a preceding MESSAGE statement filled, as a static method or through an interface.independent, abapRaises an ABAP exception from a text or the last system message
- RESULT-for-ABAPRESULT-for-ABAPAn ABAP implementation of the result pattern: a method returns an object built with ok or fail instead of raising an exception for an expected failure, and several results combine into one.independent, abapResult pattern for ABAP instead of exceptions for expected failures
- EITHER-FOR-ABAPEITHER-FOR-ABAPAn ABAP class implementing the Either pattern, holding a success value or an error from a method call in one object, with checks for which side it holds and exceptions for misuse.independent, abapABAP class implementing the Either pattern
- sap-usi-exceptionsap-usi-exceptionA shared root exception class and text getter API used across SchwarzIT's USI ABAP developments, converting an exception's text into a common format such as BAPIRET2 or SYMSG.independent, abapShared root exception class and text getter for USI developments
- aditheos/ApplicationLogsNotificationToFioriaditheos/ApplicationLogsNotificationToFioriRaises a Fiori launchpad notification when an application log records an error, and the notification opens the Application Logs app (F1487) on that log for review and corrective action.independent, abapFiori launchpad notification for application log errors
- agiguere/SCPmsPushNotificationREST_APIagiguere/SCPmsPushNotificationREST_APIABAP classes that send push notifications from an SAP backend to iOS devices through the REST API of SAP Cloud Platform Mobile Services, reached through an RFC destination on NetWeaver 731 or higher.independent, abapABAP classes sending push notifications to Mobile Services
- DryDumbHead/easyHtmlEmailDryDumbHead/easyHtmlEmailA helper class that builds HTML emails in ABAP from an HTML template uploaded through SMW0, with placeholders replaced at runtime, so only the dynamic values are handled in code.independent, abapABAP helper class building HTML emails from templates
- peterlangner/zrsspeterlangner/zrssAn ABAP package that publishes content from an SAP NetWeaver ABAP system as an RSS feed for ABAP Development Tools and other RSS readers, stated for ABAP 7.00 and installed with abapGit.independent, abapRSS feed publisher for content from an SAP NetWeaver ABAP system
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
Flavors
“The framework core is written in ABAP for Cloud Development and uses released APIs only.” — brandeis-consulting/abap-prc — README, Supported stacks
“The UI layer is not: the Fiori apps are deployed as BSP applications, which are classic ABAP objects. The repository therefore contains both language versions, split across packages.” — brandeis-consulting/abap-prc — README, Supported stacks
Contributors
History in the atlas
- Entered by intake from the repository README, the repository description and the maintainer's landing page.
- First seen.
For your agent
- Ref
artifact:brandeis-consulting-abap-prc- JSON
- /artifacts/brandeis-consulting-abap-prc.json
- MCP
- Connecting an agent