Blog

Technical notes, no marketing

ABAP Cloud, S/4HANA and the modern SAP ecosystem, told from the trenches.

    #SAP BTP#SAP Build Work Zone#Cloud Identity Services

    SAP Build Work Zone advanced: configuring CIS and IPS on BTP

    How to enable SAP Build Work Zone, advanced edition on SAP BTP with SAML 2.0 authentication and automatic user and group provisioning with Identity Provisioning.

    Oct 23, 2026

    #SAP CAP#MCP#AI agents

    SAP CAP and MCP: authentication and roles with @requires and @restrict

    How to restrict by role what an AI agent queries and writes in an SAP CAP service exposed through MCP, and the three gaps that appeared when testing it.

    Oct 23, 2026

    #SAP Integration Suite#SAP API Management#SAP BTP

    SAP Integration Suite: enabling the API Management runtime

    API Management activated in SAP Integration Suite, but no Configure > APIs. Why the runtime is missing and how to enable it in a trial and in a productive tenant.

    Oct 23, 2026

    #SAP Mobile Services#XSUAA#IAS

    The one SAP Mobile Services setting you cannot change later

    When you create an app in SAP Mobile Services you choose XSUAA or IAS, and that choice cannot be changed later. What each option means and when to choose IAS.

    Oct 20, 2026

    #SAP S/4HANA#SAP Fiori#Key User Extensibility

    Enabling extensibility (key user) in SAP S/4HANA 2025

    Steps to enable the key user extensibility apps in SAP S/4HANA 2025: SAP Note, ATO, SAP_BASIS_BC_EXT catalog, ICF nodes, OData services and role.

    Oct 17, 2026

    #SAP MDK#SAP Mobile Services#VS Code

    A better alternative to BAS for MDK development

    How to set up a local VS Code environment to develop SAP MDK applications without Business Application Studio, and work on them with AI agents.

    Oct 14, 2026

    #SAP GUI#SAP GUI for Java#macOS

    SAP GUI for Java on macOS: installation and first connection

    SAP GUI for Java 8.10 on a Mac with an M processor: the Java it already ships with, the three ways to connect and why the System tab is no use with just a host.

    Oct 9, 2026

    #SAP API Management#SAP Integration Suite#TLS

    SAP API Management: how TLS ciphers are changing

    SAP API Management retires two TLS 1.2 cipher suites for inbound connections. How it affects your integrations and what to review before October 2026.

    Oct 8, 2026

    #SAP Document AI#SAP BAIP#Confidence score

    SAP Document AI: when the confidence score is not reliable

    Material matching with SAP Document AI in multi-vendor purchase orders: why the confidence score was not enough to decide and which solution did work.

    Oct 8, 2026

    #SAP CAP#MCP#AI agents

    SAP CAP as an MCP server: one annotation and three surprises

    How to expose a SAP CAP service as an MCP server with the @cap-js/mcp plugin, which tools the AI agent receives and what limits appear when you test it.

    Oct 7, 2026

    #SAP RAP#ABAP Cloud#SAP BTP

    SAP RAP from zero to expert: free ABAP Cloud series

    Free YouTube series on SAP RAP with ABAP Cloud: more than 6 hours of video in Spanish, from the SAP BTP trial account to the Behavior Definition.

    Oct 6, 2026

    #SAP S/4HANA#Journal Entry#Ledger

    Ledger or SourceLedger in S/4HANA: filtering extension ledgers

    A journal entry takes up 4 rows in ACDOCA and 8 in I_JournalEntryItem. How to filter Ledger and SourceLedger so you neither lose nor multiply amounts, with measured results.

    Oct 1, 2026

    #Fiori SAPUI5 Master#SAP BTP#Business Application Studio

    SAP Fiori development with AI: set up your professional environment

    Class 1 of the Fiori SAPUI5 Master, with the full video: SAP BTP trial, Business Application Studio, VS Code, TypeScript and AI assistants with MCP.

    Oct 1, 2026

    #SAP Document AI#SAP BAIP#Schemas and templates

    What is SAP Document AI? The vocabulary of the series

    Document lifecycle, schemas, templates, extraction methods, confidence score and what you need to set up in SAP BAIP to use SAP Document AI.

    Oct 1, 2026

    #SAP S/4HANA#Journal Entry#ABAP CDS

    S/4HANA without ACDOCA: the released CDS views for Journal Entry

    SAP marks ACDOCA as not released and proposes three released CDS views as successors. Which one to use for line items, balances, header and analytics, and with what limitations.

    Sep 30, 2026

    #ABAP SQL#CDS#HANA

    Pagination in ABAP SQL: offset vs keyset, measured

    Why OFFSET degrades with page depth while keyset keeps a constant cost: a curve measured on 2.4 million rows and how to choose.

    Sep 29, 2026

    #Career#SAP#ABAP Cloud

    SAP consultant salaries in 2026: what nobody tells you

    Why the SAP consultant salary figures you see on LinkedIn are useless for making any decision, and which factors really move the number: specialization, country, and whether you work freelance or for a consultancy.

    Sep 23, 2026

    #ABAP#RAP#ABAP Cloud

    Your first business object with RAP, step by step

    A table, an interface view and a managed behavior definition, in a single end-to-end walkthrough: your first RAP business object, step by step.

    Sep 21, 2026

    #SAP BTP#Consulting#CIO

    When to hire external SAP BTP consulting (and when not to)

    SAP BTP consulting: when it makes sense to bring in senior external help, what to ask before signing, and when the problem is better solved in-house.

    Sep 17, 2026

    #ABAP#Clean Core#S/4HANA

    Clean core for developers: extending S/4HANA without breaking the core

    Modifying the standard is not free: you pay for it at every upgrade. A practical guide for developers on choosing the right clean core extension path.

    Sep 15, 2026

    #ABAP Cloud#Career#RAP

    What a functional consultant should understand about ABAP Cloud

    You do not need to program to defend an SAP project well. The minimum about ABAP Cloud that a functional consultant needs in order not to depend on someone else's judgment.

    Sep 11, 2026

    #ABAP#ABAP Cloud#ABAP RAP

    From procedural ABAP to ABAP Cloud: migration checklist

    Migrating to ABAP Cloud is not about translating syntax: it changes data access, business logic and how you model with RAP. A step-by-step checklist, with real examples.

    Sep 9, 2026

    #ABAP#ABAP Cloud#ABAP CDS

    Why is your CDS view poorly structured?

    How to structure a CDS view into Basic, Composite and Consumption layers, and why mixing them breaks your Fiori apps and your reports.

    Sep 7, 2026

    #ABAP#ABAP Cloud#Career

    ABAP Cloud is not Cobol: for developers coming from outside

    Learning ABAP coming from Java is not starting from scratch. Look at the code written today in S/4HANA and why the market pays for it.

    Sep 2, 2026

    #ABAP#RAP#EML

    EML: manipulating RAP business entities without a single SELECT

    In the Behavior Pool you use neither SELECT nor COMMIT: you use the Entity Manipulation Language. READ ENTITIES, MODIFY ENTITIES and the %tky technical keys, with the real code.

    Aug 13, 2026

    #ABAP#RAP#Security

    Authorizations in RAP: global vs instance without losing your mind

    Blocking an operation for everyone is one thing; blocking it based on the record's content is a very different one. RAP's two authorization levels and when you need each.

    Aug 12, 2026

    #ABAP#RAP#ABAP Cloud

    Validations and determinations in RAP: where each business rule lives

    A validation vetoes the save; a determination fills a field on its own. Confusing them means putting logic in the wrong place. When to use each, with the real behavior definition.

    Aug 10, 2026

    #ABAP#RAP#Fiori

    Draft in RAP: the work-in-progress that stops your users from losing their work

    Draft mode lets users save halfway without dirtying the database. How you enable it in the behavior definition, which actions it requires, and why it needs the total ETag.

    Aug 8, 2026

    #ABAP#RAP#ABAP Cloud

    The data model of a RAP business object: active persistence, draft and audit

    In ABAP Cloud you no longer define tables graphically: you write them with annotations. The audit columns, the UUID and the draft table the RAP framework expects, with the real DDL.

    Aug 5, 2026

    #ABAP#RAP#ABAP Cloud

    Managed vs Unmanaged in RAP: when to let the framework persist for you

    The managed scenario gives you create, update and delete for free; unmanaged forces you to write them. When to use each in the RESTful ABAP Programming Model, with the real behavior definition.

    Aug 4, 2026

    #BTP#Cloud Foundry#XSUAA

    VCAP_SERVICES: why your credentials never go in the code

    In Cloud Foundry, HANA or XSUAA credentials are not written: they are injected. The service binding puts them into the VCAP_SERVICES environment variable at runtime. Grasping this changes how you design the app.

    Aug 2, 2026

    #BTP#Cloud Foundry#CLI

    cf CLI for real: push, bind and logs, the three you use every day

    The cf CLI has dozens of commands, but 90% of your daily work fits into three verbs: deploy, bind services and read logs. With the real syntax and the flags that matter.

    Jul 31, 2026

    #BTP#Cloud Foundry#MTA

    mta.yaml: why the deployment unit is not the app, it's the MTA

    A Multi-Target Application packages service, database and UI into one versioned artifact. Deploying app by app with cf push is fine until you have three modules that depend on each other.

    Jul 30, 2026

    #BTP#Cloud Foundry#Architecture

    The Cloud Foundry model: orgs, spaces and apps demystified

    Before you write a single cf push you need the hierarchy: global account, subaccount, organization, space and app. Ignore it and you end up with quotas misallocated and deployments in the wrong place.

    Jul 27, 2026

    #BTP#Cloud Foundry#CAP

    Deploying a full-stack CAP app to Cloud Foundry, end to end

    Put it all together: a CAP project with HANA and XSUAA, the MTA build, CF login and deploy. The complete run from File New Project to the app answering with its token, with the real commands.

    Jul 25, 2026

    #BTP#Cloud Foundry#Buildpacks

    Buildpacks and staging: what happens between your cf push and a running app

    Between cf push and a green app there's a phase almost nobody looks at: staging. The buildpack detects your language, installs the runtime and assembles the droplet. When startup fails, it almost always fails here.

    Jul 23, 2026

    #BTP#Administration#Connectivity

    Destinations and Cloud Connector: connect BTP without opening the firewall

    The bridge between the BTP cloud and your on-premise systems isn't opening ports. It's Cloud Connector plus well-typed destinations. We break it down with the real properties.

    Jul 20, 2026

    #BTP#Administration#Security

    Role collections, role templates and shadow users in SAP BTP

    BTP's authorization model isn't a checkbox. Role templates, collections and shadow users: getting it right is the difference between auditable access and a permissions mess.

    Jul 19, 2026

    #BTP#Administration#Entitlements

    Entitlements and quotas in SAP BTP: the budget that doesn't overflow

    Service entitlements and quota entitlements. This is where BTP spending is really controlled. Split it wrong and you're signing a surprise invoice at month end.

    Jul 17, 2026

    #BTP#Administration#Governance

    The account hierarchy in SAP BTP: governance from day 1

    Global account, directories, subaccounts. Not a decorative org chart: it's the boundary for billing, security and regions. Improvise it and you pay in every audit.

    Jul 15, 2026

    #BTP#Administration#Services

    Subscriptions vs service instances in SAP BTP: not the same thing

    Applications you subscribe to and services you instantiate. Confusing them leads to the wrong service plan, wasted quota and an architecture that doesn't scale. We clear it up.

    Jul 12, 2026

    #BTP#Administration#CLI

    Administering SAP BTP from the terminal: btp CLI and cf CLI

    The Cockpit is fine for exploring. To really govern, automate and audit, you need the command line. btp CLI for the account, cf CLI for the runtime.

    Jul 11, 2026

    #SAP CAP#Node.js#CDS

    Handlers in CAP: write less JavaScript, not more

    CAP's generic runtime already handles CRUD. Node.js handlers are for logic the model can't express: actions, functions and validations. With a real cancelOrder.

    Jul 9, 2026

    #ABAP#Clean Core#RAP

    Released APIs: consuming the standard without coupling to what you shouldn't

    Consuming a released SAP API is fine; consuming it badly couples you to the core just like a modification. The difference lies in the access pattern. A practical guide in ABAP Cloud.

    Jul 9, 2026

    #ABAP#CDS#VDM

    Well-structured CDS: the VDM layer that won't embarrass you in three years

    Basic, Composite, Consumption. The Virtual Data Model isn't bureaucracy: it's what separates a model that scales from a plate of spaghetti. With a real ABAP CDS code example.

    Jul 8, 2026

    #SAP CAP#CDS#CDL

    The CDS model in CAP: entities and services that don't collide

    In CAP the data model lives in db and services live in srv, and that split is not a whim: it's what lets you change the schema without touching the API. With real schema.cds and catalog-service.cds.

    Jul 7, 2026

    #ABAP#Clean Core#S/4HANA

    Clean Core, no nonsense: what it actually means in ABAP Cloud

    Clean Core is not a marketing label, nor a ban on modifications. It's an extensibility discipline built on released APIs and stable extension points. We break it down with examples.

    Jul 7, 2026

    #SAP CAP#XSUAA#BTP

    Authorization in CAP with XSUAA: when an annotation becomes a permission

    In CAP security is declared in the model with @requires and @restrict, not coded in each handler. How XSUAA turns roles into scopes and the xs-security.json that ties it together.

    Jul 6, 2026

    #SAP CAP#S/4HANA#OData

    Remote services in CAP: consume S/4HANA without copying the ERP

    Import an external OData service, project it as your own and delegate the query to the backend. How CAP integrates S/4HANA without replicating data, with cds import and a real projection.

    Jul 3, 2026

    #SAP CAP#BTP#MTA

    Deploying CAP to BTP: from cds watch to mta.yaml without surprises

    Locally it runs on in-memory SQLite. On BTP you need HANA, an HDI container and an mta.yaml wiring the modules together. What changes between your laptop and Cloud Foundry, no fluff.

    Jul 1, 2026

    #SAP CAP#RAP#BTP

    CAP vs RAP: it's not religion, it's where your business logic lives

    CAP runs in Node.js or Java on BTP; RAP runs in ABAP inside S/4HANA. The choice isn't taste: it depends on where your data and your team are. No tribalism.

    Jun 29, 2026

    #Fiori Elements#Fiori#OData

    What Fiori Elements are, and why you should use them

    Fiori Elements isn't just another framework: it swaps hand-written UI5 for annotations over the OData service. Less JavaScript, more metadata, consistent UX. With a real CDS annotation example.

    Jun 26, 2026

    #Fiori Elements#Fiori#OData

    Fiori Elements floorplans: List Report, Object Page, Worklist and Analytical

    Not every pattern fits every case. When to pick List Report Object Page, when a Worklist and when an analytical List Report. With the real wizard start in Business Application Studio.

    Jun 25, 2026

    #Fiori Elements#Fiori#VS Code

    Fiori tools in VS Code: the tooling that makes Fiori Elements productive

    Annotations are the language, but without good tooling writing them by hand is torture. Fiori tools (wizard, guided development, cds watch) turn metadata into productivity. With the real startup flow.

    Jun 23, 2026

    #Fiori Elements#Fiori#Clean Core

    Extension points in Fiori Elements: when stepping out of the lane is justified

    Fiori Elements gives you a lot for free, but sometimes you need what the template doesn't cover. Extension points are the controlled exit. When to use them, when not, and why metadata extensions come first.

    Jun 21, 2026

    #Fiori Elements#Fiori#RAP

    Draft and actions in Fiori Elements: when the screen does more than display

    Draft and actions turn a read-only app into a real business application. How RAP draft and actions bound to ABAP methods are declared, not hand-coded.

    Jun 18, 2026

    #Fiori Elements#Fiori#OData

    UI annotations: lineItem, facets and headerInfo, the language of Fiori Elements

    A Fiori Elements screen is drawn with annotations, not XML. LineItem for the table, HeaderInfo for the header, Facets to organize the detail. With real CDS annotations.

    Jun 17, 2026

    #SAPUI5#Fiori#TypeScript

    TypeScript in SAPUI5: from @ts-nocheck to types that warn you before you break

    UI5 projects have faked types with JSDoc for years. TypeScript makes them real: typed events, ES6 imports and compile-time errors. How to make the jump without rewriting the whole app.

    Jun 15, 2026

    #SAPUI5#Fiori#Routing

    Routing in SAPUI5: navigate with the URL, not with setVisible

    Routes, patterns and parameters in the manifest, and a router that syncs the hash with the view. How to go from a list to a detail without hiding controls by hand, with back navigation that respects history.

    Jun 13, 2026

    #SAPUI5#Fiori#manifest

    manifest.json: the single source of truth for your UI5 app

    Models, routes, dependencies, i18n and minimum UI5 version declared in one file. Stop instantiating models by hand in the component and describe the app in the descriptor. With real JSON.

    Jun 12, 2026

    #SAPUI5#Fiori#Async

    sap.ui.define and async loading: the end of global variables in UI5

    AMD, explicit dependencies, async:true and ComponentSupport instead of inline scripts. Why sap.ui.require replaces globals and how this fits with CSP. With real bootstrap code.

    Jun 9, 2026

    #SAPUI5#Fiori#Data Binding

    Data binding in SAPUI5: stop moving data by hand

    JSONModel for local, ODataModel for the backend, and a binding that refreshes the UI on its own. Property, aggregation, expression and custom formatters, with real code from an invoice list.

    Jun 7, 2026

    #SAPUI5#Fiori#MVC

    MVC architecture in SAPUI5: the controller is not a junk drawer

    View, model and controller have clear boundaries. Respect them and the app maintains itself; ignore them and the controller ends up with 800 lines of everything. We show it with real XML and JavaScript.

    Jun 5, 2026

    #ABAP#ABAP Cloud#Clean Core

    Wrappers for legacy code: consuming the old without contaminating the new

    You cannot rewrite twenty years of classic ABAP overnight, but you cannot let it soil your cloud layer either. The wrapper strategy and Tier 2 are the bridge. With a pattern and real code.

    Jun 2, 2026

    #ABAP#ABAP Cloud#ABAP SQL

    ABAP SQL in ABAP Cloud: what changes versus classic (and why it is better)

    In ABAP Cloud, SQL is still SQL, but the language takes away the crutches: no direct access to core tables, no reckless CLIENT SPECIFIED, WHERE always. We walk the changes with real code.

    Jun 1, 2026

    #ABAP#ABAP Cloud#Clean Core

    The usage list: how to tell, cold, whether a class is released

    Before calling a standard object in ABAP Cloud, the question is not whether it exists, but whether it is released for your use. Here is how to actually check: contract check, usage list and release state.

    May 30, 2026

    #ABAP#ABAP Cloud#Clean Core

    The three extensibility tiers in ABAP Cloud: decide before you code

    Key user, developer, side-by-side. Before the first line of code, decide which tier your extension lives in. Choosing wrong is not a detail: it condemns the code to the next upgrade. With a decision tree and example.

    May 28, 2026

    #ABAP#ATC#Code Inspector

    ATC: what it is and why it retires the Code Inspector

    The ABAP Test Cockpit isn't a Code Inspector with a new badge. It's a quality engine wired into ADT, with governed exemptions and mass runs over packages and transports. No fluff.

    May 25, 2026

    #ABAP#ATC#CI

    ATC in CI: don't let quality depend on anyone's memory

    Background runs, the Result Browser and the quality gate on transport release turn the ATC into a continuous control. That's how you bring quality into the pipeline, not to the end of the sprint.

    May 24, 2026

    #ABAP#ATC#priorities

    Reds, yellows and blues: prioritizing ATC findings without drowning

    An ATC run with three thousand findings isn't information: it's noise. Priorities, grouping and a baseline turn that impossible list into a real work queue. With judgment, not brute force.

    May 22, 2026

    #ABAP#ATC#ABAP Cloud

    The ATC as your ABAP Cloud readiness radar

    Before migrating to ABAP Cloud, the ABAP_CLOUD_READINESS variant tells you exactly what of your code survives and what doesn't. It's the map that turns a blind migration into a plan.

    May 20, 2026

    #ABAP#ATC#exemptions

    ATC in the flow: exemptions and pragmas without sweeping under the rug

    Pragmas, pseudo-comments and exemptions are the three ways to tell the ATC a finding is intentional. Used well, they keep the flow clean. Used badly, they hide bombs. Here's the difference.

    May 19, 2026

    #ABAP#ATC#variants

    Check variants and baseline: the ATC doesn't measure everyone the same

    ABAP_CLOUD_DEVELOPMENT_DEFAULT, ABAP_CLOUD_READINESS, ABAP_CLOUD_DEVELOPMENT_PARTNER. Picking the variant and setting a baseline is what separates a useful ATC from a sea of warnings nobody reads.

    May 16, 2026

    #ABAP#abapGit#git

    Moving code between systems with abapGit, no STMS involved

    abapGit can carry your development from one system to another without a single transport request. It's powerful and dangerous in equal measure. Here's how it works, when it makes sense and where you should NOT use it.

    May 14, 2026

    #ABAP#abapGit#git

    abapGit: what it is and why you should finally version your ABAP

    abapGit is a Git client written in ABAP that runs inside the system itself. It isn't a community novelty: it's how you free your code from the tyranny of transports and put it under real version control.

    May 12, 2026

    #ABAP#abapGit#git

    Online vs offline repos in abapGit: when it connects and when it doesn't

    abapGit has two repository modes: online, tied to a remote GitHub, and offline, a ZIP you carry by hand. They aren't the same and don't serve the same purpose. Choosing wrong costs you a whole workflow.

    May 9, 2026

    #ABAP#abapGit#git

    abapGit in practice: best practices and the mistakes you will absolutely hit

    Unsupported objects, phantom dependencies, expired tokens, a badly set master language. abapGit works beautifully until one of these bites you. Here's the list of what goes wrong and how to avoid it.

    May 8, 2026

    #ABAP#abapGit#git

    The abapGit workflow: staging, commit, push, pull and branches without drama

    The daily abapGit cycle isn't magic: it's git add, git commit and git push translated into ADT. Here's the real flow, with the Staging view, commit messages that actually help, and why branches save you.

    May 6, 2026

    #ABAP#abapGit#git

    The .abapgit.xml and package mapping: the piece almost nobody looks at

    That small file at the repo root decides how ABAP packages map to folders and back. Folder logic FULL or PREFIX, master language, starting folder. Here's what it does and why it matters.

    May 4, 2026

    #ABAP#Web Services#SOAMANAGER

    SOAMANAGER and endpoint configuration: the transaction that separates defining a service from publishing it

    Activating a service definition doesn't make it reachable. SOAMANAGER generates the WSDL and the binding; and the hosts file, that great forgotten piece, can take down a flawless service. A no-fluff guide to SOAP deployment.

    May 1, 2026

    #ABAP#Web Services#Security

    Security in ABAP Web Services: communication users, authentication profiles and the mistake of using a dialog user

    A service exposed without a communication user and without a security profile is an open door into the ERP. We review SAP's four profiles, why the type C user exists and what role to give it without overreaching.

    Apr 30, 2026

    #ABAP#Web Services#SOAP

    Errors and faults in ABAP Web Services: the SOAP Fault, the HTTP code and why a 200 doesn't mean success

    The SOAP envelope has a fourth element almost nobody uses: the fault. In REST the error travels in the HTTP code. Handling both well is what separates a robust integration from one that fails silently.

    Apr 28, 2026

    #ABAP#Web Services#Consumer

    Consuming an external service from ABAP: consumer proxy, logical port and when to drop to HTTP

    Two ways to call a service from SAP: the wizard-generated proxy with its logical port, or raw CL_HTTP_CLIENT. When to use each and why the logical port is the piece everyone forgets.

    Apr 26, 2026

    #ABAP#Web Services#SOAP

    Building a Web Service Provider in ABAP: from BAPI to published service, no fluff

    RFC, BAPI or proxy class: three doors to expose SAP logic as a SOAP service. We show which to pick, the real Enterprise Service and SOAMANAGER flow, and the format mistake that breaks integrations.

    Apr 25, 2026

    #ABAP#Web Services#SOAP

    SOAP vs REST in ABAP: when to use each and why the debate is usually framed wrong

    SOAP isn't old and REST isn't modern: one is a protocol, the other a pattern. In ABAP they coexist, and choosing well saves you needless WSDLs or hand-written parsers. With real payload examples.

    Apr 22, 2026

    #ABAP#OData#SAP Gateway

    SEGW versus CDS: SAP Gateway isn't dead, it moved

    The classic SAP Gateway model with SEGW, MPC and DPC classes, is still alive in many systems. The modern CDS approach is cleaner, but not always the right call. When each one, without dogma.

    Apr 20, 2026

    #ABAP#OData#CDS

    OData from CDS: @OData.publish or Service Definition, not the same thing

    Publishing an OData service from a CDS view with a single annotation is tempting. But @OData.publish and the Service Definition + Service Binding pair solve different problems. When to use each, with real code.

    Apr 18, 2026

    #ABAP#OData#performance

    OData performance: $filter, $select and paging or the service crawls

    An OData service that returns every column of every row is a time bomb. $select trims the width, $filter trims the height and paging avoids fetching the world. The three performance keys, with real examples.

    Apr 15, 2026

    #ABAP#OData#expand

    $expand and navigation in OData: one call, not ten

    Fetching a customer and then, in another request, its orders, is the pattern that kills a Fiori app's performance. $expand and association navigations solve in a single call what many do in N. With real detail.

    Apr 14, 2026

    #ABAP#OData#CRUD

    CRUD and Function Imports in OData: when CRUD isn't enough

    Create, Read, Update, Delete cover 90 percent of an OData service. The other 10 percent are actions that are neither create nor read: that's where Function Imports come in. How to tell them apart and not put logic where it doesn't belong.

    Apr 12, 2026

    #ABAP#OData#SAP Gateway

    OData V2 or V4 in ABAP: choosing without fooling yourself

    V2 has a decade in production; V4 is the future and what modern Fiori asks for. When each one fits, what V4 actually buys you, and why migrating for fashion is a mistake. With a real SEGW project example.

    Apr 10, 2026

    #ABAP#HANA#ABAP SQL

    The golden rules of SELECT on HANA: no SELECT * and no nested loops

    HANA is fast, but it won't forgive a SELECT inside a LOOP or a SELECT *. The five rules that separate data access that flies from data access that drags the whole system down.

    Apr 7, 2026

    #ABAP#HANA#performance

    Analyzing performance on HANA: measure with ST05, SQLM, SAT, ATC and SWLT

    Optimizing without measuring is superstition. An honest tour of the tools HANA and ABAP give you to find the SQL that's actually slow: each one answers a different question.

    Apr 6, 2026

    #ABAP#HANA#code-pushdown

    Code pushdown in practice: what to push and how far

    Pushdown isn't optimizer magic: it's your decision. CASE, SQL functions, WITH, UNION and hints. We review what you can push to HANA with ABAP SQL and when you shouldn't.

    Apr 4, 2026

    #ABAP#HANA#code-to-data

    Code-to-data: stop dragging the database into ABAP

    The code-to-data paradigm isn't a HANA fad: it's admitting that moving millions of rows to the application server to sum them in a LOOP was always a mistake. Explained with real examples.

    Apr 2, 2026

    #ABAP#HANA#CDS

    CDS Table Functions: when a CDS view isn't enough and you need SQLScript

    Table Functions merge the best of CDS and AMDP: you model like a CDS entity but implement in SQLScript. When to use them, how the two pieces wire together and the SELECT-OPTIONS trick.

    Apr 1, 2026

    #ABAP#HANA#AMDP

    AMDP: SQLScript inside an ABAP class (no database user)

    ABAP Managed Database Procedures let you write HANA SQLScript as a class method, transported as ABAP code. When it makes sense, how it's declared and why it isn't your first choice.

    Mar 29, 2026

    #ABAP#CDS#parameters

    Parameters in CDS: stop cloning the same view twelve times

    A view with the year and company code hardcoded in the WHERE isn't reusable, pollutes the plan cache and forces you to maintain copies. Typed parameters fix all three. With real DDL and the recompilation trap.

    Mar 27, 2026

    #ABAP#CDS#associations

    Associations vs joins in CDS: the detail that changes the HANA plan

    A JOIN always runs; an association only when someone navigates it. In reused views that cuts data transfer by 30 to 80 percent. With real DDL and the cardinality trap.

    Mar 25, 2026

    #ABAP#CDS#annotations

    The six CDS annotations you should always declare (and one that can lie to you)

    compareFilter, authorizationCheck, clientHandling, preserveKey. Not decoration: omitting them costs 15 to 30 percent on views with joins, and one of them, misdeclared, returns wrong results with no warning.

    Mar 22, 2026

    #ABAP#CDS#performance

    CDS performance: logic goes where the data is, not the other way round

    The LOOP with a SELECT SINGLE inside was normal in ECC. In S/4HANA it's the cardinal sin. Code pushdown, why the native join beats FOR ALL ENTRIES, and the string function that turns 1 second into 60.

    Mar 21, 2026

    #ABAP#CDS#annotations

    Analytical and semantic annotations: the CDS that Fiori and SAC understand on their own

    A decimal without @Semantics is just a number. With the right annotations, Fiori formats the currency, SAC converts amounts and temporal drill-down works with no UI code. With real cube and dimension DDL.

    Mar 19, 2026

    #ABAP#Web Dynpro#MVC

    The MVC pattern in Web Dynpro ABAP: why separation isn't optional

    Model, View, Controller. Web Dynpro doesn't suggest MVC to you: it enforces it. Understanding that architecture is the difference between an app that survives maintenance and a classic dynpro in disguise.

    Mar 17, 2026

    #ABAP#Web Dynpro#FPM

    Floorplan Manager versus classic Web Dynpro: when to standardize and when to migrate

    FPM doesn't replace Web Dynpro: it standardizes it. UIBB, floorplans and configuration versus hand-built views. And the uncomfortable question: when it makes sense to stay in WD and when to jump to Fiori.

    Mar 14, 2026

    #ABAP#Web Dynpro#Components

    Reusable components in Web Dynpro: component usage without coupling

    Reusing a Web Dynpro component isn't copy and paste. It's declaring the usage, instantiating the component usage and mapping contexts. Done right, it scales; done wrong, it couples everything to everything.

    Mar 13, 2026

    #ABAP#Web Dynpro#Navigation

    Events, actions and navigation in Web Dynpro: the flow you have to see

    From a click to a view change. Actions, inbound and outbound plugs, navigation links and the phase model. Once you understand this flow, you stop programming blind.

    Mar 11, 2026

    #ABAP#Web Dynpro#Controllers

    Controllers and components in Web Dynpro: who commands and who exposes

    View controller, global controller, interface controller. Understanding the three types and the hook methods is what separates whoever copies snippets from whoever designs reusable components.

    Mar 9, 2026

    #ABAP#Web Dynpro#Context

    The Web Dynpro context: nodes, attributes and binding without drama

    The context is the memory of your Web Dynpro application. Nodes, cardinality and automatic binding. Master this and half the bugs of a WD app disappear before they're even born.

    Mar 8, 2026

    #ABAP#ALV#fieldcatalog

    Field catalog, layout and variants: what holds the ALV up

    Columns, texts, visibility, layout and variants the user saves. With SALV this is done with typed objects, not flat structures. Closing the ALV series with real ABAP code.

    Mar 5, 2026

    #ABAP#ALV#editable

    Editable ALV: editing and validation without drama

    When the user types into the cell, your responsibility begins. data_changed to validate, F4 for value helps, and persist with a user command. The editable grid with real ABAP code.

    Mar 3, 2026

    #ABAP#ALV#toolbar

    Toolbar and custom functions in ALV: buttons that do your job

    The standard bar is only the start. With SALV you add custom functions via add_function; with ALV Grid, buttons in the toolbar event. We look at both paths with real ABAP code.

    Mar 1, 2026

    #ABAP#ALV#events

    Events and hotspots in ALV: when the list starts to respond

    Hotspot, double-click, user command. Interaction in ALV Grid runs on events and handlers, not loose callbacks. We look at the pattern with SET HANDLER and real ABAP code for a hotspot event.

    Feb 26, 2026

    #ABAP#ALV#SALV

    An ALV in ten lines with CL_SALV_TABLE

    The fastest list you can write in classic ABAP: factory, display and little else. We look at the real minimum with CL_SALV_TABLE, full screen and inside a container, with real ABAP code.

    Feb 25, 2026

    #ABAP#ALV#SALV

    SALV vs REUSE_ALV: why CL_SALV_TABLE is the way

    The REUSE_ALV_* function zoo works, but it ages badly. We compare the classic family with CL_SALV_TABLE and explain why the class is the modern standard. With real ABAP code.

    Feb 23, 2026

    #ABAP#ABAP SQL#Security

    Host expressions and the @: your first defense against injection in ABAP SQL

    Host variables, host expressions with @( ... ) and dynamic SQL. The difference between passing a value and concatenating a string is the difference between a secure system and one with an open door. With real code.

    Feb 21, 2026

    #ABAP#ABAP SQL#CTE

    CTEs with WITH and subqueries: step-by-step queries without throwaway views

    The Common Table Expression (WITH +cte AS ...) breaks a complex query into readable steps that live inside the statement. With real code, the mandatory + prefix and the ENDWITH people forget.

    Feb 18, 2026

    #ABAP#ABAP SQL#GROUP BY

    Aggregations and GROUP BY: let the database hand you the totals, not the rows

    SUM, COUNT, MAX and GROUP BY in the statement. Summing in a LOOP is fetching ten thousand rows to produce three. With real code over the flight tables and the HAVING filter many forget.

    Feb 17, 2026

    #ABAP#ABAP SQL#CASE

    SQL expressions in ABAP: let the database compute for you

    CASE, arithmetic and functions inside the SELECT. Everything you resolve in the statement is computation that never travels up to ABAP. With real code for CASE, CAST, DIVISION, ROUND and string functions.

    Feb 15, 2026

    #ABAP#ABAP SQL#JOIN

    JOIN in the database or nested loop: the pattern that decides your performance

    The SELECT inside a LOOP still shows up in every code review. A JOIN resolves in one trip what a nested loop resolves in thousands. We see it with real code over the flight tables.

    Feb 13, 2026

    #ABAP#ABAP SQL#Open SQL

    Modern ABAP SQL: why the comma and @ syntax isn't cosmetic

    Commas between columns, INTO at the end, inline declarations with @DATA and host variables with @. The new Open SQL syntax isn't sugar: it's what switches on strict mode and saves you from silent errors.

    Feb 12, 2026

    #ABAP#ABAP OO#Events

    Events in ABAP OO: the emitter doesn't know who's listening, and that's the point

    EVENTS, RAISE EVENT and SET HANDLER let you decouple who triggers an action from who reacts. The ABAP emitter-handler model, with its ordering and registration traps. With real ABAP OO.

    Feb 9, 2026

    #ABAP#ABAP OO#Exceptions

    Class-based exceptions in ABAP: stop staring at sy-subrc

    TRY CATCH, the CX_ROOT hierarchy and chaining with PREVIOUS. Why class-based exceptions beat sy-subrc and how not to lose the root cause of an error. With real ABAP OO.

    Feb 7, 2026

    #ABAP#ABAP OO#Polymorphism

    Polymorphism and casting in ABAP: the parent reference, the child's method

    Polymorphism lets you treat different objects through a single access point. Narrowing and widening casts, when they are safe and when they raise CX_SY_MOVE_CAST_ERROR. With real ABAP OO.

    Feb 5, 2026

    #ABAP#ABAP OO#Interfaces

    Interfaces versus inheritance in ABAP: pick a contract, not a family tree

    ABAP only supports single inheritance and solves multiple inheritance with interfaces. When to inherit, when to implement an interface, and why the interface usually wins. With real ABAP OO.

    Feb 2, 2026

    #ABAP#ABAP OO#Encapsulation

    Encapsulation in ABAP: every public attribute is a debt

    PUBLIC, PROTECTED, PRIVATE and READ-ONLY aren't bureaucracy. They are your class's contract with the rest of the system, and over-declaring today gets paid back on every evolution. With real ABAP OO.

    Feb 1, 2026

    #ABAP#ABAP OO#Classes

    Classes and objects in ABAP: the mold is not the furniture

    A class is a template; an object is an instance with its own state. Grasping that difference, and the role of NEW versus CREATE OBJECT, is what separates real ABAP OO from procedural code in disguise.

    Jan 30, 2026

    Don't miss the first one

    Learn modern SAP every week: ABAP Cloud, S/4HANA, Fiori, BTP and AI. No spam, just the good stuff.