---
title: LookupObject (LU) — Validation Rules
aliases: [LU, lookup-object, lookupobject, Lkp, lookup objects]
sources: [rcg-mobile-dev-agent/raw/006-contract-types-matrix.md, rcg-mobile-dev-agent/wiki/contracts/lookup-object.md]
last_updated: 2026-04-26
status: seed
---

# LookupObject (LU) — Validation Rules

LookupObjects are read-mostly reference entities — typically small, slowly-changing catalogs (status values, currencies, sales orgs) that BOs and LOs resolve against. They share much of BusinessObject's shape (SimpleProperties, Methods, DataSource binding) but are structurally simpler: no NestedObjects, no child ListObjects, and thinner lifecycle.

## What this contract represents

An LU (`.lookupobject.xml`) defines a reference entity identified by a primary key. The heaviest cross-contract validator in the modeler (216 lines) enforces that every SimpleProperty's `@dataSourceProperty` resolves against the bound DataSource, and that every non-standard method has a matching BusinessLogic file.

## File shape

-   Extension: `.lookupobject.xml`
-   Root element: `<LookupObject>`
-   Standard methods exempt from the BL-pairing check: `loadAsync`, `saveAsync`, `createAsync`, `doValidateAsync`.

## Validation rules

### Cross-cutting (every contract)

-   Contract names must be unique workspace-wide.
-   Files must be readable, well-formed XML.

### Must

-   Root element is `<LookupObject>`.
-   File name starts with `Lkp` and ends with `.lookupobject.xml`. Custom LUs start with the customizing indicator in both the file name and the root `@name`.
-   If a SimpleProperty declares `blobTable`, it must also declare `blobPKeyField` — blob handling is an all-or-nothing pair.
-   Storable LUs should reference a DataSource (missing DS is warned, not rejected).
-   Every non-standard `<Method @name>` must be backed by a matching BL (`.bl.js` or legacy `.BusinessLogic.xml`). The four standard methods above are exempt.
-   A SimpleProperty's `@dataSourceProperty` must resolve to a DS Attribute — mismatches are warned (LU's rule is softer than BO's, which errors on the same case).

### Must not

-   SimpleProperty `@type` cannot start with `__`.
-   SimpleProperty `@blobTable` cannot reference a temp table (name ending `_T`).
-   Two SimpleProperties cannot share a name; two Methods cannot share a name.

### Coerced (silently rewritten)

-   `xmlns="*.xsd"` on the root is stripped.

### Known XSD quirk

-   `LookupObject.xsd` declares `SimplePropertyType/@id` as `xs:boolean` (probably a copy-paste from another type) — BO and ListItem type the same attribute as `xs:string`. Most real LU files use `id="true"` / `id="false"` and this quirk doesn't bite them, but be aware if you see a cryptic boolean-parse error on a SimpleProperty's `id` attribute.

## Reference

-   Internal schema reference: `rcg-mobile-dev-agent/wiki/contracts/lookup-object.md`.
-   Cross-repo raw source: `rcg-mobile-dev-agent/raw/006-contract-types-matrix.md`.

## See also

-   [[business-objects]] — BO references LUs via `<ObjectLookup>`.
-   [[datasource]] — LU binds to a DataSource (`DsLu*` naming convention).
-   [[business-logic]] — LU methods implemented in `.bl.js`.
