いいね!数

0

閲覧数
1607

Aフィールドが複数値のテキストフィールドで値に以下が入っています。

CN=USER1/O=TEST

CN=USER2/O=TEST

 

Aフィールドの値をBラベル(あるいはB計算結果フィールドでも可)に

以下のように改行区切りで表示したいと思っています。

USER1/TEST

USER2/TEST

 

Bラベルには以下の式を入れてみました。

list=@Name("[ABBREVIATE]",@Unique(document1.getItemValueArray("A")));
list

上記の式の結果は、Aフィールドのリストの値がカンマ区切りで入るものになってしまいます。

これを改行区切りで表示させたいのですが、やり方がわかりません。

方法がありましたら教えてください。

よろしくお願い致します。

 

 

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:2017/01/12 9:47:19

回答・コメント

いいね!数

0

ヘルプをよく読んでみてください。

@Name()は文字列を返す関数ですよ。

構文
@Name(action:string, name:string) : string

第2引数も文字列を渡すべきなのに@Unique()が返す配列を渡してる。

まずはこのへんをよく理解しましょう。
/Yac

回答日時:2017/01/12 23:29:52

いいね!数

0

まず、Notes/Dominoのヘルプはあまりあてになりません。引数とか戻り値の説明が誤っていることは多々あります(それじゃあ、困るんですけどね)。

今回の場合、

var nameList = @Name( "[ABBREVIATE]", @Unique( document1.getItemValueArray("namae") ) );
document1.replaceItemValue( "nameList", nameList );
document1.save();

という形でアクションを作成してみたら、

実際に「nameList」というアイテムはテキストリストで保存されてました。

それでもヘルプを読むことはとても大事です!

 

上記を踏まえて、

> 改行区切りで表示したい

とのことですが、

Notesのフィールドのオプション設定にはそういうものはありますが、XPagesには(私が調べた範囲では)そういったオプションはありません。

あくまで配列は配列ということです。

ではどうするかと言ったら、区切り文字を改行文字に変更すればいいのです。

画面表示の場合であれば、htmlの<br/>が相当します。

配列の区切り文字に<br/>を設定して一つの文字列にすれば、それで改行して表示されるはずです。

htmlで表示する必要があるので、ラベルではなく、計算結果コントロールを使います。

あとは、添付したコードを参考にしていただければできるでしょう。

 

ちなみにXPagesは、Notes/Dominoですけど、コードを記述する場合はJavaScriptなので、

javascriptを含めて検索しましょう。

今回の場合は、「javascript 配列 改行」で検索したら色々と出てきましたよ。

 

 

回答日時:2017/01/13 11:50:59

いいね!数

0

へー、マジですか!びっくり。

保守性考えると、そんなコードは許せん!って感じはしますけどね。

フィールドAに入ってる名前が1つの場合と複数の場合で挙動変わったりしないかしらん。

エラーにならない分、タチ悪いですね。気をつけよう。

/yac

回答日時:2017/01/13 12:58:47

いいね!数

0

yac4423さん、およよさん、

ご回答いただきましてありがとうございます。

計算結果でHTML、そして以下のコードを書いたところ、Aの値が複数のときは思うように

改行で表示されたのですが、値がひとつの場合はエラーになってしまいました。

var list=@Name("[ABBREVIATE]",@Unique(document1.getItemValueArray("A")));
list.join( '<br/>' );

エラーは以下の通りです。

JavaScript 計算式を実行中にエラーが発生しました
スクリプトインタープリタエラー、行=2、列=6: [TypeError] タイプ「String [JavaScript Object]」のオブジェクトでメソッド「join(string)」を呼び出し中にエラーが発生しました

値がひとつの場合は、配列になっていないのでしょうか??

よくわかっていなくてすみません。。

 

回答日時:2017/01/16 10:19:36

いいね!数

0

以下の式でうまくいきました!

var list=@Name("[ABBREVIATE]",@Unique(document1.getItemValueArray("A")));
if(list instanceof Array ){
list.join( '<br/>' );
}else{
list;
};

回答日時:2017/01/16 10:33:36

いいね!数

0

@Uniequ()は結果が複数だと配列で返すくせに、結果が単独だと文字列で返すというとんでもない仕様です。

多分@Name()も同じなんでしょうね。

そのせいでどう頑張っても汚いコードになってしまう。

せめて、myUnique()みたいに自前の関数でラップして、必ず配列を返すようにすると、呼び出す側はキレイに書けます。

あと、join("<br>")を使うときは、計算結果を生htmlで出力するようにしますが、フィールドAの格納値が自由に入力できる項目だと、タグを挿入されてXSS脆弱性になる場合がありますので注意しましょう(今回のケースは大丈夫そうだけど)。

私だったら、@Name()の結果を配列にして、<xp:repeat>のデータソースに指定する方法取るかな。

この方法だと、フィールド値にタグ文字があっても、ちゃんとエスケープされるので安心です。

/Yac

回答日時:2017/01/16 12:41:12