Notesembeddedobject.remove глючит

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

  1. Darker

    Darker Гость

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

    Код (LotusScript):
    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
    Знаю что в качестве решения можно, переаттачивать все вложения (кроме удаляемого). Но это ведь "танцы".
    Сталкивались ли Вы с такой траблой?
     
  2. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    это тема о рассинхронизации бэкэнда и фронтэнда?
     
  3. Darker

    Darker Гость

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

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ну дык желательно при закрытом фронтэнде делать такие операции
     
  5. Darker

    Darker Гость

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

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    не понятно - почему закрыть программно не получается?
     
  7. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Это не глюк, а вполне ожидаемое поведение. Вы просите удалить аттач из документа - аттач удаляется. Чего ж вы еще хочите? :)
    Чтобы удалить аттач с удалением ссылки в RT - нужно получить NotesEmbeddedObject не из документа, а из поля.
    Код (Text):
    ' удалит аттач из документа, оставит битую ссылку в RT
    ...
    Set doc = ws.CurrentDocument.Document
    Call doc.GetAttachment( "test.txt" ).remove()
    Call doc.Save( True , False )
    Код (Text):
    ' удалит аттач из 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, добиваясь синхронной работы.
     
  8. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    turumbay
    Судя по коду топикстартера, он удаляет вложения именно в рт-поле. Другое дело, что удаление происходит в бэкэнде, а потом происходит сохранение уи-документа. Думаю, должно помочь обновление рт-поля после удаления вложений одним из способов: Обновление Rtfield
     
  9. Darker

    Darker Гость

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

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

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    закрывается, можно его ещё и Delete uidoc, просто бэкэнд док нужно получить по UINID, а не пользовать полученный из uidoc
    а шобы "убить" запрос о сохранении SaveOptions="00" (либо любому не "1" и не "0")
     
  11. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    тогда не изобретайте велосипед - все украдено до нас.
    см. ссылку из поста nvy http://codeby.net/ipb.html?s=&sh...st&p=170594
     
  12. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    turumbay
    в том методе м.б. тонкости...
    если отрисовка осущ. не под виндой... :RTFM:
     
  13. Darker

    Darker Гость

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

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    ну дык делитесь! навскидку не увидел там ничего ms-specific. вроде все просто: по-тихой закрыть текущий uidoc без сохранения и поднять его заново из бэкенд-документа...
    имхо так: чем больше секретов мы рассказываем сообществу себе подобных - тем меньше ляпов получаем в коде, с которым придеца встретица в будущем.
     
  15. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    просто отрисовка, под вайном, выполняется "иначе" и такой апдейт, почему-то, не даёт желаемого (это уж вопрос - к тому как реализовано в нотусах), у меня получалась всё-одно - рассинхронизация

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

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

    ' теперь открываем документ в новом окне
    Call ws.EditDocument(True, uidoc.Document)
    а бэкэнд "поднять" по UINID
     
Загрузка...
Похожие Темы - Notesembeddedobject remove глючит
  1. Mikle77
    Ответов:
    2
    Просмотров:
    2.222

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