Data Types
| Type | Example | Notes |
|---|
| Text | "Hello" | Double-quoted strings |
| Number | 42, 3.14 | Decimal numbers |
| Boolean | true, false | Logical values |
| Date | Date(2026, 3, 29) | Year, month, day |
| DateTime | DateTimeValue("2026-03-29T10:00:00") | ISO 8601 format |
| Record | {Name: "Dmitri", Age: 30} | Key-value pairs |
| Table | [{Name: "A"}, {Name: "B"}] | Array of records |
| GUID | GUID("...") | Unique identifier |
| Blank | Blank() | Null/empty value |
Operators
| Operator | Example | Description |
|---|
= | A = B | Equality (not assignment) |
<> | A <> B | Not equal |
<, >, <=, >= | Age > 18 | Comparison |
& | "Hello" & " " & "World" | Text concatenation |
+, -, *, / | Price * Qty | Arithmetic |
And, Or, Not | And(A, B) or A && B | Logical |
in | "abc" in Text1 | Contains (text) |
exactin | "ABC" exactin Text1 | Case-sensitive contains |
@ | [@Column] | Disambiguation |
Text Functions
| Function | Example | Result |
|---|
Len(text) | Len("Hello") | 5 |
Left(text, n) | Left("Hello", 3) | "Hel" |
Right(text, n) | Right("Hello", 2) | "lo" |
Mid(text, start, n) | Mid("Hello", 2, 3) | "ell" |
Upper(text) | Upper("hello") | "HELLO" |
Lower(text) | Lower("HELLO") | "hello" |
Trim(text) | Trim(" hi ") | "hi" |
Substitute(text, old, new) | Substitute("abc", "b", "x") | "axc" |
Concatenate(a, b, ...) | Concatenate("a", "b") | "ab" |
Text(value, format) | Text(Now(), "dd/mm/yyyy") | "29/03/2026" |
Value(text) | Value("42") | 42 |
Find(find, within) | Find("lo", "Hello") | 4 |
StartsWith(text, start) | StartsWith("Hello", "He") | true |
EndsWith(text, end) | EndsWith("Hello", "lo") | true |
IsBlank(value) | IsBlank("") | true |
Coalesce(a, b, ...) | Coalesce(Blank(), "fallback") | "fallback" |
Number Functions
| Function | Example | Result |
|---|
Round(number, digits) | Round(3.456, 2) | 3.46 |
RoundUp(number, digits) | RoundUp(3.451, 2) | 3.46 |
RoundDown(number, digits) | RoundDown(3.459, 2) | 3.45 |
Abs(number) | Abs(-5) | 5 |
Mod(number, divisor) | Mod(10, 3) | 1 |
Power(base, exp) | Power(2, 10) | 1024 |
Sqrt(number) | Sqrt(16) | 4 |
Int(number) | Int(3.9) | 3 |
Rand() | Rand() | 0.0–1.0 |
RandBetween(low, high) | RandBetween(1, 100) | Random integer |
Date & Time Functions
| Function | Example | Description |
|---|
Now() | Now() | Current date and time |
Today() | Today() | Current date (no time) |
Date(y, m, d) | Date(2026, 3, 29) | Construct a date |
DateAdd(date, n, units) | DateAdd(Today(), 7, TimeUnit.Days) | Add to date |
DateDiff(start, end, units) | DateDiff(start, end, TimeUnit.Days) | Difference |
Year(date) | Year(Today()) | Extract year |
Month(date) | Month(Today()) | Extract month (1-12) |
Day(date) | Day(Today()) | Extract day (1-31) |
Hour(datetime) | Hour(Now()) | Extract hour (0-23) |
Weekday(date) | Weekday(Today()) | Day of week (1=Sun) |
Text(date, format) | Text(Today(), "[$-en-GB]dd mmmm yyyy") | Format date |
DateTimeValue(text) | DateTimeValue("2026-03-29T10:00:00") | Parse ISO text |
IsToday(date) | IsToday(record.DueDate) | Check if today |
Table & Record Functions
| Function | Description | Delegable? |
|---|
Filter(table, condition) | Filter rows matching condition | Yes (simple conditions) |
Search(table, text, col) | Full-text search on a column | Yes (Dataverse) |
Sort(table, col, order) | Sort by column | Yes (Dataverse) |
SortByColumns(table, col, order) | Sort by column name string | Yes |
LookUp(table, condition) | Return first matching record | Yes |
First(table) | First record | N/A |
Last(table) | Last record | N/A |
FirstN(table, n) | First N records | N/A |
CountRows(table) | Number of rows | Yes (Dataverse) |
CountIf(table, condition) | Count matching rows | No |
Sum(table, column) | Sum of column values | No |
Average(table, column) | Average of column values | No |
Max(table, column) | Maximum value | No |
Min(table, column) | Minimum value | No |
AddColumns(table, name, expr) | Add computed column | N/A |
DropColumns(table, col) | Remove columns | N/A |
RenameColumns(table, old, new) | Rename columns | N/A |
Distinct(table, column) | Unique values | No |
GroupBy(table, col, name) | Group records | No |
Ungroup(table, col) | Flatten grouped table | No |
Collect(collection, record) | Add to collection | N/A |
ClearCollect(collection, table) | Replace collection | N/A |
Patch(datasource, record, changes) | Create or update record | N/A |
Remove(datasource, record) | Delete record | N/A |
Delegation Quick Reference
Functions that are delegable to Dataverse:
Filter, Search, Sort, SortByColumns, LookUp, CountRows,
=, <>, <, >, <=, >=, And, Or, Not, In, StartsWith
Functions that are NOT delegable (run locally, 500/2000 row limit):
CountIf, Sum, Average, Min, Max, Distinct, GroupBy,
AddColumns, DropColumns, Left, Right, Mid, Len, Lower,
Upper, Trim, Substitute, Find, IsBlank
Common Patterns
Conditional default value
If(IsBlank(TextInput1.Text), "Default value", TextInput1.Text)
Filter gallery by dropdown + search
Filter(
Products,
(Dropdown1.Selected.Value = "All" || Category = Dropdown1.Selected.Value)
&& (IsBlank(SearchBox.Text) || StartsWith(Title, SearchBox.Text))
)
Text(Price, "[$-en-GB]£#,##0.00")
Navigate with context
Navigate(DetailScreen, ScreenTransition.None, {SelectedItem: ThisItem})
Error handling with IfError
IfError(
Patch(DataSource, Defaults(DataSource), {Title: "New"}),
Notify("Save failed: " & FirstError.Message, NotificationType.Error),
Notify("Saved successfully", NotificationType.Success)
)
Collect and process beyond delegation limit
ClearCollect(
AllRecords,
Filter(LargeDataSource, Status = "Active")
);
// Now operate on AllRecords locally (up to 2000 rows)
CountRows(Filter(AllRecords, Priority = "High"))
User’s display name and email
User().FullName
User().Email
Parse JSON (Power Fx)
Set(parsed, ParseJSON(jsonText));
Text(parsed.name)