The SPGuides IT desk lead asked me how many service requests were still open, and nobody could answer. The status lived in a text column where people typed Open, open, OPEN and Opened, so every count disagreed.
In this tutorial, we’ll create a Dataverse choice column on a Service Request table, then build a canvas app that shows the choice text, fills a dropdown with Choices(), filters by a choice, and saves single and multi-select choices with Patch() and an edit form.
We’ll also hit the Status name clash that breaks most choice formulas, plus errors, delegation, Power BI and formula columns. Here’s what we’re building, filtered to In Progress:

The gallery lists each request with its status, the dropdown filters by any status option, and the Close button and Affected Systems combo box write choices back to Dataverse.
Choice vs Choices, and Local vs Global Choices
If Dataverse is new to you, start with what Microsoft Dataverse is. A choice column (formerly called an option set or picklist) holds one value from a fixed list. Dataverse stores a number behind each label, so every filter and report agrees on what Open means.
A choices column is the same thing with Selecting multiple choices is allowed turned on, so a row can hold several values.
| Type | What it stores | Use it for |
|---|---|---|
| Choice (single) | One option, stored as a number with a text label | Status, Priority, Region |
| Choices (multi-select) | Several options from the same list | Affected systems, skills, tags |
| Local choice | Options that belong to one column on one table | Lists only one table needs |
| Global (synced) choice | One shared option list that many columns reuse | Departments used across tables |
| Yes/No | Two options backed by true/false | Approved, Active |
Decide on multi-select when you create the column; I add a second column rather than converting a live one. If users need to add their own values, or each value needs extra fields, use a lookup to another table instead.
Before You Start
You need a Power Apps environment with Dataverse and the Environment Maker or System Customizer role. I’m using a developer environment named Power Platform. The demo table is Service Request (Power Apps Studio calls it Service Requests, the plural name):
| Column | Type | Notes |
|---|---|---|
| Subject | Single line of text | Primary column |
| Status (cr85a_status) | Choice (local) | Open, In Progress, Closed |
| Priority | Choice (local) | Low, Medium, High |
| Affected Systems | Choices (multi-select, local) | Email, VPN, Laptop, Printer |
Sample rows, logged in October 2026: Network Issue (In Progress), Hardware Repair (In Progress), Login Issue (Closed), Password Reset (Open) and Software Update (Open).
One warning before you name anything: every Dataverse table already has a system column called Status (Active or Inactive). I named my custom choice Status on purpose to show the clash it causes. For your own tables, pick a different name, such as Request Status.
Step 1: Create the Choice Columns
Our goal is local choice columns on the table. If you don’t have a table yet, create a table in Microsoft Dataverse first. Here’s the multi-select Affected Systems column; Status and Priority use the same steps without the multi-select box:
- Go to make.powerapps.com, pick your environment, and select Tables.
- Open Service Request and select + New column.
- Enter Affected Systems as the Display name.
- Set Data type to Choice > Choice.

- Check Selecting multiple choices is allowed (leave it off for Status and Priority).
- Set Sync with global choice? to No for a local choice.
- Type the labels Email, VPN, Laptop and Printer. Leave each generated Value as it is, then select Save.

The values (770,700,000 to 770,700,003 here) are what Dataverse actually stores. Microsoft recommends keeping the generated numbers, since they carry your publisher’s prefix and won’t clash with imported solutions. For a shared list, choose Yes and pick the global choice in Sync this choice with.
Checkpoint: Checkpoint: the table’s columns list shows Status and Priority with the type Choice, and Affected Systems as Choices.
Step 2: Create the Canvas App and Connect the Table
Now we’ll build the app around the table. You’ll find more beginner builds on the Power Apps tutorials hub.
- On make.powerapps.com, select Create > Start with a blank canvas, then pick Tablet.
- Name the app Service Request Choices Demo.
- In the left Data pane, select Add data, search for Service Request, and select Service Requests (Microsoft Dataverse).
- Press Ctrl+S to save.

Dataverse tables don’t need a separate connector or site URL. The app connects to the table in the current environment.
Step 3: Find the Right Status Column Name
This is the number one reason Dataverse choice formulas fail. Insert a Vertical gallery named galRequests, select its Items property in the dropdown left of the formula bar (fx), and start typing Filter('Service Requests', Stat. IntelliSense offers two columns:

| What you write | What it points to |
|---|---|
'Status (cr85a_status)' | Our custom choice column (Open, In Progress, Closed) |
'Status (statecode)' | The system Status column (Active, Inactive) |
'Status (Service Requests)' | The option list (enum) of our custom choice |
'Status (Service Requests)_1' | The enum of the system Status column |
Because the display names clash, plain Status isn’t our column. This formula gives a warning that the columns are “all nested tables and/or records” and leaves the dropdown empty:
Choices('Service Requests'.Status)
If your choice column has a unique name, such as Request Status, none of this applies and you can write 'Request Status' directly. If it’s called Status, always use the disambiguated name with the logical name in parentheses.
Step 4: Fill a Dropdown With Choices()
Insert a Drop down above the gallery, name it drpStatus, and set its Items property:
Choices('Service Requests'.'Status (cr85a_status)')
Choices() reads the column’s option list and returns one Value per option. The reference must point straight at the data source column, not at a variable or another control. More patterns are in these Power Apps Choices function examples.

Passing the enum works too, and it’s what Studio writes in edit form cards:
Choices('Status (Service Requests)')
Press F5 or the Play button to preview, or hold Alt and click the dropdown in the editor:

Checkpoint: Checkpoint: drpStatus lists Open, In Progress and Closed.
Step 5: Show and Filter by the Choice
Add a label inside the gallery named lblStatus and set its Text property. It shows the label, such as In Progress, without .Value or Text(). I compare more ways to read it in getting a choice field value in Power Apps.
ThisItem.'Status (cr85a_status)'
Now set the gallery’s Items property so it only shows rows that match the dropdown:
Filter(
'Service Requests',
'Status (cr85a_status)' = drpStatus.Selected.Value
)

drpStatus.Selected.Value is already a choice option, so Dataverse runs the filter on the server with no delegation warning. A label named lblCount shows how many rows match:
CountRows(galRequests.AllItems) & " requests"
Open returns Password Reset and Software Update; In Progress returns Network Issue and Hardware Repair. The same Items formula works on a Data table control if you prefer rows and columns. To filter on a fixed option, use the enum, for example 'Status (Service Requests)'.Open.
For several statuses at once, Microsoft Learn shows a combo box with the in operator, where an empty selection shows every row. I haven’t tested this one in the demo:
Filter(
'Service Requests',
'Status (cr85a_status)' in cmbStatusFilter.SelectedItems
|| IsEmpty(cmbStatusFilter.SelectedItems)
)
Checkpoint: Checkpoint: with In Progress selected, the gallery shows Network Issue and Hardware Repair, and lblCount reads 2 requests.
Step 6: Patch Single and Multi-Select Choices
Add a button named btnClose inside the gallery with the text Close. Its OnSelect sets the row’s status to Closed. If Patch() is new to you, read the ways to use the Patch function first.
Patch(
'Service Requests',
ThisItem,
{'Status (cr85a_status)': 'Status (Service Requests)'.Closed}
)

Clicking Close on Hardware Repair moved it out of the In Progress list, and the count dropped from 2 to 1. Learn notes that leaving out the choice-set prefix gives an OptionSetValue error, so always pass the full enum.
A multi-select column takes a table of options. Add a classic Combo box named cmbSystems, set SelectMultiple to true, and set its Items:
Choices('Service Requests'.'Affected Systems')
Then set IsSearchable to false. With the default true, App checker shows three SearchItems errors for this combo box, because a choices table has no text column to search.
A Save Systems button saves the picks to the selected row:
Patch(
'Service Requests',
galRequests.Selected,
{'Affected Systems': cmbSystems.SelectedItems}
)

A label can’t show a multi-select column directly because it’s a table. Join the labels into one line in lblSystems:
Concat(ThisItem.'Affected Systems', Value, ", ")

Checkpoint: Checkpoint: after picking Email and VPN for Network Issue and saving, its row shows Email, VPN.
Step 7: Use the Choice Field in an Edit Form
Forms do most of this for you. On a new screen, insert an Edit form named frmRequest, set DataSource to 'Service Requests' and Item to galRequests.Selected, then add the Subject and Status fields.
Studio picks the right column for you: the Status card gets a combo box with Choices('Status (Service Requests)') as its Items. Add a button with this OnSelect to save:
SubmitForm(frmRequest)

Checkpoint: Checkpoint: selecting a row in the gallery loads its status in the form’s Status box.
Test the App
Press F5 and run these checks in order:
- Pick Open in drpStatus. The gallery shows Password Reset and Software Update.
- Pick In Progress. Network Issue and Hardware Repair appear, and the count reads 2 requests.
- Click Close on Hardware Repair. It leaves the list and the count drops to 1.
- Select Network Issue, pick Email and VPN in cmbSystems, and select Save Systems. The row shows Email, VPN.

Make It Production-Ready
- Delegation: = and <> on a choice column are delegated to Dataverse, and so is
in. IsBlank(), Search() andText()on the column aren’t. Read how to fix Power Apps delegation warnings before your table passes 500 rows. - Multi-select filters: per Learn, any filter on a choices column gets a delegation warning. A Dataverse view with the filter built in avoids it.
- Unique names: never name a custom choice Status, Owner or another system column name.
- Global choices for shared lists: if several tables need the same Department list, sync them to one global choice.
- Solutions: create choice columns inside a solution so they move from dev to test to production with the app.
Troubleshooting
Comparing a choice with text doesn’t show an error in the formula bar, which is what makes it sneaky. This formula looks fine:
Filter('Service Requests', 'Status (cr85a_status)' = "Open")
At run time the gallery stays empty and the app shows: “Error when trying to retrieve data from the network … A binary operator with incompatible types was detected. Found operand types ‘Edm.Int32’ and ‘Edm.String’ for operator kind ‘Equal’.” Dataverse compares the stored number with your text.

Wrapping the column in Text() returns the right two rows, but Studio flags it, since Text() can’t be delegated. Use the enum or a control’s Selected.Value instead:
Filter('Service Requests', Text('Status (cr85a_status)') = "Open")

- Empty dropdown with a nested records warning: the column name clashes with the system Status column. Use
'Status (cr85a_status)'. - Three SearchItems errors on a combo box: set IsSearchable to false for a choices combo box.
- New options don’t show up: refresh the table in the Data pane, then reopen the app.
- Label error for a multi-select column: it’s a table. Use Concat() as shown in Step 6.
Choice Columns in Power BI and Formula Columns
In Power BI Desktop, the Dataverse connector splits a choice column into two columns: cr85a_status holds the number and cr85a_statusname holds the label. Show the name column in visuals, but filter on the number column, because label lookups are slower. More setup steps are in this Dataverse Power BI tutorial.
Multi-select choices only come through as comma-separated numbers. A Dataverse formula column can return a choice, too, as long as it uses a global choice or a simple choice column’s local choice on the same table.
Where to Take It Next
- Send an email when a request changes to Closed by reading the choice column value in Power Automate.
- Let users pick statuses from the modern combo box selected values pattern.
- Start the filter dropdown empty with a blank default value for the dropdown.
Building more Dataverse apps? These guides cover the next pieces:
Frequently Asked Questions
How do I get the value of a Dataverse choice field in Power Apps?
Set a label’s Text to ThisItem.’Status (cr85a_status)’ (or your column’s name) to show the label. To test it, compare it with the enum, for example ‘Status (Service Requests)’.Open, never with the text “Open”.
Why does Choices() show an empty dropdown for my Dataverse Status column?
Every table has a system Status column, so a custom column named Status clashes with it. Use the disambiguated name, such as Choices(‘Service Requests’.’Status (cr85a_status)’), or give your choice column a unique name.
How do I patch a choice column in Dataverse from Power Apps?
Pass an option, not text: Patch(‘Service Requests’, ThisItem, {‘Status (cr85a_status)’: ‘Status (Service Requests)’.Closed}). For a multi-select column, pass a combo box’s SelectedItems. Choice and choices columns are explained in Create a choice column.
How do Dataverse choice columns appear in Power BI?
The Dataverse connector returns two columns per choice: the number and a name column with the label. Multi-select choices return only comma-separated numbers. See the Power BI Dataverse connector notes.
Can a Dataverse formula column return a choice?
Yes. When the formula returns an option from a global choice or from a simple choice column’s local choice on the same table, the column type becomes Choice. A related table’s local choice can’t be the result.

Hey! I’m Bijay Kumar, founder of SPGuides.com and a Microsoft Business Applications MVP (Power Automate, Power Apps). I launched this site in 2020 because I truly enjoy working with SharePoint, Power Platform, and SharePoint Framework (SPFx), and wanted to share that passion through step-by-step tutorials, guides, and training videos. My mission is to help you learn these technologies so you can utilize SharePoint, enhance productivity, and potentially build business solutions along the way.