LotusScript: недопустимый тип значения ключа

Может ли кто-нибудь предложить некоторую помощь в этом? Я получаю сообщение об ошибке «неверный тип значения ключа» при попытке поиска в представлении с использованием переменной userName в качестве ключа.

Это потому, что это тип NotesName? Есть ли способ обойти это? Любая помощь приветствуется. Спасибо!

%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

person Community    schedule 02.02.2012    source источник
comment
Какие значения вы получаете при отладке.   -  person Simon O'Doherty    schedule 02.02.2012


Ответы (1)


Похоже, вы используете переменную userName несколько раз для разных целей, один раз в определении функции, а затем изменяя тип позже в коде. Код выглядит так, как будто он был скопирован из другой функции и адаптирован, потому что передаваемое в нем значение не совпадает с тем, которое вы сравниваете в коде позже, также нет ничего, чтобы установить возвращаемое значение функции, что является еще одной ошибкой.

Вот как я бы написал эту функцию

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
person Declan Lynch    schedule 02.02.2012
comment
Код Деклана выглядит хорошо. (Неудивительно! :-)) Краткий ответ на конкретные вопросы: 1. Это потому, что это тип NotesName? Да. 2. Есть ли способ обойти это? Используйте метод NotesName.Abbreviated. Это предполагает, что представление All\LocSysLookup использует формат сокращенного имени в первом отсортированном столбце. Если используется канонический формат, используйте NotesName.Canonical. Если используется только общее имя, используйте NotesName.Common. - person Richard Schwartz; 02.02.2012