从文档中检索的父文件夹并不总是正确的

时间:2016-06-07 09:54:50

标签: vb6 migration filenet filenet-panagon

我们将库内容从 Filenet内容服务迁移 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

我们正在开发一种解决方法,可能需要更多资源(对于每个文档,请仔细检查......)。但是理解为什么我们得不到同样的结果可能与检查我们的图书馆有关。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了问题,我相信快速回答是查询无法保证结果集中父记录和子记录的逻辑顺序。您正在对ID序列做出假设。可以移动文档,因此没有任何东西可以保证在文档ID之前会出现文件夹ID,反之亦然。对于大型文档集,要在没有递归的情况下解决此问题,请在没有父级的情况下推迟子记录并稍后解决它们(在示例中,我使用了标记来标记/过滤此类记录)。取决于孤儿的数量'行,您可以在内存中执行此操作,或者可能需要第二遍。 getrows方法将允许您处理“巨大的”#39;数据集,特别是如果您使用XML并且不想耗尽内存。