コンテンツにスキップ
「プリザンター入門」発売中!

開発者向け機能:サーバスクリプト:view.Filters

概要

viewオブジェクトの「Filters」です。サーバスクリプト一覧画面エディタに表示する「レコード」をフィルタすることで、ユーザに閲覧させるレコードを制限することができます。レコードのアクセス制御と異なり「レコード」1件1件にアクセス権を設定する必要がありません。JSONデータレイアウト:Viewが使用できます。

制限事項

  1. 「ビュー処理時」の条件のみ使用できます。
  2. 添付ファイル項目コメント項目は使用できません。
  3. サーバスクリプトによりフィルタを設定した項目は一覧画面等のフィルタ操作が動作しません。サーバスクリプトにより上書きされます。
    1.view.Filterをすると「フィルタボタンを使用する」を有効にしても一覧画等面表示時にview.Filterに指定した条件で抽出したレコードが表示されます。
  4. view.Filterをすると常に検索条件を要求するを有効にしても一覧画等面表示時にview.Filterに指定した条件で抽出したレコードが表示されます。
  5. SQL Serverを使用する場合とPostgreSQLを使用する場合では検索結果が異なる場合がございます。SQL ServerではLIKE句またはフルテキスト検索が使用されるのに対し、PostgreSQLではILIKE句またはpg_trgmによるフルテキスト検索が行われます。

注意事項

  1. view.Filtersの機能で、一覧画面でレコードを抽出されないようにフィルタした場合であっても、横断検索では検索結果リストに表示されます。これを防ぐにはテーブルの管理の設定横断検索を無効化で横断検索を無効化する必要があります。

プロパティ

No プロパティ名 変更 説明
1 [カラム名] フィルタをかけるカラム名を指定しフィルタ文字列を設定。

メソッド

メソッドはありません。

使用例

使用例1

下記の例では状況項目が 900 (完了) または 910 (保留) のレコードを抽出して表示します。

view.Filters.Status = '["900","910"]';

使用例2

下記の例では担当者項目にセットされたユーザのユーザIDが 215 と 319 のレコードを抽出して表示します。

view.Filters.Owner = '["215","319"]';

使用例3

下記の例では数値項目にセットされた数値が 600000 ~ 700000 のレコードを抽出して表示します。カンマより前を省略すると 700000 以下、カンマより後を省略すると 600000 以上がセットされたレコードを抽出して表示します。複数の範囲を検索する場合は '["100000,200000","600000,700000"]' のように指定します。

view.Filters.NumA = '["600000,700000"]'

使用例4

下記の例では日付項目にセットされた日付が本日のレコードを抽出して表示します。'["Today"]'は本日、'["ThisMonth"]'は今月、'["ThisYear"]'は今年を抽出します。

view.Filters.DateA = '["Today"]';

使用例5

下記の例では日付項目にセットされた日付が 2021/5/1 00:00:00 ~ 2021/5/31 23:59:59.997 のレコードを抽出して表示します。カンマより前を省略すると 2021/5/31 23:59:59.997以前、カンマより後を省略すると 2021/5/1 00:00:00以降がセットされたレコードを抽出して表示します。複数の範囲を検索する場合は '["2021/1/1,2021/1/31 23:59:59.997","2021/5/1,2021/5/31 23:59:59.997"]' のように指定します。

view.Filters.DateB = '["2021/5/1,2021/5/31 23:59:59.997"]'

使用例6

下記の例ではチェック項目がオンになっているレコードを抽出して表示します。false を代入するとオフのレコードを抽出します。

view.Filters.CheckA = true;

使用例7

下記の例では内容項目に ソフトウェア の文字を含むレコードを抽出して表示します。テーブルの管理フィルタ検索の種類を設定すると「部分一致検索」だけでなく「前方一致検索」や「完全一致検索」も行えます。タイトル項目、「説明項目及び選択肢の無い分類項目でも同様の検索が行えます。

view.Filters.Body = 'ソフトウェア';

使用例8

下記の例では状況項目が 900 (完了) かつ日付項目にセットされた日付が本日のレコードを抽出して表示します。異なる項目を複数セットした場合には AND 条件でフィルタされます。

view.Filters.Status = '["900"]';
view.Filters.DateA = '["Today"]';

使用例9

下記の例では状況項目が 900 (完了) または分類項目の選択肢に 設計 がセットされたレコードを抽出して表示します。or_で始まる任意のプロパティにJSON形式のフィルタ条件を代入することで、OR条件によるフィルタを行うことができます。画面からのフィルタ操作は明示的に無効化する必要があります。

1
2
3
4
5
6
7
8
// 画面からのフィルタ操作を無効化
view.Filters.ClassA = '';
view.Filters.Status = '';
// OR条件の設定
let data = {};
data.Status = '["900"]';
data.ClassA = '["設計"]';
view.Filters.or_MyFilterName = JSON.stringify(data);

使用例10

下記の例では組織IDが 3 のユーザがアクセスした場合分類項目の選択肢に 人事 がセットされたレコードを抽出して表示します。組織IDが 7 のユーザが使用した場合分類項目の選択肢に 開発 がセットされたレコードを抽出して表示します。それ以外の組織のユーザがアクセスした場合には全てのレコードを抽出して表示します。

context.Log(context.DeptId);
switch (context.DeptId) {
    case 3:
        view.Filters.ClassA = '["人事"]'
        break;
    case 7:
        view.Filters.ClassA = '["開発"]'
        break;
    default:
        break;
}

使用例11

下記の例ではユーザIDが 2 以外のユーザがアクセスした場合 分類A が 設計 かつ 分類D が 3 のレコード、または 分類B が テスト かつ 分類D が 7 のレコードを抽出して表示します。ユーザIDが 2 のユーザがアクセスした場合には全てのレコードを抽出して表示します。and_で始まる任意のプロパティにJSON形式のフィルタ条件を代入することで、OR条件と条件をAND条件を組み合わせたフィルタを行うことができます。

if (context.UserId !== 2) {
    let data1 = {};
    data1.ClassA = '["設計"]';
    data1.ClassD = '["3"]';
    let data2 = {};
    data2.ClassA = '["テスト"]';
    data2.ClassD = '["7"]';
    let data = {};
    data.and_Filter1 = JSON.stringify(data1);
    data.and_Filter2 = JSON.stringify(data2);
    view.Filters.or_Filter = JSON.stringify(data);
}

使用例12

下記の例では 分類A でリンクした サイトID 6 のレコードの分類B に 東京都中野区 がセットされているレコードを抽出して表示します。下記の記述によりマスタレコードの項目でフィルタすることができます。

view.Filters['ClassA~6,ClassB'] = '東京都中野区';

使用例13

下記の例では 分類A でリンクされた サイトID 7 の子レコードの 分類B に システム開発 がセットされているレコードを抽出して表示します。下記の記述により子レコードの項目でフィルタすることができます。子レコードに複数のレコードがヒットした場合、親レコードの同じレコードが複数表示されます。

view.Filters['ClassA~~7,ClassB'] = '["システム開発"]';

使用例14

下記の例では 分類A の値と 分類B の値が一致しているレコードのみを抽出して表示します。eq_で始まる任意のプロパティに{1つ目の項目}|{二つ目の項目}の形式で比較する項目を指定することで、2つの項目の値が一致しているレコードのみをフィルタすることができます。1

view.Filters.eq_MyFilterName = 'ClassA|ClassB';

使用例15

下記の例では 分類A の値と 分類B の値が一致していないレコードのみを抽出して表示します。notEq_で始まる任意のプロパティに{1つ目の項目}|{二つ目の項目}の形式で比較する項目を指定することで、2つの項目の値が一致しているレコードのみをフィルタすることができます。2

view.Filters.notEq_MyFilterName = 'NumA|NumB';

eq_notEq_で始まるプロパティは、or_and_で始まるプロパティと組み合わせて使用することができます。また、リンクしている親レコードの項目を指定することも可能です。下記の例では「分類A でリンクした サイトID 10 のレコードの タイトル と、分類B の値が一致する」または「分類A でリンクしてた サイトID 10 のレコードの 数値A の値と、数値A の値が一致する」レコードのみを抽出して表示します。

1
2
3
4
let data = {}
data.eq_Filter1 = 'ClassA~10,Title|ClassB';
data.eq_Filter2 = 'ClassA~10,NumA|NumA';
view.Filters.or_MyFilter = JSON.stringify(data);

サンプルコード

1. ユーザロールごとにフィルタ条件を制御する

以下のようなフィルタ条件を制御します。

ロール 権限
特権ユーザ すべてのレコードを参照可
管理職 所属組織のレコードを参照可
一般社員 自分担当のレコードのみ参照可

制御のため、以下のようにグループを用意し、ユーザを所属させます。

ロール 特権ユーザグループ 管理職グループ
特権ユーザ 所属
管理職 所属
一般社員

なお、本サンプルコードでは、特権ユーザグループ:GroupId=5管理職グループ:GroupId=4として定義しています。

また、所属組織の担当レコードであることを判別するため、ClassAに組織を選択できるように設定しておきます。

その上で、以下のように制御します。

  • 管理職:自分の組織ID=ClassAを対象
  • 一般社員:自分のユーザID=Ownerを対象
JavaScript
// グループIDを定義
const ADMIN_GROUP_ID = 5;
const MANAGE_GROUP_ID = 4;
// ユーザが特定のグループに所属しているか判定
function isUserInGroup(userId, groupId) {
    const group = groups.Get(groupId);
    if (!group) return false;
    for (const member of group.GetMembers()) {
        if (member.UserId === userId) return true;
    }
    return false;
}
// フィルタ適用ルールを定義
const rules = [
    {
        name: '特権ユーザグループ',
        when: () => isUserInGroup(context.UserId, ADMIN_GROUP_ID),
        apply: () => view.ClearFilters(),
    },
    {
        name: '管理職グループ',
        when: () => isUserInGroup(context.UserId, MANAGE_GROUP_ID),
        apply: () => {
            const user = users.Get(context.UserId);
            view.Filters.ClassA = `["${user.DeptId}"]`;
        },
    },
    {
        name: '一般社員',
        when: () => true,
        apply: () => {
            view.Filters.Owner = `["${context.UserId}"]`;
        },
    },
];
// ルールを順番に評価し、最初に該当したルールを適用
for (const rule of rules) {
    if (rule.when()) {
        logs.LogInfo(rule.name);
        rule.apply();
        break;
    }
}

対応バージョン

対応バージョン 内容
1.1.14.0 以降 OR条件によるフィルタ機能の追加

関連情報


  1. ただし、2つの項目にはデータタイプの異なる項目は指定できません。各項目のデータタイプは 項目名とデータベース上のカラム名の対応の一覧に記載されています。 

  2. ただし、2つの項目にはデータタイプの異なる項目は指定できません。各項目のデータタイプは 項目名とデータベース上のカラム名の対応の一覧に記載されています。