1. 汎用検索(Entity Listing)
汎用検索(Entity Listing)はエンティティに対して、
-
エンドユーザーが自分自身で抽出項目やフィルター条件を指定したり、システム管理者が定期的なデータ抽出作業用の定型フィルター条件を作成したり
-
その作成した条件や検索結果を保存・共有
する機能を提供しています。
登録されているエンティティに対して、抽出項目(Select)やフィルター条件(Where)を画面上で自由に指定することができます。
指定した検索条件や検索結果はCSVに出力することが可能です。
また、保存リストとして指定した検索条件や検索結果を保存して、再利用したり共有することが可能です。
保存リストはGEM機能のTopViewパーツとしてTop画面に配置する方法と、メニューから画面遷移する方法を提供しています。
2. 操作説明
2.1. 画面構成
2.2. 画面操作
データアイテム選択
エンティティをドロップダウンから選択します。選択すると アイテム
部分にプロパティが表示されます。
選択可能なエンティティやプロパティはEntityListingメタデータで指定することが可能です。EntityListingメタデータを利用しない場合は、エンティティ権限の設定により参照可能なエンティティやプロパティが表示されます。 |
抽出項目
を設定したい場合は、アイテムをダブルクリックするか、 抽出項目
領域にドラッグ&ドロップすることで追加されます。
フィルター条件
に追加したい場合は、フィルター条件下部の「アイテムをドロップしてください」という領域にドラッグ&ドロップすることで追加されます。
プロパティがReferenceプロパティの場合は、左に右向き「▼」が表示されます。 このアイテムをクリックすることでReference対象エンティティのプロパティが表示されます。
抽出項目設定
抽出項目の列の順番はドラッグ&ドロップで並びかえることが可能です。
抽出項目に対して、集計関数を指定することが可能です。 集計関数として利用できる関数は、ドロップされたアイテムのデータ型によって決まります。
検索結果一覧の表示設定を行うことが可能です。
-
配置設定
左寄せ、中央寄せ、右寄せを設定します。未指定の場合、「左寄せ」になります。 -
列幅設定
検索結果の表示列幅を設定します。未指定の場合、150pxになります。 -
数値フォーマット設定(集計項目、数値項目のみ)
数値をフォーマットするかを設定します。
未指定の場合、GemConfigServiceの「formatNumberWithComma」がtrueの場合にのみフォーマット表示されます。 GemConfigServiceの「formatNumberWithComma」がtrueの場合で、フォーマット表示したくない場合は、「フォーマットしない」を選択する必要があります。
フィルター条件
フィルター条件として指定可能な条件入力方法は、ドロップされたアイテムのデータ型によって決まります。
フィルターに条件が1つでも追加されると、 条件式
の入力エリアが表示されます。
この条件式には各フィルターの組み合わせ条件を指定することができます。
${フィルタの行番号}
で対象の条件を指定します。
※ 条件式には、カッコ、AND、OR、NOT を利用することができます。
フィルター条件式が未指定の場合は、同一プロパティはOR条件として、他プロパティに対してはAND条件として検索します。
画面の例の場合、条件式が指定されていなければ、
( 販売ステータス = '準備中' OR 販売ステータス = '販売中' ) AND ( 在庫数 < 500 OR 在庫数 < 100 )
となりますが、
($1 and $2) or ($3 and $4)
を指定した場合は、
( 販売ステータス = '準備中' AND 在庫数 < 500 ) OR ( 販売ステータス = '販売中' AND 在庫数 < 100 )
として検索することができます。
検索条件、検索結果の保存
設定した検索条件や検索結果を保存リストとして保存することができます。保存データは別名での保存も可能です。
- まだ保存されていない場合
-
- 保存されているデータを編集で開いた場合
-
保存ボタン
をクリックすると、ダイアログが表示されます。
保存リストの名前に表示されているフォルダをクリックすることで、 保存フォルダ
にフォルダが設定されます。
また フォルダの作成
から新しくフォルダを作成することができます。
保存した保存リストを他のユーザーが参照することができるようになります。
保存した保存リストをもとに、他のユーザーが編集画面を表示することができるようになります。 他者編集を許可しない場合は、保存リスト上でデータを参照することはできますが、編集画面には遷移できません。
-
条件を保存
条件のみ保存されます。このリストを開くと、保存された条件で最新のデータを検索します。 -
スナップショットを保存
条件とデータを保存します。このリストを開くと、保存時のデータが表示されます。
※ スナップショットについて
スナップショットとして保存したデータについては、保存データ編集(検索条件編集)や、保存されたエンティティの参照画面への遷移は行えません。
保存リストとして参照する際に、フィルター条件を変更できるかを指定するものです。 例えば、システム管理者がある特定のデータに対する抽出条件を保存リストとして保存して一般ユーザーに公開したときに、一般ユーザーが検索条件を変更してもいいような場合に利用します。
- 編集を許可した場合
-
- 編集を許可しない場合
-
保存リストを画面に表示する際に、同時に検索を実行するかを指定します。 対象のデータ件数が多い場合、または条件の指定を行ってから検索させたい場合など、リスト初期表示を「しない」に設定することで画面表示時に検索を行いません。
※ フォルダやデータの可視範囲について
フォルダや保存データの他者への可視範囲については、エンティティ権限で制御します。
フォルダは mtp.listing.SavedListFolder
、保存データは mtp.listing.SavedList
エンティティに対して権限を設定します。
検索結果一覧
抽出項目
に オブジェクトID
が含まれている場合、リンクとして表示されます。
リンクをクリックすることで、エンティティの参照ダイアログが開きます。
※ 対象エンティティの OID
プロパティをカスタマイズしている場合、 OID
プロパティが1つのみであれば、その項目に対してもリンクが張られます。
複数項目を利用して OID
プロパティを指定している場合(複合指定)は、リンク表示されません。
※ EntityListingメタデータを定義することで、 Name
プロパティに対してもリンクを表示することが可能です。
※ EntityListingメタデータを定義することで、参照時のView指定や編集可能とするかの設定が可能です。
デフォルトでは、 default
Viewで 編集可
として動作します。
3. EntityListingの管理
3.1. EntityListingの作成
EntityListingアイコンを右クリックして、「EntityListingを作成する」を選択してください。
3.2. 設定
メタデータを定義しなくてもEntityListing機能自体は実行することが可能です。
ただし、ユーザーによって利用可能なエンティティやプロパティを制御したい場合には、EntityListingメタデータを作成します。
Default Setting
ここでの設定は、下のCustom Settingを設定していないエンティティに対してデフォルトで適用される設定です。
設定項目 | 設定値 |
---|---|
exclude mtp entities |
選択可能なエンティティから「mtp.*」を除外します。 下のCustom Settingでエンティティを1つでも選択している場合は、そちらが優先されます。 |
exclude inherited properties |
選択可能なプロパティとして継承プロパティを除外します。 下のCustom Settingでエンティティ別にプロパティ設定をしている場合は、そちらが優先されます。 選択した場合、オブジェクトIDが選択可能なプロパティとして選択できなくなるため、エンティティの参照画面が開けなくなります。 (エンティティ定義でOIDプロパティを独自指定している場合は可能です) |
to edit the narrowing condition, as dialog |
抽出項目に集計関数がある場合に利用可能な絞り込み条件(Having条件)の指定方法を設定します。
|
handle inherited user property as name |
エンティティの「作成者」、「更新者」、「ロックユーザー」を名前で扱います。 Filter条件に指定する場合は、Userエンティティを選択します。 検索結果、CSVファイルには名前が出力されます(ただしソートはOIDで比較します)。 |
display user name in privileged execution |
|
show reference dialog for edit mode |
エンティティの参照画面を開く際に編集可能モードで開くかを指定します。 |
show reference dialog from name property |
抽出項目として「name」プロパティを指定した際に、参照画面のリンクを表示するかを指定します。 |
can CSV download |
条件編集画面で「CSV Download」を利用できるかを指定します。 |
CSV multiple format |
CSVファイルダウンロード時の多重度が複数のプロパティの出力形式を指定します。
|
CSV file name format |
CSVファイルダウンロード時のファイル名をGroovyTemplate書式を利用して指定します。 詳細はCSV file name formatを参照してください。 |
use property name in CSV header |
CSVヘッダに表示名ではなくプロパティ名を出力します。 |
Custom ViewScript |
条件編集画面内に埋め込むカスタムコード(HTML)を設定できます。GroovyTemplateとして定義します。 |
Custom JavaScript |
条件編集画面にJavaScriptコードを埋め込みます。 |
Query interrupter class name |
実際に検索が実行される直前に、実行するEQLをカスタママイズするためのクラスを指定します。 詳細はQuery Interrupterを参照してください。 |
CSVファイルダウンロード時のファイル名をGroovyTemplate書式を利用して指定します。 フォーマットが指定されている場合、ボタンに「(*)」が表示されます。 また、/とスペースについては、_(アンダースコア)に変換します。
利用可能なバインド変数は、編集ダイアログの「Notes」を参照してください。
${csvName}_${yyyy}${MM}${dd}${HH}${mm}${ss}
<%
def fileName = entityDisplayName;
if (savedListName != null) {
fileName = savedListName + "_" + entityDisplayName;
}
%>
${fileName}_${yyyy}${MM}${dd}${HH}${mm}${ss}
パフォーマンス改善などの目的で、実際に検索を行う直前のEQLをカスタマイズすることが可能です。 以下のQueryInterrupterを実装したJavaクラスまたはUtilityClassを指定します。
org.iplass.mtp.view.entitylisting.QueryInterrupter
EntityListingの検索では、ページング制御のための件数取得と実際のデータ検索の2回EQLが実行されます。 QueryInterrupterではこの直前にEQLをカスタマイズする処理を追加することができます。
スナップショットとして保存されたリストの場合は実行されません。 |
メソッド | 引数 | 戻り値 | 処理内容 |
---|---|---|---|
beforeCount |
QueryContext |
void |
件数取得前処理を行います。 |
beforeSearch |
QueryContext |
void |
検索前処理を行います。 |
afterSearch |
Object[] |
void |
検索後処理を行います。afterSearchでは1レコード毎に処理が呼ばれます。 |
QueryContext |
package sample.entitylisting;
import org.iplass.mtp.entity.query.Query;
import org.iplass.mtp.entity.query.hint.CacheHint;
import org.iplass.mtp.entity.query.hint.CacheHint.CacheScope;
import org.iplass.mtp.entity.query.hint.TimeoutHint;
import org.iplass.mtp.view.entitylisting.QueryContext;
//実装するIF定義
import org.iplass.mtp.view.entitylisting.QueryInterrupter;
//サンプル用
import org.iplass.mtp.auth.User;
public class SampleQueryInterrupter implements QueryInterrupter{
//beforeCountとbeforeSearchで渡されるQueryContextはインスタンスが異なります
@Override
public void beforeCount(QueryContext context) {
//QueryContextからQueryを取得
Query query = context.getQuery();
//(例)Queryに対してCacheHintを指定
query.hint(new CacheHint(CacheScope.GLOBAL, 60));
System.out.println("interrupt result:" + query.toString());
//(例)Entity権限における限定条件の除外設定
setWithoutConditionReferenceName(context);
}
@Override
public void beforeSearch(QueryContext context) {
//QueryContextからQueryを取得
Query query = context.getQuery();
//(例)Queryに対してCacheHint、TimeoutHintを指定
query.hint(new CacheHint(CacheScope.GLOBAL, 60))
.hint(new TimeoutHint(120));
System.out.println("interrupt result:" + query.toString());
//QueryContextからはEntityListing定義名、エンティティ名も取得可能
System.out.println("target entity listing definition name:" + context.getDefinitionName());
System.out.println("target entity definition name:" + context.getEntityName());
//(例)Entity権限における限定条件の除外設定
setWithoutConditionReferenceName(context);
}
@Override
public void afterSearch(Object[] data, QueryContext context) {
//(例)Userエンティティに対してメールアドレスを検索された場合、値を置き換える
if (context.getEntityName().equals(User.DEFINITION_NAME)) {
//Select句にメールアドレスが含まれる場合(含まれない場合はnull)
if (context.getSelectIndex(User.MAIL) != null) {
//Select句に同じプロパティを複数指定可能なので配列で返ってくるので、返ってきた分置き換える
for (int index : context.getSelectIndex(User.MAIL)) {
data[index] = "*****";
}
}
}
}
/**
* Entity権限における限定条件の除外設定
*/
private void setWithoutConditionReferenceName(QueryContext context) {
//QueryContextに対してWithoutConditionReferenceNameとしてEntity権限における限定条件を除外するプロパティを指定することができる
//EntityListingは対象Entityを選択可能なためデフォルト設定のInterrupterで処理する場合はEntity名をチェック
//Entity別にInterrupterを定義している場合は特にチェック不要
//対象EntityがUserの場合
if (context.getEntityName().equals(User.DEFINITION_NAME)) {
//groupsとrankのEntity権限における限定条件を除外
context.setWithoutConditionReferenceName(User.GROUPS, User.RANK);
}
}
}
Custom Setting
Default Settingではなく、エンティティ個別に設定を行いたい場合に指定します。
設定項目 | 設定値 |
---|---|
Target |
参照可能なエンティティを選択します。対象外のエンティティを参照しようとした場合は権限エラーとなります。
1つも選択されていない場合は、Default Settingの |
DisRoot |
|
Custom |
個別に |
個別にプロパティなどを絞り込みたい場合は、対象のエンティティをダブルクリックしてください。 右側にエンティティごとの設定項目が表示されます。
Entity Custom Setting
設定項目 | 設定値 |
---|---|
exclude inherited properties |
選択可能なプロパティとして継承プロパティを除外します。 下のプロパティ選択部分で1件でも選択されている場合は、そちらが優先されます。 |
handle inherited user property as name |
エンティティの「作成者」、「更新者」、「ロックユーザー」を名前で扱います。 |
display user name in privileged execution |
|
show reference dialog for edit mode |
エンティティの参照画面を開く際に編集可能モードで開くかを指定します。 |
show reference dialog from name property |
抽出項目として「name」プロパティを指定した際に、参照画面のリンクを表示するかを指定します。 |
View Name |
エンティティの参照画面を開く際のView名をGroovyTemplate書式を利用して指定します。 詳細はView Nameの指定を参照してください。 |
CSV file name format |
CSVファイルダウンロード時のファイル名をGroovyTemplate書式を利用して指定します。 「Default Setting」と同様です。 |
Without Condition Reference |
Entity権限における限定条件を適用せずに検索を実行する参照先プロパティ名を設定します。特権実行する場合、または |
Query interrupter class name |
実際に検索が実行される直前に、実行するEQLをカスタママイズするためのクラスを指定します。 未指定の場合は「Default Setting」の設定が有効になります。 詳細はQuery Interrupterを参照してください。 |
Propertyリスト |
選択可能としたいプロパティをチェックしてください。 |
エンティティの参照画面を開く際のView名をGroovyTemplate書式を利用して指定します。 値が設定されている場合、ボタンに「(*)」が表示されます。
利用可能なバインド変数は、編集ダイアログの「Notes」を参照してください。
opeView
<%@import org.iplass.mtp.entity.Entity %>
<%
def viewName = "XXXXXXXXX";
%>
${viewName}
検索結果のリンク表示時には、表示対象データのOIDが「oid」としてバインドされています。 Filter条件としてReferenceを指定した場合の参照時はOIDはバインドされません。
3.3. 表示方法
メニューへの登録
条件設定画面を表示するにはメニューにActionMenuItemを登録します。
ActionMenuItemには雛型として gem/template/entitylisting/ViewEntityListingAction
というメニューアイテムがあります。
このActionMenuItemをコピーしてメニューアイテムを編集してください。
項目 | 設定値 |
---|---|
Name |
管理しやすいように設定してください。 |
DisplayName |
メニューの表示名になります。 |
Execute Action |
|
Parameter |
|
※EntityListingメタデータが1つでも登録されている場合は、雛形の ViewEntityListingAction
から起動しようとするとエラーが発生します。
もしEntityListingメタデータ定義を1件でも作成した場合は、必ずパラメータに defName
を指定してください。
4. 保存リスト
保存リスト(SavedList)は、EntityListingや定型集計・簡易BIのローデータを保存、復元する機能です。
画面左側のWidget表示エリアに表示されます。
- 保存リスト
-
他のユーザーが保存している、かつ公開されているデータも含めて表示されます。
- 所有リスト
-
自分で保存したデータが表示されます。 こちらはフォルダ形式ではありません。
データを選択することで、右側に詳細画面が表示されます。
Top画面に表示されます。
保存リストと、所有リストがタブで表示されます。 フォルダの作成や名前変更、削除、保存データの名前変更、削除が可能です。 フォルダや保存データを編集する機能はPartsでのみ提供しています。
所有するリスト
については、Parts上で 共有
、 他者編集
のON・OFFを設定することができます。
4.1. 設定
TopViewのSavedListパーツでは以下の設定が可能です。
設定項目 | 設定値 | ||
---|---|---|---|
Title |
タイトルをカスタマイズする場合に設定します。 |
||
Icon Tag |
Fontawsomeによるアイコンタグを設定します。 |
||
Class |
スタイルシートのクラス名を指定します。複数指定する場合は半角スペースで区切って下さい。 |
||
visible to top view |
PartsをTop画面に表示するかを設定します(デフォルト:表示) |
||
can delete other user saved list |
他のユーザーが保存したデータを削除可能かを設定します(デフォルト:不可) |
||
can create folder |
フォルダを作成可能かを設定します(デフォルト:可) |
||
can delete folder |
フォルダを削除可能かを設定します(デフォルト:不可) |
||
can save snapshot type |
スナップショットとして保存可能かを設定します(デフォルト:可) |
||
can csv download |
CSV Downloadが可能かを設定します(デフォルト:可) |
||
can direct csv download |
保存リストの一覧画面から直接CSV Downloadを許可するかを設定します(デフォルト:不可)
|
||
run a search when loading detailed data |
保存リストを表示する際に、初期検索を行うかのデフォルト値を設定します。 |
||
link action mode |
保存データのリンクをクリックした際に、ダイアログで表示するか画面遷移するかを指定します(デフォルト:ダイアログ) |
||
Interrupter Class |
保存リスト上のフォルダやアイテムの表示制御をカスタマイズしたい場合に、カスタマイズ処理を実装したJavaクラスまたはUtilityClassを指定します。
指定するClassは |
||
Edit Custom ViewScript |
保存リストの保存画面内に埋め込むカスタムコード(HTML)を設定できます。GroovyTemplateとして定義します。 |
4.2. 表示方法
メニューへの登録
TopViewの一部としてではなく、専用の保存リスト画面を表示したい場合は、保存リスト画面表示用のActionを利用します(メニューにActionMenuItemを登録します)。
フォルダの作成や他ユーザーの作成したデータの削除など、標準動作を変更しない場合は、ActionMenuItemにあらかじめ登録されている ViewSavedListAction
という雛型のメニューアイテムをメニューに追加してください。
この設定によりメニューに 保存リスト
が追加され、保存リスト画面を起動することができます。
標準動作を変更したい場合、ActionMenuItemをコピーし、下記パラメータを指定する必要があります。
Key | 設定値 |
---|---|
listingTitle |
画面タイトルをカスタマイズする場合に設定します。 |
canCreateFolder |
フォルダを作成可能かを設定します(デフォルト:true) |
linkActionMode |
保存データのリンクをクリックした際に、画面遷移するかを指定します(デフォルト:DIALOG) |
TopViewでの表示
TopViewの一部として保存リストを表示させたい場合は、以下のようにItemをドロップしてください。
Widget、Parts、または両方を設定することができます。 この設定によりTop画面から保存されたデータを参照することができます。
4.3. カスタム処理の組み込み
保存リスト上に表示されるフォルダやアイテムの表示制御や、変更、削除などの更新制御はEntity権限により制御されます。 カスタム処理を実装することでEntity権限での制御に加えてユーザーごとやフォルダごとの詳細なカスタマイズが可能になります。
以下のインターフェースを実装したJavaクラスまたはUtilityClassを作成してください。
作成したクラスを保存リストパーツの Interrupter Class
に指定します。
org.iplass.mtp.view.top.parts.listing.SavedListInterrupter
メソッド | 引数 | 戻り値 | 処理内容 |
---|---|---|---|
needFolderPathInfo |
- |
boolean |
権限チェック時にフォルダ情報を必要とするかを返します。
|
getPermission |
folder : SavedListFolder |
SavedListFolderPermission |
フォルダに対する権限を返します。
ルートの場合は |
path :List<SavedListFolder> |
|||
getPermission |
savedList : SavedList |
SavedListPermission |
アイテムに対する権限を返します。
|
path :List<SavedListFolder> |
SavedListInterrupter
上、全ての処理に対してデフォルト実装されています。
必要に応じてオーバーライドします。
package sample.listing;
import org.iplass.mtp.listing.SavedList;
import org.iplass.mtp.listing.SavedListFolder;
import org.iplass.mtp.view.top.parts.listing.SavedListFolderPermission;
import org.iplass.mtp.view.top.parts.listing.SavedListInterrupter;
import org.iplass.mtp.view.top.parts.listing.SavedListPermission;
import org.iplass.mtp.auth.AuthContext;
public class SampleSavedListInterrupter implements SavedListInterrupter {
@Override
public boolean needFolderPathInfo() {
//権限チェックの判断でフォルダ情報が欲しい場合はtrue
//trueの場合、引数でルートからのパス情報が渡される
return true;
}
@Override
public SavedListFolderPermission getPermission(SavedListFolder folder, List<SavedListFolder> path) {
//Adminは全て許可
if (AuthContext.getCurrentContext().getUser().isAdmin()) {
return SavedListFolderPermission.ALL_PERMIT;
}
if (folder == null) {
//ルートフォルダは参照のみ
return new SavedListFolderPermission(true, false, false, false, false);
}
if (folder.getName().equals("test")) {
//testフォルダは非表示
return SavedListFolderPermission.NO_PERMIT;
}
//pathを利用して階層による制御
if (path == null) {
//1階層目は「Public」の場合はフォルダ作成、アイテム作成許可
if (folder.getName().equals("Public")) {
return new SavedListFolderPermission(true, false, false, true, true);
} else {
//それ以外は参照のみ
return new SavedListFolderPermission(true, false, false, false, false);
}
}
//2階層以上の場合、一階層目が「Public」であれば、全て許可
if (path.get(0).getName().equals("Public")) {
return SavedListFolderPermission.ALL_PERMIT;
} else {
//それ以外は参照のみ
return new SavedListFolderPermission(true, false, false, false, false);
}
}
@Override
public SavedListPermission getPermission(SavedList savedList, List<SavedListFolder> path) {
//Adminは全て許可
if (AuthContext.getCurrentContext().getUser().isAdmin()) {
return SavedListPermission.ALL_PERMIT;
}
if (savedList.getFolder() == null) { // またはpath == null
//ルートフォルダ直下のアイテムは非表示
return SavedListPermission.NO_PERMIT;
}
if (savedList.getFolder().getName().equals("test1")) {
//test1フォルダのアイテムは参照のみ
return new SavedListPermission(true, false, false);
}
//pathを利用して階層による制御
//2階層以上の場合、一階層目が「Public」であれば、全て許可
if (path.get(0).getName().equals("Public")) {
return SavedListPermission.ALL_PERMIT;
} else {
//それ以外は参照のみ
return new SavedListPermission(true, false, false);
}
}
}