Live training: next batches coming soon. Join the waitlist:Waitlists open:Developer Training →Developer →Copilot Studio Training →Copilot Studio →

Dataverse Choice Column in Power Apps: Create, Show, Filter and Patch Choices

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:

Service Request Choices Demo app filtered to In Progress requests with a count of 2

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.

TypeWhat it storesUse it for
Choice (single)One option, stored as a number with a text labelStatus, Priority, Region
Choices (multi-select)Several options from the same listAffected systems, skills, tags
Local choiceOptions that belong to one column on one tableLists only one table needs
Global (synced) choiceOne shared option list that many columns reuseDepartments used across tables
Yes/NoTwo options backed by true/falseApproved, 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):

ColumnTypeNotes
SubjectSingle line of textPrimary column
Status (cr85a_status)Choice (local)Open, In Progress, Closed
PriorityChoice (local)Low, Medium, High
Affected SystemsChoices (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:

  1. Go to make.powerapps.com, pick your environment, and select Tables.
  2. Open Service Request and select + New column.
  3. Enter Affected Systems as the Display name.
  4. Set Data type to Choice > Choice.
New column panel with Data type set to Choice for the Affected Systems column
  1. Check Selecting multiple choices is allowed (leave it off for Status and Priority).
  2. Set Sync with global choice? to No for a local choice.
  3. Type the labels Email, VPN, Laptop and Printer. Leave each generated Value as it is, then select Save.
Choice options Email VPN Laptop and Printer with multi-select allowed and local choice

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.

  1. On make.powerapps.com, select Create > Start with a blank canvas, then pick Tablet.
  2. Name the app Service Request Choices Demo.
  3. In the left Data pane, select Add data, search for Service Request, and select Service Requests (Microsoft Dataverse).
  4. Press Ctrl+S to save.
Power Apps Studio Add data search showing the Service Requests Dataverse table

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:

IntelliSense listing Status cr85a_status and Status statecode columns for the Service Requests table
What you writeWhat 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.

Dropdown Items property using Choices with the Status cr85a_status column

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:

Filter by Status dropdown open in Preview showing Open In Progress and Closed

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
)
Gallery Items Filter formula comparing the Status choice with the dropdown selection

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}
)
Close button OnSelect Patch formula setting the Status choice to 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}
)
Save Systems button Patch formula saving the combo box SelectedItems to Affected Systems

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, ", ")
Label Concat formula showing Email and VPN for the Affected Systems column

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)
Edit form Status card combo box with Items set to Choices of the Status enum

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:

  1. Pick Open in drpStatus. The gallery shows Password Reset and Software Update.
  2. Pick In Progress. Network Issue and Hardware Repair appear, and the count reads 2 requests.
  3. Click Close on Hardware Repair. It leaves the list and the count drops to 1.
  4. Select Network Issue, pick Email and VPN in cmbSystems, and select Save Systems. The row shows Email, VPN.
Preview with Network Issue showing Email and VPN saved in the multi-select choices column

Make It Production-Ready

  • Delegation: = and <> on a choice column are delegated to Dataverse, and so is in. IsBlank(), Search() and Text() 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.

Run-time incompatible types error when a Dataverse choice is compared with 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")
Delegation warning on the Text part of a choice column filter in Power Apps
  • 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

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.