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

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

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

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

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

Работа С Rtf Полями.

  • Автор темы haldey
  • Дата начала
Статус
Закрыто для дальнейших ответов.
H

haldey

Доброго времени суток!
Прошу помочь решить задачку, как хранить историю изменения полей.
Вообщем у меня получилось сохранять только 2-й и последующие варианты.
При первом сохранении документ не сохраняется если убрать первый If.
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim rtitem, RDateItem As Variant
Set cuid = Source
Set CurDoc = cuid.Document
Set rtitem = curdoc.GetFirstItem( "numberhistory" )
Set RDateItem = curdoc.GetFirstItem( "RDatehistory" )

If CurDoc.old_number(0)<>"" Then 'Если не проверять то документ не сохранится
If CurDoc.old_number(0) <> CurDoc.Number(0) Then
Call curdoc.replaceitemvalue("old_number", CurDoc.Number(0))
Call CurDoc.Save(True, False)
If rtitem.Type = RICHTEXT Then
Call rtitem.AppendText( CurDoc.Number(0) & {, } & getAFSession.CurrentUser.ShortName & {, } & Format$(Now, "dd.mm.yyyy hh:mm"))
Call rtitem.AddNewLine( 1 )
Call curdoc.Save(False, True)
curdoc.SaveOptions="0"
Call cuid.Close()
End If
End If
End If

If CurDoc.old_number(0)="" Then
Call curdoc.replaceitemvalue("old_number", CurDoc.Number(0))
End If

'============================================================================
========

If CurDoc.old_RDate(0)<>"" Then 'Если не проверять то документ не сохранится
If CurDoc.old_RDate(0) <> CurDoc.RDate(0) Then
Call curdoc.replaceitemvalue("old_RDate", CurDoc.RDate(0))
If RDateItem.Type = RICHTEXT Then
Call RDateItem.AppendText( CurDoc.RDate(0) & {, } & getAFSession.CurrentUser.ShortName & {, } & Format$(Now, "dd.mm.yyyy hh:mm"))
Call RDateItem.AddNewLine( 1 )
Call curdoc.Save(False, True)
curdoc.SaveOptions="0"
Call cuid.Close()
End If
End If
End If

If CurDoc.old_RDate(0)="" Then
Call curdoc.replaceitemvalue("old_RDate", CurDoc.RDate(0))
End If

End Sub
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Call CurDoc.Save(True, False) в событии Querysave!
и прочий винегрет:
Код:
curdoc.SaveOptions="0"
Call cuid.Close()
как же я это люблю!..
и кто-то после этого смеет заявлять, что платформа не пользуется популярностью?
 
A

alexas

В помощь начинающиму.
VladSH написал правильно, но для Вас непонятно.
Немного расшифрую "винегрет"
1. в Querysave так делать не надо:
Call curdoc.Save(False, True)
curdoc.SaveOptions="0"
Call cuid.Close()
Никогда.
Если не хочется сохранять док, используйте параметр в Querysave - Continue :
например: If (почему не надо сохранять) Then Continue = False
2. Source он и в Африке Sourse:
Set cuid = Source ??????
Set CurDoc = cuid.Document ??????
если уж очень хочется, то просто Set CurDoc = Source.Document,
хотя здесь - это лишнее.
3. RTF поле, как-бы не причем.
хочется сохранять историю в поле "RDatehistory" флаг Вам в руки:
если для показа в UI - делаете его (текстовое поле "RDatehistory") "multivalue" с разделителем для показа "NewLine" и дописывайте в конец.
Например: Source.Document.RDatehistory = Source.Document.RDatehistory(0)+chr(13)+{новая строка}
Переписывайте код, все получится. И более внимательно читайте Help, там много интересного!
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
1. Часто так делаю (для каждой проверки свой выход):
Код:
If (почему не надо сохранять) Then
Continue = False
Exit Sub	 'это не нужно делать только в onSubmit
End If
3. Изменений м.б. очень много, можем выпасть за 32kb, возможно потому RT.
Значения в текстовое поле добавлял бы так:
Код:
Call Source.Document.replaceItemValue("ItemName", FullTrim(ArrayAppend(Source.Document.getItemValue("ItemName"), newValue)))
И перестал бы делать такие проверки:
Код:
If CurDoc.old_number(0)<>"" Then
так гораздо лучше:
Код:
If Len(ndCurrent.getItemValue("ItemName")(0)) <> 0 Then
Добавлено: обсуждение по последнему излиянию уехало сюда.
 
H

haldey

1. в Querysave так делать не надо:
Call curdoc.Save(False, True)
curdoc.SaveOptions="0"
Call cuid.Close()
Никогда.
Если не хочется сохранять док, используйте параметр в Querysave - Continue :
например: If (почему не надо сохранять) Then Continue = False

А в принципе в UI можно так делать?
Пример брал из helpa, правда там button
Код:
Sub Click(Source As Button)
Dim w As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim docA As NotesDocument
Dim rtitemA As Variant
Dim rtitemB As Variant
Set uidoc = w.CurrentDocument
Set docA = uidoc.Document
Call uidoc.Save
Set rtitemA = docA.GetFirstItem( "Body" )
Set rtitemB = docA.GetFirstItem( "Body1" )
If ( rtitemA.Type = RICHTEXT And _
rtitemB.Type = RICHTEXT ) Then
Call rtitemA.AddNewLine(1)
Call rtitemA.AppendRTItem( rtitemB )
docA.body1 = " "
docA.SaveOptions = "0"
Call docA.Save(False, True)
Call uidoc.Close
End IF
End Sub

Хотелось сделать именно через RTF по причине 32К
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
haldey
В принципе, можно. Как и ездить по встречке.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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