1

2 つの日付フィールドとビューにバインドされた繰り返しコントロールを持つ XPage があります。各日付フィールドで日付が選択されると、私のコードは日付範囲を作成し、ビューの「キー」パラメーターを使用して、2 つの日付の間のビュー内のドキュメントのみを返します。これは完全に機能します。この問題は、ビューから離れてから戻るときに発生します。ビューに戻ったときの状態にビューを復元する必要がある pagerSaveState コントロールがありますが、代わりにエラーが発生します。com.ibm.xsp.FacesExceptionEx: Unknown or unsupported object type in Vector

ビューの XML は次のようになります。

<xp:this.data>
    <xp:dominoView var="view1" viewName="ByDeliveryDate"
        keysExactMatch="true"
        keys="#{javascript:sessionScope.selectedDateRange}">

    </xp:dominoView>
</xp:this.data>

日付範囲を作成して sessionScope 変数に入れる SSJS は次のようになります。

function doDateRangeSearch() {

var vValStart = @Date(getComponent('StartDate').getValue());
if(vValStart==null||vValStart=='')vValStart = @Date(@Year(@Today()),1,1,0,0,0);

var vValEnd = @Date(getComponent('EndDate').getValue());
if(vValEnd==null||vValEnd=='')vValEnd = @Today();

var vDateRange = session.createDateRange(vValStart, vValEnd);
var vDateVector:java.util.Vector = new java.util.Vector();
vDateVector.addElement(vDateRange);
if(vDateVector.isEmpty())vDateVector = null;

sessionScope.selectedStartDate = vValStart;
sessionScope.selectedEndDate = vValEnd;
sessionScope.selectedDateRange = vDateVector;

/* reset the pager to the first page because if there is only one search 
 * result to display and if the pager was on anything except the first 
 * page the search result is not displayed
 */
var pager:com.ibm.xsp.component.xp.XspPager = getComponent("pager1"); 
pager.gotoPage(0);
}

ビューに戻るとこのエラーが発生する理由を誰か教えてもらえますか?

アップデート:

Panu の提案に従って、ビューの queryOpen イベントに次のコードを追加しました。

print("queryOpen: opening date range view");
if(sessionScope.selectedDateRange == null){
    print("selectedDateRange is null")
}else{
    for (var s in sessionScope.selectedDateRange) print(s);
}
print("queryOpen: completed");

Web ブラウザでビューに移動しました。このセッションでビューにアクセスするのはこれが初めてなので、ビューの最初のページに最新のドキュメントが表示されます。これはコンソールに表示されたものです: 18/10/2013 10:45:23 HTTP JVM: queryOpen: 日付範囲ビューを
開く 18/10/2013 10:45:23 HTTP JVM: selectedDateRange is null
18/10/2013 10: 45:23 HTTP JVM: queryOpen: 完了

次に、2 つの日付フィールドでいくつかの日付を選択し、SSJS 関数を呼び出すボタンをクリックしました。検索は正しく実行され、日付範囲内のドキュメントのみが表示されました。これはコンソールに表示されたものです:
18/10/2013 10:45:48 HTTP JVM: queryOpen: 日付範囲ビューを
開く 18/10/2013 10:45:48 HTTP JVM: 01/08/2013 00:00:00 GDT - 18/10/2013 00:00:00 GDT
18/10/2013 10:45:48 HTTP JVM: queryOpen: 完了

ドキュメントの 1 つをクリックして開き、ビューに戻りました。代わりにエラーページが表示されました。これはコンソールに表示されたものです:
18/10/2013 10:46:16 HTTP JVM: queryOpen: 日付範囲ビューを
開く 18/10/2013 10:46:16 HTTP JVM: null
18/10/2013 10:46: 16 HTTP JVM: queryOpen: 完了
18/10/2013 10:46:16 HTTP JVM: com.ibm.xsp.webapp.FacesServlet$ExtendedServletException: com.ibm.xsp.FacesExceptionEx: Vector で不明またはサポートされていないオブジェクト タイプ

上記に基づいて、 sessionScope.selectedDateRange はまだ存在しているように見えますが、その内容はすべて失われています。

4

2 に答える 2

2

私はそれを機能させる方法を考え出しました。Julian と Panu の提案に感謝します。以下は、私が問題を解決した方法です。他の誰かが同様のことをしたい場合に備えて、ここに投稿します。

最初に、並べ替えられた最初の列に日付が含まれるビューを作成します。日付/時刻列にします。

次に、ビューを表示するカスタム コントロールで、次のように 2 つの日付フィールドを追加します。

開始日フィールド:

<xe:djDateTextBox
    id="StartDate"
    defaultValue="#{javascript:sessionScope.selectedStartDate}"
    value="#{sessionScope.selectedStartDate}">
    <xp:this.converter>
        <xp:convertDateTime type="date"
            dateStyle="full">
        </xp:convertDateTime>
    </xp:this.converter>
</xe:djDateTextBox>

終了日フィールド:

<xe:djDateTextBox
    id="EndDate"
    defaultValue="#{javascript:sessionScope.selectedEndDate}"
    value="#{sessionScope.selectedEndDate}">
    <xp:this.converter>
        <xp:convertDateTime type="date"
            dateStyle="full">
        </xp:convertDateTime>
    </xp:this.converter>
</xe:djDateTextBox>

フィールドは sessionScope 変数にバインドされていることに注意してください。

3 番目に、カスタム コントロールにデータ ソースを追加します。

<xp:this.data>
        <xp:dominoView var="view1" viewName="ByDeliveryDate"
            keysExactMatch="true">

            <xp:this.keys><![CDATA[#{javascript:try {
    if(sessionScope.selectedStartDate == null) return;
    if(sessionScope.selectedStartDate == "") return;
    if(sessionScope.selectedEndDate == null) return;
    if(sessionScope.selectedEndDate == "") return;

    var vDateRange = session.createDateRange(sessionScope.selectedStartDate, sessionScope.selectedEndDate);
    return [vDateRange]

}catch(e){
    print("view filter error: " + e.toString())
}}]]></xp:this.keys>
        </xp:dominoView>
</xp:this.data>

最後に、ビューを更新するだけのボタンを追加します。

<xp:button value="Go" id="FirstColumnSearchButton"
    styleClass="lotusBtn goButton">
    <xp:eventHandler event="onclick"
        submit="false" refreshMode="partial" refreshId="viewHolder">
    </xp:eventHandler>
</xp:button>

必要に応じて、「リセット」ボタンを追加して、ビューを元の状態に戻すこともできます。

<xp:button value="Reset"
    id="FirstColumnSearchResetButton">
    <xp:eventHandler event="onclick"
        submit="false" refreshMode="partial" refreshId="viewHolder">
        <xp:this.action><![CDATA[#{javascript:sessionScope.selectedStartDate = "";
sessionScope.selectedEndDate = "";}]]>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>

doDateRangeSearch()元の質問に投稿した機能は使用しないことに注意してください。

于 2013-10-24T10:14:03.910 に答える