<FetchXmlBuilder> 誰もFetchXMLを書かずにFetchXMLクエリを編集します。実際に人々がアクセスする言語の部分―テーブル、返される列、行のソート方法、条件やネストされたグループのフィルターツリー――をカバーし、関連するテーブルを結合し、集約し、構築したものを実行します。
この環境のメタデータに対する実際のコンポーネントです。テーブルを選び、カラムや条件を追加し、関連するテーブルに加入し、FetchXMLパネルが追いつくのを見守り、実行ボタンを押してクエリが何と一致するか確認してください。
FetchXMLBuilder とは違います
このページは コンポーネントについてです。
FetchXMLBuilderは、サーバー側の呼び出し者が手作業でクエリを作成するために、同じXMLをコードで構成するC#クラスです。それらは同じものを生成し、どちらも互いに必要ありません。
すべてのテーブル、列、関係は、環境が実際に持っているものから選ばれます。これは意図的です。手書きで入力した論理名がFetchXMLを生成し、完璧に解析しますが、Dataverseでは失敗します。これは誰かに渡すには最悪のエラーです。 usePowerPortalsProFetchXmlMetadata フックはビルダーをフレームワークのキャッシュされたメタデータエンドポイントに配線し、ピッカーは同じページのグリッドがすでに取得したものを共有します。
// ポータルページの配線全体。
import { FetchXmlBuilder, usePowerPortalsProFetchXmlMetadata } from '@powerportalspro/react-fluent';
export function QueryEditor() {
const metadata = usePowerPortalsProFetchXmlMetadata();
const [fetchXml, setFetchXml] = useState('');
return <FetchXmlBuilder value={fetchXml} onChange={setFetchXml} metadata={metadata} />;
}
Blazorは配線を必要としません。 <FetchXmlBuilder> ポータルのメタデータサービス自体を解決し、同じキャッシュされたエンドポイントを読み込むため、ピッカーはページ上のグリッドがすでに取得したものも共有します。
@* テーブル、列、関係は環境から来ています *@
<FetchXmlBuilder @bind-FetchXml="_fetchXml" />
ビルダーはFetchXMLをドキュメントモデルに解析し、それを書き戻します。エディターが存在しないもの(新しいプラットフォームの属性や別のツールで書かれた要素など)は、ロード時に削除されることなく引き継がれるため、クエリを開いて保存しても静かに一部が失われることはありません。
保存されたクエリにとって何を意味するのか
フォーマットは保持されません。インデントや属性の引用は正規化されるため、ビルダーを通じて再保存されたクエリは同じテキストではなく同じクエリとなります。
読む方法は3つあり、すべて同じリーダーを通して行われます:
valueプロップ。制御されたコンポーネント用のonChangeを供給するか、defaultValueを使い、その状態を建築業者に任せるか。届いたものはまず確認されます。歪んだXMLは行と列で報告され、編集者が書かれたものとは異なるものを見せるようなものも同様に報告されます。例えば、エディタが知らない演算子やリンクタイプ、テーブル名のないクエリなどです。それらは完全に拒否され、画面上のクエリはそのまま残されます。それ以外はすべて報告され、適用されます:スペルミスされた要素や属性、エイリアスを共有する2つのテーブル、何も宣言されないエイリアスから読み取る条件などです。
ジョインはリレーションシップピッカーから追加されるため、 from 列と to カラムはメモリではなくリレーションシップから得られます。ジョインが何を貢献できるかは、その型によって異なります。
inner、 outer 、 matchfirstrowusingcrossapply )は関連するテーブルの列を戻し、それらの列を投影し、ソートし、比較できるようにします。exists、 in、 any、 not any 、 all )は、行を最大一度だけ返し、関連する列は一切返しません。エディタはエイリアスに切り替えるとエイリアスを外し、名前は別のジョインのために空いてあります。「すべて」について
FetchXMLの
allは名前の通りの意味ではなく、フィルターを満たしない関連する行を持つ行をマッチングし、not allは「anyと同等」として文書化されています。各型は名前ではなく、何をするかでラベル付けされ、フィルターグループに対するInvert Conditionアクションは、通常求められる読み取りを表現します。
フィルターとは 、条件 の集合と、またはを組み合わせた もので、グループはクエリが必要とする深さまで内嵌子にされます。ツリー内の4つのポイントを知っておく価値があります。なぜなら、それぞれがFetchXMLが尋ねにくい質問に答えるからです。
all 。これは「関連するすべての行が一致する」という意味ではなく、フィルターを満たし ない 関連行と一致することを意味します。したがって直感的な読み方はまず逆さまを意味します。この方法は、以下のすべての条件に真の逆がある場合のみ提供されます。ほとんどの日付演算子には逆がなく、フィルターの一部を逆にすると逆に見え、間違った行に合致します。valueofです。6つの演算子がこれを許可し、プラットフォームは残りを完全に拒否するため、そのモードの行中は演算子リストが狭まります。候補はすべての結合テーブルから出ます。なぜなら、条件は結合の別名を付けることで関連する列に到達するためです。まだ完成していない列
演算子が必要とする値が欠けている場合、必須で空欄のエイリアス、または他の列と共有されるエイリアスが示されます。これら3つすべてがFetchXMLを生成し、解析は完璧に行われましたが失敗するか、間違った行を静かに返すため、クエリ実行時に見つけられるようにせず、エディタがそれを示します。値を必要としない演算子、例えば
Contains dataやTodayは単独で完成しており、決してマークされません。
「Columns」セクションで 「Aggregate 」をオンにすると、各列が何を貢献するかを示します。行間で計算された値、またはグループ分けされているものです。提供される機能はカラムの種類に絞られ、エイリアスは必須となり自動的に埋められます。グループ化された日付列は日付部分を得て、ソートもエイリアスに切り替わります。なぜなら、集約クエリの行はグループ化され、計算された値で並べ替えることができないためです。
<fetch aggregate="true">
<entity name="account">
<attribute name="revenue" alias="sum_revenue" aggregate="sum" />
<attribute name="address1_city" alias="group_address1_city" groupby="true" />
<order alias="group_address1_city" />
</entity>
</fetch>
allowAggregate={false} これは、合計ではなく行を読むホストに対してスイッチを取り消します。つまり、1回に1つのレコードで評価されるルール、保存されたフィルター、計算された値の単一行が答えにならない場所などです。これは無効ではなく存在しているのではなく、クエリの変更が不要なため、戻ってきます。唯一の例外は 、すでに 集約されているクエリです。プロップの設定方法に関わらずコントロールを保持するため、FetchXMLパネルに貼り付けられたコントロールは通常のクエリに戻すことができます。
// Aggregateスイッチは全く提供されていません。
<FetchXmlBuilder
metadata={metadata}
table="contact"
allowAggregate={false}
value={fetchXml}
onChange={setFetchXml}
/>
AllowAggregate="false" Blazorでも同じ例外があります。すでに集約されたクエリはコントロールを保持するため、FetchXMLタブに貼り付けられたクエリは通常のクエリに戻すことができます。
@* アグリゲートスイッチの撤回 *@
<FetchXmlBuilder Table="contact"
AllowAggregate="false"
@bind-FetchXml="_fetchXml" />
すべてのセクションは電源を切ることができ、セクションは別のレイアウトで個別にエクスポートされます。 <FetchXmlBuilderProvider> をマウントして FetchXml*Section コンポーネントを自分で配置してください。セクションを省略するとUIが失われますが、基盤となるFetchXMLは消えません。クエリの列は手つかず columns: falseせずに残ります。
// フィルター専用のルールエディタで、1つのテーブルにピン留めされています。
<FetchXmlBuilder
metadata={metadata}
table="contact"
sections={{ table: false, columns: false, sorts: false, options: false }}
value={fetchXml}
onChange={setFetchXml}
/>
Blazorは同じセットを Sections レコードとして取り、セクション自体がコンポーネントとして機能します。 FetchXmlBuilderState をカスケードし、レイアウトが必要な場所に FetchXml*Section コンポーネントを配置します。非表示にするとエディターは消え、クエリは消えません。
@* フィルターエディターだけを表示する *@
<FetchXmlBuilder Table="contact"
Sections="_filterOnly"
@bind-FetchXml="_fetchXml" />
@code {
private readonly FetchXmlBuilderSections _filterOnly = new()
{
Table = false, Columns = false, Sorts = false, Options = false,
};
}
allowedTablesテーブルピッカーはリストリストの論理名に絞り込まれます。これは、ポータルが公開する数少ないテーブルを検索するレポートビルダーのような、環境全体をクエリする必要のないサーフェスに対してです。それを省くと、すべてのテーブルが提供されます。選択可能なものを絞り込み、表示できるものを絞り込むのではなく、リスト外のテーブル名をすでに付けているクエリは静かに書き換えるのではなく、関連するテーブルはジョインが言及する場所で表示名で名付けられます。ジョイン自体は制限されません。なぜなら、すでに選ばれたテーブルのプロパティである関係性に従うからです。
// 採掘者はこの三つだけを提示し、それ以外は何も提供しません。
<FetchXmlBuilder
metadata={metadata}
allowedTables={['account', 'contact', 'opportunity']}
value={fetchXml}
onChange={setFetchXml}
/>
AllowedTables これはブレイザー版の同等であり、表示できるものを正確に同じ方法で表示するよりも選択可能なものを絞り込みます。
@* テーブルは3つ提供し、他は使わない *@
<FetchXmlBuilder AllowedTables="_tables"
@bind-FetchXml="_fetchXml" />
@code {
private readonly string[] _tables = ["account", "contact", "opportunity"];
}
供給 renderResults を行えば、ビルダーは実行ボタン付きの結果パネルを作成し、クエリがテーブルとその列に名前を付け、赤いフィールドがない場合に押し付けるタイミングを決めます。行を表示するには、ビルダーが意図的に持たないデータクライアントが必要です。したがって、結果の見た目は通常、フレームワーク自身のクエリに対する自分の <MainGrid> もので、ポータル上で表示されます。プロップを外すとパネルは存在しません。
<FetchXmlBuilder
metadata={metadata}
value={fetchXml}
onChange={setFetchXml}
// ビルダーがボタンを供給します。これは結果がどのようなものかを示しています。
renderResults={(runnable) => (
<MainGrid
key={runnable.fetchXml}
tableName={runnable.tableName}
customViewDefinitions={[{
id: BUILDER_VIEW_ID,
displayName: 'Builder query',
tableName: runnable.tableName,
fetchXml: runnable.fetchXml,
columns: runnable.columns.map((columnName) => ({ columnName, width: 200 })),
}]}
viewId={BUILDER_VIEW_ID}
/>
)}
/>
Blazorでは、 RenderResults フラグメントが提供されると同じパネルが表示され、返すランナブルクエリはテーブル、FetchXML、そして列の名前を返します。フラグメントを外すとパネルは存在しません。
@* ビルダーは「走る」ボタンを所有しています。列はあなたが描くものです *@
<FetchXmlBuilder @bind-FetchXml="_fetchXml">
<RenderResults Context="runnable">
<MainGrid TableName="@runnable.TableName"
CustomViewDefinitions="@BuilderView(runnable)"
ViewIds="[BuilderViewId]" />
</RenderResults>
</FetchXmlBuilder>
@code {
private static readonly Guid BuilderViewId = Guid.Parse("00000000-0000-0000-0000-00000000f001");
private static List<GridViewDefinition> BuilderView(FetchXmlRunnableQuery runnable) =>
[
new()
{
Id = BuilderViewId,
DisplayName = "Builder query",
TableName = runnable.TableName,
FetchXml = runnable.FetchXml,
Columns = [.. runnable.Columns.Select(x => new ViewColumn { ColumnName = x, Width = 200 })],
},
];
}
名称 | 種類 | デフォルト | 概要 |
|---|---|---|---|
AllowAggregate | bool | True | クエリが集約されるかどうか。オファーを隠す場合は、そうでない場合もあります。 |
AllowedTables | IReadOnlyList<string>? | ピッカーが提供するテーブルだけ、あるいは全員が席を取らない。 | |
FetchXml | string? | クエリが編集されている。 | |
ReadOnly | bool | False | クエリを表示し、変更を申し出ずに示します。 |
RenderResults | RenderFragment<FetchXmlRunnableQuery>? | クエリが返した行を描き、結果セクションも追加します。 | |
Sections | FetchXmlBuilderSections | どのセクションを表示するか。結果以外はすべて、どこかに描く場所が必要だからです。 | |
ShowLogicalNames | bool | True | テーブルや列が表示名の隣に論理名で名前を付けているかどうかは — |
Table | string? | クエリを1つのテーブルにピン留めするため、テーブルピッカーは表示されますが無効化されます。 |
AllowAggregateAllowedTablesFetchXmlReadOnlyRenderResultsSectionsShowLogicalNamesTable名称 | 種類 | 概要 |
|---|---|---|
FetchXmlChanged | EventCallback<string> | クエリが編集変更されるたびに提出されます。 |
FetchXmlChanged