Решено Выгрузка всех файлов из базы..

Тема в разделе "Lotus - Программирование", создана пользователем JohnLemon, 17 июн 2015.

  1. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Здравствуйте, необходимо выгрузить все файлы в папки с ID доком пытаюсь делать так:
    Код (LotusScript):
    Sub Click(Source As Button)
    Dim session As NotesSession
    Set session = New NotesSession
    Set db = session.CurrentDatabase
    Set col = db.AllDocuments
    Set col1 = db.GetView("default")
     
    If col.Count <> 0 Then
    Set doc = col.GetFirstDocument
    Do While Not( doc Is Nothing )
    Set rtitem = doc.GetFirstItem( "Body" )
    If (rtItem.Type = RICHTEXT) Then
    Forall o In rtitem.EmbeddedObjects
    fileCount = fileCount + 1
    If (o.Type = EMBED_ATTACHMENT) Then Call o.ExtractFile("c:\temp\" & o.Name)
    End Forall
    End If
    Call session.UpdateProcessedDoc( doc )
    Set doc = col.GetNextDocument(doc)
    Loop
    End If
    End Sub
    Выгружается 96 файлов а дальше ошибка "Несоответствие типов в методе ForAllInit: найдено FROMVAR, ожидался Unknown" В чем может быть проблема не пойму?
     
  2. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Битый документ попался. Попробуй найти его и открыть в клиенте, наверняка выскочит какая-то ошибка, типа "32К".
     
    2 пользователям это понравилось.
  3. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    как можно исключить такие доки ? ) И как найти его )
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    возможно - через ДХЛ
     
  5. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    Если у тебя вьюшка сортирована то:
    в цикле While принтуй номер итерации.
    После ошибки, номер геморойного дока будет последний принтованный номер +1.
    On Error Resume Next пропустит все ошибки и не прервёт цикл... Также, можешь нормально обработать ошибку и в обработчике сохранить в список unids геморойных доков. Потом с ними врукопашную разберёшься.
    ЗЫ
    лучче даже, не сохранять юниды, а сразу слать весь гемор в какой нить фолдер, там и грести.
     
    #5 alexas1, 17 июн 2015
    Последнее редактирование модератором: 17 июн 2015
    2 пользователям это понравилось.
  6. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Также стоит позаботится об одноименных файлах. Лучше выгружать в подпапку, именованную UNID-ом, и учитите, что если попадутся одноименные в одном документе, то название при выгрузке у них будет неожиданное.
     
    2 пользователям это понравилось.
  7. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Я так и планировал сделать...
    Вот сделал в роде обработку ошибок, 1 обрабатывается, а если вторая то останавливается скрипт. Проблема скорее всего что вообще нету атачей в доке!
    Код (LotusScript):
    Sub Click(Source As Button)
     

    Dim session As NotesSession
    Set session = New NotesSession
    Set db = session.CurrentDatabase
    Set view = db.GetView("all")
    Set doc = view.GetFirstDocument
    l = 0
    lblNorm:
    While Not(doc Is Nothing)
    On Error Goto lblErrs
    l = l +1
    Print(l)
    Set rtitem = doc.GetFirstItem( "Body" )
    If (rtItem.Type = RICHTEXT) Then
    Forall o In rtitem.EmbeddedObjects
    If (o.Type = EMBED_ATTACHMENT) Then Call o.ExtractFile("c:\temp\" & o.Name)
    End Forall
    End If
    Set doc = view.GetNextDocument(doc)
    Wend
    Exit Sub
    lblErrs:
    Messagebox "Error "
    Set doc = view.GetNextDocument(doc)
    Goto lblNorm
    Exit Sub
    End Sub
     
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Не проверял, но попробуйте:
    Код (LotusScript):
    Sub Click(Source As Button)
    On Error Goto Handler
     dim ErrStr as String
     Dim session As  New NotesSession
     Set db = session.CurrentDatabase
     Set view = db.GetView("all")
     view.autoupdate = false
     Set doc = view.GetFirstDocument
     
    While Not(doc Is Nothing)
    Set rtitem = doc.GetFirstItem( "Body" )
    If (rtItem.Type = RICHTEXT) Then
    Forall o In rtitem.EmbeddedObjects
    If (o.Type = EMBED_ATTACHMENT) Then
    Call o.ExtractFile("c:\temp\" & o.Name)
    end if
    End Forall
    End If
    nextDoc:
    Set doc = view.GetNextDocument(doc)
    Wend
     
    view.autoupdate = True
     
    Exit Sub
     
    Handler:
    ErrStr = {Error: } & Error$ & { in line } & erl
    if not doc is nothing then ErrStr = ErrStr & chr(10) & doc.universalId
    if session.IsOnServer then
    Print ErrStr
    else
    msgbox ErrStr, 16
    end if
    if not doc is nothing then resume nextDOc
    if not view is nothing then view.autoupdate = True
    Exit Sub
    End Sub
     
    2 пользователям это понравилось.
  9. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    После 11-й строки проверьте rt-item на Nothing
     
    3 пользователям это понравилось.
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    положили выборку на диск, в виде ДХЛ, натравили LAX - всё!
     
  11. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Мне не надо, чтобы хорошо, мне надо, чтобы ты ... (с) :)
     
  12. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Если надо выгрузить все файлы из документов, то может стоит получать EmbeddedObjects не от определенного айтема, а прямо от НотесДокумента?
     
  13. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Если ошибка про 32К, то выгрузка DXL по-моему тоже должна "споткнуться" об такой документ. Любая попытка чтения полей такого документа генерит ошибку. Надо строить обход таких документов через On Error Goto...
    Код (LotusScript):

    Set doc = view.GetFirstDocument
    On Error Goto NextDoc
    if doc.HasEmbedded then
         .....
    end if
    NextDoc:
    Set doc = view.GetNextDocument(doc)
     
     
    2 пользователям это понравилось.
  14. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    LAX не в курсе даже что такое

    Я не прошу делать за меня я прошу указать на ошибки, форумы ведь для этого, а не для самоудовлетворения типо "Я такой крутой!"

    есть ссылка или пример ?
    Сделал так:
    Код (LotusScript):
    Sub Click(Source As Button)
    On Error Goto Handler
    Dim ErrStr As String
    Dim session As  New NotesSession
    Set db = session.CurrentDatabase
    Set view = db.GetView("all")
    view.autoupdate = False
    Set doc = view.GetFirstDocument
    While Not(doc Is Nothing)
    Set rtitem = doc.GetFirstItem( "Body" )
    If (rtItem.Type = RICHTEXT) Then
    Forall o In rtitem.EmbeddedObjects
    If (o.Type = EMBED_ATTACHMENT) Then
    Mkdir "d:\TEMP\" & doc.universalId & "\"
    Call o.ExtractFile("C:\Temp\" & o.Name)
    End If
    End Forall
    End If
    nextDoc:
    Set doc = view.GetNextDocument(doc)
    Wend
     
    view.autoupdate = True
     
    Exit Sub
     
    Handler:
    ErrStr = {Error: } & Error$ & { in line } & Erl
    If Not doc Is Nothing Then ErrStr = ErrStr & Chr(10) & doc.universalId
    If session.IsOnServer Then
    Print ErrStr
    Else
    Mkdir "c:\TEMP\" & doc.universalId & "-problem\"
    End If
    If Not doc Is Nothing Then Resume nextDOc
    If Not view Is Nothing Then view.autoupdate = True
    Exit Sub
    End Sub
    На первый взгляд в роде работает правильно все, но почему то создаются папки с правами, что я не могу потом ничего записать в них (
     
  15. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Mkdir "d:\TEMP\" & doc.universalId & "\"
    Call o.ExtractFile("C:\Temp\" & o.Name)

    Вы ничего не забыли/не перепутали? :)
    Не тот это город и полночь не та... (с)
     
  16. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Да это я проверял просто как папки создаются. Во первых почему то только для чтения. потом установил для папки темп на диске д доступ всем - полный доступ, но ни создаются почему то для всех - особые права, и записать я в них ничего не могу (
     
  17. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Пишите не в C/D:\Temp, а в папку, полученную из Environ("Temp")
    [DOUBLEPOST=1434618580,1434618345][/DOUBLEPOST]У Вас поля Body может и не быть, и код свалится при обращении к нафинг-айтему.
    Если задача выгрузить все файлы из всех документов, то
    EmbeddedObjects получайте из самого документа:

    While Not(doc Is Nothing)
    Set rtitem = doc.GetFirstItem( "Body" )
    If (rtItem.Type = RICHTEXT) Then
    Forall o In doc.EmbeddedObjects
    ...
     
  18. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    @Shandrik, насколько мне помнится, были какие-то засады с doc.EmbeddedObjects - то ли не все файлы извлекались, то ли ошибка выпадала. ИМХО, через RichTextItem правильней...Да, нужно проверять наличие айтема и его тип.

    Код (LotusScript):
    Set rtitem = Nothing
    Set rtitem = doc.GetFirstItem( "Body" )
    If not rtitem Is Nothing Then
        If ( rtitem.Type = RICHTEXT ) Then
            If Not Isempty(rtitem.EmbeddedObjects) Then  
                Forall o In rtitem.EmbeddedObjects    ...
    @JohnLemon, Domino как сервис работает? Если да, то под каким пользователем?
     
    #18 Мыш, 18 июн 2015
    Последнее редактирование модератором: 18 июн 2015
    2 пользователям это понравилось.
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    не уверен, яж не буду перебирать документы..., но надо тестить
    а выгрузка примечательна тем, что обработка возможна массово и без нотусевых классов
    Call notesXMLProcessor.SetInput(NotesDocumentCollection)


    а поискать на форуме?
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    мало того - возможно, для доков с картинками - не выгружать в поток картинки (опция)
     
Загрузка...
Похожие Темы - Выгрузка всех файлов
  1. Mikle_GB
    Ответов:
    12
    Просмотров:
    637
  2. KapitoliyKakoyTo
    Ответов:
    1
    Просмотров:
    2.807
  3. Надя1972
    Ответов:
    0
    Просмотров:
    650
  4. AndreiBY
    Ответов:
    0
    Просмотров:
    1.336
  5. Dimok-163rus
    Ответов:
    32
    Просмотров:
    6.575

Поделиться этой страницей