コンボボックスの値を@DBColumnで指定したら32KBオーバーでエラーになった場合の回避

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
	<xp:this.data>
		<xp:dominoView var="view1" viewName="ByCategory"></xp:dominoView>
	</xp:this.data>
	<div>
		<h3>@DBColumnを使用(エラー)</h3>
		<xp:comboBox id="comboBox1">
			<xp:selectItems>
				<xp:this.value><![CDATA[#{javascript:@DbColumn(@DbName(), "ByCategory", 1)}]]></xp:this.value>
			</xp:selectItems>
		</xp:comboBox>
	</div>
	<div>
		<h3>ssjsで実装</h3>
		<xp:comboBox id="comboBox2">
			<xp:selectItems>
				<xp:this.value><![CDATA[#{javascript:
var ndb:NotesDatabase = database,
	nview:NotesView = ndb.getView("ByCategory"),
	entries:NotesViewEntryCollection = nview.getAllEntries(),
	entry:NotesViewEntry,
	categories:java.util.List = new java.util.Vector(),

entry = entries.getFirstEntry();
while(entry !== null){
	if(entry.isCategory){
		categories.add(entry.getColumnValues().get(0));
	}
	entry = entries.getNextEntry(entry);
}
return categories.toArray();

	}]]></xp:this.value>
			</xp:selectItems>
		</xp:comboBox>
	</div>
</xp:view>





コンボボックスの値を@DBColumnで指定した場合、Notesクライアントの場合と同様に、リストサイズが32KBを超えるとエラーが発生し、リストボックスの選択肢には”Infinity”とのみ表示されます。

こうなった場合には、@DBColumn関数を使用せず、ViewEntryから値を生成する必要があります。

コードには、コンボボックスを2つ定義していて、1つ目(<h3>@DBColumnを使用(エラー)</h3>以降)がエラー発生ケース。

2つ目(<h3>ssjsで実装</h3>)がSSJSによる実装です。

高速化(効果不明ですが)のため、Documentクラスは使用せず、ViewEntryCollectionのみで処理しています。

使用するには、ビュー名(<xp:dominoView var="view1" viewName="ByCategory"></xp:dominoView>)と、
取得するカラム位置(categories.add(entry.getColumnValues().get(0));)を変更する必要があります。


JavaScript (Server)
kazzwach
July 17, 2018 at 4:45 PM
Rating
0





No comments yetLogin first to comment...