Notesembeddedobject.remove глючит

  • Автор темы Darker
  • Дата начала
D

Darker

Гость
#1
Есть RT поле, в котором хранятся вложения. Мне нужно было удалить одно вложение. Использовал метод Remove класса NotesEmbeddedObject. Вложение удаляется, а его иконка остается в RT поле. А когда пытаешься его открыть, то ругается "notes item not found".

Код:
Forall obj In rtitem.EmbeddedObjects 'Берем все названия вложенных аттачей
If ( obj.Type = EMBED_ATTACHMENT ) Then 
If Instr(attFN,obj.name)>0 Then 
obj.remove
End If
End If
End Forall
Знаю что в качестве решения можно, переаттачивать все вложения (кроме удаляемого). Но это ведь "танцы".
Сталкивались ли Вы с такой траблой?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#2
это тема о рассинхронизации бэкэнда и фронтэнда?
 
D

Darker

Гость
#3
lmike
Угу, на экране одно, а в бэкенде, при обращении к массиву объектов - другое
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#4
ну дык желательно при закрытом фронтэнде делать такие операции
 
D

Darker

Гость
#5
Это все понятно, но как пользователя заставить удалять аттачи вне документа, программно закрывать док и запускать удаление аттачей не получается.
Как у Вас организована работа с аттачами?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#6
не понятно - почему закрыть программно не получается?
 
13.03.2009
625
2
#7
Есть RT поле, в котором хранятся вложения. Мне нужно было удалить одно вложение. Использовал метод Remove класса NotesEmbeddedObject. Вложение удаляется, а его иконка остается в RT поле. А когда пытаешься его открыть, то ругается "notes item not found".
Это не глюк, а вполне ожидаемое поведение. Вы просите удалить аттач из документа - аттач удаляется. Чего ж вы еще хочите? :)
Чтобы удалить аттач с удалением ссылки в RT - нужно получить NotesEmbeddedObject не из документа, а из поля.
Код:
' удалит аттач из документа, оставит битую ссылку в RT
...
Set doc = ws.CurrentDocument.Document
Call doc.GetAttachment( "test.txt" ).remove()
Call doc.Save( True , False )
Код:
' удалит аттач из RT (и из документа)
...
Set doc = ws.CurrentDocument.Document
Dim item As NotesRichTextItem
Set item = doc.GetFirstItem( "Body" )
Call item.GetEmbeddedObject( "test.txt").remove()
Call doc.Save( True , False )
Добавлено гм. прочитал пост, не вникая в код - а ведь вы реально получаете объект из RTItem. Должно работать. Проблемы могут вызваны неявным приведением типов в forall. В момент вызова obj.remove - куда указывает obj.parent? Возможно стоит переполучить EmbeddedObject?
Добавлено ну и отделяем backend от фронтенда - добейтесь устойчивой работы коды в бэкенде, при закрытом документе. Потом отлаживайтесь в UI, добиваясь синхронной работы.
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#8
turumbay
Судя по коду топикстартера, он удаляет вложения именно в рт-поле. Другое дело, что удаление происходит в бэкэнде, а потом происходит сохранение уи-документа. Думаю, должно помочь обновление рт-поля после удаления вложений одним из способов: Обновление Rtfield
 
D

Darker

Гость
#9
Во во, с закрытым доком удаление происходит "как положено".
Проблема в том, что необходимо вызывать удаление прямо из открытого документа. Пробовал в кнопке удаления закрывать уи документ, а после запускал агент удаления, так уи документ не закрывается пока не выполнится агент удаления.

Пробовал обновить поле через update, compact, переоткрывал документ, а ссылка остается
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#10
закрывается, можно его ещё и Delete uidoc, просто бэкэнд док нужно получить по UINID, а не пользовать полученный из uidoc
а шобы "убить" запрос о сохранении SaveOptions="00" (либо любому не "1" и не "0")
 
13.03.2009
625
2
#11
Во во, с закрытым доком удаление происходит "как положено".
Проблема в том, что необходимо вызывать удаление прямо из открытого документа. Пробовал в кнопке удаления закрывать уи документ, а после запускал агент удаления, так уи документ не закрывается пока не выполнится агент удаления.

Пробовал обновить поле через update, compact, переоткрывал документ, а ссылка остается
тогда не изобретайте велосипед - все украдено до нас.
см. ссылку из поста nvy http://codeby.net/ipb.html?s=&sh...st&p=170594
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#12
turumbay
в том методе м.б. тонкости...
если отрисовка осущ. не под виндой... :RTFM:
 
D

Darker

Гость
#13
Всем спасибо, получилось закрыть документ немедленно, с помощью SaveOptions и Close с параметром True(закрывать немедленно)
 
13.03.2009
625
2
#14
turumbay
в том методе м.б. тонкости...
если отрисовка осущ. не под виндой... ;)
ну дык делитесь! навскидку не увидел там ничего ms-specific. вроде все просто: по-тихой закрыть текущий uidoc без сохранения и поднять его заново из бэкенд-документа...
имхо так: чем больше секретов мы рассказываем сообществу себе подобных - тем меньше ляпов получаем в коде, с которым придеца встретица в будущем.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#15
просто отрисовка, под вайном, выполняется "иначе" и такой апдейт, почему-то, не даёт желаемого (это уж вопрос - к тому как реализовано в нотусах), у меня получалась всё-одно - рассинхронизация

я ваще не люблю такие вот хаки UI нотусов, оно и так еле живое...
потому считаю - лучше не играться с их инмемори доками, а просто закрыть и открыть заново (ежели ваще нужно)
др. словами не делать:
Код:
' "прописываем" изменения в RichTextItem
Call RichTextItem.Update

' тут указывается форма документа, если он был новый и форма не установлена еще, либо на всякий случай :)
Call uidoc.Document.ReplaceItemValue("Form", "СЮДА НАДО ВПИСАТЬ ИМЯ ФОРМЫ, А ЛУЧШЕ АЛИАС")

' теперь открываем документ в новом окне
Call ws.EditDocument(True, uidoc.Document)
а бэкэнд "поднять" по UINID