Create business solutions
Create business solutions is the most hands-on domain: canvas apps, model-driven apps, and cloud flows, plus the Power Fx and Dataverse behaviours that decide whether they work at scale.
Canvas apps and Power Fx
Typical pattern: a gallery with Items = Filter(...), a form with Item = Gallery1.Selected, and buttons calling SubmitForm or ResetForm. Use NewForm and EditForm to switch form modes, and Defaults(Table) when creating a record with Patch. Patch updates or creates a single record; Collect only appends to a collection and duplicates rows if pointed at a data source. For bulk work use ForAll, keeping each call small and delegable. OnStart runs once per app launch; named formulas in App.Formulas recalculate automatically and suit derived values. IfError wraps calls that can fail, and Concurrent parallelises independent calls.
Model-driven apps
The site map defines navigation. Forms, views, and charts are configured per table in the app designer. Business rules set, lock, clear, or validate fields with a scope of Entity or All Forms; they run in the client and on the server and can display error messages. Business process flows guide stages with required columns.
Cloud flows
Choose the trigger deliberately: automated (Dataverse "When a row is added, modified or deleted", using select columns and filter rows to avoid needless runs), instant (called from a canvas app, returning values with Respond to a Power Apps action), or scheduled. Wrap actions in a Scope and use Configure run after for try/catch handling. Trigger conditions stop the flow before it runs at all.
Worked example
A dispatcher marks an order shipped. The canvas app calls Patch(Orders, Gallery1.Selected, {Status: "Shipped", ShippedOn: Now()}). Reasoning: Patch targets the Orders data source and the selected record, updates only the supplied columns, and returns the modified record. Collect would insert a duplicate, and SubmitForm needs the record loaded into an EditForm first.
Traps
- Using Collect to update an existing row.
- Omitting Defaults() when creating a record with Patch.
- Adding client-side validation where a server-side business rule is required.
- Ignoring delegation warnings inside ForAll loops.