Полученные родительские папки из документа не всегда верны

Мы переносим содержимое библиотеки из Filenet Content Services в Filenet P8.

Итак, мы написали экстрактор, который выводит как дерево папок, так и список документов в формате XML, каждый документ с версиями, свойствами и родительской папкой. Этот экстрактор основан на самодельной dll, которая виртуализирует объекты FileNet.

Документы извлекаются таким образом (огромный запрос 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

Мы работаем над обходным решением, которое может потребовать больше ресурсов (для каждого документа перепроверьте...). Но понимание того, почему мы не получаем одинаковых результатов, может иметь значение для проверки нашей библиотеки.


person Amessihel    schedule 07.06.2016    source источник


Ответы (1)


Если я правильно понимаю проблему, я считаю, что быстрый ответ заключается в том, что логический порядок родительских и дочерних записей в наборе результатов не может быть гарантирован запросом. Вы делаете предположение о последовательностях ID. Документ можно перемещать, поэтому ничто не гарантирует, что идентификатор папки появится перед идентификатором документа или наоборот. Для большого набора документов, чтобы решить эту проблему без рекурсии, отложите дочерние записи без родителя и разрешите их позже (в примере я использовал дозорный для пометки/фильтрации таких записей). В зависимости от количества «осиротевших» строк вы можете сделать это в памяти или может потребоваться второй проход. Метод getrows позволит вам обрабатывать «огромные» наборы данных, особенно если вы используете XML и не хотите исчерпать память.

person Applied-Logic    schedule 17.06.2016
comment
Спасибо за ваш ответ, особенно потому, что вы, очевидно, даже создали учетную запись, чтобы ответить на эти вопросы. Мы сделали обходной путь для этого, я вернусь, чтобы более внимательно прочитать ваш ответ позже. - person Amessihel; 17.06.2016