いいね!数

0

閲覧数
413

フォーム上のボタンで以下のコードを実行すると競合文書ができてしまいます。

var doc = document1.getDocument();
doc.replaceItemValue("CompanyDirector","山田太郎")
doc.save();
document1.setValue("CompanyName","山田商事");
document1.save()

 

そもそも、notesXspDocumentとnotesDocumentは一緒に使ってはいけないものなのでしょうか?

そうでないならば、notesXspDocumentで設定した値とnotesDocumentで設定した値の両方を

競合なしに保存するにはどうしたら良いでしょうか?

notesXspDocumentとnotesDocumentについてあまり良くわかっていません。初心者的な

質問で申し訳ないです。

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

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:2016/11/18 13:29:57

回答・コメント

いいね!数

1

あれは、確かにXPages始めた頃は理解できなかった。

XSPの方はブラウザに表示されてる文書を表してるモノ。

NotesDocumentの方はNotesDBに格納されてる文書を表してる、と理解すればいい。

だからUNIDはNotesDocumentからしか得られない。

よって基本は、変更はXSPの方にかけて保存もXSPに対してやればいい。

ただ作成者フィールドやリッチテキストアイテムの操作など、NotesDocumentしかできないものもある。

そういう時に、 xspDoc.getDocument()でxspDocの裏docを取得する必要がある。

フィールド変更しないといけないときは、NotesDocumentの変更をxspDocに反映させたい。そういう時は、getDocument(true)にすればいい。こうするとNotesDocumentへの変更は xspDocにも反映される。xspDoc→NotesDocの反映はなかったはず。

保存はxspDocに対して行うのが基本。変更が反映されない方向があるからね。

/Yac

回答日時:2016/11/18 15:47:48

いいね!数

0

yac4423さん、

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

そして、わかりやすい説明に感謝です。

ただ・・・わかったつもりがうまくいきませんでした。

以下のコードをボタンで実行したのですが、CompanyDirectorフィールドに値が入りません。

var doc = document1.getDocument(true);
doc.replaceItemValue("CompanyDirector",""山田太郎")
document1.save()

使い方を間違っているでしょうか?

回答日時:2016/11/18 17:04:40

いいね!数

0

編集モードで試していたのですが、読み込みモードでたまたまボタンを押してみたところ

CompanyDirectorフィールドに値が入りました。

編集モードでも値を入れる方法はあるのでしょうか?

回答日時:2016/11/18 17:10:00

いいね!数

0

もしかして、[CompanyDirector]はページ内のどこかの<xp:inputText>とかにバインドされてたりしない?

これをわざわざdocの方から変更したいのは何か理由あるの?

document1から変更すればいいような。あまりそういうことはやったことないな。

document1の保存時に[CompanyDirector]が上書きされてるとか。

回答日時:2016/11/18 19:53:28

いいね!数

0

yac4423さん、

[CompanyDirector]はページ内のどこかの<xp:inputText>とかにバインドされているということは

ありません。

docのほうから変更したい理由は、元々はpostSaveDocumentイベントに書かれていた以下の式を

「保存閉じる」ボタン内でdocument1.save()とともに使いたかったからです。document1.save()を

使うとpostSaveDocumentイベントを通らないため、一連の式に組み込んでみました。

式は以下になります。

var dt:NotesDateTime = document1.getItemValueDateTime("ReadKigenSD_input");
if(dt!=null){
doc.replaceItemValue("ReadKigenSD", dt.getDateOnly());
dt.recycle();
}
var dt2:NotesDateTime = document1.getItemValueDateTime("ReadKigenED_input");
if(dt2!=null){
doc.replaceItemValue("ReadKigenED", dt2.getDateOnly());
dt2.recycle();
}

上記のdoc.replaceItemValueをdocument1.setValueとやっても値が設定されません。

最初は保存はシンプルアクションの「文書の保存」を使ってみたのですが、これだと

他の部分でやっている文書の競合を避けるコードとの関係で保存時に競合文書ができて

しまいます。この「XPages のシンプルアクションで保存すると競合文書が発生する現象」に

ついてはIBMへ問い合わせをしたのですが、仕様とのことシンプルアクションの保存では

なく、コードでsave()をかけるようにと言われてました。

何か根本的に間違っているのでしょうか?

説明がわかりにくくなってしまい申し訳ないです。足りない説明がありましたら

ご指摘ください。

回答日時:2016/11/21 9:25:37

いいね!数

0

勘違いしていました!

先ほどのコードでdoc.save()ではなく、document.save()でもちゃんと値が設定されました。

doc.save()を使う必要性はなかったですね。。

ただ、notesXspDocumentとnotesDocumentの関係性が今までよりわかるようになり、

大変勉強になりました。

yac4423さん、いろいろとありがとうございました。混乱した質問で申し訳なかったです。

現在の文書に関する処理では、notesDocumentは読者フィールドなど、どうしても

使う必要のあるときに使用して通常はnotesXSPDocumentを使うというのが正当なやり方だと思って良い

でしょうか?

回答日時:2016/11/21 9:41:53

いいね!数

0

notesDocumentとnotesXSPDocumentは値を設定するときには一緒に使わないほうが

良さそうですね。

これから気をつけようと思います。

yac4423さん、アドバイスをありがとうございました。

回答日時:2016/11/24 11:17:19