Domino Directory – People By Client Version

Lotus Notes stores the currently used client version for each user in the user’s person record in the Domino Directory.
It also stores the client version previously used. The information is automatically updated by the Notes client.

Release Overview

One of many new feature in Notes / Domino 8 is a Notes client version view in the Domino Directory.

The Domino Directory contains a People – by Client Version view that you can use to quickly see what versions of the Notes client are deployed on users’ computers in your domains. ( from: What’s new in IBM Lotus Domino 8 and 8.0.1? )

People - By Client Version

The view looks like this

Old View

Indeed, it shows the client versions in your domain. But can it really be used to “quickly see what versions of the Notes client are deployed on users’ computers in your domains”? NO. The view displays ALL releases ever used in your domain. Not very useful.

I changed the view to only display the currently used client version as category. The main problem when designing the view was the fact the the client version information is stored in different fields in the person record. In addition to this, it is stored unsorted.
So a simple @Subset command to get the first ( or last ) entry of the ClntBld field does not neccessarily return the Notes Client version that is currently used by a user.

A great function which is available from version 6 on is @Sort. @Sort can be used in view columns and the greatest trick is custom sorts using the [CustomSort] keyword.

The first column ( categorized, descending ) of the new view contains the following formula.

_list:= ClntBld  + " - "  + @Text(@ToTime(ClntDate)) ;
_Sorted:=@Sort(_list; [CustomSort];
@Trim(@RightBack($A; " - "))
) < @ToTime(
@Trim(@RightBack($B; " - "))
@Subset(@LeftBack(_Sorted; " - ");1)

Parts of this formula are 'stolen' from Rocky Olivers presentation 'AD 304 - Formula Follies and LotusScript Lunacy: Coding Feats that Will Amaze'.
The "All Releases" column contains the same formula, except the last @Subset command. The option for multiple values is set to "New Line".

The result looks like this.

New View

This gives you a better overview about the client versions currently in use than the original view shipped with release 8 of Lotus Notes / Domino.

Get A JSONReader And JSONWriter For FREE

JSONTroy Reimer of SNAPPS donates LotusScript JSONWriter and JSONReader to the community.
You can download Version 1.0 of JSONReader and JSONWriter here.

The database (json.nsf) contains LotusScript classes for parsing and creating JSON text.
These classes are contained in five script libraries: ls.snapps.JSONArray, ls.snapps.JSONObject, ls.snapps.JSONReader, ls.snapps.JSONWriter, and ls.snapps.JSONWrapperConverters.

The JSONArray and JSONObject classes are wrapper classes that are used by the JSONReader class. Additional information can be found in the “Help – About This Database” document.

The JSON LotusScript Classes are also available on OpenNTF.

SnTT: @ServerAccess in LotusScript


You can use @ServerAccess to check if a specified user has a specified administrative access level to a server. For a list of keywords to represent the access level you want to check for take a look at the designer help either on your local client or on the web.

But what to do if you want to check the server access level using Lotus Script? The help document does not give you a cross reference to Lotusscript.

In this case, the Evaluate statement is your friend.
For further information about how to use Evaluate I recommend to read the following article on DeveloperWorks: “Simplifying your LotusScript with the Evaluate statement

The following function uses evaluate and @ServerAccess to make the @function available in LotusScript.

Function atServerAccess ( 
sAction As String, sUserName As String, sServerName As String ) As Boolean
  Dim vAccess As Variant
  vAccess = 
   Evaluate(|@ServerAccess(| + sAction + |; "| + sUserName_
                + |"; "| + sServerName + |")|)	atServerAccess = Cbool(vAccess(0))
End Function

Here is a sample of how to call the function

Sub Click(Source As Button)
  Dim sUser As String
  Dim sServer As String
  Dim sAction As String
  sUser = "Bill Gates/Microsoft"
  sServer = "MyServer/foo"
  sAction = "[RemoteAccess]"

  ' returns TRUE of FALSE
  Msgbox atServerAccess ( sAction, sUser, sServer )
End Sub

What Is Wrong With Year 1700?

2008 is a leap year again. The Gregorian calendar, the current standard calendar in most of the world, adds a 29th day to February in 97 years out of every 400, a closer approximation than once every four years. This is implemented by making every year divisible by 4 a leap year unless that year is divisible by 100. If it is divisible by 100 it can only be a leap year if that year is also divisible by 400.

So, in the last millennium, 1600 and 2000 were leap years, but 1700, 1800 and 1900 were not. In this millennium, 2100, 2200, 2300, 2500, 2600, 2700, 2900 and 3000 will not be leap years, but 2400 and 2800 will be. You can find numerous examples in almost every programming language of how to determine if a year is a leap year or not.

In LotusScript as well as with @Formula you can “adjust” a given date to another date depending on the parameters you use. So the easiest method to determine a leap year is to set the date to March, 1st of the given year and “substract” one day. If the resulting date is Feb., 29th, the year is a leap year.

Here is my @Formula

@Prompt([Ok];"Last Day";@Text( @Day( @Adjust( _date; 0;0;-1;0;0;0 ) ) ) )

I expected a 28 in the message box, but it prompted 29 ! Oups …

I tried the same using LotusScript and the NotesDateTime class

Sub Click(Source As Button)
	Set dt = New NotesDateTime( Datenumber( 1700 ,3, 1) )
	Call dt.AdjustDay (-1)
        Msgbox dt.Localtime
End Sub

Guess what it returns. 29.02.1700 ! Another oups …

Seems that IBM / Lotus uses another calender than the Gregorian calendar. No surprise is that ­čÖé

You might want to try the next piece of code and watch what happens …

Sub Click(Source As Button)
	Set dt = New NotesDateTime( Datenumber( 1700 ,3, 1) )
	Call dt.AdjustDay (-1)
	Msgbox Day (dt.Localtime)
End Sub

An error message occurs, stating that there is a “Type mismatch”. I guess that some subroutines deep in the core code are not sure which calendar to use; Gregorian or IBM calendar. By the way, you get the same error when replacing the 1700 by 1500, 1400, 1300, 1100 and 1000.

If you happen to travel to the year 1700 using a time machine, be careful when planning a meeting at the end of February …

BlackBerry Platform Enhancements

RIM) announced a series of updates for its BlackBerry® platform that include enhanced messaging and collaboration, simpler management, enhanced security and expanded application development support.
These new BlackBerry platform enhancements are scheduled to be phased in to new software releases during the first half of 2008.

My favorites are

  • Remote Search for Messages ├ó?? Users will be able to search for and retrieve email messages from their email server even if the message is no longer stored on their BlackBerry smartphone.
  • Over-the-Air Device Software Upgrades ├ó?? Organizations will be able to update a user’s BlackBerry device software wirelessly, delivering a fast, cost-effective method for remotely supporting users and managing BlackBerry device software lifecycles

For more information, read this press release

‘Merge Replication Conflicts’ does not work as expected in Notes 7.0.3 or 8.0

Although the Form property “Merge Replication Conflicts” is enabled, and the Form contains a $ConflictAction field, a replication conflict occurs when modifications are made to different fields in a database.

1. Create a Form that contains two fields.
2. Enable the Form property, “Merge Replication Conflicts”.
3. Create a document based on the new Form.
4. Create a replica of the database.
5. Modify one field in one replica and the other field in the other replica.
6. When replication occurs, no conflict is generated and the later modified document is what is replicated to all other servers. The modifications made in other replicas documents are lost.

IBM Source

Thanks to Gabor for the hint

User experience guidelines for IBM Lotus rich client applications and plug-ins

This white paper describes user-interface design and interaction guidelines for designers and developers who are building IBM® Lotus® Notes® applications, IBM Lotus Sametime® V7.5 or later plug-ins, IBM Lotus Symphony� plug-ins, IBM Lotus Expeditor plug-ins, or composite applications (assembling any mixture of plug-ins, Lotus Notes applications, and components built with IBM Lotus Component Designer).

[via Mary Beth Raven]

ddCharts – Now Displays Charts In Notes Client

Richard Hogan of 6wSystems released ddCharts v5.0 – Beta 1(b) which displays the charts also in a Notes client, and as, it doesn’t need to access the server using http, it solves the double login issue. Performance with very large views has also been improved.
If you are looking for a solution to display your data as a pie-, line- or bar-chart ( or as gauge as well ) then download your free evaluation copy of ddCharts now.


There will be another download available on the 6wSystems website in a few days which let you create charts from !!HELP!!.
!!HELP!! is an open source trouble ticket solution for Lotus Notes / Domino. Visit to get your copy of !!HELP!!.

OpenProj – A Microsoft Project Replacement

OpenProj is a free, open source project management solution. OpenProj is a complete replacement of Microsoft Project and other commercial project solutions.


The OpenProj solution is the most advanced project solution ever provided to the open source community. Projity has open sourced the entire OpenProj solution including the most advanced scheduling, resource and cost algorithms in the industry. Projity provides the source code and OpenProj solution free of charge. OpenProj runs on Linux, Unix, Mac or Windows desktops.

Display Date Range As Bar In Notes Views

You can find a lot of stuff on the internet like Chris Blatnick’s ” Using Color Columns To Make A Gantt Chart” to display column values either as color or as picture ( you might take a look at “A Splash of Color” as well ).
Today I would like to share my solution on how to build a view to display a date range like it is used in group calendar applications.

Display Calendar Entries

I tried to keep the view design as simple as possible to avoid performance impacts. As you can see in the sample database there are no formulas in the columns. All necessary information is stored in a “collector” document.

Form Design

The form contains one field for each day in a month ( Day_1 … Day_31 ). All fields are of type text with multiple values enabled. To colorize Day_1 ( and all subsequent colums ) simply put 0 : 255 : 255 into Day_1 which results in an aquamarine color.
Surfing the web for more information about view column colors I found this article on
Instead of using 6 decimal numbers for foreground and background color, you can use hexadecimal values as well. This would make it easier to handle the data when passing it via LotusScript to the collector document.

We can now build a list of colorcodes.

' Declaration

Dim ColorCode List As String

Sub Initialize
	ColorCode("Alice_Blue") = "F0F8FF"
	ColorCode("Antique_White") = "FAEBD7"
	ColorCode("Aqua") = "00FFFF"
	ColorCode("Aquamarine") = "7FFFD4"
	ColorCode("Azure") = "F0FFFF"
	ColorCode("Beige") = "F5F5DC"
	ColorCode("Bisque") = "FFE4C4"
	ColorCode("Black") = "000000"
	ColorCode("Blanched_Almond") = "FFEBCD"
	ColorCode("Blue") = "0000FF"
	ColorCode("Blue_Violet") = "8A2BE2"

End Sub

You can call the following function and pass a colorcode from the list as a parameter. You can use any hexadecimal value that is not in the list as well.

Function SetMarker ( doc As NotesDocument, user As String,_
DateFrom As NotesDateTime, DateTo As NotesDateTime, color As String ) As Integer

	On Error Goto ERR_HANDLE
	SetMarker = 0
	Dim item As NotesItem
	Dim i As Integer
	Dim MarkerBegin As Integer
	Dim MarkerEnd As Integer
	Dim MarkerColor (1) As String

	If Iselement(ColorCode( color)) Then
		MarkerColor(0) = ColorCode( color)
		MarkerColor(1) = ColorCode( color)
		MarkerColor(0) = color
		MarkerColor(1) = color
	End If

	MarkerBegin = Day ( DateFrom.DateOnly )
	MarkerEnd = Int ( Day ( DateTo.DateOnly )) + 1

	Set Item = doc.ReplaceItemValue ( DAY_FLD_PREFIX + Cstr( MarkerBegin ), MarkerColor)
	If MarkerEnd - MarkerBegin > 1 Then
		For i = (MarkerBegin +1) To (MarkerEnd -1)
			Set Item = doc.ReplaceItemValue ( DAY_FLD_PREFIX + Cstr ( i ), "" )
	End If
	If Not ( MarkerEnd > 31 ) Then
		Set Item = doc.ReplaceItemValue ( DAY_FLD_PREFIX + Cstr ( MarkerEnd ), "FFFFFFF" )
	End If
	Call doc.Save ( False, False )

	Exit Function
End Function

The function writes the necessary values to the document. It translates the DateFrom and DateTo parameters and writes the according colorcodes. As you can see in the next screenshot, only two fields are needed to build a bar for a date range.


Notes colorizes the column displaying the colorcode from the document and subsequent columns as long as you do not set the column to another color. Any hexadecimal value longer than 6 will reset the column color to default.

DOWNLOAD Sample Database

Notes 7.0.3 – Problem With German Umlauts

I’ve recently downloaded “IBM Lotus Notes Client 7.0.3 for Windows 2000, XP and Vista German (C180SDE)” from passport advantage. After upgrading my 7.0.2 de client to the 7.0.3 the views in the IBM standard templates do no longer display multi value entries as expexted.

The problem is reproducable. With a little help from the Lotus Notes Community, it was found that this issue only occurs when you use Umlauts in your view columns.
It seems to be a regression bug described here.

To solve this issue, you can replace your umlauts with the corresponding ue, ae etc. or simply add


to the client’s notes.ini.

P.S. There already exists an SPR ( # JKEY79CGTE ). I hope it will be fixed in 7.0.4.

Instance member…does not exist’ when enabling Out Of Office

Today I had a lot of calls in our helpdesk regarding Out Of Office. Users complained that the had enabled the agent before Christmas and it worked fine but when they tried to disable the agent it does not disable. Instead the Out Of Office profile shows the following message:

Even it is in German, I think I do not have to translate the blue text as you might know that this is the message that is displayed when a user has editor access to his mail file and tries to enable / disable the Out Of Office agent.
With editor access an administration request is created that will enable / disable the agent on behalf of the user.

Well, nothing special so far. Except the fact that this message is displayed to the user all day long and I could not find any administration request on the server.

I tried to reproduce the error on my workstation but failed. I opened the users desktop remotely and there it was. An error message occurred in the statusbar stating that there is a

Notes error: 182 Instance member CONFIGUREMAILAGENTTEXT does not exist.

I searched the Knowledge Base for CONFIGUREMAILAGENTTEXT and found this technote

In Lotus Notes®, you attempt to enable the Out Of Office (OOO) agent in your mail file. The agent does not enable and you notice the following error message in the status bar of the Notes client:

“Notes error: 182 Instance member CONFIGUREMAILAGENTTEXT does not exist.”

This issue only occurs for users with Editor access to their mail file and only occurs in Notes, regardless of the mail template design being used. The issue does not occur when using Lotus Domino® Web Access (DWA) mail.

So, what has happened?

On December, 29th, 2007 I did a mass change on the users mail files to ensure that all ACL only have editor access with all options set except ‘Can Create personal agents’.

We use Domino server version 7.0.3 and Notes Client version 7.0.2 with a slightly modified dwa7.ntf mail template. The changes do not touch the Out Of Office profile !

Reading the technote mentioned before, I found the following hint:

NOTE: The DWA7 client that ships with the Notes/Domino 7.0.2 release is incompatible with all previous versions of Notes.

All previous versions of Notes? Does this mean version 7.0.1, too ?
To make a long story short; yes it means that version 7.0.1 is not compatible with dwa7.ntf shipped with client version 7.0.2.

And yes, we have some clients still using this version. Exactly the same users who are not able to disable the Out of Office agent are on this ‘old’ client version.

To solve the puzzle, I will have to update the clients ASAP J

Another option ( according to the technote ) is to grant designer access. I used the following code to do the changes out of the Domino Directory.

Create a new agent in the DD ( Select from menue, All selected documents ) and copy the following code into the agent.

Option Public
Option Declare

'Use "OpenLogFunctions"
Sub Initialize
	'On Error Goto Errorhandler
	Dim ws As New NotesUIWorkspace
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim total As Long
	Dim docnum As Long

	Set db = session.CurrentDatabase

	Set dc = db.UnprocessedDocuments
	total = dc.Count
	docnum = 0

	Set doc = dc.GetFirstDocument
	While Not doc Is Nothing
		docnum = docnum + 1
		Call UpdateStatusBar(docnum, total)
		Call ProcessPersonDoc(doc)
		Set doc = dc.GetNextDocument(doc)

	Call ws.ViewRefresh
	'Exit Sub

	'Call LogError
	'Exit Sub

End Sub

Sub UpdateStatusBar(x As Long, total As Long)
	'This will display the percentage complete in the status bar as the agent runs

	Print "Working..." & Cstr(Round((x / total), 2)*100) & "% done"

End Sub

Sub ProcessPersonDoc(doc As NotesDocument)
	'On Error Goto stackError
	Dim s As New NotesSession
	Dim profile As NotesDocument
	Dim owner As String
	Dim ACL As NotesACL
	Dim ACLEntry As NotesACLEntry
	Dim nn As NotesName

	Dim Maildb As New NotesDatabase( doc.MailServer(0), doc.MailFile(0) )
	If Maildb.IsOpen Then
		Print( "Succesfully opened " & Maildb.Title )
		Set profile = Maildb.GetProfileDocument("CalendarProfile")
		Set nn = s.CreateName ( profile.Owner(0) )

		Set ACL = MailDB.ACL
		Set ACLEntry = ACL.GetEntry ( profile.Owner(0) )
		If Not ( ACLEntry Is Nothing ) Then
		End If

		'Set OWNER access to DESIGNER
		Set ACLENtry = New NotesACLEntry ( ACL, profile.Owner(0), 5 )
		ACLENtry.CanDeleteDocuments = True
		ACLENtry.CanCreateLSOrJavaAgent = True
		ACLENtry.IsPerson = True

	End If

	'Exit Sub
	'Call LogError()
End Sub

Now you can select one or more persons and run the agent against their mail file. The agent will read the calendar profile to determine the mail file owner and then changes the ACL.