通过vba连接到特定的Lotus Notes数据库/文档

时间:2015-02-13 07:21:01

标签: vba lotus-notes lotus-domino lotus

我可以通过以下代码连接莲花笔记。所以基本上我连接到数据库:CLASTNAME/O=TEST/C=US.nsf

Set oSession = CreateObject("Notes.NotesSession")
Server = oSession.GetEnvironmentString("MailServer", True)

UserName = oSession.UserName
MailDbName = Left$(UserName, 1) & Right$(UserName, (Len(UserName) - InStr(1, UserName, " "))) & ".nsf"

'Open the mail database in notes
Set db = oSession.GETDATABASE("", MailDbName)

Set view = db.GetView("Customers") //ERROR

但是,我想连接到我拥有的特定数据库。这是文档链接:

<NDL>
<REPLICA C1451C8A:00575D55>
<VIEW OD3B89A25B:7D1FR7SA-OM4923732F:011L111C>
<NOTE OFAAAA64WE:GH1Q0W0W-IUZ0987MNB:2222F4LÖ>
<HINT>CN=ZZZUSDMS09/O=ZZZ/C=US</HINT>
<REM>Database 'UserName', View 'Customers', Document 'AG: A list of all company customers, Jannuary 9, 2009'</REM>
</NDL>

这就是我的尝试:

Sub notesBB()
    'Const DATABASE = ""
    Dim r As Integer
    Dim i As Integer
    Dim db As Object
    Dim view As Object
    Dim Entry As Object
    Dim nav As Object
    Dim oSession As Object   'The notes session
    Dim nam As Object       ' notes username
    Dim v() As Variant      ' to hold the subtotal values
    Dim bills(12, 16)       ' 12 months, 16 departments
    r = 1
    Worksheets(1).Range("A1:Z99").Clear

    '##############################
    'Start a session to notes
    Set oSession = CreateObject("Notes.NotesSession")
    Server = oSession.GetEnvironmentString("MailServer", True)

    UserName = "CN=ZZZUSDMS09/O=ZZZ/C=US" 'oSession.UserName
    CustomerDbName = "CZZZUSDMS09/O=ZZZ/C=US" & ".nsf"
    'Open the mail database in notes
    Set db = oSession.GETDATABASE("", CustomerDbName)

    Set view = db.GetView("OD3B89A25B:7D1FR7SA-OM4923732F:011L111C")
    view.AutoUpdate = True // here I get an error
    Set nav = view.CreateViewNav 
    Set Entry = nav.GetFirst
    Do Until Entry Is Nothing
    If Entry.isCategory Then
        r = r + 1
        v = Entry.ColumnValues
        For i = 1 To 16
        bills(v(0), i) = v(4 + i)
        Cells(4 + r, 2 + i) = bills(v(0), i)
        Next
    End If
    Set Entry = nav.getNextCategory(Entry)
    DoEvents
    Loop
End Sub

然而,正如您所看到的,我得到了一个错误:view.AutoUpdate = True // here I get an error

如何通过vba连接到这个数据库?

我非常感谢你的回答!

3 个答案:

答案 0 :(得分:2)

嗯,这看起来并不正确:

CustomerDbName = "CZZZUSDMS09/O=ZZZ/C=US" & ".nsf"
'Open the mail database in notes
Set db = oSession.GETDATABASE("", CustomerDbName)

你只是追加&#34; .nsf&#34;以规范形式对用户的完全破坏的名称,这对于服务器上的数据库来说是一个非常不寻常的命名约定。此外,在您的代码的前面,您检索了服务器名称,但在此您要指定&#34;&#34;对于服务器名称而不是使用您检索的内容,结果是代码将尝试在本地计算机上打开数据库。

NDL文件在这里为您提供数据库的ReplicaID:

<REPLICA C1451C8A:00575D55>

您可以改为使用OpenByReplicalID方法:

repID = "C1451C8A00575D55"         ' note that the : is removed
'Open the database by replica id 
set db = new NotesDatabase("","")
If db.OpenByReplicaID( , "85255FA900747B84" ) Then
   Print( db.Title & " was successfully opened" )
Else
   Print( "Unable to open database" )
End If

然而,下一个问题是NDL文件正在提供视图的UNID,而不是它的名称

<VIEW OD3B89A25B:7D1FR7SA-OM4923732F:011L111C>

Notes COM API中没有可以通过其UNID检索视图的调用;你需要这个名字。但你真的需要得到这个观点吗? NDL为您提供文档的UNID:

<NOTE OFAAAA64WE:GH1Q0W0W-IUZ0987MNB:2222F4LÖ>

因此,如果您的目标是获取NDL中指定的特定文档,则可以使用对GetDocumentByUNID的调用。但请注意,实际的UNID仅包含上述标记中OF右侧的17个字符,减去:char。所以你的代码看起来像这样:

unid = "AAAA64WEGH1Q0W0W" ' see note below!!
Set doc = db.GetDocumentByUnid(unid)
BTW,UNID看起来不合法。字符应为十六进制,W,Q和G不是。我假设您(或某人)故意模糊NDL文件中的数据。

如果您确实需要访问该视图,NotesNoteCollection类可能会提供一种方法来实现,但这不会是微不足道的。

最后,您可能会发现code from Stepehn Wissel有用。

答案 1 :(得分:1)

改为指定视图的名称:

Set view = db.GetView("Customer")

答案 2 :(得分:1)

很高兴看到我的代码被回收!在我看来,你没有使用正确的数据库和视图名称。他们不是吗? 数据库&#39;用户名&#39;,以及查看&#39;客户&#39; ? (来自你的链接)。无论如何 - 当您的XL VBA崩溃时,在Debug - Locals窗口中,查找您尝试使用SET命令实例化的对象。如果它们显示为&#34;没有&#34;,您已经错误地设置SET命令并尝试使用失败的对象(视图),然后在下一行崩溃。

如果您的服务器名称是&#34; Yoda&#34;我猜你需要

Set db = session.getdatabase("Yoda", "Username.nsf")
Set view = db.GetView("Customers")