[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 で評価します。
コメント
回避策ですが、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”)
Posted at 2010/03/23 2:58 PM by ピヨパパ
ピヨパパさん、コメントありがとうございます! 😀
そして、検証までしていただいて感謝感激ですm(_ _)mm(_ _)m
エージェント化すればよかったんですね!
まったく思いつきませんでした。
なぜうまくいくのかは、わたしも判りませんが、まぁノーツに理由を求めても詮無いことですから(^^;
どうもありがとうございました!m(_ _)m
Posted at 2010/03/24 12:29 AM by takenoff
もう、一年以上も前の話題ですが、気になったので一言です。 😉
ノーツメールのフォルダはリアルに追加されます。
これを参考に、コピペで設計要素を拝借することでスマートに実現できています。
なおデザイナーから同じ機能を作りだす方法がわかりませんでしたので、非公開機能なのかもしれません。
Posted at 2011/05/30 2:12 AM by 遅れてやってきた通りすがり
コメントありがとうございます!
メールにはそのような機能があるのですね 😯
知りませんでした。
たしかに、ノーツメールには非公開クラスやら非公開@関数やら使いまくって
ますから、そんなお宝が埋まっているのかも。
でも、管理人はアホなので発見できませんでした 😥
Posted at 2011/05/30 9:56 PM by takenoff
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。