ライブラリ コンテンツをFilenet Content ServicesからFilenet P8に移行しています。
そこで、フォルダ ツリーとドキュメント リストの両方を XML 形式で出力するエクストラクタを作成しました。各ドキュメントには、バージョン、プロパティ、および親フォルダが含まれています。このエクストラクタは、FileNet オブジェクトを仮想化する自作の dll に依存しています。
ドキュメントはこの方法で取得されます (巨大な sql リクエスト):
Public Function getAllDocumentIds() As ADODB.Recordset
Dim cmdProperties As New Dictionary
cmdProperties.Item("Maximum Rows") = 0
cmdProperties.Item("Page Size") = 0
Set getAllDocumentIds = _
executeADOQuery("SELECT idmId, idmVerFileName, " & vbNewLine & _
" idmVerCreateDate, idmAddedByUser" & vbNewLine & _
" FROM FNDOCUMENT ORDER BY idmId ASC", & _
cmdProperties)
End Function
ただし、この方法で親フォルダーを取得すると問題が発生します (例として使用するために少し変更されています)。
Public Function getFolders(document As IDMObjects.document) As Collection
Dim f As IDMObjects.Folder
' [...]
For Each f In document.FoldersFiledIn '
' folders retrieval
Next
End Function
少量のドキュメントの場合、いくつかの「間違った」親フォルダ(「[ドキュメントが] ファイリングされているフォルダ」) が報告されます。
次の方法では、ドキュメントがファイルされていることが報告されないため、「間違っています」(コードもわずかに変更されています):
Public Function getDocumentIds(folder As IDMObjects.Folder) As Collection
Dim rs As ADODB.Recordset
Dim cmdProperties As New Dictionary
' Actually there is a control here, to prevent Filenet crashing.
' Indeed, setting "Page Size" to 0 crashes if no results are returned.
' *Maybe* a product bug.
cmdProperties.Add "SearchFolderName", internalObject.id ' Folder parent
cmdProperties.Item("Maximum Rows") = 0 ' No limits
cmdProperties.Item("Page Size") = 0 ' No limits. Crashes if Recordset is empty
' Here, the cmdProperties entries are copied to an
' ADODB.Command object, into the "properties" member.
' The query are copied to this object, into the "CommandText" member.
' Then ADODB.Command.Execute is invoked and returs an ADODB.RecordSet.
' So this Recordset contains all documents filled in this folder.
Set rs = executeADOQuery("SELECT * from FnDocument", cmdProperties)
Exit Function
End Function
より多くのリソースが必要になる可能性がある回避策に取り組んでいます (ドキュメントごとに再確認してください...)。しかし、同じ結果が得られない理由を理解することは、ライブラリをチェックすることに関連している可能性があります。