• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Пропадают Документы Из Представления После Пересохранения

  • Автор темы juk-777
  • Дата начала
J

juk-777

И снова здравствуйте уважаемые форумчане.

Опишу ситуацию, а затем проблему:
Имеются 2 идентичные по настройкам базы: Основная база документов и Архив Документов (куда списываются отработанные документы).
Имеются в этих базах также идентичные вьюхи и формы.

Проблема с следующем: когда пересохраняю через UI документ в Архиве - то он пропадает из представления. обновления вьюхи по F9 не помогает, поэтому приходится перестраивать индекс по shift+F9 (это очень неудобно так как не все пользователи знают про такую комбинацию).
НО, когда пересохраняю через UI документ в Основной базе - то он тоже пропадает из представления, но перестраивать индекс не надо, помогает просто обновления вьюхи по F9 ну или по стрелочке обновления в левом верхнем углу у вьюхи.

ВОПРОС: почему так происходит?

P.S. частота обновления индекса в свойствах обеих баз - стоит НЕМЕДЛЕННО. В свойствах представления в разделе "Индекс" выставлял все возможные значения - результат один .. только перестраивать надо чтобы увидеть пересохраненный док.
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
формула отбора вьюх, нужно глянуть, что-то в документе меняется.
Если сильно замороченные, то надо проверять по частям.
Через scanez проще всего,Lite версия даже может, но если нет, то делаем поля на форму туда вставляем эту формулу и смотрим документ до сохранения и после, предварительно сохранив ссылку.
 
J

juk-777

формула отбора вьюх, нужно глянуть, что-то в документе меняется.
Если сильно замороченные, то надо проверять по частям.
Через scanez проще всего,Lite версия даже может, но если нет, то делаем поля на форму туда вставляем эту формулу и смотрим документ до сохранения и после, предварительно сохранив ссылку.

Формула отбора одной из вьюх вот:
SELECT ( ((@Left(Form;4)="Vhod")&( ТИП_ДОКУМЕНТА="Проект н.п.а. поступающий на согласование") )|(РАССМАТРИВАЕТ_ДОКУМЕНТ="В Архиве"&ПРЕДВАРИТ_ЧИТАЮТ_ДОЛЖНОСТ_ЛИЦА="На контроле")&ОТМЕТКА_ОБ_УДАЛЕНИИ=0)

Если честно не очень понял что именно надо сделать исходя из этого текста: "делаем поля на форму туда вставляем эту формулу и смотрим документ до сохранения и после, предварительно сохранив ссылку."

Вот что заметил буквально несколько минут назад. Есть копии этих баз на других серверах (ну то есть с ними в общем работают другие организации), так вот - там все отлично работает и документы не пропадают из вьюх.
Может ли это быть из-за созданного индекса? В базах где все работает индекс создан по умолчанию с единственной галкой - индексировать зашифрованные поля. А в базе где документы пропадают - индекс создан по всем пунктам, включая вложения.
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
Формула отбора одной из вьюх вот:
SELECT ( ((@Left(Form;4)="Vhod")&( ТИП_ДОКУМЕНТА="Проект н.п.а. поступающий на согласование") )|(РАССМАТРИВАЕТ_ДОКУМЕНТ="В Архиве"&ПРЕДВАРИТ_ЧИТАЮТ_ДОЛЖНОСТ_ЛИЦА="На контроле")&ОТМЕТКА_ОБ_УДАЛЕНИИ=0)

Значения полей: РАССМАТРИВАЕТ_ДОКУМЕНТ, ПРЕДВАРИТ_ЧИТАЮТ_ДОЛЖНОСТ_ЛИЦА,ОТМЕТКА_ОБ_УДАЛЕНИИ

Смотрим значения полей, до сохранения документа.
Затем сохраняем документ.
Смотрим значения полей, если меняются: значит где-то на форме в событиях стоит пересчет.

Вот что заметил буквально несколько минут назад. Есть копии этих баз на других серверах (ну то есть с ними в общем работают другие организации), так вот - там все отлично работает и документы не пропадают из вьюх.
Спорно... Копии баз могут отличаться программным кодом, иначе бы хватило просто реплики и разграничения доступа.
 
J

juk-777

Значения полей: РАССМАТРИВАЕТ_ДОКУМЕНТ, ПРЕДВАРИТ_ЧИТАЮТ_ДОЛЖНОСТ_ЛИЦА,ОТМЕТКА_ОБ_УДАЛЕНИИ

Смотрим значения полей, до сохранения документа.
Затем сохраняем документ.
Смотрим значения полей, если меняются: значит где-то на форме в событиях стоит пересчет.

Значения полей как до сохранения как после сохранения одинаковые, сморю через свойства документа на второй закладке. НО из представления удаляется все равно.
Создал другое представление с пустой выборкой, ну то есть с отбором по всем документам, так вот документ не удаляется из этого представления, но в столбцах с вышеуказанными полями пустые значения, хотя само поле через свойство документа заполнено значением.
Почему так?
Ах да забыл сказать, события формы выложу сейчас:

Sub Queryopen(UIDoc As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
If Isnewdoc=False Then
If Isnull(Arraygetindex(UIDoc.Document.РАССМАТРИВАЕТ_ДОКУМЕНТ,"регистратор")) And Isnull(Arraygetindex(UIDoc.Document.РАССМАТРИВАЕТ_ДОКУМЕНТ,"На резолюции"))Then
If Mode=1 Then Continue=False
End If
End If
End Sub

Sub Querymodechange(UIDoc As Notesuidocument, Continue As Variant)
Dim CurDoc As NotesDocument
Set CurDoc=UIDoc.Document
'----------удаление SAVEOPTIONS ---------------------
If CurDoc.HasItem("SAVEOPTIONS")=True Then
Call CurDoc.RemoveItem("SAVEOPTIONS")
End If

End Sub

НИкаких пересчетов полей нет, поэтому не пойму почему происходит подобное.
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
QuerySave и PostSave пустые?
Подформы есть на форме? Если да, то в событиях подформ может быть пересчет.
Сами поля редактируемые или вычисляемые? Если вычисляемы то там есть формула.

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

juk-777

QuerySave и PostSave пустые?
Подформы есть на форме? Если да, то в событиях подформ может быть пересчет.
Сами поля редактируемые или вычисляемые? Если вычисляемы то там есть формула.

QuerySave и PostSave - пустые.
Подформ нет.
Поля вычисляемые (заполняются в процессе работы), в формуле стоит название поля.


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

juk-777

Проблему решил добавив в событие формы следующий код.

Sub Querysave(Source As Notesuidocument, Continue As Variant)

Call Source.Document.Save(1,0)
Continue=True

End Sub

Теперь просто по нажатию на F9 документ отображается в виде.
Прошу разъяснений по приведенному коду - правильно ли я сделал, можно ли так вообще было делать или есть другие варианты?

Спасибо ...
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
код:
Call Source.Document.Save(1,0)

читается как NotesDocument(True,False)
первый параметр - принудительное сохранение.
второй параметр - сделать ответным, у вас жесткий False.
Значит если документ был ответным, то он перестанет им быть и иерархия, если она была - сломается.

Вопрос: до сохранения поле $Ref было в документе?

Что касается перебивки индекса, это странно, так как кнопки F9 всегда хватало и Shift-F9 нажимать не надо.
Так же как и странно, что колонки пустые, а значения есть.

Добавлено: Вы когда поля проверяли в документе после сохранения - переоктрывали его? или просто сохранили и смотрели?
 
J

juk-777

код:
Call Source.Document.Save(1,0)

читается как NotesDocument(True,False)
первый параметр - принудительное сохранение.
второй параметр - сделать ответным, у вас жесткий False.
Значит если документ был ответным, то он перестанет им быть и иерархия, если она была - сломается.

Вопрос: до сохранения поле $Ref было в документе?

Что касается перебивки индекса, это странно, так как кнопки F9 всегда хватало и Shift-F9 нажимать не надо.
Так же как и странно, что колонки пустые, а значения есть.

Добавлено: Вы когда поля проверяли в документе после сохранения - переоктрывали его? или просто сохранили и смотрели?

Спасибо за разъяснения.
До сохранения поля $Ref в документе не было.
Я проверял поля документа во вьюхе после сохранения.

Хотелось бы уточнить по поводу метода save. В документации указано, что второй параметр учитывается только если у первого значение False, так ли это? И почему тогда в той же документации в примерах пишут конструкции типа Save(True,True) ... это аналогично написанию Save(True,false) или есть различия? И если можно разъяснить в каких случаях использовать метод с различными параметрами ...
save(1,0)
save(1,1)
save(0,1)
save(0,0)

P.S. если я правильно понял то метод save со вторым параметром равным True использовать при работе с ответными документами. А при работе с обычными доками можно использовать с параметром равным False. Поправьте плиз если я не прав.
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
В хелпе:
flag = notesDocument.Save( force, createResponse [, markRead ] )
Метод всегда возвращает значение, если только Call не используется.
True - удалось сохранить, False - в пролете.

Первые 2 параметра обязательные, но по хелпу да, второй учитывается только при первом False, совсем запамятовал.
Но, так как хелп IBM может долго не обновлять, то лично я уже привык писать call Save(True,doc.IsResponse), на всякий случай.
И кажется натыкался на то, что он все же учитывается. Ибо пару ответных при Save(True,False) я потерял.

Если первый True, то документ будет сохранен в любом случае, даже если он заблочен кем-то (открыт на редактирование).
И если этот кто-то после такой правки в бэке сохранит документ, то получит сообщение о возможном конфликте.
Конечно это не решает ошибки: "Вы не входите в список авторов..."

Второй параметр отвечает за "дочерность" документа и как гласит опять же хелп:
"Если кто-то редактирует документ, то этот параметр укажет что сделать"
Если проще: Если первый Fasle и второй True и документ кто-то редактирует, то сохраниться новая версия документа, которая будет ответная к основной, если False ничего не сохраниться.
Но что самое главное, это дает использовать следующую конструкцию:
Код:
If doc.Save(false,false) then
'...
End If
Такой подход может использоваться в циклах на сохранение документа-счетчика.

Есть док, в котором хранится последний порядковый номер, резервируем номер, пытаемся прописать новый, если не получается снова резервируем и так пока не сохраним. Только главное не зациклиться :)
 
Мы в соцсетях:

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