Гуру, ошибка с аттачментами

Тема в разделе "Lotus - Программирование", создана пользователем Omh, 28 янв 2010.

  1. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Товарищи, сложилась дебильная ситуация.

    У клиента, к которому у меня нет доступа, есть плавающая ошибка.
    Повторить её никак не могу.

    Хочу спросить, почему теоретически может появляться такая ошибка, а там уж решу, как действовать.

    Ошибка с аттачметами.
    Есть документа с author полями, в котором есть пара RT полей с аттачментами.
    Этот документ процесситься, врямя от времени аттачи убираются из документа с помощью хитрого скрипта (наследие):
    <!--shcode--><pre><code class='vb'>Dim RTItem As NotesRichTextItem

    Dim RTItemNames(1) As String 'имена полей с аттачами
    RTItemNames(0) = "RTFieldName1"
    RTItemNames(1) = "RTFieldName2"

    Forall x In RTItemNames
    Call doc.RemoveItem(x)
    Set RTItem = New NotesRichTextItem(doc, x)
    RTItem.IsSigned = False
    RTItem.IsEncrypted = False
    End Forall[/CODE]
    В скрипте делается новый айтем с тем же именем, потому что его наличие обязательно в документе - потом дибильный скрипт переносит этот айтем в документ из другой базы и если айтема нет, то материться. Тоже наследие :)

    Посел того, как аттачи удалены, зачастую в эти же поля прикладываются новые аттачи.

    Ну и время от времени высплывает такая ошибка:
    иконки аттачментов в документе есть, но при вызывании окошка пропертиес аттачмета поле Length у нас серенького цвета и с вопросительныым значком в скобках.
    При попытке открыть выкидывает ошибку "One or more of the source document's attachment are missing.Run fix up to delete the document in the source database".

    Как я понимаю, от настоящего аттачмента у нас осталась только картинка ведущая в никуда ;)

    Есть идеи, в каком случае эта ошибка возникает и что может вызвать такое поведение?
    Пересмотрю скрипты, попробую поменять потенциально опасное место.

    Заранее спс!
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а где ты док потом сохраняешь - в этом же куске кода ниже? Апдейт рт поля не поможет?
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ниже апдейтятся ещё пачка полей, в основном текстовые.
    Потом документ сохраняется, и если doc.save(True, True) вернул True, то поля синхронизируются в документ в другой базе.

    Куда предлагаешь засунуть Update? (гусары, молчать!)

    Как я понимаю, удаление происходит нормально, но потом в это поле снова прикладываются аттачи и после какой-то операции они ломаются.
    Не могу понять, что хотя бы теоретически может быть виновато.

    Поле "$File" нигде не удаляеться, если что...
     
  4. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Процессинг документа в UI или BE? Документ сохраняется через UI или BE? Новые аттачи сразу после удаления? Новые аттачи в UI или BE?
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Удаляется всё в BE, потом происхоlит переоткрытие.
    Документ сохраняется через бэкграунд - doc.Save(True, True)

    Новые аттачи прикладываются через UI (File-Attach).
    Новые аттачи могут прикладываться как сразу, так и через какое-то время.

    Вообще, это типа процесс согласования.
     
  6. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Omh
    думаю тут проблема в том, что кто-то в сухую обращается к полям $File и прибивает их
    разбираясь с ЕЦП + DXML я замечат, что в РТ поле лежит иконка на аттач, но лежит она там тоже хитро:
    Код (Text):
    <item name='Body' seal='true'><richtext>
    <pardef id='2' leftmargin='1in' hide='copy'/>
    <par def='2'><run><font size='8pt'/></run><attachmentref name='logoR.gif'
    displayname='logoR.gif'><picture height='47px' width='50px'><notesbitmap>
    .......
    </notesbitmap></picture></attachmentref><run></par></richtext></item>
    есть большая вероятность, что:
    1) если не обращаться через стандартные средства и не делать апдейт РТ полю, то иконка в никуда может там остаться навечно
    2) если файл называется так же как и предыдущий то иконка не пересоздаётся а юзается та же
    3) если сервер этим занимается и не находит соотстветствия типу файл+иконка то апдейт РТ поля не происходит вообще
     
  7. allex

    allex Гость

    Очень похожая ситуация, после сохранения, так же "плавающе" получается что файлы не прикрепляются в свои поля, а висят под внизу чертой.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Пример кода</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
        Set docA = collection.GetFirstDocument()
    If Not (docA Is Nothing) Then

    Set docB = New NotesDocument( db )
    Call docA.CopyAllItems( docB, True )
    ' переименование вложенных файлов     
    Set cbody = docB.GetFirstItem( "Info" )
    Set cbody_1 = docB.GetFirstItem( "Info_1" )
    Set cbody_1_1 = docB.GetFirstItem( "Info_1_1" )
    Set rtitem = docB.GetFirstItem( "Info_2" )
    If docB.HasItem("$FILE" ) Then
    If Not (Isempty(cbody.EmbeddedObjects)) Then
    Forall o In cbody.EmbeddedObjects  
    filenamesave = Right(o.Source,8)
    Call o.ExtractFile ( "c:\lotustemp\" & filenamesave)
    Call cbody.embedObject(EMBED_ATTACHMENT,"", "c:\lotustemp\"+filenamesave ) 
    Call o.Remove
    End Forall
    End If
    If Not (Isempty(cbody_1.EmbeddedObjects)) Then
    Forall o_1 In cbody_1.EmbeddedObjects              
    filenamesave = Right(o_1.Source,10)
    Call o_1.ExtractFile ( "c:\lotustemp\" & filenamesave)
    Call cbody_1.embedObject(EMBED_ATTACHMENT,"", "c:\lotustemp\"+filenamesave )
    Call o_1.Remove
    End Forall
    End If
    If Not (Isempty(cbody_1_1.EmbeddedObjects)) Then
    Forall o_1_1 In cbody_1_1.EmbeddedObjects              
    filenamesave = Right(o_1_1.Source,10)
    Call o_1_1.ExtractFile ( "c:\lotustemp\" & filenamesave)
    Call cbody_1_1.embedObject(EMBED_ATTACHMENT,"", "c:\lotustemp\"+filenamesave )
    Call o_1_1.Remove
    End Forall
    End If
    Else
    Exit Sub
    End If

    If Not (Isempty(rtitem.EmbeddedObjects)) Then
    Forall o_2 In rtitem.EmbeddedObjects                       
    Call o_2.Remove
    End Forall
    End If

    Call docB.Save( True, True )
    Else
    Messagebox "Не выбран документ, на базе которого" &Chr(13)&" был бы создан новый документ"
    Exit Sub
    End If
    Messagebox "Если вы создали документ из зарегистрированного документа," &Chr(13) &_
    "то отредактируйте (удалите дату и номер подписания) проект и имеющиеся приложения"

    Dim unid As String
    unid = docB.UniversalID
    If unid = "" Then Exit Sub
    Set parentDoc = db.GetDocumentByUNID(unid)
    Call ws.EditDocument(True, parentDoc)
     
  8. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Omh
    подозреваю что тут еще одна ошибочка
    при таком "плавающем" переходе от УИ в бекграунду ты не делаешь
    а это в определенные моменты и вызывает потерю иконки

    Добавлено: allex
    в вашем примере отсутствует обязательный апдейт РТ поля
     
  9. allex

    allex Гость

    Еще иногда пользователь умудряется задвоить иконку (или приатачить 2 одинокао-именованных файла). И у скрипта сносит крышу при обращении к имени объекта
     
  10. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    allex
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Кнопка выглядит примерно так:
    <!--shcode--><pre><code class='vb'>Dim ws As New NotesUIWorkspace
    Dim uiDoc As NotesUiDocument
    Dim Doc As NotesDocument
    Set uiDoc = ws.CurrentDocument
    Set Doc = uiDoc.Document
    If CreateNewVersion(doc) Then Call ReopenUIDoc[/CODE]

    В ф-ии CreateNewVersion нет вообще никакой работы с UI объектами: там удаляются те самые ричтексты, апдейтятся другие поля.
    Она возвращает True, если doc.Save(True, True) возвратил True.

    Ф-ия ReopenUIDoc выглядит примерно так:
    <!--shcode--><pre><code class='vb'>Sub lsp_ReopenUIDoc
    Dim ws As New NotesUIWorkspace
    Dim uiDoc As NotesUiDocument
    Set uiDoc = ws.CurrentDocument

    If Not uidoc Is Nothing Then
    Dim UIDocEditMode As Integer
    UIDocEditMode = UIDoc.EditMode

    Dim Doc As NotesDocument
    Set Doc = uiDoc.Document

    If Not doc Is Nothing Then
    Call doc.ReplaceItemValue("SaveOptions", "0")
    Call uidoc.Close

    Call UncacheDocument(doc) 'считайте тут документс берётся из view
    Set uidoc = ws.EditDocument(UIDocEditMode, Doc)
    If Not uidoc Is Nothing Then Call uidoc.RefreshHideFormulas
    End If
    End If

    End Sub[/CODE]

    Если честно, я не вижу плавающего перехода.
    Сначала все операции с NotesDocument, потом все операции с NotesUIDocument.
    Хотя, я, конечно, переоткрытие очень не люблю.

    Работы отдельно с $File нету, всё через RichTextItem.
    Я могу получить похожую ошибку, если напрямую удалить из документа поле $File.
    Но там ошибка немного другая: "Note item not found" + Properties Box аттачмента не показывает размер даже серым :what?:
    Точнее показывает 0 байт.

    Куда предлагаете засунуть Update?
    После удаления айтема и создания нового?

    Добавлено: Поля $File в документе есть.
    Смотрел на экспортнутый документ через File-Export.

    Такое ощущение, что рушиться связь между картинкой и $File

    Добавлено: Полагаю, перед появлением ProopertiesBox аттачмента выскакивает ошибка "Invalid or not existent document".
    Но это предположение сделаное по скриншоту.

    Добавлено: Вот такую ошибку надо получить.
     

    Вложения:

    • Err.jpg
      Err.jpg
      Размер файла:
      57,4 КБ
      Просмотров:
      121
  12. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Omh
    еще на ум приходи - а не юзаете ли вы антивири?
    они порой тестят аттачи так, что линки слетают
     
  13. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну вот я завтра, либо в понедельник поеду смотреть на продукции.
    Достану DXL документов, заодно узнаю и про антивирусы.

    Пока что я в растеряности.
     
  14. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    воще все игры с аттачами луча делать при закрытом uidoc и порожденном doc
    особливо при убиении и аттаче заново
    т.е. полчаем юнид, убиваем объекты uidoc, doc
    получаем doc из базы
    хреначим аттачи, цепляем новые
    сохраняем
    открываем ui
     
  15. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    lmike
    да никтож не спорит, только косяк call uidoc.Close(True) еще никто не обоше :what?:
    а значит прибить УИ так легко не удастся, разве что через запуск агента, которому передается УНИД
     
  16. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    вот отрывок кода, и он работает, в 7.0.4:
    Код (Text):
        Set db=ws.CurrentDatabase.Database 
    Set uidoc=ws.Currentdocument
    Call uidoc.Refresh(True)
    '   Call ws.ViewRefresh()
    Set doc=uidoc.Document
    Call doc.Save(True,False)
    condition=doc.GetItemValue("condition")(0)
    viewName=doc.GetItemValue("viewTitle")(0)
    uid=doc.UniversalID
    pwd$=uid
    uidoc.Close(True)

    Set doc=db.GetDocumentByUNID(uid)
    по кнопке, в форме, главное - шоб uidoc НЕ нагадил, а то что его видно - это мелочь :what?:
     
  17. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    lmike
    не знаю как там у вас
    но у мну uidoc.Close(True) в 90% заканчивается редбоксом вне зависимости от версии
     
  18. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    я не точно выразился - кнопка, на форме, но вызывает агента
     
Загрузка...
Похожие Темы - Гуру ошибка аттачментами
  1. igrok999
    Ответов:
    0
    Просмотров:
    849
  2. Omh
    Ответов:
    4
    Просмотров:
    2.484
  3. Ruska132
    Ответов:
    1
    Просмотров:
    46
  4. Lamerman
    Ответов:
    0
    Просмотров:
    28
  5. Enima
    Ответов:
    0
    Просмотров:
    57

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