• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Поле NotesRichTextItem и SaveOptions

seoman2

Green Team
17.02.2010
506
1
BIT
58
На поле нет поля SaveOptions.
Такого поля не было.
Мож на форму поставить перед открытием (или на событие после открытия) удаление поля SaveOptions ?
 
Последнее редактирование:

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
80
Код:
doc.ReplaceItemValue({SaveOptions},{0}).SaveToDisk=False
Call doc.save (False, True)
Call uidoc.Close
Call workspace.EditDocument(False, doc)
Проблема в том, что Вы не понимаете сути того, что происходит.
SaveOptions="0" отключает UI-запрос сохранения документа при его закрытии, если он был в режиме редактирования.
Вы это поле сами вписали в документ первой строчкой кода, который выше. Я обычно его после переоткрытия удалял, чтобы если попытаться закрыть документ, то он бы спросил, сохранять или нет. Типа вот так:
Код:
Set uidoc = workspace.EditDocument(False, doc)
Set doc = uidoc.Document
Call doc.removeItem("SaveOptions")
Многое в этом Вашем коде непонятно...
1. Почему в EditDocument передаётся False? После вставки атача пользователю не надо дать возможность дальше редактировать документ?
Или документ изначально был в режиме чтения? В таком случае вообще непонятно, зачем эти игры с SaveOptions.
2. Зачем строка
Код:
Call doc.save (False, True)
? А если после вставки атача пользователь откажется сохранять документ (допустим, передумал)?

Добавлено: посмотрите тему Обновление RTField, там есть альтернативная рабочая реализация переоткрытия документа для обновления RT-полей.
 
Последнее редактирование:

seoman2

Green Team
17.02.2010
506
1
BIT
58
Почему в EditDocument передаётся False?
Да в моем докобороте это не важно, т.к. на постопен Source.EditMode = True

Call doc.save (False, True) - да, лишнее.
посмотрите тему Обновление RTField,....
Если док создавался с помощью Compose, то НА ФОРМЕ ПЕРЕОТКРЫВАЕМОГО ДОКУМЕНТА Д.Б. ПОЛЕ Form!!!
- не очень понятно, когда вызывать эту функцию RefreshRT?

Код:
Const IN_SAVEOPTIONS = "SaveOptions"

Function RefreshRT(EditMode As Boolean, nuid As NotesUIDocument) As NotesUIDocument
    'Если док создавался с помощью Compose, то НА ФОРМЕ ПЕРЕОТКРЫВАЕМОГО ДОКУМЕНТА Д.Б. ПОЛЕ Form!!!
    'методом Compose или соотв. формулой создаю только простые документы, типа справочников, чего и всем желаю
    Dim nuiws As New NotesUIWorkSpace
    If nuid.ModifiedSinceSaved Or nuid.Document.GetItemValue(IN_SAVEOPTIONS)(0) = "1" Then
        Call nuid.Document.ReplaceItemValue(IN_SAVEOPTIONS, "0")
    End If
    Call nuid.Close()
    Set RefreshRT = nuiws.EditDocument(EditMode, nuid.Document)
    If (Not RefreshRT Is Nothing) And EditMode Then
        RefreshRT.Document.ReplaceItemValue(IN_SAVEOPTIONS, "1").SaveToDisk = False
    End If
End Function
Если SAVEOPTIONS = 1 , то делает SAVEOPTIONS=0 и закрывает док?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
80
не очень понятно, когда вызывать эту функцию RefreshRT?
Она вместо всего того кода, который Вы писали в этой теме для переоткрытия документа.

Если SAVEOPTIONS = 1, то делает SAVEOPTIONS=0 и закрывает док?
Да, потом возвращает. Это сделано потому, что на QuerySave, OnSubmit могут быть вызовы Refresh(True), таким образом уходим от случайного (неконтролируемого) сохранения документа на диск.
 

seoman2

Green Team
17.02.2010
506
1
BIT
58
If nuid.ModifiedSinceSaved - это поле такое на форме?
Вызываю функцию Call RefreshRT(0,uidoc)
всё равно есть окошко сохранения дока, аттач выкидывает с его поля.
 
Последнее редактирование:

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
80
If nuid.ModifiedSinceSaved - это поле такое на форме?
Это свойство объекта NotesUIDocument, означающее, что документ изменялся в UI.

У меня этот код работает без вопросов с тех пор как появилось свойство ModifiedSinceSaved.
Первым параметром желательно передавать тот тип, что указан в описании функции.
Если не работает, попробуйте закоментировать строку, начинающуюся на "If nuid.ModifiedSinceSaved" и её "End If", чтобы строка
Код:
Call nuid.Document.ReplaceItemValue(IN_SAVEOPTIONS, "0")
осталась нетронутой.

Что такое
аттач выкидывает с его поля.
я не понял.
 

maliy

Green Team
20.03.2007
180
2
BIT
47
Дабы не создавать новую тему напишу здесь.
Имеется поле Rich Text . Тип - Editable. в нем файл.
Задача - При нажатии на кнопку проверить если в этом поле есть файл, то стереть его и заменить на новый файл, Но:
Как удалить аттачмент без переоткрытия документа? или переоткрывать документ но SaveOptions не удалять - потому как необходимо сохранить диалоговое окно - сохранить документ/нет/отмена.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
Дабы не создавать новую тему напишу здесь.
Имеется поле Rich Text . Тип - Editable. в нем файл.
Задача - При нажатии на кнопку проверить если в этом поле есть файл, то стереть его и заменить на новый файл, Но:
Как удалить аттачмент без переоткрытия документа? или переоткрывать документ но SaveOptions не удалять - потому как необходимо сохранить диалоговое окно - сохранить документ/нет/отмена.
ничего не понял
если инмемори интерактивно-открытый док - придется перечитать, есть трюк с заменой инмемори дока
есть uidoc.Refresh(true) но насколько я помню - открытый интерактивно док не обновится
а не понял про SaveOptions - ставьте ему OnDisk=False (.SaveToDisk=False) и ничего не изменится
 
Последнее редактирование:

garrick

Lotus Team
26.10.2009
1 352
151
BIT
202
Дабы не создавать новую тему напишу здесь.
Имеется поле Rich Text . Тип - Editable. в нем файл.
Задача - При нажатии на кнопку проверить если в этом поле есть файл, то стереть его и заменить на новый файл, Но:
Как удалить аттачмент без переоткрытия документа? или переоткрывать документ но SaveOptions не удалять - потому как необходимо сохранить диалоговое окно - сохранить документ/нет/отмена.
Храните аттачмены в респонзах, отображайте в документе через embedded view, над view разместите две кнопки "Добавить" и "Удалить". Можно будет что угодно делать с аттачментами не перезагружая и не изменяя основной документ.
 

maliy

Green Team
20.03.2007
180
2
BIT
47
Есть лотус документ, в нем Rich Text поле(attach). Открыл лотус документ Нажал кнопку А:
Код:
Call rtitem.EmbedObject ( EMBED_ATTACHMENT, "", FileName)
'Приатачился файл, но чтобы мне увидеть его , нужно вызвать
Call uidoc.Close
Call workspace.EditDocument(True, doc)
'а чтобы не было диалога сохранить да/нет/отмена
doc.ReplaceItemValue({SaveOptions},{0}).SaveToDisk=False
Все бы хорошо, но мне нужен диалог сохранить да/нет/отмена.
Поэтому приатачить файл сделал другим путем как в статье :

Теперь возникла другая задача. Если в Rich Text поле(attach) есть файл тогда его нужно стереть по кнопке А и приатачить другой:
Код:
If rtitem.Type = RICHTEXT Then
            Forall o In rtitem.EmbeddedObjects
                If o.Type = EMBED_ATTACHMENT Then
                            Call o.Remove
                        End If
                    End Forall
                 Call rtitem.Update
Но опять уперся в то - что нужно переоткрыть документ, но при этом нужен диалог сохранить да/нет/отмена
В этом и вопрос.
Храните аттачмены в респонзах, отображайте в документе через embedded view, над view разместите две кнопки "Добавить" и "Удалить". Можно будет что угодно делать с аттачментами не перезагружая и не изменяя основной документ.
Не вариант. Переделывать всю логику не представляется возможным.
 
Последнее редактирование модератором:

maliy

Green Team
20.03.2007
180
2
BIT
47
Наверное не до конца мысль правильно оформил - когда стереть аттач - необходимо чтоб диалоговое окно не появлялось, а когда уже аттач другой прикреплен тогда при закрытии документа на крестик - чтоб выходило - сохранить документ да/нет/отмена.
 

garrick

Lotus Team
26.10.2009
1 352
151
BIT
202
По мере надобности, создаёте либо удаляете поле SaveOptions (либо заполняете его чем-то или очищаете) перед сохранением документа.
 
Мы в соцсетях:

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