記事公開日
Power Apps キャンバスアプリにおける選択肢の型不一致を攻略!

はじめに
こんにちは!DXソリューション営業本部の中垣です。
皆さん、キャンバスアプリで選択肢型を扱った際、「型に互換性がありません」というエラーが表示されて、作業が止まってしまった経験はありませんか?
選択肢型は、入力ミスや表記ゆれを防ぎ、データの品質を向上させることのできる便利なデータ型ですが、テキスト型と同じ感覚で扱おうとすると、思わぬエラーに悩まされることがあります。
本記事では、ナレッジの作成や管理を行うアプリを例にして、Dataverseにおける選択肢型の構造と扱い方についてご紹介します!
Dataverseの選択肢型について
まず、Dataverseの選択肢型には、グローバル選択肢とローカル選択肢の2種類があります。
1.グローバル選択肢
グローバル選択肢とは、複数のテーブルや列で共有して利用できる選択肢のリストです。
例えば、業務全体で共通の「ステータス」の選択肢(新規、対応中、完了など)を定義しておけば、複数のアプリやテーブルでその選択肢のリストを流用することができます。
2.ローカル選択肢
一方で、ローカル選択肢とは、特定のテーブルの特定の列でのみ利用できる、独立した選択肢のリストです。
その列でしか使わない独自の選択肢を定義したい場合に適しています。
どちらも選択肢としての構造は同じになっており、ユーザーに表示されるラベルと、システムが識別するための値のセットで構成されています。
選択肢型は、このラベルと値がセットになった「レコード型」として扱われるため、テキスト型とは異なるアプローチが必要となります。
同じ選択肢型でも、使い方が違う?
今お話したように、グローバル選択肢もローカル選択肢も構造は同じですが、選択肢の種類によって実装方法が異なる場合があります。
例えば、選択肢型の値をドロップダウンコントロールに表示する際です。
前提として、どちらの種類の選択肢であっても選択肢の情報を表示する際は「Choices」関数を使用します。
「Choices」関数とは、データソースの選択肢型列の情報を一覧で取り出すための関数です。
グローバル選択肢の場合
ドロップダウンコントロールの「Item」プロパティで以下の数式を入力し、選択肢を設定します。
補足:「グローバルな選択肢のリスト」を設定Choices(gblCategoryOptionSet)

ローカル選択肢の場合
ドロップダウンコントロールの「Item」プロパティで以下の関数を入力し、選択肢を設定します。
補足:「'列名(テーブル名)'」を設定Choices('locCategory (KnowledgeTable)')

「型が違う!」と言われたときの対処法
では、ここから本記事のメインとなる「型に互換性がありません」というエラーを解消する方法をご紹介します。
①選択肢型とテキスト型を比較
今回は、ナレッジ管理アプリを開発する中で、登録されているナレッジの中のKnowledgeStatusが「投稿済み」のデータのみをGalleryに表示するというシナリオでご説明します。
■エラー例
以下のように、選択肢型である「KnowledgeStatus」列とテキストである「投稿済み」を比較しようとすると、型が一致せず比較が出来ないため「型に互換性がありません」とエラーが表示されます。
Filter(KnowledgeTable,KnowledgeStatus = "投稿済み")

■解消方法
以下のように、テキストで指定していた部分を「[@gblKnowledgeStatusOptionSet].投稿済み」と記載することで、選択肢のリストの中から「投稿済み」というラベルに対応するレコード型の値を参照することになるため、選択肢型と型が一致して比較が出来るようになります。
補足:「[@グローバルな選択肢のリスト].ラベル名」を設定Filter(KnowledgeTable,KnowledgeStatus = [@gblKnowledgeStatusOptionSet].投稿済み)
「[@グローバルな選択肢のリスト].ラベル名」の部分は「'グローバルな選択肢のリスト'.ラベル名」でも可
ローカル選択肢の場合は、「'列名(テーブル名)'.'ラベル名'」で設定

②選択肢型の値を更新
今回は、ナレッジ管理アプリを開発する中で、ボタン押下時に既に登録されているナレッジのKnowledgeStatusを「下書き」に更新するというシナリオでご説明します。
■エラー例
以下のように、選択肢型である「KnowledgeStatus」列に対してテキストの「下書き」で更新をしようとすると、型が違い更新が出来ないため「型に互換性がありません」とエラーが表示されます。
Patch(KnowledgeTable,LookUp(KnowledgeTable,KnowledgeTable = Gallery1.Selected.KnowledgeTable),{KnowledgeStatus:"下書き"})

■解消方法
以下のように、「 [@gblKnowledgeStatusOptionSet ].下書き」と記載することで、選択肢のリストの中から「下書き」というラベルに対応するレコード型の値を参照することになるため、選択肢型と型が一致してデータの更新が出来るようになります。
補足:「[@グローバルな選択肢のリスト].ラベル名」を設定Patch(KnowledgeTable,LookUp(KnowledgeTable,KnowledgeTable = Gallery1.Selected.KnowledgeTable),{KnowledgeStatus:[@gblKnowledgeStatusOptionSet].下書き})
「[@グローバルな選択肢のリスト].ラベル名」の部分は「'グローバルな選択肢のリスト'.ラベル名」でも可
ローカル選択肢の場合は、「'列名(テーブル名)'.'値'」で設定

上記2つのように、選択肢型を扱う際はレコード型として数式を組んでいく必要があります。
最初は難しく感じるかもしれませんが、仕組みを理解してしまえば、選択肢型はアプリの品質を高めるための非常に頼れる存在になります!
まとめ
本記事では、選択肢型の種類、構造、そして型不一致エラーに対する解消方法について解説しました。
選択肢型の値を扱う際は、構造を理解し、正しい型で比較・更新することが重要です。
今後、キャンバスアプリで選択肢型を扱う場面に遭遇した際は、この記事を思い出して、スムーズな開発につなげていただければ幸いです。
QES では Power Platform の開発支援、QAサポート、開発者教育、ガバナンス整備など、組織で Power Platform を活用するためのサポートを包括的にご提供しています。Power Platform 活用についてご興味がある/利用中だが課題を感じていらっしゃるお客様はまずはお気軽にお問い合わせください。
このブログで参照されている、Microsoft、Windows、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。


