いいね!数

0

閲覧数
538

name pickerのようなダイアログを使ってnames.nsfの特定のフィールドの値を取得したいと

思っているのですが実現可能でしょうか?

names.nsfのミドルネームのフィールドに漢字氏名と部署名を入れています。

name pickerのようなユーザーインターフェースを使ってミドルネームに入っている漢字氏名を

取得したいと考えております。

良い案が浮かばないのですが、実現方法はありますでしょうか?

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:2016/10/12 15:02:51

回答・コメント

いいね!数

1

自作できます。基本的なコンセプトは次の通り。

Dojo ダイアログに、names.nsf のビューを配置します。ビューの行にはチェックマーク付きで。Dojo ダイアログは「アドレス帳選択」の自作ボタンに show してあげます。するとモーダルのダイアログが表示されます。

ダイアログが開いたら、ビューの一覧が見えますが、ビューコントロールの startKey などですぐエントリーが見つけられる工夫もすると良いでしょう。

チェックされたエントリーのUNID を使って文書中のフィールドのどのフィールドにもアクセスできます。このロジックはスクリプトを書く必要があります。

ダイアログ内のOK ボタンか「選択」ボタンに上記で取得したフィールドの値をXPage上のフィールドに転送するロジックと、ダイアログを hide すれば完成です。

 

回答日時:2016/10/12 15:25:00

いいね!数

0

katomanさん、

ご回答をありがとうございます。

namepickerはダイアログの上部で名前が検索できるようになっていますが、

「ビューコントロールの startKey などですぐエントリーが見つけられる工夫」で

それと同じようなことが実現できるのでしょうか?

回答日時:2016/10/12 16:08:23

いいね!数

0

できるかと訊かれればできます。ビューコントロールの詳細は startKey は開始キー、search は検索の式を入れれば表示する内容を制御できます。

https://www-10.lotus.com/ldd/ddwiki.nsf/dx/%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E6%B4%BB%E7%94%A8%E6%96%B9%E6%B3%95-%E6%A4%9C%E7%B4%A2

を参考にしてみては。

回答日時:2016/10/12 16:22:48

いいね!数

0

katomanさん、

だいたいやるべきことの概要がつかめました。

細かいところでまた質問させて頂くかもしれません。

ありがとうございました。大変に助かりました。

回答日時:2016/10/12 17:10:12

いいね!数

0

@Picklist の焼き直しを XPages で実現したいときの典型的な設計にもなります。知って(作って)おいて損はありません。

xpages+picklist でweb検索するとヒントがぞろぞろでてくると思います。

回答日時:2016/10/12 17:23:15

いいね!数

0

katomanさんに頂いた回答を参考にユーザー名一覧のダイアログを作成してみました。

ユーザー名検索のテキストボックスに名前を入れるとビューが検索されて結果が表示されるのですが、

キャンセルボタンをクリックしてダイアログを閉じた後、再びダイアログを開くと前回検索した結果が

そのまま表示され、テキストボックスにも値が入ったままになってしまいます。

再度開くときには検索結果をすべてリセットしたいのですが、どこにどのような設定をすれば良いの

でしょうか?

回答日時:2016/10/13 14:52:07

いいね!数

0

キャンセルボタンをクリックした際に、元の状態に戻したいコントロールを含むエリア(ダイアログ?)に対して、部分更新を指定するのはどうでしょうか?部分更新ではコントロールIDを指定します。

部分更新の前に検索のテキストボックスはクリアしておかないといけませんね。

 

回答日時:2016/10/13 15:08:51

いいね!数

0

katomanさん、

早々のご回答をありがとうございます。

結局、キャンセルボタンに以下を書いてなんとかリセットすることができました。

document.getElementById("#{id:テキストボックス名}").value="";
document.getElementById("#{id:検索リンク}").click();

 

まだOKボタンをクリック時の動作を設定していないので、これからトライしてみようと

思っているのですが、以下に関して質問があります。

「ダイアログ内のOK ボタンか「選択」ボタンに上記で取得したフィールドの値をXPage上のフィールドに転送するロジックと、ダイアログを hide すれば完成です。」

ダイアログ内のOKボタンの中のコートでhideする(csjs)かと思うのですが、チェックされたエントリーのUNIDはssjsで、また

UNIDから各値の取得もssjsで取得するかと思います。ssjsで各値を取得した後、hideするためのccjsを使わないといけないと

思うのですが、式の実行される順番はcsjs→ssjsのところどのようにして、ssjs→csjsを実現させれば良いのでしょうか?

hideの式の書かれた別の非表示ボタンをクリックする等の工夫が必要ですか?

まだ実装していないので、的外れな質問だったらすみません。

回答日時:2016/10/13 15:51:13

いいね!数

0

OKボタンには スクリプトエディタで CSJS と SSJS の両方を記述しますが、実行の順番は関係ありますか?

CSJS にはダイアログを hide() するだけで良いかと思っていましたが、他に何か CSJS で処理させることがあるのでしょうか?

SSJS ⇒ CSJS を実現させなければならない要件とはなんでしょう?

もしダイアログの制御だけを SSJS からやりたいのなら次のコードはどうでしょう。

//ダイアログを開く
facesContext.getViewRoot().postScript("XSP.openDialog('#{id:serverSideId}')");
//ダイアログを閉じる
facesContext.getViewRoot().postScript("XSP.closeDialog('#{id:serverSideId}')");
回答日時:2016/10/13 16:35:25

いいね!数

0

katomanさん、

試してみたのですが、実行の順番は関係なかったですね・・・失礼しました。

しかし、一部ccjsのコードが実行されない(?)ところがありました。

以下、コードになります。

<OKボタンの式>

-ccjs-

document.getElementById("#{id:テキストボックス名}").value="";
document.getElementById("#{id:検索リンク}").click();
var dialog = dijit.byId("#{id:ダイアログ名}");
dialog.hide();

-ssjs-

チェックボックスで選択したUNIDから取得した値をフィールドに設定するコード

 

上記のコードのうち、document.getElementById("#{id:検索リンク}").click();

の部分が実行されない(?)のか、再度ダイアログを表示させても一覧が

リセットされません。

上記のccjsと全く同じ式を「キャンセル」ボタンに書いているのですが、こちらは

うまく動作します。

「OK」ボタンでdocument.getElementById("#{id:検索リンク}").click();が動作しない原因は

何でしょうか。デバックの方法があるようでしたら教えてください。

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

※「元の状態に戻したいコントロールを含むエリア(ダイアログ?)に対して、

部分更新を指定する」ではリセットされませんでした。

 

 

回答日時:2016/10/13 18:00:41

いいね!数

0

ビューの内容を初期の状態に戻すことを CSJS でやろうとしているようですが、それはムリだと思います。レンダリングされた現在のページ(HTML)上のフィールドの値をクリアする程度のことはできると思いますが。

要はCSJS はブラウザ上にレンダリングされたものに対して操作には有効ですが、Domino のバックエンドとの通信が必要になる操作(この場合は、ビューを元の状態に戻す、次ページ、前ページに移動などなど)は SSJS の範疇です。このあたりの操作は SSJS で書くべきだと思います。

ソースコードがないので全容は分かりませんが、ビューコントロールに動的更新されない理由を追求したほうがよいのではないでしょうか?検索テキストボックスとビューコントロールのsearch (それとも startKey?)のプロパティの関係は?そこらへんが怪しいのでは。クリアされずに部分更新されているかではないのでしょうか?

 

回答日時:2016/10/14 9:08:27

いいね!数

0

katomanさん、

質問にお付き合い頂きありがとうございます。感謝です。

csjsでビューを初期状態に戻すのは無理があるのですね。

ssjs側では以下のコードでdocument1上のフィールドに値を設定しているのですが、

値を設定後に設定したフィールドの範囲を部分更新しないと値が表示されないため、

ssjsを実行するときにその範囲を部分更新しています。

<OKボタン>

ssjs

var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
var i=0;
var db:NotesDatabase = session.getDatabase(database.getServer(), "names", false);
for(var docid in id_arr) {
 i += 1
}
if(i>1){
view.postScript('alert("複数選択されています。1つだけ選択してください。")')
return false;
}
if(i==0){
view.postScript('alert("ユーザを選択するかキャンセルしてください。")')
return false;
}
var doc:NotesDocument = db.getDocumentByID(docid);
var nUser = doc.getItemValueString("FullName");
var nsUser = @Name("[ABBREVIATE]",nUser);
var MidName = doc.getItemValueString("MiddleInitial");
var kjindex=MidName.indexOf("(");
var bsindex=MidName.indexOf("(",kjindex+1);
var kjName=MidName.slice(0,kjindex);
var bsName = MidName.slice(kjindex+1,bsindex);
document1.setValue("YTTantousyaKj",kjName);
document1.setValue("YTTantousyaBu",bsName);
document1.setValue("YTTantousya",nsUser);

document1上のフィールドの範囲を部分部分更新しているために、重ねてssjsにビューコントロール

部分を部分更新させることができない状態です。

やはりビューを初期状態に戻すのは更新をかけるのが良いのでしょうか?

その場合、どのように更新をかければ良いのでしょうか?

回答日時:2016/10/14 9:27:34

いいね!数

0

OKボタンをクリックするときに、非表示のボタンをクリックし、非表示のボタンでビューに更新を

かけるようにしようかと思います。

まずは更新かけてビューがクリアできない原因を探ってみたいと思います。

回答日時:2016/10/14 9:33:44

いいね!数

0

ビューがリセットされないのは、viewScopeの値をクリアしていないからでした。

更新によってビューをクリアできたのですが、今度は、非表示のボタンで更新をかけることが

できません。<OK>ボタンをクリックしたときに非表示ボタンをクリックし、この非表示ボタンに

ビュー更新のロジックをしかけたのですが、うまくいきません。

一番楽なのは、OKボタンをクリックしたときに、document1のフィールドの更新とビューコントロール

部分の更新を一度にかけることだと思うのですが、2つ以上の箇所を一度に部分更新かけることは

可能なのでしょうか?

うまく説明ができずわかりにくいかと思うのですが、何か必要な情報がありましたらご指摘頂ければ

と思います。よろしくお願いします。

回答日時:2016/10/14 10:26:55

いいね!数

0

2箇所以上のコントロールへの部分更新は CCJS でコーディングする必要があります。

XSP.partialRefreshPost を検索してみてください。

 

回答日時:2016/10/14 10:45:04

いいね!数

0

katomanさん、

試しに以下の二つのボタンを用意し、①②と順番に押すとうまくいったのですが・・・

①<OK>ボタン

ssjs

var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
var i=0;
var db:NotesDatabase = session.getDatabase(database.getServer(), "names", false);
for(var docid in id_arr) {
 i += 1
}
if(i>1){
view.postScript('alert("複数選択されています。1つだけ選択してください。")')
return false;
}
if(i==0){
view.postScript('alert("ユーザを選択するかキャンセルしてください。")')
return false;
}
var doc:NotesDocument = db.getDocumentByID(docid);
var nUser = doc.getItemValueString("FullName");
var nsUser = @Name("[ABBREVIATE]",nUser);
var MidName = doc.getItemValueString("MiddleInitial");
var kjindex=MidName.indexOf("(");
var bsindex=MidName.indexOf("(",kjindex+1);
var kjName=MidName.slice(0,kjindex);
var bsName = MidName.slice(kjindex+1,bsindex);
document1.setValue("YTTantousyaKj",kjName);
document1.setValue("YTTantousyaBu",bsName);
document1.setValue("YTTantousya",nsUser);
viewScope.searchVariable="";

②<try>ボタン

csjs

document.getElementById("#{id:inputSearch}").value="";
XSP.partialRefreshPost("#{id:ビューコントロールの領域}", {});
 

しかし、①②を同じボタンで実行しようとしてもビューがクリアされません。

②のボタンを非表示にして、①のボタンでキックしてみたのですが、それも

うまくいきませんでした。

何かやり方が間違っていますでしょうか?

 

回答日時:2016/10/14 14:20:07

いいね!数

0

katomanさん、

ボタンのイベントハンドラからonCompleteを使用することで実現することができました!

<OK>ボタン

var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
var i=0;
var db:NotesDatabase = session.getDatabase(database.getServer(), "names", false);
for(var docid in id_arr) {
 i += 1
}
if(i>1){
view.postScript('alert("複数選択されています。1つだけ選択してください。")')
return false;
}
if(i==0){
view.postScript('alert("ユーザを選択するかキャンセルしてください。")')
return false;
}
var doc:NotesDocument = db.getDocumentByID(docid);
var nUser = doc.getItemValueString("FullName");
var nsUser = @Name("[ABBREVIATE]",nUser);
var MidName = doc.getItemValueString("MiddleInitial");
var kjindex=MidName.indexOf("(");
var bsindex=MidName.indexOf("(",kjindex+1);
var kjName=MidName.slice(0,kjindex);
var bsName = MidName.slice(kjindex+1,bsindex);
document1.setValue("YTTantousyaKj",kjName);
document1.setValue("YTTantousyaBu",bsName);
document1.setValue("YTTantousya",nsUser);
//スコープ変数を消去する
viewScope.searchVariable="";
//ダイアログクローズのボタンをクリック
//ダイアログを閉じる
view.postScript("XSP.addOnLoad(dialogClose1);");

//var move:com.ibm.xsp.component.xp.XspCommandButton = getComponent("dclose1");
//move.setRendered(true);

<dclose1>ボタン---非表示

var dialog = dijit.byId("#{id:selectCategory3}");
dialog.hide();

<onComplete>

document.getElementById("#{id:inputSearch}").value="";
XSP.partialRefreshPost("#{id:viewPanel}", {});

 

お忙しいところ、最後までお付き合い頂き、本当に感謝しております。

大変に助かりました。

ありがとうございます!

 

回答日時:2016/10/14 15:43:00