• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Notesembeddedobject.remove глючит

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

Darker

Есть 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
7 940
609
BIT
210
это тема о рассинхронизации бэкэнда и фронтэнда?
 
D

Darker

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
ну дык желательно при закрытом фронтэнде делать такие операции
 
D

Darker

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
не понятно - почему закрыть программно не получается?
 
T

turumbay

Есть 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, добиваясь синхронной работы.
 
N

nvyush

turumbay
Судя по коду топикстартера, он удаляет вложения именно в рт-поле. Другое дело, что удаление происходит в бэкэнде, а потом происходит сохранение уи-документа. Думаю, должно помочь обновление рт-поля после удаления вложений одним из способов: link removed
 
D

Darker

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
закрывается, можно его ещё и Delete uidoc, просто бэкэнд док нужно получить по UINID, а не пользовать полученный из uidoc
а шобы "убить" запрос о сохранении SaveOptions="00" (либо любому не "1" и не "0")
 
T

turumbay

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

Пробовал обновить поле через update, compact, переоткрывал документ, а ссылка остается
тогда не изобретайте велосипед - все украдено до нас.
см. ссылку из поста nvy link removed
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
turumbay
в том методе м.б. тонкости...
если отрисовка осущ. не под виндой... :RTFM:
 
D

Darker

Всем спасибо, получилось закрыть документ немедленно, с помощью SaveOptions и Close с параметром True(закрывать немедленно)
 
T

turumbay

turumbay
в том методе м.б. тонкости...
если отрисовка осущ. не под виндой... ;)
ну дык делитесь! навскидку не увидел там ничего ms-specific. вроде все просто: по-тихой закрыть текущий uidoc без сохранения и поднять его заново из бэкенд-документа...
имхо так: чем больше секретов мы рассказываем сообществу себе подобных - тем меньше ляпов получаем в коде, с которым придеца встретица в будущем.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
просто отрисовка, под вайном, выполняется "иначе" и такой апдейт, почему-то, не даёт желаемого (это уж вопрос - к тому как реализовано в нотусах), у меня получалась всё-одно - рассинхронизация

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

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!