Lotus notes LotusScript从视图获取数据

Lotus notes LotusScript从视图获取数据,lotus-notes,lotusscript,Lotus Notes,Lotusscript,我不熟悉LotusScript,我正在尝试从视图中获取数据并将其保存到字符串中。但每次这样做时,我都会得到一个错误,即初始化对象变量未设置在第36行。在我的domino designer中,第36行正好位于ItemNames(6)下面 我试着使用我朋友的代码,我得到了同样的错误,而他的工作没有问题 请帮帮我,我非常想把这件事做好 Sub Initialize On Error GoTo ERRSUB Dim nSession As New NotesSession D

我不熟悉LotusScript,我正在尝试从视图中获取数据并将其保存到字符串中。但每次这样做时,我都会得到一个错误,即初始化对象变量未设置在第36行。在我的domino designer中,第36行正好位于ItemNames(6)下面

我试着使用我朋友的代码,我得到了同样的错误,而他的工作没有问题

请帮帮我,我非常想把这件事做好

Sub Initialize

    On Error GoTo ERRSUB

    Dim nSession As New NotesSession
    Dim nDb As NotesDatabase
    Dim nDoc As NotesDocument
    Dim view As NotesView
    Dim nitem As NotesItem

    Dim strRecord As String
    Dim DataString As String
    Dim nList List As String
    Dim ListCount As Integer
    Dim FirstLine As String 
    Dim counter As Integer
    counter = 0

    Dim ItemNames(6) As String  
    ItemNames(0) = "Date"
    ItemNames(1) = "Name"
    ItemNames(2) = "Name of buyer"
    ItemNames(3) = "Naziv of project"
    ItemNames(4) = "value"
    ItemNames(5) = "source"
    ItemNames(6) = "status" 

    Set nDb = nSession.Currentdatabase
    Set view = nDb.Getview("X_view_1")
    Set ndoc = view.Getfirstdocument()

    Do Until (ndoc Is nothing)

        ForAll item In ItemNames
            Set nitem = ndoc.Getfirstitem(item)
            DataString = nitem.Values & ";"
            counter = counter + 1
        End ForAll

        DataString = DataString & Chr(13)

        Set ndoc = view.Getnextdocument(ndoc)
    Loop    

    GoTo DONE

    DONE:   

    MessageBox counter
    Exit Sub    

    ERRSUB:

    Call logger("Error",nSession.currentagent.name,"Initialize","","")
    GoTo done       

End Sub

第36行是
DataString=nitem.Values&“;”
。错误在于未正确设置
nitem
。可能该项目在特定文档中不可用。测试
nitem
不是
Nothing

将ForAll循环更改为

    ForAll item In ItemNames
        Set nitem = ndoc.Getfirstitem(item)
        If Not nitem Is Nothing then
            DataString = DataString & nitem.Text
        End If 
        DataString = DataString & ";"
        counter = counter + 1
    End ForAll

我会这样写在下面

我在您的代码中注意到以下几点: *您在错误处理程序中使用GoTo,应该是一份简历。 *当代码无论如何都会到达那里时,您已经“GoTo DONE”,这是不需要的。 *您声明了几个不使用的变量。 *你不用太多的错误检查,克努特的建议很好

以下是我的建议,这是我导出视图的方式:

Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim col As NotesViewEntryCollection
    Dim entry As NotesViewEntry
    Dim DataString As String
    Dim cnt List As Long

    On Error GoTo errHandler
    Set db = session.Currentdatabase
    Set view = db.Getview("X_view_1")
    Set col = view.AllEntries
    '*** Set counters
    cnt("total") = col.Count
    cnt("processed") = 0
    '*** Loop though all view entries, much faster that documents
    Set entry = col.GetFirstEntry()
    Do Until entry Is Nothing
        '*** Update status bar every 100 documents
        If cnt("processed") Mod 100 = 0 Then 
            Print "Processed " & cnt("processed") & " of " & cnt("total") & " documents."
        End If
        '*** Read view columns and add to string
        ForAll cv In entry.ColumnValues
            DataString = cv & ";"
        End ForAll
        '*** Add line break to string
        DataString = DataString & Chr(13)
        '*** Update counter and get next entry in view collection
        cnt("processed") = cnt("processed") + 1
        Set entry = col.GetNextEntry(entry)
    Loop    

exitSub: 
    MsgBox "Processed " & cnt("processed") & " of " & cnt("total") & " documents.",,"Finished" 
    Exit Sub    

errHandler:
    Call logger("Error",session.CurrentAgent.Name,"Initialize","","")
    Resume exitSub       
End Sub
另一种方法是直接从NotesDocument读取值:

DataString = doc.GetItemValue(item)(0) & ";"
当然,这将只读取任何多值字段的第一个值,但您可以这样修复:

DataString = Join(doc.GetItemValue(item),"~") & ";"

如果有多个值,这将在每个值之间放置一个~,然后,您可以按自己喜欢的方式进行处理。

我猜这是一个分类视图,第一个项目只是一个没有文档项目的类别?项目名称不能包含空格,这可能是您的问题。错误原因是nitem.values始终是一个包含一个或多个元素的数组,并且您不能附加字符串(char)到一个数组。要将字符附加到数组中,还可以使用“join(nitem.values,;”)”—这相当于nitem.text属性。(两种方法都要求该项存在)。