1

私の明るいアイデアの 1 つは、最初に考えていたよりも少し明るくないように見えることです。

背景 - 列の 1 つで DBLookups を使用して、ビューに対して従来の繰り返し制御ソリューションを実行する必要がありました。列の合計が必要なので、viewScope 変数を使用して小計を保持し、繰り返しコントロールの行で値を計算するときに値を追加することにしました。

理論的には良さそうに思えますが、何らかの理由で、繰り返しコントロール内で計算フィールドを使用すると、値が 2 回計算されます (そして小計に追加されます)。繰り返し内に同じコードを含む計算フィールドと編集ボックスの両方を使用して、次の行に沿ったコードでこれを確立しました。

<xp:text escape="true" id="computedField9">
    <xp:this.value><![CDATA[#{javascript:
        //some calculations, nothing to see here*
        var subTotal = viewScope.get("valueColumnTotal");
        viewScope.put("valueColumnTotal", subTotal + sumVals);
        sessionScope.put("Testing", sessionScope.get("Testing") + "~" + sumVals);
        return sumVals;
    }]]></xp:this.value>
    //converters and stuff, nothing to see here
</xp:text>

<xp:inputText id="inputText1">
    <xp:this.value><![CDATA[#{javascript:
        //Same as the computed field above
    </xp:this.value>
</xp:inputText>

値が 1、2、3 の場合、sessionScope 変数は 0~1~1~1~2~2~2~3~3~3 を示し、小計は 18 と表示されます。テキスト ボックスを削除すると、0~ になります。 1~1~2~2~3~3と小計12

つまり、計算フィールドでは double の値を、編集ボックスでは single の値を取得しています。説明できないゼロもありますが、それは単なる初期値であり、心配する必要はないと思います。

リピートが何かでリフレッシュされたのかと思ったら、1~2~3~1~2~3と予想。

計算フィールドがいつ計算されるかについて基本的なことを理解していないだけだと思いますが、困惑しています。エディット ボックスに切り替えることもできると思いますが、ここでは計算フィールドの方が適していると思います。

誰かがこれに光を当てることができますか?

4

2 に答える 2

1

JSF ライフサイクルは、直面している課題に光を当てます。Perが指摘したように、使用する式は複数のフェーズで実行されます。それらが 1 回だけ計算されるようにする最も簡単な方法は、次のコードを使用することです。

        if (view.isRenderingPhase() {
           var subTotal = viewScope.get("valueColumnTotal");
           viewScope.put("valueColumnTotal", subTotal + sumVals);
           sessionScope.put("Testing", sessionScope.get("Testing") + "~" + sumVals);
           return sumVals;
        }

適切なタイミングで値をリセットする必要があるだけです (例: beforeRenderResponse) 。

サイクルから独立するためのもう 1 つのオプション (ページをレンダリングしない場合でも値を計算したい場合があります) は、小さな Java クラスを使用することです。

       public class SumItUp {

           private HashMap<String, Integer> totals = new HashMap<String,Integer>();        

           public void add(String key, int value) {
               Integer i = new Integer(value);
               this.totals.put(key,i);
           }

           public int getTotal() {
               int result = 0;
               for (Map.Entry<String, Integer> me : this.totals.entrySet()) {
                   result += me.getValue().toInt(); // <-- check that one - off my memory
           }               
       }

これをデータ コンテキストとして使用するか、SSJS で初期化します。計算が呼び出される頻度に関係なく。ハッシュマップに送信すると、重複する値はありません。clientid (id ではなく、繰り返しのすべてのコントロールで同じ) またはドキュメントの UNID をキーとして使用します - それらは一意です。

于 2013-07-17T04:22:47.460 に答える
0

要件を正しく読んだ場合、要件は列の合計を表示することです。ビューに列が分類されている場合、9 – 019 – Xpages の Notes: Getting Column Totals From a Viewに基づいて、私が使用したソリューションを次に示します。

ビューから列の合計を取得するためにデータコンテキストが使用され ます

列の合計または 0/false を返すデータコンテキスト

繰り返しコントロール内の行を使用して値を表示するために使用されるテーブル内の合計の表示は、以下のコードを合計行として xp:facet を使用して行われます。

通貨用にフォーマットされたカテゴリ合計

ファセット全体は次のようになります: {** 列 #4、5 番目の列、ビューではカテゴリの合計を示す列でした} ここに画像の説明を入力

以下のカット アンド ペースト {**プロのカット アンド ペースト担当者のみが使用}

<xp:dataContext var="contractCategory">
    <xp:this.value>
        <![CDATA[#{javascript:
            try{
                var nav:NotesViewNavigator = contractView.createViewNav();
                var query = new java.util.Vector();
                query.addElement(sGrantId);
                var entry:NotesViewEntry = contractView.getEntryByKey(query);
                var entry = nav.getPrev(entry);
                if (entry==null) {return false}else{return entry}
                }catch(e){
                return false;
                }
            }]]>
    </xp:this.value>
</xp:dataContext>



<xp:this.facets>
  <xp:panel xp:key="footer" id="TotalDisplayArea">
    <xp:tr style="background-color:#c9c9c9">
      <xp:this.rendered>
        <![CDATA[#{javascript:getComponent("repeat1").getRowCount();}]]>
      </xp:this.rendered>
      <xp:td colspan="2" styleClass="budget_grid_body lotusBold" style="text-align:left">
      Totals:</xp:td>
      <xp:td styleClass="budget_grid_body" style="text-align:right">&#160;</xp:td>
      <xp:td styleClass="budget_grid_body" style="text-align:center;">
        <xp:div style="text-align:left;float:left;padding-left:20px;">
          <xp:span>$</xp:span>
        </xp:div>
        <xp:div style="float:right;padding-right:5px;">
          <xp:text escape="true" id="totalCostDisp">
            <xp:this.converter>
              <xp:convertNumber pattern="#,##0.00"></xp:convertNumber>
            </xp:this.converter>
            <xp:this.value>
              <![CDATA[#{javascript:
                          (operatingCategory)?
                          operatingCategory.getColumnValues()[4]:
                          "CodeError:4:2"}]]>
            </xp:this.value>
          </xp:text>
        </xp:div>
      </xp:td>
      <xp:td style="background-color:#ffffff"></xp:td>
    </xp:tr>
  </xp:panel>
</xp:this.facets>
于 2014-04-30T23:59:42.963 に答える