patterns-crud
Standard Create/Read/Update/Delete microflow patterns with the naming conventions that go with them. Use when writing the action microflows behind page buttons rather than looking up individual syntax
SKILL.md.claude/skills/mendix/patterns-crud/SKILL.md
GitHub<!-- skill-index: generated by scripts/skill-index.py; make check-skill-index -->
<!-- /skill-index -->
Find it fast
sed -n '<from>,<to>p' SKILL.md one section rather than reading the file;
./mxcli syntax <topic> answers how do I write this for a fraction of either.
| lines | section |
|---|---|
| 29-37 | Naming Conventions |
| 38-67 | Save Pattern (Create/Update) |
| 68-107 | Validation Pattern |
| 108-131 | Delete Pattern |
| 132-155 | Cancel Pattern |
| 156-179 | Create New Pattern |
| 180-202 | Data Source Pattern |
| 203-224 | Edit Pattern |
| 225-238 | Complete CRUD Set |
| 239-246 | Best Practices |
CRUD Action Patterns
Standard patterns for Create, Read, Update, Delete operations on entities.
Naming Conventions
| Prefix | Purpose | Example |
|---|---|---|
ACT_ |
Action microflow (page button) | ACT_Customer_Save |
VAL_ |
Validation microflow | VAL_Customer_Save |
DS_ |
Data source microflow | DS_Customer_GetAll |
SUB_ |
Sub-microflow (internal) | SUB_Customer_SendEmail |
Save Pattern (Create/Update)
Used for Save buttons on NewEdit pages.
mdl 1;
/**
* Save action for Customer NewEdit page
* Validates, commits, and closes the page
*
* @param $Customer The customer to save
* @returns true if saved successfully
*/
create microflow Module.ACT_Customer_Save (
$Customer: Module.Customer
)
returns boolean
begin
-- Validate first
$IsValid = call microflow Module.VAL_Customer_Save(Customer = $Customer);
if $IsValid then
commit $Customer;
close page;
end if;
return $IsValid;
end;
Validation Pattern
Companion validation microflow for Save actions.
mdl 1;
/**
* Validate Customer before save
*
* @param $Customer The customer to validate
* @returns true if valid
*/
create microflow Module.VAL_Customer_Save (
$Customer: Module.Customer
)
returns boolean
begin
declare $IsValid boolean = true;
-- Required field validation
if $Customer/Name = empty then
validation feedback $Customer/Name message 'Name is required';
set $IsValid = false;
end if;
if $Customer/Email = empty then
validation feedback $Customer/Email message 'Email is required';
set $IsValid = false;
end if;
-- Business rule validation
if $Customer/CreditLimit < 0 then
validation feedback $Customer/CreditLimit message 'Credit limit cannot be negative';
set $IsValid = false;
end if;
return $IsValid;
end;
Delete Pattern
Used for Delete buttons with confirmation.
mdl 1;
/**
* Delete a customer
* Called after user confirms deletion
*
* @param $Customer The customer to delete
* @returns true if deleted
*/
create microflow Module.ACT_Customer_Delete (
$Customer: Module.Customer
)
returns boolean
begin
delete $Customer;
close page;
return true;
end;
Cancel Pattern
Used for Cancel buttons (discard changes).
mdl 1;
/**
* Cancel editing and close page
* Discards uncommitted changes
*
* @param $Customer The customer being edited
* @returns true
*/
create microflow Module.ACT_Customer_Cancel (
$Customer: Module.Customer
)
returns boolean
begin
rollback $Customer;
close page;
return true;
end;
Create New Pattern
Used for New/Add buttons on overview pages.
mdl 1;
/**
* Create new customer and open edit page
*
* @returns true
*/
create microflow Module.ACT_Customer_New ()
returns boolean
begin
$NewCustomer = create Module.Customer (
IsActive = true,
CreatedDate = [%CurrentDateTime%]
);
show page Module.Customer_NewEdit (Customer = $NewCustomer);
return true;
end;
Data Source Pattern
Used for data grid/list view sources.
mdl 1;
/**
* Get all active customers
* Used as data source for Customer overview
*
* @returns List of active customers
*/
create microflow Module.DS_Customer_GetActive ()
returns list of Module.Customer
begin
-- retrieve creates the list variable directly — never declare a list first
retrieve $Customers from Module.Customer
where IsActive = true;
return $Customers;
end;
Edit Pattern
Open existing entity for editing.
mdl 1;
/**
* Open customer for editing
*
* @param $Customer The customer to edit
* @returns true
*/
create microflow Module.ACT_Customer_Edit (
$Customer: Module.Customer
)
returns boolean
begin
show page Module.Customer_NewEdit (Customer = $Customer);
return true;
end;
Complete CRUD Set
For a typical entity, create these microflows:
| Microflow | Purpose | Parameters |
|---|---|---|
ACT_Entity_New |
Create new | None |
ACT_Entity_Edit |
Open for edit | $entity |
ACT_Entity_Save |
Save changes | $entity |
VAL_Entity_Save |
Validate | $entity |
ACT_Entity_Delete |
Delete | $entity |
ACT_Entity_Cancel |
Cancel edit | $entity |
DS_Entity_GetAll |
List all | None |
Best Practices
- Always validate before commit: Call VAL_ microflow in ACT_Save
- Events are on by default: a bare
commit $entitytriggers the event handlers; writecommit $entity without eventsonly to skip them - Close page on success: Use
close pageafter successful save/delete - Rollback on cancel: Use
rollback $entityto discard changes - Initialize defaults: Set default values in ACT_New microflow
- Return Boolean: All action microflows should return success status