Preflight Validation Cheat Sheet
Quick reference for ADR-075 In-Memory Preflight Validation.
| Tool |
Purpose |
Use When |
wfValidateTable |
Validate only |
Check definition before planning |
wfPlanDeployTable |
Plan + validate + preview |
See full execution plan |
wfDeployTable |
Execute (validates first) |
Deploy to iDempiere |
Column Prefix Notation
| Prefix |
Type |
SQL |
Default Length |
S# |
String |
VARCHAR(60) |
60 |
S120# |
String |
VARCHAR(120) |
custom |
T# |
Text |
VARCHAR(2000) |
2000 |
M# |
Memo |
TEXT |
unlimited |
I# |
Integer |
NUMERIC(10,0) |
- |
N# |
Number |
NUMERIC |
- |
A# |
Amount |
NUMERIC |
- |
Q# |
Quantity |
NUMERIC |
- |
Y# |
YesNo |
CHAR(1) |
1 |
D# |
Date |
TIMESTAMP |
- |
d# |
DateTime |
TIMESTAMP |
- |
L# |
List |
CHAR(1) |
- |
ID# |
TableDir |
NUMERIC(10,0) |
- |
B# |
Binary |
BYTEA |
- |
U# |
URL |
VARCHAR(2000) |
2000 |
Examples:
S#Name → VARCHAR(60) NOT NULL
S120#LongName → VARCHAR(120)
ID#C_BPartner_ID → FK to C_BPartner
Y#IsApproved → CHAR(1) DEFAULT 'N'
D#DateDoc → TIMESTAMP
Q#Qty → NUMERIC
Validation Rules
Table Name
- ✅ Start with uppercase:
XX_MyTable
- ✅ Max 40 characters
- ✅ Alphanumeric + underscore only
- ⚠️ Should have prefix:
XX_, CE_, etc.
Column Name
- ✅ Start with uppercase:
MyColumn
- ✅ Max 40 characters
- ✅ Alphanumeric + underscore only
- ⚠️ YesNo should start with
Is, Has, Can
- ⚠️ TableDir should end with
_ID
Required Columns (auto-added)
{Table}_ID - Primary key
{Table}_UU - UUID (v11+)
AD_Client_ID, AD_Org_ID - Multi-tenant
IsActive - Active flag
Created, CreatedBy - Audit
Updated, UpdatedBy - Audit
Quick Examples
1. Validate Only
{
"tool": "wfValidateTable",
"arguments": {
"tableName": "XX_Task",
"columns": "S#Name,T#Description,D#DueDate,Y#IsComplete"
}
}
2. Plan Deployment
{
"tool": "wfPlanDeployTable",
"arguments": {
"tableName": "XX_Task",
"columns": "S#Name,D#DueDate,Y#IsComplete",
"windowName": "Task Management",
"deploy": false
}
}
3. Execute Deployment
{
"tool": "wfDeployTable",
"arguments": {
"tableName": "XX_Task",
"columns": "S#Name,D#DueDate,Y#IsComplete",
"windowName": "Tasks",
"deploy": true
}
}
Response Structure
Success (validation passed)
{
"success": true,
"message": "Validation passed. Ready to deploy.",
"preflight": {
"tableName": "XX_Task",
"validation": {
"valid": true,
"state": "OK",
"warnings": []
},
"tableSpec": {
"tableName": "XX_Task",
"columnCount": 11,
"columns": [...]
},
"previews": {
"sql": "CREATE TABLE XX_Task (...)",
"xml": "<?xml version=\"1.0\"?>..."
}
}
}
Error (validation failed)
{
"success": false,
"errorCode": "VALIDATION_FAILED",
"message": "Validation failed: 2 error(s)",
"preflight": {
"validation": {
"valid": false,
"state": "BLOCKED",
"errors": [
{
"field": "tableName",
"message": "Table name exceeds maximum length of 40",
"rule": "MTable.TABLENAME_LENGTH",
"suggestion": "Shorten to 40 characters"
}
]
}
}
}
Validation States
| State |
Meaning |
Action |
OK |
No errors, no warnings |
Proceed |
WARNINGS |
Warnings only |
Proceed with caution |
BLOCKED |
Has errors |
Fix errors first |
Workflow Pattern (Nx-style)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ VALIDATE │───▶│ PLAN │───▶│ EXECUTE │
│ │ │ │ │ │
│ wfValidate │ │ wfPlanDeploy│ │ wfDeploy │
│ Table() │ │ Table() │ │ Table() │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
Errors? Preview OK? Success!
Fix them Confirm Done
Common Errors
| Error |
Cause |
Fix |
TABLENAME_LENGTH |
Name > 40 chars |
Shorten name |
TABLENAME_FORMAT |
Invalid characters |
Use A-Za-z0-9_ only |
COLUMNNAME_LENGTH |
Column > 40 chars |
Shorten column name |
Invalid DisplayType |
Unknown prefix |
Check prefix table above |
Missing key column |
No {Table}_ID |
Auto-added, check table name |
Files Reference
| File |
Purpose |
docs/adr/075-in-memory-preflight-validation.md |
Full specification |
src/main/java/org/idempiere/cli/model/TableSpec.java |
Table model |
src/main/java/org/idempiere/cli/model/ColumnSpec.java |
Column model + prefix parsing |
src/main/java/org/idempiere/cli/model/ValidationResult.java |
Validation results |
src/main/java/org/idempiere/cli/mcp/tools/McpWfTools.java |
MCP tools |