我可以通过以下代码连接莲花笔记。所以基本上我连接到数据库: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连接到这个数据库?
我非常感谢你的回答!
答案 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")