0

基本的に、データ制御クラスのgetData()メソッドから返されたデータのリストが入力されたADFテーブルを含む、いくつかのコンポーネントを含むJSFページがあります。表の上に、表示されたデータから計算された値を表示しようとしていますが、フィールド値が正しく表示されていません。

(JDev 11.1.1.5を使用しています)

データ制御クラスはRecentDealsと呼ばれ、getData()メソッドは、いくつかのフィールド(日付、値、名前など)を含むDealオブジェクトのリストを返します。

最近のDealsクラスには、テーブルの上に表示される計算された(平均)値を格納するためのプライベート変数も含まれています(例:avgSize、avgTerm、avgRentなど)。同じgetData()メソッドで、取引リストを反復処理して必要な計算を実行した後(そして、途中でそれぞれの値を保存した後)、テーブルに入力された取引リストオブジェクトを返す前に、変数は計算された平均で更新されます。

以下は、参照用のコードの抜粋です。

public class RecentDealsDC {

    private Double avgSize;
    private Double avgTerm;
    private Double avgRent;
    ...

    public RecentDealsDC() {
        super();
        avgSize = 0.0;
        avgTerm = 0.0;
        avgRent = 0.0;
        ...
    }

    public List<DealDTO> getData(List<String> businessUnits){
        List<TransactionDTO> transactions = new ArrayList<TransactionDTO>();
        List<DealDTO> deals = new ArrayList<DealDTO>();
        TransactionSessionBean transBean = lookupTransactionSessionBean();

        Double size = 0.0;
        Double term = 0.0;
        Double totalBaseRent = 0.0;
        ...
        Integer recordCount = 0;

        if (businessUnits != null && !businessUnits.isEmpty()){
            transactions = transBean.getDealsData(SystemUtil.getCurrentUser(), businessUnits);

            recordCount = transactions.size();

            if( recordCount > 0 ){
                for (int i=0; i < recordCount; i++){
                    TransactionDTO transObj = new TransactionDTO();
                    DealDTO dealObj = new DealDTO();

                    transObj = transactions.get(i);

                    // process transaction, execute logic, store deal values

                    size = size + transObj.getRentableArea();
                    term = term + transObj.getLeaseTerm();
                    totalBaseRent = totalBaseRent + (transObj.getRentableArea() * transObj.getBaseRent());
                    ...

                    deals.add(dealObj);
                }
            }

            avgSize = size / recordCount;
            avgTerm = term / recordCount;
            avgRent = totalBaseRent / size;
            ...

        }

        return deals;
    }
}

JSFページを実行すると、Dealオブジェクトのリストからのデータが正しく表示されますが、計算されたフィールドにはゼロが表示されます。ユーザーが次の「基準」を選択してテーブルにデータを入力すると(ヘッダーのドロップダウンリストから)、計算されたフィールドが以前に保存された値で更新されます。つまり、ヘッダーフィールドには前のデータセットに関連する平均が表示され、後続のユーザー選択ごとにサイクルが継続するように見えます。したがって、ユーザーは必要な平均を取得するために別の値を選択する必要がありますが、これは明らかに受け入れられません。 。

デバッグモードで、計算が正しく実行され、リストが返される前に正しい値がプライベート変数に格納されていることを確認しました。

ここで何が欠けているのかわかりませんが、期待値をすぐに表示するには、outputTextコンポーネントを何らかの方法で「更新」する必要があると考えています。それは私が研究していることですが、今は少し途方に暮れています。

任意の提案/方向性/アイデアをいただければ幸いです。

編集:outputTextフィールドは、それらが含まれているpanelBoxを折りたたんだり、再展開したりすると更新されるようです。だから、同じ更新を手動で実行する方法があるかどうか疑問に思っています...

ありがとう、カリム

4

1 に答える 1

1

私がたどり着いた解決策は次のとおりです。

DCクラスのgetDataメソッドを改訂して、元のリスト結果セットと表示する必要のある4つの変数を含む新しいDTOを返しました。次に、返されたDTOの下から結果セットと変数を同じそれぞれのコンポーネントにバインドしました(ADFテーブルの結果セット、結果セットテーブルの上のヘッダーの4つのoutputTextフィールドの変数)。次に、属性バインディングのIteratorにRefresh="IfNeeded"プロパティを追加しました。

これで、resultSetが変更されると同時に、outputTextフィールドが期待どおりに更新されます。

カリム

于 2012-12-12T14:55:34.767 に答える