【问题标题】:How to create array of lists in LotusScript如何在 LotusScript 中创建列表数组
【发布时间】:2014-01-23 06:53:03
【问题描述】:

我有这样的代码:

    Dim MyACL As Variant
    Dim Person As List

    Redim MyACL(0)

    Person("Detail1") = "Something1"
    .
    .
    .
    Person(Detailx") = "Somethingx"

    ForAll name in names
       ReDim Preserve MyAcl(Ubound(MyACL)+1)
       Person("Name") = name
       MyACL = ArrayAppend(MyACL,Person)
   End ForAll

它抛出错误“类型不匹配”。你知道如何创建列表数组吗?谢谢。

【问题讨论】:

    标签: lotus-notes lotusscript


    【解决方案1】:

    这是一个典型的例子,当你想使用一个类,并创建一个该类的数组时。该类又可以包含一个列表(以及其他东西)。可以很强大!

    更新:

    使用类的好处是可以在类中添加业务逻辑,以后很容易扩展更多功能。下面是一个示例,基于上述问题,但具有附加功能。

    Class PersonObject
        Public PersonAttribute List As String
        Public NABdoc As NotesDocument
        Public PersonName As String
    
        Public Sub New(personname As String)
            Dim nab as New NotesDatabase("Server/Domain","names.nsf")
            Dim view as NotesView
            '*** Get person document from Domino directory
            Set view = nab.GetView("PeopleByFirstName")
            Set me.NABdoc = view.GetDocumentByKey(personname)
            '*** Set person name in object
            me.PersonName = personname
            '*** Set some values from person doc
            me.PersonAttribute("Email") = GetValue("InternetAddress")
            me.PersonAttribute("Phone") = GetValue("OfficePhone")
        End Sub
    
        Public Function GetValue(fieldname as String) as String
            GetValue = me.NABdoc.GetItemValue(fieldname)(0)
        End Function
    
        Public Sub AddAttribute(attributename as String, value as string)
            me.PersonAttribute(attributename) = value
        End Sub
    
    End Class
    

    您现在可以使用此类非常轻松地构建一个列表(并假设 names 是一个唯一名称的列表):

    Dim person List As PersonObject
    Dim personname As String
    
    ForAll n in names
        '*** Create person object based on name
        person(n) = New PersonObject(n)
        '*** Store additional info about this person
        person.AddAttribute("Age","35")
    End ForAll    
    

    希望这能让您了解如何使用类。

    您还可以查看以下两个有关面向对象的 Lotusscript 基础知识的博客文章:

    http://blog.texasswede.com/object-oriented-lotusscript-for-beginners-part-1/

    http://blog.texasswede.com/object-oriented-lotusscript-for-beginners-part-2/

    【讨论】:

    • 我完全同意你的观点,一个班级会更好地做到这一点,但没有任何示例代码,这个答案恕我直言不够具体......
    • 为什么你认为使用类更好?我正在考虑这个选项,但列表数组对我来说看起来更简单。但是,我问过的每个人都建议使用类。你有什么具体的理由,为什么它更好?
    【解决方案2】:

    如果你明确地将一个变量声明为数组(就像你在 Redim 语句中所做的那样),那么它就不能使用 arrayappend 来“重新分配”。

    而且没有必要这样做。只需将行 MyACL = ArrayAppend(MyACL,Person) 替换为 MyACL(Ubound(MyACL)) = Person

    注意:使用该示例代码,您将永远不会填充 MyACL(0),因为填充的第一个元素是 MyACL(1)

    要开始用元素 0 填充数组,需要像这样更改代码:

    Dim max As Integer
    max = 0
    ForAll thisName In names
        ReDim Preserve MyAcl(max)
        Person("Name") = thisName
        MyACL(max) = Person
        max = max + 1
    End ForAll
    

    但是:我不知道,这是否是个好主意,因为您不能直接访问 Person 的“Detail1- Property”。

    类似

    detail = MyACL(1)("Detail1")
    

    不可能。你总是必须有一个像这样的临时变量:

    person = MyACL(1)
    detail = person("Detail1")
    

    【讨论】:

    • 谢谢,同时我自己想通了,它看起来很像你的解决方案,而且它有效:) 你所说的问题对我来说很好,因为我将在 ForAll 循环中使用它.在这种情况下,我可以直接访问它。
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多