I found that in many of my applications I was always recording document history
(creation, changes, workflow events, etc.) in a multi-value text field usually
at the bottom of the document. Most of the time I took the easy way out and
just kept appending history items to the field, this results in a oldest to
newest list. Most often users want a list that is most recent (newest) to
least recent (oldest). I wrote the WriteHistory function to accomondate both
types of history lists. The ReverseMVI (Reverse Multi-value item) was written
to correct my past mistakes and reverse the order of exisitng histroy lists.
Function WriteHistory(historyText As String, mode As Integer, historyItem
As String, doc As NotesDocument) As Integer
' --------------------------------------------------------------------
---------------------------------------------------------
' historyText - The text string to be written.
' mode - 0 = new item appended to the bottom of the list. 1 = new item
is added at the top of the list.
' HistoryItem - string name of the item to add the historyText to.
' doc - the NotesDocument that contains the history item.
' --------------------------------------------------------------------
---------------------------------------------------------
' Time Stamps in a mmm d,yyyy h:mmam/pm format such as Oct 11,1999
6:17pm
' --------------------------------------------------------------------
---------------------------------------------------------
Dim stampDate As String
Dim stampTime As String
Dim item As NotesItem
Redim newHistory(0) As String
Dim x As Integer
' Date/Time Formats
stampDate = "mmm d,yyyy"
stampTime = "h:nnam/pm"
Set item = doc.GetFirstItem(HistoryItem)
If item Is Nothing Then
' Just in case the item does not already exist on the document
Set Item = New NotesItem( doc, HistoryItem, "")
End If
If mode = 0 Then
' New items appear at the end of the history field
Call item.AppendToTextList(Format(Date(),stampDate) & " " &
Format(Time(),stampTime) & " - " & HistoryText)
Else
' New items appear at the top of the history field
If item.text = "" Then
' Handle a current history item with just a single NULL
value.
Redim newHistory(0) As String
Else
Redim newHistory(Ubound(item.values)+1) As String
' Transfer previous history entries
For x = 0 To Ubound(item.values)
newHistory(x+1) = item.values(x)
Next
End If
' Add the new history entry
newHistory(0) = Format(Date(),stampDate) & " " &
Format(Time(),stampTime) & " - " & HistoryText
' Rewrite the hsitory list
item.values = newHistory
End If
WriteHistory = True
End Function
Function ReverseMVI(itemName As String, doc As NotesDocument) As Integer
' --------------------------------------------------------------------
-----------------------------------------------
' This function will reverse the order of the values in a multi value
field
' itemName - Field Name of the history list to reverse.
' doc - The notes document object in which the itemName field exists.
' Example: Original values... 1,2,3 After ReverseMVI... 3,2,1
' --------------------------------------------------------------------
-----------------------------------------------
Dim item As NotesItem
Dim nEntries As Integer
Redim newHistory(0) As String
Set item = doc.GetFirstItem(itemName)
nEntries = Ubound(item.values)
Redim newHistory(nEntries) As String
Forall v In item.values
newHistory(nEntries) = v
nEntries = nEntries - 1
End Forall
item.values = newHistory
ReverseMVI = True
End Function
This was first published in November 2000