当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。

テクてく Lotus 技術者 Slack に参加しよう!

2008年6月17日火曜日

ノーツデータベースの一覧を表示する

ディレクトリに存在するノーツDBの一覧を取得するサンプルを用意した。
カタログDBに出力していないものや「データベースを開く」ダイアログに表示しないDBも取得できる。
隠れたDBがいそうだな?と思ったら使うとよい。

---------------------------------------------------------------------------------------------------------
Sub Click(Source As Button)
'データベースの一覧の変数の定義
Dim session As New NotesSession
Dim directory As NotesDbDirectory
Dim db As NotesDatabase

'プログラム変数の定義
Dim res As String
Dim sbj As String
Dim i As Integer

'データベースの一覧を取得する場所を選択する
res = Inputbox ( "サーバー名を入力してください。" & Chr$(10) & "loaclの場合はローカルコンピュータを参照します。",_
"データベースの一覧", "local" )
'キャンセルを押した場合は処理を中断、localの場合はNULLに変換
If res = "" Then
Exit Sub
Elseif res = "local" Then
res = ""
End If
Set directory = New NotesDbDirectory( res )

i = 0
'最初のデータベースを取得する
Set db = directory.GetFirstDatabase( DATABASE )
'データベースを全部取得するまで繰り返す
Do While Not (db Is Nothing )
i = i + 1
sbj = sbj & Cstr( i ) & "." & db.Title & " ; " & db.FilePath & Chr$(10)
'dbの次のデータベースを取得する(GetFirstDatabaseとペアで使うこと)
Set db = directory.GetNextDatabase
Loop

'NULLの場合はローカルなので、「ローカルコンピュータ」を代入する
If res = "" Then
res = "ローカルコンピュータ"
End If
Messagebox sbj, 0, res & "のデータベースの一覧"
End Sub

2 件のコメント:

匿名 さんのコメント...

こんにちは。はじめまして。
ぐりぐりと申します。

のおつの設計をちょこちょこ見るようになり,こちらのサイトも参考にさせてもらっています。

DBの一覧を作成することになりまして,この記事にたどり着きました。

DBカタログは怖くて触れなかったので,DBをひとつ作りまして,この記事を参考にしました。
自分なりにアレンジしまして,行き詰ってしまいましたので,よければアドバイスをいただけないでしょうか。

・各DBの最終更新日を取得したいです。「LastModified」が使えると思いました。
・LastModifiedを使うと,「○○.nsfはまだ開かれていません」となり,止まってしまいます。
・1つめのファイルを処理するときから止まってしまいました。

・本当はアクセスした最終日(ユーザーが読み書きした最終日)が良いのですが,難しそうなので,
DBを右クリックしてプロパティで確認できる「最終更新日」で妥協しようかと。
・txtファイルに書き出ししたいので,「Print」を使いました。
・DBのタイトルとファイル名だけを取得するときはエラーなく処理できます。
LastModifiedを入れると,途中でとまるんです。
・同一サーバー内で実行してもエラーになります。
・他サイト様も参考にしたのですが,書いてあることは以下と変わりないと思います。

大変ぶしつけな依頼ですので恐縮ですが,ご確認くださいますと幸いです。

以下コーディングです。

~略~

Dim mei As String 'DB名
Dim pasu As String 'DBファイル名
Dim lm As Variant '最終更新日

'出力用
Dim FileName As String
Dim FileNum As Long
Dim theDateV As Variant
Dim fDay As String
theDateV = Date
fDay = Format( theDateV , "yymmdd")
FileName = "C:\temp\DB一覧" & fDay & ".txt"
FileNum = Freefile
Open FileName For Output As #FileNum

Print #FileNum , "DB名" & "," & "ファイル名" & "," & "最終更新日"

~略~(記事のコーディングをそのままパクりました)

i = 0
'最初のデータベースを取得する
Set db = directory.GetFirstDatabase( DATABASE )
'データベースを全部取得するまで繰り返す
Do While Not (db Is Nothing )
i = i + 1

mei = db.title
pasu = db.FilePath

lm = db.LastModified 'ここで止まります(T_T)
Print #FileNum , mei & "," & pasu & "," & lm

Print #FileNum , mei & "," & pasu & "," & Cstr(db.LastModified) 'これでも止まります。


'dbの次のデータベースを取得する(GetFirstDatabaseとペアで使うこと)
Set db = directory.GetNextDatabase
Loop

~略~

Guy Locke さんのコメント...

ぐりぐりさん、コメントありがとうございます。

最初に申し上げておきますが、当サイトは質問を受け付ける場所ではありません。唯一、行っているのは筆者が公開しているサンプルコードに明らかな誤りがあった場合のみです。
どうしても、サポートが必要と言うことであれば、「有償」にて承りますので、別途筆者宛にご連絡ください(プロフィール欄を見ていただければ連絡先は分かります)。


それではあまりにも非道すぎるので、今回はヒントだけ差し上げます。
デザイナヘルプを良く読んでみてください。
NotesDocumentクラスのLastModifiedプロパティの説明。
NotesDbDirectoryクラスのGetFirstDatabaseメソッドの説明。
この2つについて良く読めば、なぜエラーになったのかが分かります。解決策についても触れられています。