Opening another mail file is causing Type mismatch in method CoerStrToNum: STRING found, DOUBLE expected
Thomas Hampel
7 January 2015Problem:
Opening the mail file of another person is causing the message "Type mismatch in method CoerStrToNum: STRING found, DOUBLE expected" to be displayed:
While IBM Technote 1303181 only provides a basic idea of what is wrong, it does not give any idea what can be done to fix it.
So I had to look into details and quickly found the problem.
Steps to reproduce
In order to reproduce the problem, this is what you have to do:
- Make sure you have the Notes.ini variable CHECK_QUOTA_ON_MAIL_CREATE set to 1
- Open another person's mail file, this will write the current date at the end of the Notes.ini variable DELEGATED_MAIL_FILEx
- Close your Notes client
- Change the date format of your operating system from DD.MM.YYYY to MM/DD/YYYY (or the other way around)
- Open the same other persons mail file again.
Analysis
Trying to find the root cause with debugging enabled shows a different error "*CE39918+421: Type mismatch"
but at least it indiicates the problem is located in the Database Open script.
What is causing this problem?
Obviously it is a String to Date conversion issue. Storing a Date in a String to convert it back to a date is never a good idea. If you really need to do it you should not rely on the CDat function to work. Write your own function which does ignore the
Regional settings - in specific the date format - of this workstation have been changed.
Resolving the problem
Change the date format of your operating system back to what it should be.
If the date format of your computer is correct and the problem still persists, then manually update your Notes.ini and remove all lines starting with DELEGATED_MAIL_FILE or by updating the date format at the end of this line yourself.
Permanent solution
A perfect solution would require to update the mail template to be updated. in specific the script Library "CheckQuotas" contains a class called "CheckQuota" with the Sub "SetCalMgrINI"
This sub contains several references where a string is being converted to a date. This is where additional verification is required to ensure the string value is a date which can be converted using the current regional settings.
1.) Comment
Proposed new sub: writes all dates in iso8601 format.
Sub SetCalMgrINI
If db.Server <> "" Then
Dim servName As New NotesName(db.Server)
Dim retStr As String
Dim tmpDate As String
Dim oldestDate As String
Dim idxOldestDelegated As Integer
Dim idxDelegated As Integer
Dim strToday As String
Const iso8601date = "yyyy-mm-dd"
Const INI_VAR = "DELEGATED_MAIL_FILE"
Const MAX_DELEGATED = 35
Dim nmCom As String
idxDelegated = 1
retStr = Me.getEnvStr(INI_VAR & idxDelegated)
strToday = Format$(Today, iso8601date)
nmCom = ownerName.Common
Do While retStr <> ""
tmpDate = StrRightBack(retStr, "_")
If Instr(1, retStr, nmCom, 5) = 1 Then ' found common name (was <>0, but given format below, should be 1!)
If tmpDate <> strToday Then ' set date if not today in ISO8601
Call Me.setEnv(INI_VAR & idxDelegated, nmCom + "_" + servName.Abbreviated + "!!" + db.FilePath + "_" + strToday)
End If
Exit Sub 'found, so exit
End If
' Store oldest date
If tmpDate Like "####-##-##" Then ' Is found Date iso?
If oldestDate = "" Or tmpDate < oldestDate Then ' is oldest empty or earlier than current
oldestDate = tmpDate
idxOldestDelegated = idxDelegated
End If
Else ' if not iso, mark it as oldest
idxOldestDelegated = idxDelegated
End If
idxDelegated = idxDelegated + 1
If idxDelegated > MAX_DELEGATED Then ' if max reached, overwrite oldest found
idxDelegated = idxOldestDelegated
Exit Do
End If
retStr = Me.getEnvStr(INI_VAR & idxDelegated)
Loop
Call Me.setEnv(INI_VAR & idxDelegated, nmCom + "_" + servName.Abbreviated + "!!" + db.FilePath + "_" + strToday)
End If
End Sub
2.) Untitled
Today I had this problem as well.
A user that is a a business trip changed the regional settings from German(Austria) to English (Malaysia).
As soon as the quota check for delegated mail check is done the error occurs.
I have fixed this by sending the user a button that deleted the DELEGATED_MAIL_FILE entries from the notes.ini
Dim Session As New NotesSession
Dim MailName As String
Dim i As Integer
For i=1 To 35
MailName = Strleft(Session.GetEnvironmentString("DELEGATED_MAIL_FILE" & i, True),"_")
Call Session.SetEnvironmentVar("DELEGATED_MAIL_FILE" & i , "", True)
If MailName <> "" Then
Call Session.SetEnvironmentVar(MailName & "_LastMailDbSize","",True)
Call Session.SetEnvironmentVar(MailName & "_LastMailDbWarningQuota","",True)
Call Session.SetEnvironmentVar(MailName & "_LastMailDbMaxQuota","",True)
End If
Next