5.2. 検索¶
本項では、検索機能の機能詳細を説明します。
5.2.1. クライアントサイド¶
5.2.1.1. 検索機能の使用方法¶
検索機能は、検索機能用のタグライブラリからを使用します。検索機能用のタグライブラリの詳細は次の通りです。
タグライブラリの設定検索機能を使用するためには、次のタグライブラリの設定を読み込んでください。<%@ taglib prefix="k_generic" uri="http://kaiden.slcs.co.jp/taglib/v2/generic" %> タグライブラリの実装サンプル勘定科目マスタの検索機能を使用する場合のサンプルです。<k_generic:master masterId="account" extensionId="${extensionId}" searchType="search" mode="0" name="accountCd" viewName="accountName" surfaceKey="" criteria="{'searchCriteriaCompany':'searchCriteriaCompany', 'searchCriteriaDate':'searchCriteriaDate', 'searchCriteriaLocale':'searchCriteriaLocale', 'accountCd':'accountCd', 'includeDisabled':'true', 'includeBlank':'true'}" resultChain="{'accountCd':'accountCd', 'accountName':'accountName'}" resultValue="accountName" primaryTarget="accountCd" refreshTarget="searchCriteriaCompany,searchCriteriaDate,searchCriteriaLocale" gadgetId="${gadgetId}" gadgetBlockId="${blockId}" style="width:200px;" />注意
検索機能用のタグライブラリは、必ずガジェット内に実装してください。 タグライブラリの属性値検索機能用のタグライブラリでは、次の属性を設定します。
属性名 説明 必須 masterId 対象マスタのマスタIDを設定します。 ○ extensionId マスタ拡張IDを設定します。本属性は任意設定となりますが、カスタマイズ性を考慮して任意の値設定を推奨します。属性値は、使用箇所のガジェットIDなどを設定し、他の使用箇所と重複しないように設定してください。 searchType 検索タイプを設定します。未設定の場合は対象マスタのMasterBuilder定義から検索タイプを取得します。
search (検索部品) select (セレクトボックス) radio (ラジオボタン) mode 表示モードを設定します。
0 (「input」エレメントを生成します。) 1 (「label」エレメントを生成します。) ○ name コード項目の「name」属性を設定します。検索機能の検索タイプにより使用方法が異なります。
検索部品検索タイプが「SEARCH(検索部品)」の場合は、コード設定用と名称設定用の2つのテキストボックスを生成します。本属性に設定した値は、コード設定用テキストボックスの「name」属性となります。コード設定用テキストボックスは、隠し項目(Hidden)となるため、後述の「resultChain」を使用し値を設定してください セレクトボックス検索タイプが「SELECT(セレクトボックス)」の場合は、コード設定用のセレクトボックスと名称設定用のテキストボックスを生成します。本属性に設定した値は、コード設定用テキストボックスの「name」属性となります。 ラジオボタン検索タイプが「RADIO(ラジオボタン)」の場合は、ラジオボタンとラベルを検索結果分生成します。本属性に設定した値に「_radio」を付与した値が、ラジオボタンの「name」属性となります。 ○ viewName 名称項目の「name」属性を設定します。検索機能の検索タイプにより使用方法が異なります。
検索部品検索タイプが「SEARCH(検索部品)」の場合は、コード設定用と名称設定用の2つのテキストボックスを生成します。本属性に設定した値は、名称設定用テキストボックスの「name」属性となります。 セレクトボックス検索タイプが「SELECT(セレクトボックス)」の場合は、コード設定用のセレクトボックスと名称設定用のテキストボックスを生成します。本属性に設定した値は、名称設定用テキストボックスの「name」属性となります。名称設定用テキストボックスは、隠し項目(Hidden)となるため、後述の「resultChain」を使用し値を設定してください ラジオボタン使用されません。 ○ surfaceKey 項目名用のサーフィスキーを設定します。(エラーメッセージなどで使用します。)サーフィスキーを設定することで、プロパティファイルから文字列を取得します。サーフィス定義に存在しないキーの場合は、設定された内容をそのまま出力します。 criteria 対象マスタへの検索条件を設定します。形式 : criteria="{'%キー%':'%値%', '%キー%':'%値%', ...}"「%キー%」には、次の様な内容を設定します。
検索基準会社コード(searchCriteriaCompany)会社化特性のマスタの場合は、必須となります。 検索基準日(searchCriteriaDate)未設定、または値が空の場合はシステム日付が補完されます。 検索基準ロケール(searchCriteriaLocale)未設定、または値が空の場合はログインユーザのロケールが補完されます。 無効データ対象有無(includeDisabled)未設定、または値が空の場合は無効なマスタデータを検索対象としません。 空白行設定有無(includeBlank)検索タイプが「SELECT(セレクトボックス)」の場合のみ有効となります。未設定、または値が空の場合はセレクトボックスに空白行を作成しません。 その他上記の他に対象マスタの主キーや任意のデータが設定可能です。検索機能では、設定された検索条件を、すべてマスタ検索用SQLに引き渡します。「%値%」には、次の様な内容を設定します。
エレメントの「name」属性「%値%」と同じ「name」属性が設定されたエレメントの「value」属性に設定された値に補完します。 固定値「true/false」や文字列などが設定可能です。 ○ resultChain マスタデータ選択時に、複数のエレメントの「value」に設定するデータのキーを設定します。形式 : resultChain="{'%設定項目の「name」属性値%':'%データの項目名%', '%設定項目の「name」属性値%':'%データの項目名%', ...}"「%データの項目名%」に設定可能な値は、各タグライブラリの説明を参照してください。 resultValue 検索機能の検索タイプにより使用方法が異なります。
検索部品対象選択時に名称項目の「value」属性に設定するデータの項目名を設定します。「%データの項目名%」に設定可能な値は、各タグライブラリの説明を参照してください。 セレクトボックス使用されません。 ラジオボタン画面表示時の初期値のコードを設定します。ただし、明細行でラジオボタンを使用する場合は初期値の設定がされません。初期値の設定が不要の場合、当項目の設定は不要です。 primaryTarget 検索タイプがSEARCH (検索部品)の場合のみ使用されます。検索結果の検索有無を判定するエレメントの「name」属性値を設定します。 ○ refreshTarget 値が変更された場合に再検索を行うエレメントの「name」属性値を設定します。形式 : refreshTarget="%エレメントの「name」属性値%, %エレメントの「name」属性値%, ..."設定するエレメントは、本タグライブラリを内包するガジェットと同じガジェットに内包されるエレメントのみとなります。後述のガジェットID(gadgetId)ブロックID(gadgetBlockId)が設定されていない場合は、再検索は行われません。 gadgetId 本タグライブラリを内包するガジェットのガジェットIDを設定します。「refreshTarget」に設定されたエレメントの値が更新された場合の再検索用スクリプトで使用します。 gadgetBlockId 本タグライブラリを内包するガジェットのブロックIDを設定します。「refreshTarget」に設定されたエレメントの値が更新された場合の再検索用スクリプトで使用します。コラム
本項に記載していない属性(style,classなど)も、通常のエレメントと同様に設定可能です。コラム
ラジオボタンの検索タイプは、検索結果に紐づくデータがラジオボタンですべて表示されるため、検索結果が少数で固定のマスタに対して使用することを推奨します。注意
検索タイプ(searchType)が未設定の場合、検索タイプを正常に取得できない場合があります。検索タイプ(searchType)を必ず設定してください。
5.2.1.2. 初期値の指定方法¶
検索タイプ(searchType)を設定しない場合、対象マスタのMasterBuilder定義から検索タイプを取得します。タグライブラリによって生成されるエレメントは動的に変化しますので、初期値設定を行う場合は注意が必要です。コラム
初期値設定方法の違い
検索部品コード項目に値(初期値や再検索時の値)を設定後に再検索を実行します。再検索処理は以下のJavaScriptファンクションを利用してください。KAIDEN.MasterSearch.refresh(accessor(/**HtmlElement*/target, /**boolean*/isDistrustful);
引数 説明 target 再検索を行うエレメントを設定します。 isDistrustful データベースから値を取得するか否かを設定します。「true」が指定されている場合は、マスタデータをデータベースから取得します。「true」以外が指定されている場合は、マスタデータをデータベースから取得しません。(タグライブラリの「primaryTarget」属性で選択状態を設定します。) セレクトボックス再検索後に、コード項目に値(初期値や再検索時の値)を設定します。再検索処理は以下のJavaScriptファンクションを利用してください。KAIDEN.SelectListData.refresh(/**HtmlElement*/target, /**Object*/data, /**boolean*/isSingle);
引数 説明 target 再検索を行うエレメントを設定します。 data 再検索時に使用する検索条件(Map形式)を設定します。 isSingle 再検索を指定エレメントのみにするか否かを設定します。「true」が指定されている場合は、指定エレメントの「Option」タグ(選択肢)に再検索結果を設定します。「true」以外が指定されている場合は、指定エレメントと同じリストデータを使用しているエレメントの「Option」タグ(選択肢)に再検索結果を設定します。 ラジオボタンタグライブラリの属性値「resultValue」に値を設定すると初期値が設定されます。ラジオボタンを明細行で設定する場合、「resultValue」に値を設定しても初期値が設定されません。コード項目(「name」属性に「_radio」を付与した値)に値(初期値)を設定します。タグライブラリによって生成されたエレメントの検索タイプを判定するためには、タグライブラリによって生成されたエレメント(コード項目)の「data-kaiden-tag-type」属性の値を使用します。タグライブラリによって生成されたエレメントがラジオボタンの場合、「data-kaiden-tag-type」属性の値は設定されません。
属性値 検索タイプ search タグライブラリによって生成されたエレメントが検索部品の場合に設定されます。 select タグライブラリによって生成されたエレメントがセレクトボックスの場合に設定されます。実装サンプル上記を踏まえ、タグライブラリによって生成されたエレメントの初期値を設定する場合は、次の様に実装します。var accessor = KAIDEN.getGadget("${gadget_id}").blockAccessors["${block_id}"]; // 対象のコード項目から検索タイプ(属性「data-kaiden-tag-type」の値に設定される)を取得 var tagType = accessor("${sample_code}").elem().attr("data-kaiden-tag-type"); // 検索タイプ別の処理を実装(search:検索部品、select:セレクトボックス) if(tagType == "search"){ // 対象のコード項目に初期値を設定 accessor("${sample_code}").setValue("${xxxxx}"); // 検索部品のリフレッシュ(再検索)を実行 KAIDEN.MasterSearch.refresh(accessor("${sample_name}").elem(), true); } else if(tagType == "select"){ // セレクトボックスのリフレッシュ(再検索)を実行 KAIDEN.SelectListData.refresh(accessor("${sample_code}").elem()); // 対象のコード項目に初期値を設定 accessor("${sample_code}").setValue("${xxxxx}"); } else if(accessor("${sample_code}" + "_radio").elem(true).length > 0){ // 対象のコード項目に初期値を設定(ラジオボタン) accessor("${sample_code}" + "_radio").setValue("${xxxxx}"); }
値 説明 ${gadget_id} 対象のタグライブラリを内包するガジェットID ${block_id} 対象のタグライブラリを内包するブロックID ${sample_code} コード項目の「name」属性(name) ${sample_name} 名称項目項目の「name」属性(viewName) ${xxxxx} 初期値(コード)
5.2.1.3. 関連エレメントの値変更時の再検索方法¶
検索基準日や検索基準会社の変更に伴い、検索部品やセレクトボックスの検索結果を変更したい場合は、タグライブラリの「refreshTarget」「gadgetId」「gadgetBlockId」を設定することで、再検索を行うJavaScriptを生成します。生成されるJavaScriptは次を参照してください。
各値解説
値 説明 ${gadget_id} 対象のタグライブラリを内包するガジェットID ${block_id} 対象のタグライブラリを内包するブロックID ${sample_code} コード項目の「name」属性(name) ${sample_name} 名称項目項目の「name」属性(viewName) ${xxxxx}、${yyyyy} 値が変更された場合に、再検索を行うエレメントの「name」属性
タグライブラリ<k_generic:master masterId="sample" mode="0" name="${sample_code}" viewName="${sample_name}" surfaceKey="" criteria="{'sampleCd':'${sample_code}'}" resultChain="{'${sample_code}':'sampleCd', '${sample_name}':'sampleName'}" resultValue="sampleName" primaryTarget="${sample_code}" refreshTarget="${xxxxx},${yyyyy}" gadgetId="${gadget_id}" gadgetBlockId="${block_id}" /> 生成されるJavaScript検索部品の場合jQuery(function($){ KAIDEN.gadgetMan.pushPostInitialize("${gadget_id}", function() { var _accessor = KAIDEN.getGadget("${gadget_id}").blockAccessors["${block_id}"]; _accessor("${xxxxx}").elem(true).on("change", function(e) { KAIDEN.MasterSearch.refresh(_accessor("${sample_name}").elem(true), true); }); _accessor("${yyyyy}").elem(true).on("change", function(e) { KAIDEN.MasterSearch.refresh(_accessor("${sample_name}").elem(true), true); }); }); });セレクトボックスの場合jQuery(function($){ KAIDEN.gadgetMan.pushPostInitialize("${gadget_id}", function() { var _accessor = KAIDEN.getGadget("${gadget_id}").blockAccessors["${block_id}"]; _accessor("${yyyyy}").elem(true).on("change", function(e) { KAIDEN.SelectListData.refresh(_accessor("${sample_code}").elem(true)); }); _accessor("${xxxxx}").elem(true).on("change", function(e) { KAIDEN.SelectListData.refresh(_accessor("${sample_code}").elem(true)); }); }); });注意
「primaryTarget」に指定するエレメントはタグライブラリと同じガジェット、およびブロック内に存在する必要があります。他のガジェットやブロックに存在するエレメントを使用したい場合は、値変更に伴う再検索処理を実装してください。注意
タグライブラリがTMTable(明細)に含まれる場合は、再検索用のJavaScriptは生成できません。TMTableに含まれる場合は、値変更に伴う再検索処理を実装してください。
5.2.1.4. 明細でセレクトボックス利用時の注意点¶
本タグライブラリで生成したセレクトボックスを、明細テーブル(TMTable)内で使用する場合の注意点を説明します。セレクトボックスのリフレッシュ(再検索)を行う際に、次の2種類の方法があります。
同名のリストデータ(セレクトボックスの選択肢)をすべて更新 単一のエレメントのリストデータ(セレクトボックスの選択肢)を更新コラム
前項で解説した「関連エレメントの値変更時の再検索方法」の様に、関連エレメントの値変更に伴い明細テーブル(TMTable)内のセレクトボックスをリフレッシュする場合、関連エレメントの実装個所によって再検索方法を切り替える必要があります。後述の例では、次の様なマスタデータが登録されているものとして説明します。
サンプル会社 その他会社例)ヘッダー項目の値変更に合わせて、明細項目をリフレッシュヘッダー項目の値に合わせて明細のセレクトボックス(リストデータ)をリフレッシュする場合は、全てのリストデータをリフレッシュする必要があります。コラム
再検索処理のJavaScriptファンクションの第3引数に「true」以外(未設定も可能)を指定することで、第1引数に指定したエレメントと同じリストデータを利用しているエレメントがリフレッシュされます。KAIDEN.SelectListData.refresh(/**HtmlElement*/target, /**Object*/data, /**boolean*/isSingle);
ヘッダー項目(検索基準会社)を選択します。 明細のセレクトボックスを選択します。同様に他のセレクトボックスを選択します。 ヘッダー項目(検索基準会社)を変更します。変更に合わせて明細のセレクトボックスすべてがリフレッシュされ、未選択状態に変更されます。 再度、明細のセレクトボックスを選択すると、ヘッダー項目(検索基準会社)に合わせたリストデータが表示されます。例)同じ明細項目の値変更に合わせて、明細項目をリフレッシュ同じ明細項目の値変更に合わせて明細のセレクトボックス(リストデータ)をリフレッシュする場合は、各リストデータ毎にリフレッシュする必要があります。コラム
再検索処理のJavaScriptファンクションの第3引数に「true」を指定することで、第1引数に指定したエレメントのみリフレッシュされます。KAIDEN.SelectListData.refresh(/**HtmlElement*/target, /**Object*/data, /**boolean*/isSingle);
リフレッシュ元の項目(検索基準会社)を選択します。 リフレッシュ先のセレクトボックスを選択します。同様に他のセレクトボックスを選択します。 1行目のリフレッシュ元の項目(検索基準会社)を変更します。変更に合わせて1行目のセレクトボックスすべてがリフレッシュされ、未選択状態に変更されます。 再度、1行目のリフレッシュ先セレクトボックスを選択すると、リフレッシュ元の項目に合わせたリストデータが表示されます。他のセレクトボックスはリフレッシュしません。
5.2.2. サーバーサイド¶
5.2.2.1. Controller¶
検索部品からの検索処理では、「拡張設定」の「検索用の処理URL」に設定したURLから自動判定されます。(未設定の場合は「kaiden/v2/generic/masterSearch」を使用します。)セレクトボックス・ラジオボタンのリフレッシュ処理では、「拡張設定」の「セレクトボックス用の処理URL」に設定したURLから自動判定されます。(未設定の場合は「kaiden/v2/generic/masterSelect」を使用します。)Controllerクラスでは、Logicクラスの対象メソッド起動を行います。Controllerクラスのメソッドと主な起動処理は次の通りです。
処理名 メソッド 主な起動処理 マスタ検索 masterSearch 検索部品から検索処理実行時 リストデータ取得 masterSelect セレクトボックス・ラジオボタンのリフレッシュ時
5.2.2.2. Form¶
Controllerクラスへアクセスした際のリクエストパラメータは、Formクラス(jp.co.slcs.kaiden.v2.base.feature.form.kaiden.generic.MasterForm)に格納されます。Formクラスでは、マスタID、マスタ拡張ID、検索キーワードの他に、汎用的にデータを取得するためにJSON化したデータを保持しています。Controllerクラスの各メソッド呼出し時に格納されるJSONデータの内容は次の通りです。
マスタ検索(masterSearch)タグライブラリの属性値(criteria)に指定した値が設定されます。 リストデータ取得(masterSelect)タグライブラリの属性値(criteria)に指定した値が設定されます。
5.2.2.3. Logic¶
Logicクラスは、「拡張設定」の「Logicクラス」に設定したクラスを使用します。(未設定の場合は「jp.co.slcs.kaiden.v2.base.feature.logic.kaiden.generic.impl.MasterLogic」を使用します。)Logicクラスでは、検索処理を行います。Logicクラスのメソッドと主な処理内容次の通りです。
処理名 メソッド 主な処理 マスタ検索 masterSearch(GenericMasterSettings settings, AbstractMasterForm form) マスタ検索条件の生成と検索結果成型 リストデータ取得 masterSelect(GenericMasterSettings settings, AbstractMasterForm form) マスタ検索条件の生成と検索結果成型 コラム
上記クラスでは、検索条件の生成と検索結果の成型を行っており、実際の検索処理は、次のメソッドで実施しています。search(GenericMasterSettings settings, Map<String, Object> criteria)コラム
APIを使用したメンテナンス機能を実現する場合や、独自のロジックを追加する場合はLogicクラスの拡張を行います。Controllerクラスからの起動を想定するメソッドを追加する場合はControllerクラスの拡張が必要です。データの補完や成型を行いたい場合は、後述のConverterクラスの拡張でも対応可能です。Logicクラスの各メソッドへのリクエストパラメータやレスポンスパラメータに対してデータ補完や成型が可能です。
5.2.2.4. Manager¶
Managerクラスは、「拡張設定」の「Managerクラス」に設定したコンポーネントを使用します。(未設定の場合は「masterManager」を使用します。)Managerクラスでは、SQLを利用した検索やMirage-SQLを利用した登録・更新・削除処理を行います。基本的に拡張の必要はありませんが、標準のManagerクラスでは単一のテーブルに対して処理を実装しているため、複数のテーブルに跨る処理を実装する場合に拡張を行います。(検索時のJoinなどは複数テーブルに跨りますが、SQLで実現可能なため、拡張の必要はありません。)
処理名 メソッド 検索
select(GenerateService<? extends GenerateEntity> service, String sqlPath, Map<String, Object> criteria, int limit, int offset)
5.2.2.5. Converter¶
Converterクラスは、「拡張設定」の「Converterクラス」に設定したクラスを使用します。(未設定の場合はConverterクラスを使用しません。)Converterクラスでは、Logicクラスへのリクエストパラメータ、Logicクラスからのレスポンスパラメータに対し、補完や成型が行えます。設定を行わない場合は、補完や成型は行われません。
画面表示は%表記だが、データ上は数値として保持(80%→0.8) 固定値の補完 カンマ区切りへの変換注意
Converterクラスの処理は各データに対して行われるため、データベースの特定データを補完する場合はLogicクラスで実装を行ってください。Converterクラスに実装した場合、一覧検索のレスポンスデータの補完などで一覧行の各行単位で処理が行われるため、SQLを実行する様な処理では、複数回SQLが実行されてしまい、レスポンス悪化が懸念されます。
5.2.2.6. シーケンス¶
サーバーサイドの処理シーケンス(概要)は次の通りです。コラム
シーケンスに記載の「Controller」「Logic」「Manager」の実際のクラスは次の通りです。シーケンスの各処理は基底クラスで実装しています。
Controller基底クラス:jp.co.slcs.kaiden.v2.base.feature.controller.kaiden.generic.AbstractMasterController実装クラス:jp.co.slcs.kaiden.v2.base.feature.controller.kaiden.generic.MasterController Logic基底クラス:jp.co.slcs.kaiden.v2.base.feature.logic.kaiden.generic.AbstractMasterLogicBase実装クラス:jp.co.slcs.kaiden.v2.base.feature.logic.kaiden.generic.impl.MasterLogic ManagerIFクラス:jp.co.slcs.kaiden.v2.base.foundation.manager.generic_master.MasterManager基底クラス:jp.co.slcs.kaiden.v2.base.foundation.manager.generic_master.AbstractMasterManager実装クラス:jp.co.slcs.kaiden.v2.base.foundation.manager.generic_master.impl.MasterManagerImpl「Converter」は、「拡張設定」の「Converterクラス」に設定していない場合は実行されません。
マスタ検索(masterSearch)
リストデータ取得(masterSelect)