いいね!数

0

閲覧数
657

クラッシックノーツで開発したDBをXpages化しているところで問題が起きました。

ノーツクライアントで保存されている既存文書のリッチテキストAに添付ファイルが添付されているのですが、

Xpages上で文書を開いてリッチテキストAを編集して保存すると、添付されている添付ファイルがなくなってしまうという

現象です。

ノーツクライアントで該当文書を開いて確認したところ、文書の枠外に添付ファイルがついているのがわかりました。

Xpages上では「ファイルのアップロード」コントロールと「ファイルのダウンロード」コントロールを使ってリッチテキストAに

バインドしています。

 

調べたところ、フォームのquerySaveDocumentイベントにある以下のコードを削除すると問題が解消するという

ことがわかりました。

//Fromフィールドを名前フィールドに
var doc =document1.getDocument(true);
//作成者属性を設定
var item_n = doc.getFirstItem("From");
item_n.setAuthors(true);

NotesDocumentを取得していることが問題なのでしょうか。

Fromフィールドは作成者フィールドにする必要があるのですが、前述の問題を回避し、さらに

Fromフィールドを作成者フィールドにする方法はあるでしょうか?

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:Dec 28, 2016, 11:45:04 AM

回答・コメント

いいね!数

0

こんにちわ。

文書の保存処理はどうやってます?

docはdocument1の写像ですが、getDocument()の引数をtrueにしてるので、docへの変更はdocument1にも反映されます。

ここでは、Fromフィールドの種別の変更はちゃんとdocument1にも反映される。

doc.save()で保存してたりしないですか?

document1.save()ならうまくいきそう。

/Yac

回答日時:Dec 28, 2016, 12:37:04 PM

いいね!数

0

yac4423さん、

お世話になっております。こんにちは。

文書の保存処理は、シンプルアクションの「文書の保存」でquerySaveDocumentを

通していますので、特にdoc.save()もdocument1.save()もやっていません。

document1.save()とやってみたのですが、結果は同じでした。

どうしたものでしょうか。

回答日時:Dec 28, 2016, 12:55:11 PM

いいね!数

0

解決できたかもです。

保存ごとに毎回作成者の属性をつけなくても、新規作成時だけでいいのかと以下のように

コードを書き換えました。

if(document1.isNewNote()){
//Fromフィールドを名前フィールドに
var doc =document1.getDocument(true);
//作成者属性を設定
var item_n = doc.getFirstItem("From");
item_n.setAuthors(true);
}

ノーツクライアントで保存されている既存文書は上記のコードが通らないため、添付ファイルは

無事にファイルダウンロードコントロールに出てきました。

今後はXpages上でしか新規文書は作らないので、上記で良いかもと思いました。

 

回答日時:Dec 28, 2016, 1:30:05 PM

いいね!数

0

私も同じようなアプリ運用してますが、うまくいってます。

この手も問題は、余計な処理をそぎ落として、限界まで単純化させれば原因が分かるもんですよ。

いつも言ってますが、単純化させて問題を再現できるモノを提供してもらえれば解析してあげられるんですけどねぇ。

後、シンプルアクションは本質の理解を妨げるので使わないことをお勧めします。

/Yac

回答日時:Dec 28, 2016, 1:35:42 PM

いいね!数

0

大事なことを見落としてました。

「 フォームのquerySaveDocumentイベントにある以下のコードを 」と書いてありますね。てっきりXPage上の[保存]のようなボタンのイベントハンドラに書かれてると思ったら、フォームの方に保存時に走る処理を書いてるんですね。

なんでまた? と思ったのですが保存をシンプルアクションでやってるから、保存時にやりたいこと(今回ならfromフィールドを作成者に設定)をどこに書けばいいか悩んで、フォームのquerySaveDocumentイベントに記述した、という流れでしょうか。いや、元はクラシカルNotesと書いてあったので、今までの保存時の処理はそのままにしてXPage側には大事な処理が書いてないのかも。

それなら、フォームのquerySaveDocumentイベントの処理は削除して、XPageの保存ボタンのイベントハンドラにFormフィールドの種別設定と保存処理を同時に書けばいいのでは?

「いや、今までの処理はそのまま残したいんだ」なんてことを言われそうだけど、大事なコードがXPage側にあったりフォームにあったり、フィールドにあったりと分散してるのはこれから保守する人にとっては地獄のような面倒くささですから、そこはきっぱりあきらめてシンプルに書きましょう。

/Yac

  <xp:button value="保存" id="button2">
      <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
          <xp:this.action><![CDATA[#{javascript:
            var doc =document1.getDocument(true);
            var item_n = doc.getFirstItem("From");
            item_n.setAuthors(true);
            document1.save();
            context.redirectToPage("/docView.xsp");
          }]]></xp:this.action>
      </xp:eventHandler>
  </xp:button>
回答日時:Jan 4, 2017, 11:30:28 PM

いいね!数

0

yac4423さん、

アドバイスありがとうございます。

シンプルが一番ですよね。以降、常々気をつけたいと思います!

 

※ちなみにメーカーに問い合わせたところ今回の現象は新規の障害とのことでした。

 

 

回答日時:Jan 6, 2017, 5:13:41 PM