0

短い質問:

実行時にグループ化条件を変更できるグループがあります (詳細については、以下の長い質問を参照してください)。グループの現在の値をグループ ヘッダー/フッターに表示できますか (例: ブランチごとのグループ - ブランチ名の表示、クライアントごとのグループ - クライアント名など)。

長い質問:

ユーザーがその場でグループ化条件を変更できるようにしたいと考えています。これは、次の 2 つの方法で比較的簡単に実現できます。

  1. BIRT 設計時 API 経由 (適切な行/データセット列の値をグループ化するために渡します)。
  2. レポート パラメータ経由。データセットの列名をパラメーター値として渡し、グループ条件で次のように使用します

    eval(params["groupColumnName"].value)

私の問題は、現在のグループの値をグループ ヘッダーに表示する必要があることです (グループ フッターでもそれを繰り返すとよいでしょう)。

オプション1でそれを達成する方法がわかりません(設計時API)。

オプション 2. の場合、グループ ヘッダー/フッターで 2. から Java スクリプトを繰り返すことができますが、それは私が達成したいことではありません。その面倒な Java スクリプトを 2 ~ 3 回繰り返したくありません。その値をグループ レベル (グループの名前付きクエリなど) で定義し、後でグループ条件、ヘッダー、フッターで再利用できますか?

可能性のある BIRT は、グループ名でグループ化の現在の値を表示できますか?

どんな考えでも大歓迎です。

4

2 に答える 2

2

オプション 2 は、次の 2 つの方法のいずれかで実現できます。

  1. パラメータを評価する式を使用して計算列をデータセットに追加し、必要に応じてレポートで計算列をグループ化/含めます。
  2. SQL データソースを使用している場合は、クエリの SELECT 句に新しいフィールドを CASE WHENパラメータ値として追加し、必要に応じて新しいフィールドをグループ化するか、レポートに含めます。
于 2012-06-02T09:53:39.830 に答える
0

私がやったこと - DataItem と TextItem の API を介してグループ ヘッダー/フッターを変更します。

誰かが今私の回避策をしたい場合に備えて:

    private static void processRowHandle(SlotHandle pSlotHandle, ReportGroup pGroupInfo) throws SemanticException {
    if (pSlotHandle == null) return;
    for(Object obj : pSlotHandle.getContents()){
        if (obj instanceof RowHandle){
            SlotHandle cells = ((RowHandle)obj).getCells();
            if (cells == null) continue;
            for(Object item : cells.getContents()){
                if (item instanceof CellHandle){
                    SlotHandle content = ((CellHandle)item).getContent();
                    if (content == null) continue;
                    for(Object cell : content.getContents()){
                        if (cell instanceof DesignElementHandle) processGroupLabels((DesignElementHandle) cell, pGroupInfo);
                    }
                }
            }
        }
    }
}

private static void processGroupLabels(DesignElementHandle pElementHandle, ReportGroup pGroupInfo) throws SemanticException {
    if (pElementHandle instanceof DataItemHandle){
        DataItemHandle dataItemHandle = (DataItemHandle)pElementHandle;
        if (pGroupInfo.getOldBindingName().equals(dataItemHandle.getResultSetColumn())){
            dataItemHandle.setResultSetColumn(pGroupInfo.getNewColumn().getBindingNameText());
        }
    }
    if (pElementHandle instanceof TextItemHandle){
        String newColumnBindingText = ExpressionUtil.createRowExpression(pGroupInfo.getNewColumn().getBindingNameText());
        String content = ((TextItemHandle)pElementHandle).getContent().replace(pGroupInfo.getOriginalExpression(), newColumnBindingText);
        ((TextItemHandle)pElementHandle).setContent(content);
    }
}
于 2012-07-12T05:31:08.593 に答える