Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[Notes/Domino] バックエンドで作成したフォルダをすぐに表示する方法

最近、涙なくしては語れない理由により(上司の許可が下りたら次回書きます)、フォルダをリアルタイムに作成する必要に迫られました。が、EnableFolder や PutInFolder などのメソッドで作成したフォルダは、DBを開き直すまで開くことができないらしいです……凸(- -メ

(参考) Folders created using back-end LotusScript methods do not appear in database

再現方法

以下のようなエージェントを作成して実行してください。1回目はエラーとなりますが、DBを開きなおして再度実行すると、エラーになりません。

Dim ws As New NotesUIWorkspace
Dim ss As New NotesSession
Dim db As NotesDatabase

Set db = ss.Currentdatabase
Call db.EnableFolder("testfolder")
Call ws.SetTargetFrame("NotesView") '←必要に応じて変えてください
Call ws.CurrentDatabase.OpenView("testfolder")

回避方法

R8.0.2 Standard 版では、以下のようにすれば回避できました(ちょっとタブがチラつきますが)。ただし、R6.0.4 で試してみたら動かなかったので、R6、R7 系はダメかもしれません。(検証してくださる方はコメントくださいまし~m(_ _)m)

(2010/03/24 追記)ピヨパパさんが検証&解決してくださいました。コメントを参照してくださいませ。

Dim ws As New NotesUIWorkspace
Dim ss As New NotesSession
Dim db As NotesDatabase

Set db = ss.Currentdatabase
Call db.EnableFolder("testfolder")
Call ws.CurrentView.Close()
Call ws.OpenDatabase(db.Server, db.filepath)
Call ws.SetTargetFrame("NotesView")
Call ws.CurrentDatabase.OpenView("testfolder")

つまり、DBを開きなおさなきゃだめだっつーなら、スクリプトで開き直してやれ、というロジックです。

DBの設計状態や仕様によっては、いろいろ改変する必要はあるでしょう。たとえば管理人のDBでは、フォームの埋め込みビューとして新規作成したフォルダを表示したかったので、1フレームだけのフレームセットを1つ用意し、起動フレームをその中に入れ子にしました。この状態では、ws.OpenDatabase で表示されるフレームセットは、まず1フレームのフレームセットが上位に表示されていますから、そのフレームに ws.EditDocument で文書を表示してやればいい、というわけです。2010/03/24追記: すみません、この方法はダメでした(x_x) コードを訂正いたしました。)(↓試してないですが、こんな感じ。太字のところで新規ウィンドウを開いているのがミソです。)

Dim ws As New NotesUIWorkspace
Dim ss As New NotesSession
Dim db As NotesDatabase

Set db = ss.Currentdatabase
Call db.EnableFolder("フォルダ名")
Call ws.OpenDatabase(db.Server, db.filepath, "", "", True)
Call ws.SetTargetFrame("NotesView")
Call ws.CurrentView.Close()
Call ws.EditDocument(False, docNew)

おまけ

ビューをコピーして作成するメソッド(NotesDatabase.CreateView)はありますが、フォルダをコピーして作成するメソッドは無いんですね……。以下のようにするしかないみたいです。

Dim ws As New NotesUIWorkspace
Dim ss As New NotesSession
Dim db As NotesDatabase
Dim vw As NotesView
Dim doc As NotesDocument
Dim docNew As NotesDocument

Set db = ss.Currentdatabase
Set vw = db.GetView("元にするフォルダの名前")
Set doc = db.Getdocumentbyunid(vw.UniversalID)
Set docNew = doc.Copytodatabase(db)
docNew.~$NAME = "testfolder" '別名を振りたい場合は「名前|別名」とする
docNew.~$TITLE = "testfolder" '(同上)
If InStr(1, docNew.~$Flags(0), "P", 0) = 0 Then '設計置換禁止にします
	docNew.~$Flags = docNew.~$Flags(0) & "P"
End If
Call docNew.Save(True, True)

また、作成した複数のフォルダの設計を更新するには、隠し関数の「@UpdateViewDesign("対象のフォルダ名"; "置換元のフォルダ名")」をフォルダごとに実行してやればよいです。LotusScript の場合は、@UpdateViewDesign を Evaluate で評価します。

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
読み込み中...

トラックバック

トラックバックはありません

コメント

回避策ですが、R6.5.6ダメでした。このエージェントを2つに分割して式で実行するとできましたが、恥ずかしながら何故できるのかわかりません。 🙁

(1) エージェント a1
Dim ss As New NotesSession
Call ss.Currentdatabase.EnableFolder(“testfolder”)

(2) エージェント a2
Dim ws As New NotesUIWorkspace
Call ws.SetTargetFrame(“NotesView”)
Call ws.CurrentDatabase.OpenView(“testfolder”)

(3) エージェント実行
@Command([RunAgent]; “a1”);
@Command([RunAgent]; “a2”)

ピヨパパさん、コメントありがとうございます! 😀
そして、検証までしていただいて感謝感激ですm(_ _)mm(_ _)m

エージェント化すればよかったんですね!
まったく思いつきませんでした。

なぜうまくいくのかは、わたしも判りませんが、まぁノーツに理由を求めても詮無いことですから(^^;

どうもありがとうございました!m(_ _)m

もう、一年以上も前の話題ですが、気になったので一言です。 😉
ノーツメールのフォルダはリアルに追加されます。
これを参考に、コピペで設計要素を拝借することでスマートに実現できています。
なおデザイナーから同じ機能を作りだす方法がわかりませんでしたので、非公開機能なのかもしれません。

コメントありがとうございます!

メールにはそのような機能があるのですね 😯
知りませんでした。

たしかに、ノーツメールには非公開クラスやら非公開@関数やら使いまくって
ますから、そんなお宝が埋まっているのかも。
でも、管理人はアホなので発見できませんでした 😥

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 7821 to the field below:

^
×