1

当使用 LotusScript 访问 ColumnValues(通过 NotesDocument 或 NotesViewEntry 访问的值的变体数组)时,某些数组元素可能包含一个或多个元素中的嵌入数组。例如:

doc.ColumnValues(0) = "A"
doc.ColumnValues(1) = ["A", "B"]
doc.ColumnValues(2) = 4
...

有没有办法一次性将所有数组值分配给一个数组?如果您将 ColumnValues 数组分配给变量变量,那么这仅在数组元素中没有嵌入数组数据时才有效,即:ColumnValues(1) = "AB" 而不是 "[A,B]" 例如:

dim v as variant
v = doc.ColumnValues

如果存在数组,则此分配失败,但如果所有元素都是标量则有效。一种解决方法是确保所有 ColumnValues 都是标量(不是数组),但这不能保证。我唯一的其他解决方法是遍历所有 ColumnValues 并检查数组:

For i = 1 to ubound(doc.ColumnValues)   'or other columcount var!
  v=doc.ColumnValues(i)
  if isarry(v) then
    a=join(v,";")
  else
    a=v
  end if
Next

以上方法有效,但对于许多列来说非常慢,有人有替代方法吗?

4

2 回答 2

3

好的,经过一些测试,我发现了以下内容:如果我使用 forall 循环......

dim cvals() as variant
redim cvals(ncolsreqd)
i = 0
ForAll v In doc.columnValues
    If IsArray(v) Then
        cvals(i) = Join(v, ";")
    Else
        cvals(i) = v
    End if
    i = i + 1
End ForAll
Print "v:= " & Join(cvals, ",")

然后 ColumnValues 似乎只检索一次,并且许多列的性能不受影响。(如果使用 For 循环,则每次查找整个数组,然后从数组中选择 1 个元素)。

于 2013-05-13T14:01:30.810 回答
0

另一个想法:如果您要检索的数据几乎总是标量,您可以使用单个分配给变体:

dim v as variant
v = doc.ColumnValues

然后,如果由于类型不匹配(嵌入式数组)而导致此错误,则仅在 forall 循环中重新处理数据作为错误处理的一部分,然后恢复。在大多数情况下避免了 forall 循环,并且总体上应该更快。(但是,如果大部分数据是多值的,那么错误/数组处理路径可能会更慢)!

于 2013-05-14T16:33:50.490 回答