棒グラフをFluentUIChartコンポーネントにType="bar"設定してレンダリングします。カテゴリラベルのリストと1つ以上のChartDatasetオブジェクトを渡してバーを定義します。FluentUIChartは、基盤となるChartコンポーネントをテーマ認識型のラッパーで、Chart.jsの上に構築されています。
3つの無色データセットからなる棒グラフ — 色はアクティブなFluentパレットから埋められます。任意のバーをクリックするとイベントペイロードをクリックし、サイトのテーマをライトとダークで切り替えるとチャートのリテーマが表示されます。
import { ChartType, type ChartDataset } from '@powerportalspro/react-charts';
import { FluentUIChart } from '@powerportalspro/react-fluent';
const LABELS = ['Jan', 'Feb', 'Mar'];
const DATASETS: ChartDataset[] = [
{
label: 'Sales',
data: [{ value: 65 }, { value: 59 }, { value: 80 }],
},
{
label: 'Returns',
data: [{ value: 12 }, { value: 19 }, { value: 8 }],
},
];
export function MyChart() {
return <FluentUIChart type={ChartType.Bar} labels={LABELS} datasets={DATASETS} />;
}<FluentUIChart Type="ChartType.Bar"
Labels="_labels"
Datasets="_datasets" />
@code {
private List<string> _labels = new() { "Jan", "Feb", "Mar" };
private List<ChartDataset> _datasets = new()
{
new ChartDataset
{
Label = "Sales",
Data = new List<DataPoint>
{
new DataPoint(65), new DataPoint(59), new DataPoint(80),
},
},
new ChartDataset
{
Label = "Returns",
Data = new List<DataPoint>
{
new DataPoint(12), new DataPoint(19), new DataPoint(8),
},
},
};
}Chart.js HTML <canvas>にレンダリングされるため、CSSはバーや軸ラベル、グリッドラインに手を伸ばすことはできません。それらはラスタライズされたピクセルです。 FluentUIChart レンダリング時に解決されたCSSのカスタムプロパティを読み取り、 color、 scale.ticks.color、 scale.grid.colorの3 Chart.jsオプションにプッシュしてこれを回避しています。 ThemeService.ThemeChanged を支持し、テーマが変わるたびにパレットを再適用します。
nullが BackgroundColor または BorderColor 残るデータセットは、現在のアクセントカラーからFluent由来の系列パレットから自動充填されます。明示的な色を提供するデータセットは変更せずに通過されます。
ユーザーがバー(またはレンダリングされた要素)をクリックしたときに通知を受けるにはOnElementClickに登録してください。コールバックは、データセットのインデックス、データインデックス、ラベル、値、データセットラベル、そして元のIDataPointインスタンスを含むChartClickEventArgsを受け取ります。サブクラスDataPoint、コーラーが定義したコンテキスト(レコードID、地域、カテゴリなど)を付け、クリックハンドラ内のサブクラスとのパターンマッチで復元します。チャートの背景をクリックしても無視されます。
import {
ChartType,
type BaseDataPoint,
type ChartClickEventArgs,
type ChartDataset,
} from '@powerportalspro/react-charts';
import { FluentUIChart } from '@powerportalspro/react-fluent';
// BaseDataPointを拡張して、発信者定義コンテキスト(region、record id、
// カテゴリなど)を組み合わせる。<FluentUIChart> 以下にこの型を用いた</FluentUIChart>パラメータ化
// それをargs.dataPointに流れます — キャストは不要です。
interface SalesDataPoint extends BaseDataPoint {
region: string;
}
const DATASETS: ChartDataset<SalesDataPoint>[] = [/* ... */];
function onBarClicked(args: ChartClickEventArgs<SalesDataPoint>) {
const region = args.dataPoint?.region ?? '';
console.log(`${args.label}: ${args.value} (${region})`);
}
export function MyChart() {
return (
<FluentUIChart<SalesDataPoint>
type={ChartType.Bar}
labels={LABELS}
datasets={DATASETS}
onElementClick={onBarClicked}
/>
);
}<FluentUIChart Type="ChartType.Bar"
Labels="_labels"
Datasets="_datasets"
OnElementClick="OnBarClicked" />
@code {
private class SalesDataPoint : DataPoint
{
public SalesDataPoint(double value) : base(value) { }
public string Region { get; set; } = string.Empty;
}
private void OnBarClicked(ChartClickEventArgs args)
{
// パターンマッチのアルガルズ。DataPointは、発信者が定義したあらゆるコンテキストを復元するためのものです。
if (args.DataPoint is SalesDataPoint sdp)
{
Console.WriteLine($"{args.Label}: {sdp.Value} ({sdp.Region})");
}
}
}Title をチャートの上に方位を表示するように設定してください。タイトルはキャンバス内でChart.jsによって描かれ、現在のテーマのテキストカラーが使われています。
<DataverseChart dataSource={source}
type={ChartType.Bar}
title="年別収益" /><DataverseChart Source="_source"
Type="ChartType.Bar"
Title="年別収益" />Stacked="true"を並べるのではなく、重ねて積み重ねる設定にしてください。これは、すべてのシリーズの合計が意味のある棒グラフや折れ線グラフ(例:総収益=勝収+損失)に有用です。
<DataverseChart dataSource={source}
type={ChartType.Bar}
stacked /><DataverseChart Source="_source"
Type="ChartType.Bar"
Stacked="true" />LegendPosition設定で、伝例の出現場所を制御できます:"top"(デフォルト)、"bottom"、"left"、"right"、または"hidden"で完全に隠します。
// 位置:トップ(デフォルト)、ボトム、レフト、ライト
<DataverseChart dataSource={source}
legendPosition={ChartLegendPosition.Bottom} />
// 伝説を完全に隠せ
<DataverseChart dataSource={source}
legendPosition={ChartLegendPosition.Hidden} /><!-- 位置:トップ(デフォルト)、ボトム、レフト、ライト -->
<DataverseChart Source="_source"
LegendPosition="ChartLegendPosition.Bottom" />
<!-- 伝説を完全に隠せ -->
<DataverseChart Source="_source"
LegendPosition="ChartLegendPosition.Hidden" />生のFetchXMLを書かずにDataverseからチャートをフィードするために AggregateDataverseChartDataSource を使えます。セット TableName、 GroupByColumn、 AggregateColumn、 Aggregate。オプションで、マルチシリーズ用の SeriesColumn 、日付バケット化用の GroupByDateGrouping 、保存済みビューのフィルター条件をマージする ViewId 、またはインライン条件用の FilterXml フラグメントを追加できます。
import {
AggregateDataverseChartDataSource,
AggregateType,
ChartDateGrouping,
ChartType,
type ChartClickEventArgs,
} from '@powerportalspro/react-charts';
import { DataverseChart } from '@powerportalspro/react-fluent';
import { useMemo } from 'react';
export function MyChart() {
// useMemoはソースの識別を安定させるため、チャートは安定しません
// 毎回のレンダリングで再取得してください — 設定の変更はマウント時に適用されます。
const source = useMemo(
() =>
new AggregateDataverseChartDataSource({
tableName: 'opportunity',
groupByColumn: 'actualclosedate',
groupByDateGrouping: ChartDateGrouping.Year,
aggregateColumn: 'estimatedvalue',
aggregate: AggregateType.Sum,
seriesColumn: 'statecode',
filterXml:
"<filter><condition attribute='statecode' operator='ne' value='0' /></filter>",
}),
[],
);
const onBarClicked = (args: ChartClickEventArgs) => {
// args.datasetLabel, args.label, args.value, args.dataPoint
};
return (
<DataverseChart
dataSource={source}
type={ChartType.Bar}
title="Estimated Revenue by Year (Stacked)"
stacked
yAxisPrefix="$"
onElementClick={onBarClicked}
/>
);
}<DataverseChart Source="_source"
Type="ChartType.Bar"
Title="Estimated Revenue by Year (Stacked)"
Stacked="true"
YAxisPrefix="$"
OnElementClick="OnBarClicked" />
@code {
private readonly AggregateDataverseChartDataSource _source = new()
{
TableName = "opportunity",
GroupByColumn = "actualclosedate",
GroupByDateGrouping = ChartDateGrouping.Year,
AggregateColumn = "estimatedvalue",
Aggregate = AggregateType.Sum,
SeriesColumn = "statecode",
FilterXml = "<filter><condition attribute='statecode' operator='ne' value='0' /></filter>",
};
private void OnBarClicked(ChartClickEventArgs args)
{
// ARGS。DatasetLabel、args。ラベル、ARGS。価値、ARGS。データポイント
}
}年間ごとの推定機会収益は、ステータス別(勝ち負け)で分割され、積み重ねられたもので、Dataverseから AggregateDataverseChartDataSource経由で読み込みます。バーをクリックすると、年、状況、収益を確認できます。
ViewIdsとDefaultViewIdをDataverseChartにパスすると、チャートの上にビューセレクターのドロップダウンが表示されます。ユーザーがビューを切り替えると、選択したビューのフィルター条件が集計クエリに統合され、チャートが再読み込みされます。ソースのViewIdは直接設定されているわけではなく、DataverseChartが管理しています。ビューはどのレコードが含まれているかを決定します。集約設定が、それらのグループ化やまとめ方法を決定します。
import {
AggregateDataverseChartDataSource,
AggregateType,
ChartDateGrouping,
ChartType,
} from '@powerportalspro/react-charts';
import { DataverseChart } from '@powerportalspro/react-fluent';
import { useMemo } from 'react';
const VIEW_IDS = [
'...', // 獲得した機会
'...', // すべての機会
];
const DEFAULT_VIEW_ID = VIEW_IDS[0];
export function MyChart() {
const source = useMemo(
() =>
new AggregateDataverseChartDataSource({
tableName: 'opportunity',
groupByColumn: 'actualclosedate',
groupByDateGrouping: ChartDateGrouping.MonthAndYear,
aggregateColumn: 'estimatedvalue',
aggregate: AggregateType.Sum,
}),
[],
);
return (
<DataverseChart
dataSource={source}
type={ChartType.Bar}
viewIds={VIEW_IDS}
defaultViewId={DEFAULT_VIEW_ID}
yAxisPrefix="$"
/>
);
}<DataverseChart Source="_source"
Type="ChartType.Bar"
ViewIds="_viewIds"
DefaultViewId="@_defaultViewId"
YAxisPrefix="$" />
@code {
private static readonly List<Guid> _viewIds = new()
{
new Guid("..."), // 獲得した機会
new Guid("..."), // すべての機会
};
private static readonly Guid _defaultViewId = _viewIds[0];
private readonly AggregateDataverseChartDataSource _source = new()
{
TableName = "opportunity",
GroupByColumn = "actualclosedate",
GroupByDateGrouping = ChartDateGrouping.MonthAndYear,
AggregateColumn = "estimatedvalue",
Aggregate = AggregateType.Sum,
};
}月ごとの推定収益を表示し、ビューセレクターのドロップダウンがあります。ビューを切り替えると、異なるフィルター条件でチャートが再読み込みされるのを確認しましょう。
GroupByLinkedEntity(またはSeriesLinkedEntity)を関連するテーブルのカラムごとにグループ化または分割するように設定します。ビルダーは<link-entity>結合を作成し、その中にgroupby属性を配置します。マルチホップ結合のための無制限ネストChartLinkedEntity.LinkedEntityをサポートしています。
import {
AggregateDataverseChartDataSource,
AggregateType,
ChartType,
} from '@powerportalspro/react-charts';
import { DataverseChart } from '@powerportalspro/react-fluent';
import { useMemo } from 'react';
export function MyChart() {
const source = useMemo(
() =>
new AggregateDataverseChartDataSource({
tableName: 'opportunity',
groupByColumn: 'industrycode',
groupByLinkedEntity: {
tableName: 'account',
from: 'accountid',
to: 'customerid',
},
aggregateColumn: 'estimatedvalue',
aggregate: AggregateType.Sum,
}),
[],
);
return (
<DataverseChart
dataSource={source}
type={ChartType.Bar}
title="産業別の収入"
yAxisPrefix="$"
/>
);
}<DataverseChart Source="_source"
Type="ChartType.Bar"
Title="産業別の収入"
YAxisPrefix="$" />
@code {
private readonly AggregateDataverseChartDataSource _source = new()
{
TableName = "opportunity",
GroupByColumn = "industrycode",
GroupByLinkedEntity = new ChartLinkedEntity
{
TableName = "account",
From = "accountid",
To = "customerid",
},
AggregateColumn = "estimatedvalue",
Aggregate = AggregateType.Sum,
};
}上記の構成により、以下のFetchXMLが生成されます:
<fetch aggregate="true">
<entity name="opportunity">
<attribute name="estimatedvalue" alias="estimatedvalue" aggregate="sum" />
<link-entity name="account" from="accountid" to="customerid" link-type="inner">
<attribute name="industrycode" alias="industrycode" groupby="true" />
<order alias="industrycode" />
</link-entity>
</entity>
</fetch>
親アカウントの業種別にまとめた推定総機会収益 — industrycode 列は account テーブルに置かれ、 customeridで接続されます。
関連項目