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

Omh

Lotus team
04.07.2007
2 210
1
#1
Товарищи, сложилась дебильная ситуация.

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

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

Ошибка с аттачметами.
Есть документа с 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".

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

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

Заранее спс!
 

hosm

* so what *
18.05.2009
2 442
6
#2
а где ты док потом сохраняешь - в этом же куске кода ниже? Апдейт рт поля не поможет?
 

Omh

Lotus team
04.07.2007
2 210
1
#3
Ниже апдейтятся ещё пачка полей, в основном текстовые.
Потом документ сохраняется, и если doc.save(True, True) вернул True, то поля синхронизируются в документ в другой базе.

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

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

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

TIA

:-)
Lotus team
15.05.2009
790
3
#4
Процессинг документа в UI или BE? Документ сохраняется через UI или BE? Новые аттачи сразу после удаления? Новые аттачи в UI или BE?
 

Omh

Lotus team
04.07.2007
2 210
1
#5
Удаляется всё в BE, потом происхоlит переоткрытие.
Документ сохраняется через бэкграунд - doc.Save(True, True)

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

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#6
Omh
думаю тут проблема в том, что кто-то в сухую обращается к полям $File и прибивает их
разбираясь с ЕЦП + DXML я замечат, что в РТ поле лежит иконка на аттач, но лежит она там тоже хитро:
Код:
<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) если сервер этим занимается и не находит соотстветствия типу файл+иконка то апдейт РТ поля не происходит вообще
 
A

allex

#7
Очень похожая ситуация, после сохранения, так же "плавающе" получается что файлы не прикрепляются в свои поля, а висят под внизу чертой.
<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">
Код:
	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)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#8
Omh
Удаляется всё в BE, потом происхоlит переоткрытие.
Документ сохраняется через бэкграунд - doc.Save(True, True)
подозреваю что тут еще одна ошибочка
при таком "плавающем" переходе от УИ в бекграунду ты не делаешь
а это в определенные моменты и вызывает потерю иконки

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

allex

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#10
allex
Update method

Example
Processes all pending operations on a rich text item.
Note This method is new with Release 6.
Defined in
NotesRichTextItem
Syntax
Call notesRichTextItem.Update
Usage
Operations on a rich text item are queued for efficiency. The order and time of completion are not predictable. Use this method to ensure that processing is complete at a certain point.
This method is useful when interacting with the front-end classes.
 

Omh

Lotus team
04.07.2007
2 210
1
#11
подозреваю что тут еще одна ошибочка
при таком "плавающем" переходе от УИ в бекграунду ты не делаешь Call uidoc.Refresh(True)
Кнопка выглядит примерно так:
<!--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".
Но это предположение сделаное по скриншоту.

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

Вложения

  • 57.4 КБ Просмотры: 121

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#12
Omh
еще на ум приходи - а не юзаете ли вы антивири?
они порой тестят аттачи так, что линки слетают
 

Omh

Lotus team
04.07.2007
2 210
1
#13
Ну вот я завтра, либо в понедельник поеду смотреть на продукции.
Достану DXL документов, заодно узнаю и про антивирусы.

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#14
воще все игры с аттачами луча делать при закрытом uidoc и порожденном doc
особливо при убиении и аттаче заново
т.е. полчаем юнид, убиваем объекты uidoc, doc
получаем doc из базы
хреначим аттачи, цепляем новые
сохраняем
открываем ui
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#15
lmike
да никтож не спорит, только косяк call uidoc.Close(True) еще никто не обоше :what?:
а значит прибить УИ так легко не удастся, разве что через запуск агента, которому передается УНИД
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#16
вот отрывок кода, и он работает, в 7.0.4:
Код:
	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?:
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#17
lmike
не знаю как там у вас
но у мну uidoc.Close(True) в 90% заканчивается редбоксом вне зависимости от версии
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#18
я не точно выразился - кнопка, на форме, но вызывает агента