Lotus Notes: как отсортировать многозначное поле в порядке убывания

Я новичок в Lotus Notes. У меня есть форма поиска по ключевым словам и поле истории редактирования. Каждое изменение записывается в поле истории редактирования. История редактирования отображается, как показано ниже:


ДАТА: 10.02.2016 ПОЛЬЗОВАТЕЛЬ: (имя) ОТ: ключевое слово :: значения ключевого слова ДО: ключевое слово :: значения ключевого слова


ДАТА: 29.05.2016 ПОЛЬЗОВАТЕЛЬ: (имя) ОТ: ключевое слово :: значения ключевого слова ДО: ключевое слово :: значения ключевого слова

Добавление в историю редактирования находится под предыдущим редактированием, поэтому оно отображается в порядке возрастания. Как отсортировать историю изменений по убыванию? Или можно вставить новую историю редактирования над предыдущей историей редактирования, чтобы сделать ее в порядке убывания? Если да, то как я могу это сделать? Заранее благодарю вас за вашу помощь. :)

В моем многозначном поле EditHistory у меня есть этот код:

@If(@IsDocBeingLoaded & @IsNewDoc; @Return(""); @True);  
@If(!@IsDocBeingSaved; @Return(@Sort(EditHistory;[Descending]));  
@Trim(@Subset(@Sort(EditHistory;[Descending]) ; -100)))

В декларациях:

Dim FieldValues() As String 

В моей форме есть такие:

Sub EditHistorylist 
  Dim session As New NotesSession
  Dim workspace As New NotesUIWorkspace
  Dim source As NotesUIDocument
  Dim fieldnum As Integer
  Dim entry As String
  Dim histo As Variant

  Set source = workspace.CurrentDocument 
  For fieldnum = 0 To Ubound(FieldValues)
    If FieldValues(fieldnum,1) <>source.fieldgettext(FieldValues(fieldnum,0)) Then 
      entry = Chr(10) + "DATE:" + Date$+Chr(10)+ "USER:" + session.CommonUserName +_
        Chr(10)+ "FROM:" + FieldValues(fieldnum,0) + "::" + FieldValues(fieldnum,1)+_
        Chr(10)+ "TO:" + FieldValues(fieldnum,0) + "::" + source.fieldgettext(FieldValues(fieldnum,0)) +_
        Chr(10) + Chr(95) + Chr(95) + Chr(95) 
      Call source.FieldAppendText("EditHistory",Chr(10)+entry)
    End If
  Next
End Sub

События документа:

Sub Querysave(Source As Notesuidocument, Continue As Variant)
  If Not Source.IsNewDoc Then
    Call EditHistorylist 
  End If
End Sub

Sub Postmodechange(Source As Notesuidocument) 
  'build array of current values
  Dim session As New NotesSession
  Dim db As NotesDatabase
  Dim doc As NotesDocument
  Dim form As NotesForm
  Dim fieldnum As Integer
  Dim counter As Integer

  Set db = session.CurrentDatabase
  Set doc = Source.Document
  Set form = db.GetForm(doc.Form(0))
  fieldnum = Ubound(form.fields)
  Redim FieldValues(fieldnum,1)
  counter = 0 
  Forall field In form.fields
    FieldValues(counter,0) = field
    FieldValues(counter,1) = source.fieldgettext(field)
    counter = counter + 1
  End Forall
End Sub

person Faith Camille    schedule 30.09.2016    source источник
comment
покажите нам код, который вы используете для записи истории, тогда мы сможем показать, как изменить направление ... Нет кода, нет помощи!   -  person Torsten Link    schedule 30.09.2016
comment
В моем многозначном поле EditHistory есть этот код @If (@IsDocBeingLoaded & @IsNewDoc; @Return (); @True); @If (! @ IsDocBeingSaved; @Return (@Sort (EditHistory; [Descending])); @Trim (@Subset (@Sort (EditHistory; [Descending]); -100)))   -  person Faith Camille    schedule 03.10.2016
comment
В объявлениях: Dim FieldValues ​​() As String В моей форме у меня есть: Sub EditHistorylist Dim session As New NotesSession Dim workspace As New NotesUIWorkspace Dim source As NotesUIDocument Dim fieldnum As Integer Dim entry As String Dim histo As Variant Set source = workspace.CurrentDocument Для fieldnum = 0 до Ubound (FieldValues)   -  person Faith Camille    schedule 03.10.2016
comment
Если FieldValues ​​(fieldnum, 1) ‹› source.fieldgettext (FieldValues ​​(fieldnum, 0)), то запись = Chr (10) + DATE: + Date $ + Chr (10) + USER: + session.CommonUserName + Chr (10) + ОТ: + FieldValues ​​(fieldnum, 0) + :: + FieldValues ​​(fieldnum, 1) + Chr (10) + TO: + FieldValues ​​(fieldnum, 0) + :: + source.fieldgettext (FieldValues ​​(fieldnum, 0)) + Chr (10) + Chr (95) + Chr (95) + Chr (95) Источник вызова. FieldAppendText (EditHistory, Chr (10) + запись) End If Next End Sub   -  person Faith Camille    schedule 03.10.2016
comment
Sub Querysave (Source as Notesuidocument, Continue as Variant) Если не Source.IsNewDoc, тогда вызовите EditHistorylist End If End Sub   -  person Faith Camille    schedule 03.10.2016
comment
Sub Postmodechange (Source As Notesuidocument) 'построить массив текущих значений Dim session As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Dim form As NotesForm Dim fieldnum As Integer Dim counter As Integer   -  person Faith Camille    schedule 03.10.2016
comment
Установить db = session.CurrentDatabase Set doc = Source.Document Set form = db.GetForm (doc.Form (0)) fieldnum = Ubound (form.fields) Redim FieldValues ​​(fieldnum, 1) counter = 0 Для всех полей в form.fields FieldValues ​​(counter, 0) = field FieldValues ​​(counter, 1) = source.fieldgettext (field) counter = counter + 1 End Forall End Sub   -  person Faith Camille    schedule 03.10.2016


Ответы (2)


Начнем с того, что каждая строка в истории представляет собой строку, даже если вы отсортируете эти строки, результат будет отсортирован в лексикографическом порядке, а это означает, что 10 февраля 2016 года будет до 29 мая 2016 года, а это будет раньше. 29.05.2015.

Сортировка этого списка после завершения кажется не лучшим вариантом.

Можно ли вставить новую историю редактирования над предыдущей историей редактирования, чтобы она была в порядке убывания?

Да, конечно

как я могу это сделать?

Все зависит от того, как новая строка добавляется в поле. С @Formula это было бы довольно просто, возможно, просто history: = newLine: history

В LotusScript вы можете захватить существующие строки с помощью history = document.getItemValue("history"), что даст массив. Затем вы можете использовать какой-нибудь array-fu для добавления новой строки, что-то вроде строк

redim preserve history(ubound(history)+1)
for i = ubound(history) down to 1
    history(i) = history(i-1)
next
history(0) = newLine
call document.replaceItemValue("history", history)

Теперь обработка динамических массивов в LotusScript может быть сложной задачей, так что наберитесь терпения и обратитесь к справке, встроенной в Domino Designer.

person Éric Viala    schedule 30.09.2016
comment
Я получаю сообщение об ошибке Неожиданный отказ; ожидается: оператор; TO в строке For i = Ubound (FieldValues) до 1, что я могу сделать, чтобы исправить эту проблему? Спасибо. - person Faith Camille; 03.10.2016

Попробуй это:

Dim newRow(0) As String
newRow(0) = "new history line"
If document.History(0) = "" Then
    document.History=newRow
Else
    document.History =  Arrayappend(newRow, document.history)
End If
person Sándor Tatai    schedule 13.02.2017