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

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

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

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

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

Решено Проблемы с isNewNote и isNewDoc; своя проверка

  • Автор темы ak-47
  • Дата начала
A

ak-47

Visual Basic:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument

If uidoc.IsNewDoc Then
    Messagebox "uidoc.IsNewDoc = True"
Else
    Messagebox "uidoc.IsNewDoc = False"
End If

Dim doc As NotesDocument
Set doc = uidoc.Document
If doc Is Nothing Then Exit Sub

If doc.IsNewNote Then
    Messagebox "doc.IsNewNote = True"
Else
    Messagebox "doc.IsNewNote = False"
End If

После клика по экшену (до сохранения) получаю:
1) "uidoc.IsNewDoc = False"
2) "doc.IsNewNote = True"

После сохранения, ситуация не меняется.

После закрытия, и открытия сохраненного документа получаю:
1) "uidoc.IsNewDoc = False"
2) "doc.IsNewNote = False"

Чем можно объяснить подобные странности? Почему IsNewNote не меняет значение после сохранения?

Да..
Экшен сохранения - shared, с такой @-коммандой : @PostedCommand([FileSave])
 
Последнее редактирование модератором:
E

Elena Nefedova

чем можно объяснить подобные странности? почему IsNewNote не меняет значение после сохранения
Видимо, потому не меняет, что на QueryOpen что-то висит.
Либо каким-то другим способом вновь создаваемый документ изменяется до его открытия в UI, что и позволяет лотусу не считать данный Note новым
 
A

ak-47

Либо каким-то другим способом вновь создаваемый документ изменяется до его открытия в UI, что и позволяет лотусу не считать данный Note новым
С этим полностью согласен, т.к. документ создается программно с помощью метода ws.EditDocument - то IsNewDoc будет иметь значение FALSE.

А вообще проблемму решил следующим образом.

получаю UNID документа, таким образом ws.CurrentDocument.Document.UniversalID
потом пытаюсь получить объект документа при помощи db.getDocumentByUNID
- если ошибки нет, то документ уже сохранен
- если выскакивает ошибка, то считаем, что документ еще не сохранен, и при помощи обработчика ошибок, передаем управление в нужное нам место
 
E

Elena Nefedova

По-моему, если документ не записан, то у него NoteID = 0, хотя UNID уже не нулевой.
Но я документацию на эту тему не читала, так что это может оказаться рецепт не на все случаи жизни :wacko:
 
A

ak-47

Все верно... NoteID=0, а вот UNID - уже существует... но подставив его в getDocumentByUNID получаем ошибку с каким то там кодом... этим собственно я и воспользовался
 

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
Привет!

Столкнулся с тем, что во вновь созданном документе (compose) doc.isNewNote - не показывает правильно пока после сохранения не переоткроешь ui документ, в тоже время uidoc.isNewDoc показывает правильно.

С другой стороны, если doc был создан db.CreateDocument и открыт workspace.EditDocument, то тут глючит uidoc.isNewDoc

Правильна ли во всех случаях будет проверка

Private Function isNewDoc(doc As NotesDocument) As Boolean
If CStr(doc.Lastmodified) = "0:00:00" Then isNewDoc = True
End Function

Заранее благодарю.
 

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
пробовал так:
Private Function isNewDoc(doc As NotesDocument) As Boolean
If CStr(doc.Lastmodified) = "0:00:00" or doc.Noteid="0" Then isNewDoc = True
End Function

Не работает. В отладчике работает, без отладчика нет

Private Function isNewDoc(doc As NotesDocument) As Boolean
If CStr(doc.Lastmodified) = "0:00:00" Then isNewDoc = True
End Function

эта работает
 
Последнее редактирование:

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
implode(Evaluate({@NoteID}, notesdocument)) = {NT00000000}
Работает как для доков созданных в UI/Compose, так и для доков созданных через db.CreateDocument / new NotesDocument(db)
 
  • Нравится
Реакции: VladSh

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Visual Basic:
%REM
    Function getNoteID
    Description: возвращает корректный NoteID документа; обход косяков, когда после сохранения NoteID продолжает возвращать "0"
    В случае, если документ новый, возвращает "0", как и штатное свойство
%END REM
Public Function getNoteID(nd As NotesDocument) As String
    If nd.NoteID = "0" Then
        getNoteID = Right$(Implode(Evaluate({@NoteID}, nd)), 8)
        If getNoteID <> "00000000" Then Exit Function
    End If
    getNoteID = nd.NoteID
End Function

%REM
    Function isNewNote
    Description: корректно определяет, новый документ или нет; обход косяков, когда после сохранения IsNewNote продолжает возвращать True
%END REM
Public Function isNewNote(nd As NotesDocument) As Boolean
    isNewNote = (getNoteID(nd) = "0")
End Function
 
  • Нравится
Реакции: lmike

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Ребят, я тупанул выше в коде - NoteID должен содержать 8 символов, а не 6. Поправил.

Самое интересное, что на старых базах работает и с 6-ю символами, а на новых полетели ошибки...
 
Мы в соцсетях:

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