Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Language Versions and Migration

An MDL script is written in one language version, declared by its first statement:

mdl 1;

create persistent entity Shop.Customer (
  Name: String(200)
);

A script file with no header is mdl 0, the alpha language. The rest of this manual documents mdl 1; this page is the one place that documents what mdl 0 means differently, and how to move a script from one to the other.

Two rules make the move safe (ADR-0011):

  • A script never changes meaning because a newer mxcli runs it. A change of meaning, or a new rejection, applies only under the header that introduces it. Without the header the old meaning is kept, and the construct warns with an MDL-V1-* code.
  • A deprecated spelling is a respelling. It means exactly what its new form means, warns with an MDL-DEPR* code, and mxcli fmt --upgrade rewrites it. It is refused only from the version named in its entry.

Every warning that carries one of these codes ends with a pointer such as (mxcli help MDL-V1-LIMIT1). That command prints the code’s entry: the old form, the new form, whether fmt --upgrade rewrites it, and the version that refuses it. mxcli syntax <topic> --deprecated lists the old spellings of one topic.

mdl 1 is frozen

mdl 1 was frozen at beta. It is a contract: a later change of meaning needs a new version, mdl 2, and a script headed mdl 1; means the same under every later mxcli release. What that changes in practice:

WhereSince the freezeTo get mdl 0
describe (statement and mxcli describe), mxcli context, mxcli diff-localWrites mdl 1, and every description starts with mdl 1;, so it runs as it is. Descriptions concatenated into one file repeat the header; a repeated header naming the same version is allowed. Describe never writes a deprecated spelling, in either version: a List operation or Aggregate list activity is its statement ($n = count $L;), never the call (count($L)).--mdl 0 on the command (no header is written)
mxcli fmt --upgradeAdds the mdl 1; header by default, after the rewrites below.--header=false upgrades the spellings alone
mxcli fmt (without --upgrade)Keeps the script’s header, or its lack of one: formatting never changes a script’s language.—
The REPL and mxcli -c "…"Input without a header is read as mdl 1. Session commands (connect, set format, status, …) and a missing ; after the last statement stay allowed: this is the session they belong to.--mdl 0 on the command line; in the REPL an mdl 0; statement switches the session (and mdl 1; back). The REPL is the only place a header may change the language part-way
A script file run with exec, check or fmtUnchanged: read by its own header, and as mdl 0 without one (ADR-0011).—

Before the freeze mdl 1; warned “preview: may still change” (MDL-LANG01); that warning is gone. A header after the first statement must name the same version as the first: mdl 0; after mdl 1; is an error, and so is mdl 1; part-way through a script that started without one.

What a script without the header means

Each construct below is refused under mdl 1; and accepted without the header, where it keeps its old meaning and warns with the code shown.

Under mdl 1;Without the header
A statement without ; is an error.Accepted; MDL-V1-SEMI.
A / terminator line is an error.Accepted; MDL-V1-SLASH.
'' is the only string escape; a backslash is an ordinary character, so 'C:\temp' is that path.\n, \r, \t, \\ and \' are escapes; MDL-V1-ESCAPE for each literal whose value would change.
A text template (log, show message, validation feedback) written as one literal is the template text even when it spans lines, which is how a template holds a line break.A template literal spanning lines with no with ({n} = …) parameters is an expression: the template is {1}, the literal its parameter; MDL-V1-TEMPLATE.
In a REST client, published REST service, business event service, model, knowledge base, consumed MCP service or agent, an unknown property key is an error that names the key it most likely meant, and so is a value its key does not take (Response: json from $X).The property is ignored, or read by its shape as before; MDL-V1-PROP / MDL-V1-PROPVALUE.
A while loop is while <condition> begin … end while;; leaving out begin, or the while after end, is an error.Accepted; MDL-V1-WHILE.
show entity X / show association X is an error: describe entity X prints the definition, list entities in M the summary columns.Prints the summary; MDL-V1-SHOWSUMMARY.
A session command — connect, disconnect, use, set format = …, status, show version, show status, show connections, show catalog status, check, build, lint, debug, execute script, execute runtime, help, introspect api — is an error in a script. Type it at the REPL, or use the command-line flag (mxcli exec script.mdl -p app.mpr --json). The REPL keeps accepting them.Runs as before; MDL-V1-SESSION.
A quoted value of DynamicClasses, DynamicCellClass or an OData client’s credential or header value is a Mendix string, so the pre-#750 spelling — the expression’s text in quotes, 'if $currentObject/X then ''on'' else ''''', '''admin''', '@Mod.C' — is an error (MDL-WIDGET33, MDL-ODATA07). Write the expression bare.The quoted text is the expression it holds; MDL-V1-QUOTEDEXPR. A quoted class name or plain credential is the string under both.

Strings without the header

A script without the header (mdl 0) still reads a backslash before n, r, t, \ or ' as an escape — 'C:\temp' holds a tab — and check warns MDL-V1-ESCAPE for each literal whose value changes under mdl 1. Write the backslash-free form ('it''s') to mean the same under both.

In a microflow or nanoflow expression, without the header 'C:\\temp' stores 'C:\temp' and 'it\'s' stores 'it''s': the stored expression is the same value, spelled as Studio Pro spells it.

describe --mdl 0 keeps the mdl 0 escapes (\n, \\): in a flow’s expression and an XPath constraint it writes a stored backslash as \\, so the description reads back as the stored value under mdl 0. mxcli fmt --upgrade rewrites an mdl 0 script’s escaped strings to the mdl 1 form. An expression whose string holds an escaped line break is written as the expression Mendix stores for it, since an expression that spans lines is stored exactly as written.

Without the header a template literal that spans lines and has no parameters is an expression instead — the template is {1} and the literal its parameter — and check warns MDL-V1-TEMPLATE. With with ({n} = …) parameters it is the template text under both versions.

How to migrate a script

  1. Commit the script first, so the upgrade is one reviewable diff.

  2. Upgrade it with the project it runs against, and let the upgrade add the header. Never type mdl 1; by hand: the upgrade adds it only after rewriting every construct whose meaning the header would change, and refuses when one has no rewrite.

    mxcli fmt --upgrade -w -p app.mpr script.mdl
    

    The header is the default since the freeze; --header still says so explicitly, and --header=false upgrades the spellings alone.

    The project (-p) answers what the script alone cannot: whether find(…) over a flow’s result is the string function or the list operation, which bare commit statements the stored flows run without events, and which create or modify statements exec would refuse under the header. The project is only read.

  3. Read what it reports on stderr. A deprecated spelling with no mechanical rewrite is left in place and listed as “not upgraded”; a header-gated construct with no rewrite blocks the header, and the file keeps its version. Fix those by hand (mxcli help <code> says how) and upgrade again.

  4. Check it against the project, the way exec will read it:

    mxcli check script.mdl -p app.mpr --references
    

    check -p reports everything exec would refuse under the header, computed by the same code exec uses, so a refusal shows up here and not halfway through a run.

  5. Run it twice. The first exec applies the script; the second must write nothing, and report every document unchanged. A second run that writes is a script that does not say what the project holds — the upgrade’s job is to make it say so — and is worth reporting.

    mxcli exec script.mdl -p app.mpr
    mxcli exec script.mdl -p app.mpr   # expect: nothing written
    

Test files (.test.mdl, .test.md) are upgraded the same way: the statements in their blocks are rewritten, and doc comments (@test, @expect, …), separators and prose are kept byte for byte. The header goes on the first line of a .test.mdl file and on the first line inside each mdl-test block of a .test.md file; --header=false declines it, as for a script. The runner and check read it, so a test body means under the header what it means in a script (see Test Formats).

One dialect per file. Upgrade a headerless file before editing it; do not add mdl 1 statements to an mdl 0 file.

What the upgrade does, in order

mxcli fmt --upgrade changes nothing but the constructs below; comments, layout and keyword case survive, and the result is re-parsed before it is written.

  1. Deprecated spellings become their new form (the MDL-DEPR* table). This step runs with or without the header.
  2. Bare commits are pinned (with -p, with or without the header). A bare commit $X; means with events, Studio Pro’s default; mxcli releases before that change stored it without. In a create or modify flow whose stored commit has no events, the upgrade writes commit $X without events; so that re-running the script keeps what is stored. Without -p the script is left as written and fmt prints a note (MDL067) per flow.
  3. Header-gated constructs are rewritten to the spelling that keeps their mdl 0 meaning under the header (not with --header=false): the missing ; is added, / lines are deleted, a backslash escape becomes the character it stood for, retrieve … limit 1 (an object under mdl 0) becomes retrieve … first, a reassignment gets set, and a list operation becomes one statement per activity. One change is version-neutral and is rewritten without the header too (the table says which).
  4. The header is added — unless a construct in step 3 has no rewrite, or, with -p, exec would refuse a statement under the header (a create or modify of a stored flow whose change cannot be spliced in, MDL-V1-REBUILD). The file then keeps its version and the rest of the upgrade still applies; --force-header adds the header anyway.

The rewrites and refusals in detail

mxcli fmt --upgrade rewrites every deprecated spelling (the MDL-DEPRnnn warnings) to its canonical form — create or replace becomes create or modify, list entities becomes list entities, on error { … } becomes on error begin … end error — and changes nothing else: comments, layout and keyword case are kept. A deprecated use with no mechanical rewrite is reported and left in place.

mxcli fmt --upgrade script.mdl                  # print the upgraded script
mxcli fmt --upgrade -w script.mdl               # upgrade in place, adding `mdl 1;`
mxcli fmt --upgrade --header=false -w script.mdl  # the spellings alone, no header

The header is added after rewriting every construct whose meaning it would change, so the script keeps doing what it did:

CodeRewrite
MDL-V1-SEMIadds the missing ;
MDL-V1-SLASHdeletes the / line
MDL-V1-ESCAPEwrites the string’s value with '' as the only escape ('it\'s\t' becomes 'it''s + a tab + ')
MDL-V1-LIMIT1retrieve … limit 1 (one object) becomes retrieve … first
MDL-V1-SET$x = … becomes set $x = …
MDL-V1-LIST, MDL-DEPR003, MDL-DEPR004a list operation or aggregate call becomes its statement form ($x = filter($L, …) → $x = filter $L where …); find/contains on a declared String keeps the call and gains set
MDL-V1-REPLACE02create or replace user role / demo user becomes a plain create
MDL-V1-WHILEinserts the missing begin after a while condition and while after its end
MDL-V1-TEMPLATEa template literal spanning lines becomes the parameter it was: log info 'a⏎b'; becomes log info '{1}' with ({1} = 'a⏎b');
MDL-V1-QUOTEDEXPRa quoted expression becomes the expression bare: dynamicclasses: 'if $currentObject/X then ''on'' else ''''' becomes dynamicclasses: if $currentObject/X then 'on' else ''. The bare form means the same without the header, so fmt --upgrade applies this one with --header=false too

A construct with no mechanical rewrite is reported with the reason, and fmt refuses to add the header rather than change the script’s meaning: an unknown or mis-shaped property (MDL-V1-PROP, MDL-V1-PROPVALUE), create or replace view entity (MDL-V1-REPLACE01), a session command in a script (MDL-V1-SESSION: move it to the command line or the REPL), a nested list operation such as count(filter(…)), find/contains on a variable whose type the script does not state (when the variable holds a microflow or nanoflow call’s result, the called flow’s return type decides: a flow the script creates earlier is read from the script, and any other from the project given with -p app.mpr, so fmt --upgrade -p app.mpr rewrites it), and an escaped line break (\n) inside an expression. An escaped line break in a text template’s literal is rewritten: the break is written into the literal, which under mdl 1 is still the template text. Running fmt --upgrade on its own output changes nothing.

-p app.mpr also settles a bare commit $X; in a create or modify microflow|nanoflow, with or without the header. Since mendixlabs/mxcli#895 a bare commit means with events, Studio Pro’s default; an older mxcli stored the same statement without events. Where the stored flow commits the variable without events, fmt --upgrade -p app.mpr writes commit $X without events;, so re-running the script keeps what is stored instead of turning the event handlers on (or, inside a loop under mdl 1, being refused). A new flow, a new commit, or a stored commit with events is left as written; where the stored flow commits the variable both ways, the statement is left and reported. Without -p, fmt prints a note (MDL067) for each flow with a bare commit.

-p app.mpr also tells the upgrade which statements exec would refuse once the header is there. Under mdl 1 a create or modify microflow|nanoflow of a stored flow is applied as a patch, and a change the patch cannot make (inside a loop body or an error handler, a redrawn connector, a return added) is refused with nothing written; without the header the same statement rebuilds the whole flow (MDL-V1-REBUILD). No rewrite keeps that meaning, so fmt names each such statement and leaves the header off that file, applying the rest of the upgrade. Change those flows with alter, or drop and create them, and upgrade again; --force-header adds the header regardless. mxcli check script.mdl -p app.mpr reports the same statements (an MDL-V1-REBUILD error under mdl 1, the warning without the header), computed by the same code as exec and diff.

Behaviour changes to know about

Besides the generated tables, a few changes alter what an existing script writes. Most apply under both versions, because the old behaviour was a silent wrong write rather than a meaning a script could rely on (ADR-0011 allows fixing those everywhere); the others are gated like any MDL-V1-* change. They are listed because a script that ran before may write something different now. Where the old output can still be asked for, the entry says how.

ChangeWhat a script writes nowApplies underCode
String escapes in flow expressionsA string literal in a flow expression stores its value as Studio Pro spells it: '' doubled, never a backslash escape in the stored expression. Only how a \ in the MDL literal is read depends on the header (MDL-V1-ESCAPE).bothvisitor_string_escapes.go, mendixexpr.go
Pluggable widget schema keptAn unchanged pluggable widget keeps its stored Type and Object (the widget’s schema) instead of being rebuilt from mxcli’s template, so a widget upgraded in Studio Pro stays upgraded.bothcmd_pages_pluggable_passthrough.go
Text-template attribute binding{1} = $Order.Total binds the attribute and renders with its formatting, as Studio Pro stores it, instead of toString($Order/Total). Write {1} = toString($Order/Total) to keep the old output. Without the header the binding warns (MDL-V1-TEMPLATEATTR).bothcmd_pages_template_attr.go
Gallery row clickA row click on a gallery with single-click selection is refused (MDL-WIDGET36), with nothing written, because mx check fails such a page; without the header it is written and warns (MDL-V1-GALLERYCLICK).mdl 1validate_widget_language.go
create constant … privateWas never stored. Without the header it parses, does nothing and warns (MDL-DEPR138); fmt --upgrade deletes it; mdl 1 refuses it. Set a private value with mxcli constant set.bothvisitor_deprecations.go
Commit eventsA bare commit $X; commits with events, Studio Pro’s default; older releases stored it without. check names the affected flows (MDL067; exec -p leaves out a flow the project already stores with events), and fmt --upgrade -p writes without events where the stored flow has it.bothcommit_events.go, flow_commit_events.go
date as a typeMendix has no date-only type: date is an alias of DateTime and builds exactly what DateTime builds. Without the header it warns (MDL-DEPR160); fmt --upgrade writes DateTime; mdl 1 refuses date.bothdeprecation.go

Reference

The tables below are generated from the registries in the code (visitor.LanguageChanges, executor.LanguageChanges and mdl/deprecation) by make gen-migration-reference; CI fails when they are stale. A version above the newest one this mxcli knows (mdl 2 today) is the version that will refuse the spelling; until then it only warns.

Changes of meaning (MDL-V1-*)

22 constructs mean something different under the mdl 1; header. Without the header each keeps the meaning in the second column and warns with its code.

CodeWithout the header (mdl 0)Under mdl 1;Decided atRewritten by fmt --upgrade
MDL-V1-ACTIONSLOTAn onClick: or OnChange: on a widget with no slot for it is dropped on writea refusal (MDL-WIDGET37), with nothing writtenexecno: decided by exec against the project; check -p reports it
MDL-V1-BOUNDARYDROPdrop <activity> boundary event on an activity with several boundary events drops the first one describe workflow printsa refusal, with nothing writtenexecno: decided by exec against the project; check -p reports it
MDL-V1-ESCAPEa backslash in a string literal is an escape (\n is a newline, \t a tab, \' an apostrophe, \\ one backslash)an ordinary character, as in a Mendix expression; '' is the only escapeparseyes: fmt --upgrade --header
MDL-V1-GALLERYCLICKA gallery row click on a single-click selection is written, and mx check fails the page (“The item click action is ambiguous”)a refusal (MDL-WIDGET36), with nothing writtenexecno: decided by exec against the project; check -p reports it
MDL-V1-LIMIT1retrieve … limit 1 binds a single object (Mendix’s “First object” range, so a loop over it is CE0100 and count() or head() CE0097); write retrieve … first to say soa list of one (a Custom range), and the object is written firstparseyes: fmt --upgrade --header
MDL-V1-LISTa list operation or aggregate written as a call — find(…) or contains(…), a call after set, or one call nested in another — is turned into a List operation or Aggregate list activity, guessing from its arguments whether a string function was meant,an error: a List operation or Aggregate list is one statement per activity whose operand is a variable ($x = find $L where …;, $n = count $L;), and after set a call is always the expression functionparseyes: fmt --upgrade --header
MDL-V1-PROPan unknown property key is accepted and ignoredan errorparseno: blocks --header; an unknown property key is ignored under mdl 0 and an error under mdl 1; which key was meant cannot be guessed, so correct or delete it by hand
MDL-V1-PROPVALUEa value its key does not take is accepted, and ignored or read by its shapean errorparseno: blocks --header; a value its key does not take is ignored or read by its shape under mdl 0; what was meant cannot be guessed, so correct it by hand
MDL-V1-QUOTEDEXPRa quoted value holding expression text in an expression property (DynamicClasses, DynamicCellClass, an OData client’s HttpUsername / HttpPassword / ClientCertificate or header value) is that expression: the outer quotes are dropped and the doubled ones undonea Mendix string, so the old spelling is refused (MDL-WIDGET33, MDL-ODATA07); write the expression itself, without the outer quotes and with its own quotes singleparseyes: fmt --upgrade, with or without --header
MDL-V1-REBUILDcreate or modify microflow|nanoflow rebuilds the whole stored flow when the change cannot be spliced in, which resets curves, drops merges and renumbers element IDsa refusal that names the change the splice cannot make, with nothing writtenexecno: decided by exec against the project; check -p reports it
MDL-V1-REMOTETYPEcreate or modify external entity writes a mapped attribute with the declared type and keeps the service’s RemoteType, which mx check reports as CE6616a refusal that names the attribute and the type the service publishes, with nothing writtenexecno: decided by exec against the project; check -p reports it
MDL-V1-REPLACE01create or replace view entity deletes the view entity and creates a new one (a new identity; its access rules and associations are lost)create or modify view entity, which rewrites it in place and keeps its identityparseno: blocks --header; create or replace view entity drops and recreates the view entity under mdl 0, which no mdl 1 statement does: write create or modify view entity to keep its identity, or drop entity then create view entity to discard it
MDL-V1-REPLACE02create or replace on a user role or demo user is a plain create, which fails when it already existscreate or modifyparseyes: fmt --upgrade --header
MDL-V1-SEMIa statement without a terminating ; is acceptedan error: every statement ends with ;parseyes: fmt --upgrade --header
MDL-V1-SESSIONa session command in a script runs as if typed at the REPLan error: a script holds model statements only; type the command at the REPL, or use the command-line flag (-p app.mpr to connect, --json for the output format)parseno: blocks --header; a session command (connect, set format, status, help, …) is refused in an mdl 1 script, and no model statement does what it does: move it out of the script, to the command line (-p app.mpr to connect, --json for the output format) or the REPL
MDL-V1-SET$x = <expression> without set changes the variablean error: a reassignment is written set $x = <expression>;parseyes: fmt --upgrade --header
MDL-V1-SHOWSUMMARYshow entity X / show association X prints a summary of the elementan error: show is dropped (R6) and the summary has no mdl 1 statement; write describe entity X for the definition, or list entities in M / list associations in M for the summaryparseno: blocks --header; show entity X / show association X print a summary no mdl 1 statement prints: describe prints the definition as MDL and list entities / list associations the summary columns, so either would change the script’s output; choose one by hand
MDL-V1-SLASHa / after a statement is accepted as a terminator (SQL*Plus style)an error: ; is the only statement terminatorparseyes: fmt --upgrade --header
MDL-V1-TEMPLATEa message template written as one string literal that spans lines is an expression: the template is {1} and the literal its parameterthe template text, as a literal on one line is; a line break in a template is written into the literalparseyes: fmt --upgrade --header
MDL-V1-TEMPLATEATTRa text-template parameter bound to a non-String attribute ({1} = $Order.Total) was stored as toString($Order/Total) by earlier mxcli releasesan attribute reference, rendered with the attribute’s formatting, as Studio Pro stores itexecno: decided by exec against the project; check -p reports it
MDL-V1-VIEWAUTONUMBERa view entity attribute declared autonumber over an AutoNumber column passes check, and mxbuild reports CE6770 “View Entity is out of sync with the OQL Query”a check error that names the attribute and suggests long, the type the view gives the columnexecno: decided by exec against the project; check -p reports it
MDL-V1-WHILEwhile <condition> accepts a body without begin and an end without whilean error: a while loop is while <condition> begin … end while;, like loop … begin … end loop;parseyes: fmt --upgrade --header

Deprecated spellings (MDL-DEPR*)

87 old spellings mean exactly what their new form means. They warn with their code under every version before the one in the last column, which refuses them.

CodeOld formNew formRewritten by fmt --upgradeRefused from
MDL-DEPR001create or replace …create or modify …yes: replace → modifymdl 2
MDL-DEPR002show …list …yes: show → listmdl 2
MDL-DEPR003$x = <operation>($List, …)$x = <operation> $List …yes: call form to statement form: head/tail $L; filter/find $L by Member = v (when the condition has that shape) or where ; sort $L by …; union/intersect $A with $B; subtract($A, $B) -> subtract $B from $A; equals $A and $B; range($L, o, n) -> range $L offset o limit nmdl 2
MDL-DEPR004$n = <function>($List, …)$n = <function> $List …yes: call form to statement form: count $L; sum|average|minimum|maximum $L by Attr (for $L.Attr) or of ; all|any $L where ; reduce $L from as using mdl 2
MDL-DEPR005row row1 { … } / column Name (…) — a name on an element Mendix stores none forrow { … } / column (…)yes: name out of the element: row row1 { becomes row {mdl 2
MDL-DEPR006call microflow M.F($Param = expr)call microflow M.F(Param = expr)yes: parameter name without its $ (quoted when it is not an identifier or keyword)mdl 2
MDL-DEPR007show page M.P(Param: expr)show page M.P(Param = expr)yes: colon as =: Param: expr -> Param = exprmdl 2
MDL-DEPR008call microflow M.F with (Param = '<expression>')call microflow M.F(Param = <expression>)yes: string list as a list after the callee, each string’s content written as the bare expressionmdl 2
MDL-DEPR009objects [$a, $b] / parameters ['a', 'b']with ({1} = $a, {2} = $b)yes: positional list as numbered placeholders: objects [a, b] -> with ({1} = a, {2} = b)mdl 2
MDL-DEPR020show_page, save_changes, close_page, microflow M.F, …show page, save changes, close page, call microflow M.F, …yes: page action as words: the underscore becomes a space (show_page -> show page, also save_changes, cancel_changes, close_page, create_object, open_link, sign_out, complete_task); delete_object -> delete; microflow M.F / nanoflow M.F -> call microflow M.F / call nanoflow M.Fmdl 2
MDL-DEPR021error '…' / feedback '…' / error_message '…'error message '…'yes: message keyword as error message: not null error '…' (and after unique or required), a validation rule’s feedback '…', and error_message / errormessagemdl 2
MDL-DEPR022delete_behavior …on delete cascade|restrict|set nullyes: delete behaviour as the SQL referential action: delete_behavior cascade / delete_and_references -> on delete cascade; prevent / delete_if_no_references -> on delete restrict; delete_but_keep_references -> on delete set nullmdl 2
MDL-DEPR023type reference_settype ReferenceSetyes: type name as Mendix writes it: reference_set -> ReferenceSetmdl 2
MDL-DEPR024call rest service … returns nonecall rest service … returns nothingyes: none → nothingmdl 2
MDL-DEPR030grant M.Role on M.E (rights) where '[xpath]'grant rights on entity M.E to M.Role where [xpath]yes: rights before on entity, roles after to, and the XPath out of its string: grant R on M.E (read *) where '[A = ''x'']' becomes grant read * on entity M.E to R where [A = 'x']mdl 2
MDL-DEPR031targeting [users|groups] xpath '[xpath]'targeting [users|groups] xpath [xpath]yes: XPath out of its string: xpath '[Name = ''Admin'']' becomes xpath [Name = 'Admin']mdl 2
MDL-DEPR060alter settings runtime Key = value, … / create configuration 'X' Key = value, …alter settings runtime ( Key: value, … ) / create configuration 'X' ( Key: value, … )yes: assignments in parentheses, each = as :mdl 2
MDL-DEPR061alter consumed|published odata service X set Key = value, …alter consumed|published odata service X set ( Key: value, … )yes: assignments in parentheses, each = as :mdl 2
MDL-DEPR062alter styling on page P widget w set Class = 'x', 'Full width' = onalter styling on page P widget w set ( Class: 'x', 'Full width': on )yes: assignments in parentheses, each = as :mdl 2
MDL-DEPR063alter entity M.E set allow_create_change_locally = truealter entity M.E set ( AllowCreateChangeLocally: true )yes: property as create’s list: set ( AllowCreateChangeLocally: <value> )mdl 2
MDL-DEPR064type: Reference / owner: Both / storage: Tabletype Reference / owner Both / storage Tableyes: clause without its colon: type: Reference as type Reference (also owner, storage)mdl 2
MDL-DEPR065alter entity M.E modify attribute A Typealter entity M.E modify attribute A: Typeyes: attribute definition with its colon: A Type as A: Typemdl 2
MDL-DEPR070operation X { Method: get, … }operation X ( Method: get, … )yes: operation’s braces: operation X { … } becomes operation X ( … )mdl 2
MDL-DEPR071tool X { … } / mcp service M.S { … } / knowledge base K { … }tool X ( … ) / mcp service M.S ( … ) / knowledge base K ( … )yes: attachment’s braces: tool X { … } becomes tool X ( … )mdl 2
MDL-DEPR072image collection M.C ( image X from file '…', … )image collection M.C { image X ( File: '…' ) … }yes: image list: the images move into { } without commas, and from file '…' becomes ( File: '…' )mdl 2
MDL-DEPR073message definition collection M.C ( definition D for M.E ( A, M.E_B/M.B ( C ) ) )message definition collection M.C { definition D for M.E { A, M.E_B/M.B { C } } }yes: message trees: each parenthesised definition list and member tree moves into { }mdl 2
MDL-DEPR074alter microflow M.F { insert after $X { … } }alter microflow M.F { insert after $X begin … end; }yes: fragment’s braces: { becomes begin and } becomes endmdl 2
MDL-DEPR080decision '<expression>' / timer '<expression>' / due date '<expression>'decision <expression> / timer <expression> / due date <expression>yes: expression out of its string: decision '$Ctx/Total > 1000' becomes decision $Ctx/Total > 1000mdl 2
MDL-DEPR081Visible: [<expression>] / Editable: [<expression>]Visible: <expression> / Editable: <expression>yes: brackets into the expression they store: Visible: [Active] becomes Visible: $currentObject/Activemdl 2
MDL-DEPR082revoke M.Role on M.E [(rights)]revoke rights|all on entity M.E from M.Roleyes: rights (or all when none are listed) before on entity, roles after from: revoke R on M.E (write *) becomes revoke write * on entity M.E from R, revoke R on M.E becomes revoke all on entity M.E from Rmdl 2
MDL-DEPR083Username: $ConstUsername: @Module.Constyes: $Const becomes @<the service's module>.Constmdl 2
MDL-DEPR084Key: Module.ConstKey: @Module.Constyes: @ before the constant’s namemdl 2
MDL-DEPR085alter settings constant 'Module.Const' …alter settings constant @Module.Const …yes: constant’s name out of its string, with @: constant 'M.ApiUrl' becomes constant @M.ApiUrlmdl 2
MDL-DEPR090show page|project security|security matrix|structure|context of …describe page|app security|security matrix|structure|context of …yes: verb as describe: show page X -> describe page X, show project security -> describe app security; the same for list on these formsmdl 2
MDL-DEPR091alter user role R remove module roles (…)alter user role R drop module roles (…)yes: remove → dropmdl 2
MDL-DEPR092alter settings language remove '…' / alter settings workflows remove group '…'alter settings language drop '…' / alter settings workflows drop group '…'yes: remove → dropmdl 2
MDL-DEPR093alter entity E add|rename|modify|drop column …alter entity E add|rename|modify|drop attribute …yes: column → attributemdl 2
MDL-DEPR094rest call get|post|… 'url' …call rest service get|post|… 'url' …yes: statement keyword: rest call becomes call rest servicemdl 2
MDL-DEPR095describe widget <name>describe widget type <name>yes: type after widget: describe widget combobox -> describe widget type comboboxmdl 2
MDL-DEPR096define fragment F as { … }create fragment F as { … }yes: define → createmdl 2
MDL-DEPR100create constant|association|json structure|image collection … comment '…'/** … */ before the statementyes: documentation as a doc comment: the clause is deleted and its text written as /** … */ before the statementmdl 2
MDL-DEPR101set Key = value [on target] / set (Key = value, …) [on target]set (Key: value, …) [on target]yes: each = as :, and the assignments in parentheses when they are notmdl 2
MDL-DEPR102set Key: value [on target]set (Key: value) [on target]yes: assignment in parenthesesmdl 2
MDL-DEPR103drop widget a, bdrop a, byes: drop widget a as drop amdl 2
MDL-DEPR104<workflow activity> comment '…'<workflow activity> caption '…'yes: comment → captionmdl 2
MDL-DEPR105create page|snippet|consumed rest service|… M.N (…, Folder: '…', …)create page|snippet|consumed rest service|… M.N folder '…' (…)yes: folder as a clause: the property is deleted from the list and written as folder '…' after the namemdl 2
MDL-DEPR106Documentation: '…' in a regular expression, task queue or scheduled event/** … */ before the statementyes: documentation as a doc comment: the property is deleted from the list and its text written as /** … */ before the statementmdl 2
MDL-DEPR120Headers: ( 'Name' = value )Headers: ( 'Name': value )yes: header list: 'Name' = value becomes 'Name': valuemdl 2
MDL-DEPR121navigation P menu ( menu item …; menu 'X' ( … ); ) / create menu M.M ( … )navigation P { menu item … menu 'X' { … } } / create menu M.M { … }yes: menu items: menu ( becomes {, a menu’s or sub-menu’s ( ) become { }, and the ; after each item is droppedmdl 2
MDL-DEPR122menu item 'X' page M.P icon I / microflow M.F / sign outmenu item 'X' ( OnClick: show page M.P, Icon: I ) / call microflow M.F / sign outyes: item clauses: page M.P becomes ( OnClick: show page M.P ), microflow M.F OnClick: call microflow M.F, sign out OnClick: sign out, and icon I Icon: Imdl 2
MDL-DEPR123Params: { $P: M.E } / Variables: { $v: Boolean = 'true' }Params: ( $P: M.E ) / Variables: ( $v: Boolean = 'true' )yes: header map: the braces become ( )mdl 2
MDL-DEPR124ContentParams: [{1} = expr]ContentParams: ({1} = expr)yes: template parameters: the brackets become ( )mdl 2
MDL-DEPR125DesignProperties: ['Key': 'Value', 'Group': ['k': on]]DesignProperties: ('Key': 'Value', 'Group': ('k': on))yes: design properties: each bracketed list becomes ( )mdl 2
MDL-DEPR126snippetcall s (Snippet: M.S, Params: {$Asset: $var})snippetcall s (Snippet: M.S, Params: (Asset = $var))yes: snippet call arguments: {$P: $v} becomes (P = $v)mdl 2
MDL-DEPR127database connection M.Db type '…' connection string @M.C … begin query Q sql '…' returns M.E map (c as A); enddatabase connection M.Db ( Type: '…', ConnectionString: @M.C, … ) { query Q ( Sql: '…', Returns: M.E, Map: ( A = c ) ) }yes: clauses become the property list: type Type:, connection string ConnectionString:, host Host:, port Port:, database DatabaseName:, username Username:, password Password:; begin … end becomes { }; a query’s sql, parameter, returns and map become Sql, Parameters, Returns and Map, and column as Attr becomes Attr = columnmdl 2
MDL-DEPR130list image|icon|message definition collection [in M]list image|icon|message definition collections [in M]yes: singular as the plural: collection -> collections after listmdl 2
MDL-DEPR131create|alter|drop|describe|move model M.X / list modelscreate|alter|drop|describe|move ai model M.X / list ai modelsyes: document name: model becomes ai model, models becomes ai modelsmdl 2
MDL-DEPR132create json structure M.J snippet '…'create json structure M.J sample '…'yes: snippet → samplemdl 2
MDL-DEPR133alter app security level …|demo users on|off|guest access on [role R]|off|strict mode on|offalter app security ( SecurityLevel: …, EnableDemoUsers: …, EnableGuestAccess: …, GuestUserRole: R, StrictMode: … )yes: clause as a property list: level production -> ( SecurityLevel: production )mdl 2
MDL-DEPR134create constant M.C ( … ) folder '…' / create snippet M.S (…) folder '…' { … }create constant M.C folder '…' ( … ) / create snippet M.S folder '…' (…) { … }yes: clause moved: folder '…' goes right after the namemdl 2
MDL-DEPR135alter entity|association|enumeration … set comment '…'alter entity|association|enumeration … set documentation '…'yes: comment → documentationmdl 2
MDL-DEPR136create constant M.C type T default v [exposed to client]create constant M.C ( Type: T, DefaultValue: v, ExposedToClient: true )yes: constant properties: type T default v exposed to client becomes ( Type: T, DefaultValue: v, ExposedToClient: true )mdl 2
MDL-DEPR137create demo user 'u' password 'p' [entity M.E] (Role, …)create demo user 'u' ( Password: 'p', Entity: M.E, UserRoles: (Role, …) )yes: demo user properties: password 'p' entity M.E (R1, R2) becomes ( Password: 'p', Entity: M.E, UserRoles: (R1, R2) )mdl 2
MDL-DEPR138create constant M.C … privatecreate constant M.C …yes: constant’s private modifier away: it is deletedmdl 1
MDL-DEPR139create published odata service M.S ( … ) authentication basic, session, microflow M.Fcreate published odata service M.S ( …, Authentication: (basic, session, microflow M.F) )yes: published OData authentication: the trailing authentication m1, m2 clause becomes the last property, Authentication: (m1, m2)mdl 2
MDL-DEPR140alter workflow M.W set display 'x' / set description … / set export level … / set due date … / set overview page … / set parameter $P: M.Ealter workflow M.W { set ( Display: 'x', Description: …, ExportLevel: …, DueDate: …, OverviewPage: …, Parameter: $P: M.E ); }yes: property as set ( Key: value ), inside the statement’s { }mdl 2
MDL-DEPR141alter workflow M.W set activity X page M.P / description … / targeting … / due date …alter workflow M.W { set ( Page: M.P, Description: …, Targeting: …, DueDate: … ) on X; }yes: set activity X <prop> v as set ( Key: v ) on X, inside the statement’s { }mdl 2
MDL-DEPR142alter workflow M.W insert after X <activity>;alter workflow M.W { insert after X { <activity>; } }yes: inserted activity in { }, inside the statement’s { }mdl 2
MDL-DEPR143alter workflow M.W drop activity Xalter workflow M.W { drop X; }yes: drop activity X as drop X, inside the statement’s { }mdl 2
MDL-DEPR144alter workflow M.W replace activity X with <activity>;alter workflow M.W { replace X with { <activity>; } }yes: replace activity X with a; as replace X with { a; }, inside the statement’s { }mdl 2
MDL-DEPR145alter workflow M.W insert outcome 'N' on X { … }alter workflow M.W { insert into X { outcomes 'N' { … } } }yes: insert outcome 'N' on X { … } as insert into X { outcomes 'N' { … } }mdl 2
MDL-DEPR146alter workflow M.W insert path on X { … }alter workflow M.W { insert into X { path { … } } }yes: insert path on X { … } as insert into X { path { … } }mdl 2
MDL-DEPR147alter workflow M.W insert condition 'V' on X { … }alter workflow M.W { insert into X { outcomes 'V' -> { … } } }yes: insert condition 'V' on X { … } as insert into X { outcomes 'V' -> { … } }mdl 2
MDL-DEPR148alter workflow M.W insert boundary event on X <event>alter workflow M.W { insert into X { boundary event <event> } }yes: insert boundary event on X e as insert into X { boundary event e }mdl 2
MDL-DEPR149alter workflow M.W drop outcome 'N' on X / drop condition 'V' on X / drop path 'Path n' on X / drop boundary event on Xalter workflow M.W { drop X outcome 'N'; drop X outcome true; drop X path n; drop X boundary event; }yes: member after the activity it belongs to: drop X outcome 'N', drop X path n, drop X boundary eventmdl 2
MDL-DEPR160dateDateTimeyes: type date as the type it was stored as: DateTimemdl 1
MDL-DEPR161create regular expression M.R ( …, ExportLevel: Public )create regular expression M.R ( …, ExportLevel: API )yes: regular expression’s export level value Public as APImdl 2
MDL-DEPR540on error [without rollback] { … }on error [without rollback] begin … end erroryes: { becomes begin and the closing } becomes end errormdl 2
MDL-DEPR550rest client / rest clientsconsumed rest service / consumed rest servicesyes: document type name: rest client becomes consumed rest service, rest clients consumed rest servicesmdl 2
MDL-DEPR551odata client / odata clientsconsumed odata service / consumed odata servicesyes: document type name: odata client becomes consumed odata service, odata clients consumed odata servicesmdl 2
MDL-DEPR552odata service / odata servicespublished odata service / published odata servicesyes: document type name: odata service becomes published odata servicemdl 2
MDL-DEPR553queue / queuestask queue / task queuesyes: document type name: queue becomes task queue, queues task queuesmdl 2
MDL-DEPR554alter project security …alter app security …yes: security name: project security becomes app securitymdl 2
MDL-DEPR555alter settings model …alter settings runtime …yes: section name: model becomes runtimemdl 2
MDL-DEPR710create user role R (M.A, …) [manage all roles]create user role R ( ModuleRoles: (M.A, …), ManageAllRoles: true, … )yes: user role properties: the role list becomes ModuleRoles: (…) in a ( Key: value ) list, and manage all roles becomes ManageAllRoles: truemdl 2
MDL-DEPR711Headers: ('Authorization': 'Bearer ' + $Token) / ('X-Key': $Key)Headers: ('Authorization': 'Bearer {Token}') / ('X-Key': '{Key}')yes: header value as a template: 'text' + $P becomes 'text{P}'mdl 2
MDL-DEPR720call rest service <method> <url> [header N = v …] [auth basic $u password $p] [body …] [timeout n] returns …call rest service <method> <url> (Headers: ('N': v), Authentication: basic (Username: $u, Password: $p), Body: …, Timeout: n) returns …yes: activity settings as one property list (ADR-0013): header N = v becomes Headers: ('N': v), auth basic $u password $p becomes Authentication: basic (Username: $u, Password: $p), body '…' becomes Body: template '…', body binary|mapping … becomes Body: binary|mapping …, timeout n becomes Timeout: nmdl 2