File/batch integration → design staging, reconciliation, and restartability.
What connectivity constraints apply? (important for ABAP Cloud)
ABAP Cloud restricts classic RFC and unreleased APIs.
Prefer released APIs, Communication Arrangements, and Integration Suite patterns when required.
Is there a required integration middleware?
Integration Suite / API Management → plan routing, authentication (OAuth2 client credentials), monitoring, and error handling responsibilities.
What is the transactional consistency requirement across systems?
If you need cross-system consistency, plan a saga-style pattern (compensation) rather than distributed commits.
Domain & Business Object Foundation
What real-world business entity does this BO represent?
Transactional document (order, POD, request) vs. master/configuration data changes your numbering strategy, draft need, and locking model fundamentally.
Does this entity have a meaningful lifecycle with discrete statuses?
Yes → you need a state machine, feature control matrix, and status-driven actions.
No → simpler CRUD BO, minimal action design needed.
How deep is the composition hierarchy?
Root only → single-entity BO.
Root + children → plan composition tree and lock dependency before writing CDS.
Root + children + grandchildren → validate that grandchildren genuinely cannot exist outside the parent; if they can, they belong in a separate BO with an association, not a composition.
Is this greenfield or wrapping existing Database tables / legacy data?
Greenfield → UUID primary keys, managed persistence, full framework ownership.
Wrapping legacy → unmanaged or managed + additional save; you lose some framework benefits but gain compatibility with existing data.
Does this Business Object need to coexist with standard SAP business objects (PO, Sales Order, etc.)?
Yes → plan associations to standard CDS views (I_ namespace), consider impact on authorizations inherited from standard objects, and confirm whether standard extensibility (BADI, extension field) is sufficient or a custom BO is genuinely necessary.
Persistence Model
Does a legacy API (BAPI, FM, class) own the database writes at commit time?
Yes → Unmanaged or Managed + Additional Save.
No → Managed preferred.
Is the data persisted purely in custom tables under your control?
Yes → Managed.
Managed + Additional Save only if a downstream system must also be triggered at save.
Do you need fine-grained control over every INSERT / UPDATE / DELETE?
Yes → Unmanaged.
In practice this is rare for new developments; prefer managed unless there is a clear technical reason.
Does saving this BO trigger a document in another system (GR posting, FI entry, workflow)?
Yes → Managed + Additional Save.
The save_modified method in the saver class handles the external call.
Plan rollback strategy if the external call fails.
Draft Handling
Do users need to save incomplete work and return to it later?
Yes → Draft enabled. Tables must be generated for each entity node.
Is the editing session short-lived (seconds to minutes, single screen)?
Yes → Draft may be unnecessary overhead. Consider no-draft CRUD with immediate save.
Will multiple users ever hand off an in-progress document?
Yes → Draft with administrative draft handling. Plan who can resume or delete another user’s draft.
Is this a background / batch / integration scenario with no human editor?
Yes → No draft. Possibly no UI binding at all — Web API service binding only.
What is the draft expiry and cleanup strategy?
Stale drafts accumulate in draft tables. Plan a periodic cleanup job or use the framework’s draft garbage collection.
Numbering
Should a unique business key be assigned at the moment of creation before save?
Yes → Early numbering. Assign in the early numbering handler; key is stable from creation.
Is the business key generated by a number range, external system, or only at commit?
Yes → Late numbering. UUID is the internal key during the draft lifecycle. Semantic key is assigned in adjust_numbers at activation.
The projection must expose the semantic key as the consumer-facing identifier.
Is the primary key purely technical (UUID) with no business meaning?
Acceptable for internal objects but consider whether downstream integrations, reporting, or users need a readable identifier.
If yes, add a separate human-readable number field even if UUID is the key.
Are child entity keys meaningful (e.g. line item 10, 20, 30) or technical?
Line number semantics → plan the numbering determination for child nodes.
Technical child keys → UUID, simpler but less readable in error messages and APIs.
CDS View Layer
What is the intended CDS view stack?
Interface / base view (R_ namespace or I_ prefix convention)
Sits directly on the database table.
Contains all fields, associations, compositions.
No UI annotations.
Contract for reuse across consumers.
Never expose directly in a service.
Restricted / behavior view
Often identical to interface view.
May restrict fields from the transactional surface.
Place access control too broad for projection.
Projection view (P_ or C_ namespace)
Consumer-specific selection of fields.
Adds UI annotations.
Redirects associations to projection counterparts.
Defines aliases exposed in OData.
Usually one per consumer scenario.
Metadata extension (MDE)
Carries @UI annotations.
Keeps projection view clean.
Are there multiple consumer scenarios requiring different field sets from the same BO?
Yes → Multiple projection views on the same interface view.
Do any fields require computation that shouldn’t live in the database table?
Yes → Virtual elements in the interface view, implemented in the ABAP handler.
Use sparingly; virtual elements are calculated on every read and do not support filtering/sorting in OData unless explicitly handled.
Are there fields that should be exposed differently in different contexts (e.g. masked for some roles)?
Yes → Handle via separate projections or DCL conditions.
Do not use a single projection and try to conditionally hide fields; OData metadata is static.
Do you need CDS value help views?
Plan a separate VH_ prefixed CDS view for every field that presents a dropdown or F4 help in Fiori Elements.
Each value help view needs @Search.searchable: true and @ObjectModel.resultSet.sizeCategory annotations for performance.
Do you need CDS abstract entities for action parameters or return types?
Any action that takes structured input or returns structured output beyond $self needs an abstract entity.
Plan these upfront; they are part of the public API contract.
Are there analytical or reporting consumers of this data?
Yes → Plan a separate analytical projection with @Analytics annotations and cube/dimension CDS view types.
Transactional and analytical projections should not be mixed.
Actions, Functions & Operations
Map every user-initiated transition on your state machine to an action type:
Instance action → operates on one selected record (most common).
Static action → no record context (mass import, generate from template).
Factory action → creates a new instance, optionally copying from a source record.
Function → read-only operation returning data without side effects.
Are there actions that need structured input beyond the record itself?
Yes → define a CDS abstract entity as the action parameter.
Are there actions that need to return structured data beyond the modified record?
Yes → define a return abstract entity.
Plan how Fiori Elements handles the return (result table, message, navigation).
Which actions need to work on multiple selected records simultaneously?
These are mass-enabled actions.
Handler must use FOR ALL ENTITIES and process in bulk.
A single-instance handler promoted to mass action without refactoring is a performance risk.
Are there read-only queries that Fiori Elements needs to call without modifying state?
Yes → OData functions exposed as RAP functions in the behavior definition.