2016-06-07 6 views
0

Мы миграции содержания библиотеки из 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 

Для небольшого количества документов некоторые «неправильные» родительские папки («папки [документ] поданы в»).

«Wrong», потому что следующий способ не сообщает документ уже был подан в них (слегка измененный код тоже):

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

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

+0

Спасибо за ваш ответ, особенно потому, что вы, очевидно, даже создали учетную запись, чтобы ответить на эти вопросы. Мы сделали для этого работу, я вернусь, чтобы более внимательно прочитать ваш ответ позже. – Amessihel