【ViewCreator】検索にヒットした件数を取得する関数の作り方。

このCookBookでは、ViewCreatorで検索にヒットした件数を取得する関数の作り方についてご紹介します。

ユーザ定義関数についての詳細は下記のドキュメントを参照してください。
ViewCreator 管理者操作ガイド - ユーザ定義関数

完成イメージ

新しい関数(CURRENTCOUNT)が追加され、利用可能になります。
以下は、リスト集計のヘッダに「検索にヒットした件数 / 総件数」を表示する例です。

リスト集計のデータ参照編集画面。

実行結果

完成サンプル

以下の完成サンプルをダウンロードしてご活用ください。

e builder プロジェクト : im_cookbook_114393.zip
imm ファイル : im_cookbook_114393-8.0.0.imm

注意
im_cookbook_114393-8.0.0.immには、viewcreator-function-config.xmlは含まれません。
レシピの手順を参考にして、追加設定してください。

レシピ

  1. jp.co.intra_mart.foundation.viewcreator.formula.FunctionImplementationインタフェースを実装したクラスを作成する。
  2. WEB-INF/conf/viewcreator-function-config.xml に上記のクラスを登録する。
  3. アプリケーションサーバを再起動する。
1. jp.co.intra_mart.foundation.viewcreator.formula.FunctionImplementationインタフェースを実装したクラスを作成する。

次の3つのメソッドを実装します。

  1. init
    関数の初期化処理

  2. getName
    関数名の取得

  3. execute
    関数実行時に呼び出される処理

public class FunctionCurrentCount implements FunctionImplementation, Only4RDBFunction {

    private ViewCreatorData data;

    @Override
    public void init(final ViewCreatorData data) {
        this.data = data;

        // 全件取得するために、リスト集計でグループ化がセットされている場合は解除しておく
        final ListDataView view = data.getView();

        if (view.getPattern() == DataView.PATTERN_LIST) {
            for (final ListColumn listColumn : view.getColumns()) {
                if (listColumn.getType() == ListColumn.TYPE_GROUP) {
                    // タイプの設定を無しにする
                    listColumn.setType(ListColumn.TYPE_NONE);
                }
            }
        } else {
            // サマリ集計の場合は、グループ化の設定を解かないように上記処理をスキップします
        }
    }

    @Override
    public String getName() {
        // 関数名
        return "CURRENTCOUNT";
    }

    @Override
    public FixedValue execute(final Arguments args) throws FunctionExecuteException {

        // 画面から入力された検索条件やソートの状態を取得
        final ListDataViewParameters params = this.data.getParams();
        // データ参照の定義情報を取得
        final ListDataView view = this.data.getView();
        // クエリの定義情報を取得
        final VCQuery query = this.data.getQuery();

        // 画面からの入力値や定義情報を元に全件取得するSQLを生成
        final String selectSql;
        try {
            selectSql = DataViewManager.generateSql4List(params, view, query, false);
        } catch (final QueryException | SQLException e) {
            throw new FunctionExecuteException(e);
        }

        // 生成されたSQLをCOUNT関数のSELECTで包む
        final StringBuilder countSql = new StringBuilder("");
        countSql.append("SELECT COUNT(*) AS CNT FROM (");
        countSql.append(selectSql);
        countSql.append(") _IM_VC_COOKBOOK_114393");

        // SQLを実行しCOUNT関数の結果を取得する
        final int currentCount;
        try (final Connection con = VCTMConnectionManager.getConnection(query.getDataSource());
                final PreparedStatement stmt = con.prepareStatement(countSql.toString())) {
            final ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                currentCount = rs.getInt("CNT");
            } else {
                throw new FunctionExecuteException("fail");
            }
        } catch (final SQLException e) {
            throw new FunctionExecuteException(e);
        }

        // COUNT関数の結果を数値型で返却
        return new FixedNumber(currentCount);
    }

}

 

2. WEB-INF/conf/viewcreator-function-config.xml に上記のクラスを登録する。

関数の実装クラスを設定ファイルに登録します。

<?xml version='1.0' encoding='UTF-8' ?>
<viewcreator-function-config
xmlns="http://jp/co/intra-mart/foundation/viewcreator-function"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jp/co/intra-mart/foundation/viewcreator-function http://jp/co/intra-mart/foundation/viewcreator/viewcreator-function-config.xsd">
  <function-config>
    <class-name>jp.co.intra_mart.cookbook_114393.FunctionCurrentCount</class-name>
  </function-config>
</viewcreator-function-config>

3. アプリケーションサーバを再起動する。

サーバ再起動後、追加した新しい関数の利用が可能になります。