---
title: SAIF.Presentation operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-08-17
library: SAIF.Presentation
reference_type: package
---

# SAIF.Presentation operations and processes

This page is the operation catalog and cross-operation hub for this library. Each operation's detailed, step-by-step logic lives in its own page under `operations/`. `SAIF.Presentation` issues no SQL of its own — all persistence is delegated to `SAIF.Framework.Preferences.PreferenceData` in the `SAIF.BOF.Framework` package, so the Rules column below is the only cross-reference column populated for this library.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules |
| --- | --- | --- | --- | --- | --- |
| [Construct and load a user's preferences](operations/construct-and-load-preferences.md) | Load every stored preference for a user and application into memory | A consuming application creates a preference store for the signed-in user | `inUserID`, `inApplication` | A populated in-memory `List(Of Preference)` | [BR-PRES-001](business-rules.md#br-pres-001-preference-store-scoped-to-one-application), [BR-PRES-002](business-rules.md#br-pres-002-preference-access-uses-the-fixed-oracle-user-clm), [BR-PRES-003](business-rules.md#br-pres-003-effective-user-identity-comes-from-the-data-portal), [BR-PRES-004](business-rules.md#br-pres-004-all-preferences-loaded-eagerly-on-construction), [BR-PRES-005](business-rules.md#br-pres-005-user-id-trimmed-and-lower-cased-for-lookup) |
| [Read a preference value](operations/read-preference-value.md) | Look up a single preference item by key, scope, or explicit application/page | Consuming code indexes into the preference store | Key (and optionally scope, or explicit application + page) | The stored value, or `Nothing` when not found | [BR-PRES-006](business-rules.md#br-pres-006-a-nothing-key-is-a-no-op), [BR-PRES-007](business-rules.md#br-pres-007-preference-keys-are-case-insensitive), [BR-PRES-008](business-rules.md#br-pres-008-only-pagelevel-scope-binds-to-a-page), [BR-PRES-009](business-rules.md#br-pres-009-web-page-name-derived-from-request-path), [BR-PRES-010](business-rules.md#br-pres-010-non-web-page-name-derived-from-override-or-call-stack), [BR-PRES-011](business-rules.md#br-pres-011-preference-record-identified-by-application-and-page), [BR-PRES-012](business-rules.md#br-pres-012-explicit-three-argument-lookup-matches-lower-cased-fields) |
| [Add or update a preference value](operations/add-or-update-preference.md) | Upsert a preference item into the in-memory set | Consuming code stores a preference (for example, a saved grid layout) | Key, value, optional `PrefScope` (defaults to `PageLevel`) | Mutated in-memory `Preference` record | [BR-PRES-006](business-rules.md#br-pres-006-a-nothing-key-is-a-no-op), [BR-PRES-007](business-rules.md#br-pres-007-preference-keys-are-case-insensitive), [BR-PRES-013](business-rules.md#br-pres-013-adding-a-preference-creates-a-missing-record), [BR-PRES-014](business-rules.md#br-pres-014-adding-an-existing-key-replaces-its-value), [BR-PRES-015](business-rules.md#br-pres-015-preference-values-stored-as-strings) |
| [Remove, clear, or delete preferences](operations/remove-clear-delete-preferences.md) | Reset a single preference, a scope, or all preferences in memory | Consuming code resets a single preference, a scope, or all preferences | Key and/or scope | Mutated in-memory `Preference` records | [BR-PRES-006](business-rules.md#br-pres-006-a-nothing-key-is-a-no-op), [BR-PRES-007](business-rules.md#br-pres-007-preference-keys-are-case-insensitive), [BR-PRES-016](business-rules.md#br-pres-016-removing-an-absent-key-is-a-no-op), [BR-PRES-017](business-rules.md#br-pres-017-clear-empties-all-items-in-a-scopes-record), [BR-PRES-018](business-rules.md#br-pres-018-delete-empties-every-loaded-record), [BR-PRES-019](business-rules.md#br-pres-019-mutations-are-in-memory-until-save) |
| [Persist preferences](operations/persist-preferences.md) | Serialize and persist in-memory preferences through the framework preference service | Consuming code finishes a batch of `Add` / `Remove` / `Clear` calls | The in-memory `_Preferences` list, `m_DPI` | Persisted preference records; always returns `False` | [BR-PRES-020](business-rules.md#br-pres-020-save-persists-only-the-current-applications-records), [BR-PRES-021](business-rules.md#br-pres-021-preference-items-persisted-as-json), [BR-PRES-022](business-rules.md#br-pres-022-empty-preference-record-persisted-as-empty-string), [BR-PRES-023](business-rules.md#br-pres-023-persistence-always-routed-through-preferencedata), [BR-PRES-024](business-rules.md#br-pres-024-persistence-failures-wrapped-in-applicationexception) |

## Process flow diagram
The following diagram visualizes the primary operational flow across operations.

```mermaid
flowchart TD
	Start([Construct clsPreferences]) --> Load[Load all preferences for user]
	Load --> Ready[In-memory Preference set ready]
	Ready --> Read[Item: read a value]
	Ready --> Add[Add: upsert a value]
	Ready --> RemoveClear[Remove / Clear / Delete]
	Add --> Save[Save: persist to framework]
	RemoveClear --> Save
	Save --> Decision{PreferenceData.SavePreferences succeeds?}
	Decision -->|Yes| EndOk([Preferences persisted])
	Decision -->|No| EndErr([ApplicationException thrown])
```

## Failure and edge-case behavior
- A `Nothing` key passed to `Item`, `Add`, or `Remove` is a silent no-op rather than an error ([BR-PRES-006](business-rules.md#br-pres-006-a-nothing-key-is-a-no-op)).
- If persistence fails inside `PreferenceData.SavePreferences`, the exception is wrapped and re-thrown as `ApplicationException("Unable to save preferences.", ex)` ([BR-PRES-024](business-rules.md#br-pres-024-persistence-failures-wrapped-in-applicationexception)).
- `Save()` always returns `False`, even when persistence succeeds, because the `result` local is never assigned `True` — callers cannot rely on the return value to detect success or failure.*

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [API reference](api/index.md)

## Sources
- `SAIF.Presentation/clsPreferences.vb`
