Preflight Validation Cheat Sheet

Quick reference for ADR-075 In-Memory Preflight Validation.


MCP Tools

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

Column Name

Required Columns (auto-added)


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

Path: /docs/cheatsheets/preflight-validation