[]
        
(Showing Draft Content)

フィルター

Filterプロパティ (‘F’) は、テンプレート内でフィルタ処理の種類を設定します。このプロパティは、条件フィルタとスライスフィルタ2種類のフィルタ処理オプションを提供します。これらのフィルタオプションを個別にまたは組み合わせて使用すると、テーブルからデータをフィルタ処理できます。このプロパティは、レポート生成のために単一または複数のテーブルからデータをフィルタ処理できます。 DioDocs for Excelは、System.Data.DataTable や ITableDataSource などの通常のデータソースでのみフィルタプロパティをサポートします。 メモ: カスタムデータテーブルを作成することで、JSON データソースにフィルタを適用できます。詳細については、カスタムデータテーブルを参照してください。

条件フィルタ

条件フィルタは、AND、OR、NOT、および LIKE などの演算子とキーワードを使用してデータをフィルタ処理します。LIKE キーワードと比較演算子は最優先で評価されます。残りのキーワードの優先順位は、NOT > AND > OR です。さらに、括弧を使用することで、これらの演算子とキーワードの評価順序をカスタマイズできます。

設定値:式

F/Filter = (field1 > 1 AND field2 = 2 OR field3 <> 3)

次の表は、条件フィルタがサポートする演算子とキーワードを示しています。

オペレーター/キーワード

サポートするオペレーター/キーワード

記号

説明

オペレーター

より小さい

<

指定された値より小さい値をフィルタ処理します。

以下

<=

指定された値以下の値をフィルタ処理します。

より大きい

>

指定された値より大きい値をフィルタ処理します。

以上

>=

指定された値以上の値をフィルタ処理します。

等しい

=

指定された値と等しい値をフィルタ処理します。

等しくない

<>

指定された値と等しくない値をフィルタ処理します。

キーワード

And

AND

複数の条件を組み合わせる論理演算子です。両方の条件が真の場合に真を返します。 例: {{ds2.amount(F = (ds2.amount < 500 and ds2.age < 18))}}

Or

OR

複数の条件を組み合わせる論理演算子です。少なくとも1つの条件が真の場合に真を返します。 例: {{ds2.amount(F = (ds2.amount < 500 or ds2.age < 18))}}

Not

NOT

クエリ内の条件を否定する論理演算子です。条件が偽の場合に真を返し、条件が真の場合に偽を返します。 例: {{ds2.amount(F = (not ds2.amount < 500 or not ds2.age < 18))}}

Like

LIKE

パターンマッチング操作のためのキーワードです。以下の2つのワイルドカードをLIKE演算子と組み合わせて使用できます:

  • アスタリスクマーク * はゼロ、1つ、または複数の文字を表します。

  • ハテナマーク ? は1つの文字を表します。

例: {{ds2.name(F = (ds2.name like \"*wh?te?\"))}} ~* および ~? を使用して、文字 * または ? と一致させます。

メモ: 条件フィルタの左オペランドは現在のテーブルのフィールドでなければならず、右オペランドは任意の定数、現在のテーブルのフィールド、または他のテーブルの参照フィールドに設定できます。

例1: オペレーターを使用したフィルタ処理

{{order.oid(F = (order.count > 10))}}

以下の画像は、販売数が10を超える注文をフィルタ処理してレポートを生成するテンプレートの例を示しています。以下の例で使用されたExcelテンプレートのレイアウトExcel template layoutもダウンロードできます。

オペレーターを使用したフィルタ処理

オペレーターを使用したフィルタ処理の詳細については、 オンラインデモ をご参照ください。

例2: キーワードを使用したフィルタ処理

{{order.oid(F = (order.cid ="C002" and order.pid = "W003"))}}

以下の画像は、顧客IDが「C002」かつ製品IDが「W003」の注文をフィルタ処理してレポートを生成するテンプレートの例を示しています。以下の例で使用された Excel template layout テンプレートのレイアウトもダウンロードできます。

キーワードを使用したフィルタ処理

キーワードを使用したフィルタ処理の詳細については、 オンラインデモ をご参照ください。

例3: シンプルなマルチソースレポート

{{product.name(F=(product.pid = order.pid))}}

以下の画像は、異なるデータテーブルから製品IDを使用して製品名をフィルタ処理するテンプレートの例を示しています。以下の例で使用されたExcel template layoutテンプレートのレイアウトもダウンロードできます。

シンプルなマルチソースレポート

シンプルなマルチソースレポートについては、オンラインデモ もあわせてご参照ください。

例4: 複雑なマルチソースレポート

顧客名

製品名

{{customer.name(F=(customer.cid = order.cid))}}

{{product.name(F=(product.pid = order.pid))}}

以下の画像は、異なるデータテーブルから顧客IDと製品IDを使用して顧客名と製品名をフィルタ処理するテンプレートの例を示しています。以下の例で使用されたExcel template layoutテンプレートのレイアウトもダウンロードできます。

複雑なマルチソースレポート

複雑なマルチソースレポートについては、オンラインデモ もあわせてご参照ください。

スライスフィルタ

スライスフィルタは、指定されたインデックスから別の指定されたインデックスまでデータを取得してフィルタ処理します。

設定値:配列

F/Filter = [start:stop:step]

start はフィルタが開始するインデックスを指し、stopはフィルタの終了を指します。Stepを使ってインデックス間の間隔を指定することもできます。

例: スライスフィルタ

{{order.oid(F = [0:20:2])}}

以下の画像は、テンプレートが最初の20件の奇数注文をフィルタ処理してレポートを生成する方法を示しています。以下の例で使用されたExcel template layoutテンプレート レイアウトもダウンロードできます。

スライスフィルタ

スライスフィルタについては、オンラインデモ もあわせてご参照ください。

例: スライスフィルタの逆操作

{{order.oid(F = [20:0:-2])}}

以下の画像は、インデックス20から最後の20件の注文をフィルタ処理してレポートを生成するテンプレートの例を示しています。以下の例で使用された Excel template layout テンプレートのレイアウトもダウンロードできます。

スライスフィルタの逆操作

メモ: レコードの末尾から処理を行う場合(逆操作)、結果は元の順序になります。これはDioDocs for Excelの制限です。

複合フィルタ

条件フィルタとスライスフィルタの両方を組み合わせてレポートを生成できます。

例: 複合フィルタ

{{order.oid(F = (order.oid like "*1?")[0:5])}}

以下の画像は、注文IDが「*1?」の式に一致する注文をフィルタ処理し、処理された結果から最初の5件を選択してレポートを生成するテンプレートの例を示しています。以下の例で使用されたExcelテンプレートExcel template layoutのレイアウトもダウンロードできます。

複合フィルタ

複合フィルタについては、オンラインデモ もあわせてご参照ください。

メモ: スライスフィルタと条件フィルタは、フィルタステートメント内で0回または1回のみ使用できます。

NULL 値のフィルタ

DioDocs for Excel のテンプレートフィルターは、フィールド値が NULL か非 NULL かに基づいてレコードをフィルターするための NULL キーワードをサポートしています。

書式

  • = NULL を使用すると、フィールド値が NULL のレコードを返します。

    {{employee.name(F=(employee.department = NULL))}}

  • <> NULL を使用すると、フィールド値が NULL でないレコードを返します。

    {{employee.name(F=(employee.department <> NULL))}}

メモ:

  • NULL キーワードと一緒にサポートされている演算子は = および <> のみです。その他の比較演算子(>、<、>=、<=)はサポートされておらず、使用するとテンプレート処理時に例外が発生します。

  • LIKE や REGEX などのフィルターキーワードは、文字列値のみに対して動作し、NULL 値の評価は行いません。

  • NULL キーワードは大文字・小文字を区別しません。たとえば、NULL、null、Null のいずれも有効です。

NULL マッチングルール

以下の表は、DioDocs for Excel がテンプレートフィルターにおいて NULL 条件をどのように評価するかを示しています:

データソース値

= NULL にマッチ

<> NULL にマッチ

DBNull.Value

×

ネイティブ null

×

空文字列 ""

×

その他の非 NULL 値

×

カスタムの ITableDataSource を実装する場合は、欠損データに対して GetValue()メソッドが DBNull.Value またはネイティブの null を返すようにしてください。テンプレートフィルターエンジンによって NULL と認識されるのは、これらの値のみです。空文字列("")、"null" という文字列、カスタムのプレースホルダーオブジェクトなど、他のセントネル値は = NULL フィルターで一致しません。この動作は SQL のセマンティクスと一致しています。

NULL フィルターの組み合わせ

論理演算子を使用して、NULL フィルターを他のフィルター条件と組み合わせることができます。

NOT の利用(以下の 2 つの式は同じ意味です):

  • {{ds1.name(F=(NOT ds1.name = NULL))}}

  • {{ds1.name(F=(ds1.name <> NULL))}}

AND / OR の利用:

  • {{ds1.name(F=(ds1.name <> NULL AND ds1.age > 18))}}

  • {{ds1.name(F=(ds1.name = NULL OR ds1.salary < 50000))}}

以下の画像は、テンプレートで NULL 値をフィルタリングする方法を示しています。また、下記例で使用されている FilterNullKeywordTemplate をダウンロードすることもできます。

NULL フィルターの組み合わせ

また、オンラインデモ を参照すると NULL 値フィルターの詳細を確認できます。

REGEX で値をフィルタ

DioDocs for Excel テンプレートフィルターでは、正規表現によるマッチングに使用できる REGEX キーワードをサポートしています。

書式

{{ds1.name(F=(ds1.name REGEX "pattern"))}}

メモ:

  • REGEX キーワードは大文字・小文字を区別しません。たとえば、REGEX、regex、Regex のいずれも有効です。

  • 右オペランドには、二重引用符で囲まれた有効な正規表現パターンの文字列リテラルを指定する必要があります。

REGEX の一致ルール

  • 無効な正規表現パターンを使用すると、テンプレート処理時に例外が発生します。

  • パターンマッチングには、プラットフォームのネイティブ正規表現エンジン(.NET System.Text.RegularExpressions)が使用されます。すべての正規表現動作(大文字・小文字の区別など)は、プラットフォームのデフォルトルールに従います。

  • データソースが文字列型の場合のみ REGEX の使用を推奨します。その他の型は toString メソッドで文字列に変換されますが、これは一般的に推奨されません。数値や日付には、適切な演算子や DATETIME 関数を使用してください。

REGEX フィルターの組み合わせ

REGEX は NOT、AND、OR、および括弧と組み合わせて使用できます。例:

  • {{ds1.name(F=(NOT ds1.name REGEX "pattern"))}}

  • {{ds1.name(F=(ds1.name REGEX "^A" AND ds1.age > 18))}}

REGEX パターン構文とエスケープ方法

  • 正規表現パターンは、対象プラットフォームのネイティブ正規表現エンジンでサポートされている標準的な正規表現構文で記述してください。

  • テンプレート式をソースコード内の文字列リテラルとして記述する場合は、使用するプログラミング言語の文字列エスケープルールに従ってください。例えば、1 文字以上の数字を表す正規表現パターンは \d+ です。

    • テンプレート式に直接記述する場合: {{product.pid(F=(product.name REGEX "\d+"))}}

    • ソースコード内で記述する場合、バックスラッシュや引用符は必要に応じてエスケープしてください: "{{product.pid(F=(product.name REGEX "\d+"))}}"

  • 字句解析時の曖昧さを防ぐため、正規表現文字列内の二重引用符は \" でエスケープする必要があります。テンプレート式がプログラミング言語の文字列リテラル内に含まれる場合は、その言語のエスケープルールにも従ってください。(例: C# では \"\\\" と記述)

  • 名前が "Laptop" で始まる製品をフィルター

    {{product.pid(F=(product.name REGEX "^Laptop"))}}

  • SKU が年パターン(2024)に一致する製品をフィルター

    {{product.pid(F=(product.sku REGEX "2024-\d{3}"))}}

  • REGEX と他の条件を組み合わせてフィルター

    {{product.pid(F=(product.name REGEX "^(Laptop|Phone)" AND NOT product.sku REGEX "2023"))}}

  • アンカーを使った完全一致

    {{product.pid(F=(product.name REGEX "^Laptop Pro 15$"))}}

  • インラインフラグによる大文字・小文字を区別しない検索

    {{product.pid(F=(product.name REGEX "(?i)laptop"))}}

以下の画像は、テンプレートが名前が "Laptop" で始まる製品をフィルターすることでレポートを生成する方法を示しています。下記の例で使用されている FilterRegexTemplate.xlsx もダウンロードできます。

REGEX で値をフィルタ

また、オンラインデモ を参照すると、REGEXキーワードの詳細を確認できます。

日付および時刻の値でフィルタ

テンプレートフィルターは、DATETIME 関数による日付・時刻の比較に対応しています。テンプレートの条件付きフィルター内で DATETIME 関数を使用することで、アプリケーションコードで事前処理を行うことなく、日付条件を記述できます。

書式

DATETIME("dateTimeString")

引数

引数名

説明

dateTimeString

【必須】日付、時刻、または日付+時刻の値を表す文字列。ダブルクォートで囲んで指定します。この関数は以下に対応しています:

  • Excel 互換の任意の日付/時刻フォーマットを受け付けます。

  • Excel が標準でサポートしていないものも含め、データベースやプログラミングで一般的な形式も追加で受け付けます。この拡張フォーマット対応により、データベースや API、ログファイルなどでよく使われる ISO 8601 や高精度フォーマットの日付値も、事前変換なしでテンプレートフィルター内に直接使用できます。

  • 例:

    • yyyy-MM-ddTHH:mm:ss

    • yyyy-MM-ddTHH:mm:ss.fff

    • yyyy-MM-ddTHH:mm:ssZ

    • yyyy-MM-ddTHH:mm:ss±HH:mm

  • タイムゾーン情報(Z、+08:00 など)を含む形式の場合も、タイムゾーン/オフセットはパースされますが比較時には無視され、ローカルの日付/時刻部分のみで比較されます。

メモ

  • 関数名の大文字/小文字は区別されません(DATETIME、datetime、DateTime どれでも可)。

  • dateTimeString がパースできない場合、テンプレート処理例外がスローされます。

比較ルール

  • テンプレートエンジンはリテラル値の比較を行います。年、月、日、時、分、秒、ミリ秒といった各コンポーネントを、タイムゾーン変換を行わずに直接比較します。比較はエンジン内部で決定的なコンポーネント単位比較で行われます。

  • DateTimeOffset、ZonedDateTime、OffsetDateTime などタイムゾーン情報を持つデータソース型についても、タイムゾーン/オフセット情報は比較時に無視され、ローカルの日付・時刻情報のみが比較に使われます。

  • DATETIME("09:15:00") のような「時刻のみ」のリテラルを日付+時刻型のデータソース値と比較する場合、時刻部分のみ比較対象となります。たとえば 2024-06-15 09:15:00、2024-06-16 09:15:00 のいずれも、時刻が 09:15:00 で一致するのでヒットしますが、2024-06-15 10:00:00 は一致しません。

  • DATETIME("2024-06-15") のような「日付のみ」のリテラルを日付+時刻型のデータソース値と比較する場合、リテラル側の時刻部分は 00:00:00.000 とみなされます。したがって 2024-06-15 00:00:00 のみが一致し、2024-06-15 09:15:00 は一致しません。

演算子の挙動

すべての比較演算子は標準的な値比較を行います。= は完全一致のみを意味し、暗黙的な範囲比較は行いません。たとえば = DATETIME("2024-06-15") は、データソース値が完全に 2024-06-15 00:00:00.000 と一致する場合のみヒットします。特定の日付に該当する全レコードを抽出する場合は、>= DATETIME("2024-06-15") AND < DATETIME("2024-06-16") のように範囲指定をしてください。

演算子

挙動

=

完全一致比較。

<>

不一致。

>, <, >=, <=

標準的な比較。

サポートされているデータ型

テンプレートエンジンは以下の一般的な日付・時刻型を標準サポートします。

  • System.DateTime

  • System.DateTimeOffset

  • System.DateOnly

  • System.TimeOnly

  • System.TimeSpan

これら以外のカスタム日付/時刻型がデータソースに含まれる場合、テンプレート処理例外となります。

NULL との相互作用

DATETIME 関数および日付・時刻の比較は、NULL キーワードとは相互作用がありません。NULL フィールド値に対して DATETIME 比較を適用しても一致せず(false となります)、NULL の日付値をフィルターしたい場合は = NULL または <> NULL を直接ご使用ください。

  • 日時の完全一致:

    {{order.oid(F=(order.orderDate = DATETIME("2024-06-15 09:15:00")))}}

  • 日付範囲 — 2024年6月15日のすべての順序:

    {{order.oid(F=(order.orderDate >= DATETIME("2024-06-15") AND order.orderDate < DATETIME("2024-06-16")))}}

    {{order.oid(F=(order.orderDate >= DATETIME("2024-01-01") AND order.orderDate < DATETIME("2024-07-01")))}}

  • ISO 8601 形式:

    {{order.oid(F=(order.orderDate >= DATETIME("2024-06-15T00:00:00")))}}

  • Excel 互換フォーマット:

    {{order.oid(F=(order.orderDate >= DATETIME("06/15/2024")))}}

    {{order.oid(F=(order.orderDate >= DATETIME("Jun 15, 2024")))}}

  • 時刻のみ — 午前8時以降の注文:

    {{order.oid(F=(order.orderTime >= DATETIME("08:00")))}}

    {{order.oid(F=(order.orderTime >= DATETIME("09:00") AND order.orderTime < DATETIME("17:00")))}}

  • その他の条件との組み合わせ:

    {{order.oid(F=(order.orderDate >= DATETIME("2024-01-01") AND order.amount > 500))}}

以下の画像はテンプレートで NULL 値をフィルターする方法を示しています。下記の例で使用している DateTimeFilterTemplate をダウンロードできます。

日付および時刻の値でフィルタ

また、オンラインデモ を参照して日付や時刻でのフィルター詳細を確認できます。