Search code examples
lotus-noteskey-valuelotusscript

LotusScript: Invalid Key Value Type


Can someone offer some help on this? I'm getting an 'invalid key value type' error when trying to search a view using the userName variable as a key.

Is this because it's the NotesName type? Is there any way to get around this? Any help appreciated. Thanks!

%REM
 Sub aiv_checkPersonIsValid
Description: 
Checks that the person(s) that have been entered into the location database are valid
members of the CCL Address Book

Function calls: N/A
Sub calls: N/A
Called in event: onChange (to populate fields)
Called in action: Save and Close, Save, Save And Add Another
Called by: co_countValuesAndPopulate() 

%END REM
Public Function aiv_checkPersonIsValid (userName As NotesName) As Boolean

Dim s As New NotesSession
Dim w As New NotesUIWorkspace
Dim peopleDb As NotesDatabase
Dim peopleView As NotesView
Dim peopleDoc As NotesDocument
Dim thisDoc As NotesDocument
Dim uidoc As NotesUIDocument
Dim key(0) As Variant
Dim noMatchFound As String
Let noMatchFound = "No match found for this name. Please choose a name from the      menu provided."
Dim PersonNameField As NotesItem        
'Dim userName As NotesDocument
Set uidoc = w.CurrentDocument
Set thisDoc = uidoc.Document        

    'get handle to People database and check we've found the database
    Set peopleDb=s.GetDatabase("****", "ccl\development\LocSysPeople.nsf")
    If Not peopleDb Is Nothing Then

            'get handle to view in People database and check we've found the view
            Set peopleView = peopleDb.GetView("All\LocSysLookup")
            If Not peopleView Is Nothing Then

                'Make the PersonNameField variable equal to the value of the first item in the Person Name Field
                Set PersonNameField = thisDoc.GetFirstItem("PersonName")

        ForAll pName In PersonNameField.Values
            'Start to loop through the PersonNameField and check that the names chosen exist in the people database 
            'lookup record in People database which matches the name in the PersonName field on this document   

            Set userName = New NotesName(pName)

            Set key(0) = userName

            'Set peopleDoc = peopleView.GetDocumentByKey(uidoc.Document.GetItemValue("PersonName")(0), True)
            Set peopleDoc = peopleView.GetDocumentByKey(key, True)

                    'If there is no match found to the document in the peopleDb, show a MsgBox
                    If peopleDoc Is Nothing Then
                                MsgBox "No match found in the CCL People Database for '" + pName.Common + "'. Please choose a valid name.", 0, "Error: No match found"
                    aiv_checkPersonIsValid=False
                    Exit Function
                    End If

        'End Loop   
        End ForAll

    End If
End If

End Function

Solution

  • You seem to be using the userName variable multiple times for different purposes, once in the function definition and then changing the type later in the code. The code looks like it was ripped from a different function and adapted because the value being passed in it not the one your comparing in the code later, there is also nothing to set the return value of the function which is another error

    Here's how I would write that function

    Public Function aiv_checkPersonIsValid As Boolean
    
        aiv_checkPersonIsValid=False
    
        Dim s As New NotesSession
    
        Dim w As New NotesUIWorkspace
    
        Dim uidoc As NotesUIDocument
        Set uidoc = w.CurrentDocument
    
        Dim thisDoc As NotesDocument
        Set thisDoc = uidoc.Document  
    
        Dim userName As NotesName
        Dim peopleDoc As NotesDocument
        Dim PersonNameField As NotesItem        
    
        'get handle to People database and check we've found the database
        Dim peopleDb As NotesDatabase
        Set peopleDb=s.GetDatabase("****", "ccl\development\LocSysPeople.nsf")
        If Not peopleDb Is Nothing Then
    
            'get handle to view in People database and check we've found the view
            Dim peopleView As NotesView
            Set peopleView = peopleDb.GetView("All\LocSysLookup")
            If Not peopleView Is Nothing Then
    
                'Make the PersonNameField variable equal to the value of the first item in the Person Name Field
                Set PersonNameField = thisDoc.GetFirstItem("PersonName")
    
                ForAll pName In PersonNameField.Values
                    'Start to loop through the PersonNameField and check that the names chosen exist in the people database 
                    'lookup record in People database which matches the name in the PersonName field on this document   
    
                    Set userName = New NotesName(pName)
                    Set peopleDoc = peopleView.GetDocumentByKey(userName.Abbreviated, True)
    
                    'If there is no match found to the document in the peopleDb, show a MsgBox
                    If peopleDoc Is Nothing Then
                        MsgBox "No match found in the CCL People Database for '" + pName.Common + "'. Please choose a valid name.", 0, "Error: No match found"
                        Exit Function
                    End If
                End ForAll
                aiv_checkPersonIsValid = true
            End If
        End If
    
    End Function