一个小小的车:创建,保存和创建的代码通过VBA打开Lotus Draft Email

时间:2010-09-15 15:10:36

标签: vba access-vba lotus-notes

编写此函数是为了创建Lotus电子邮件,填充它,将其保存到“草稿”部分,然后打开它以供用户编辑。但是,它有两个问题:

  1. 并不总是打开正确的草稿电子邮件进行编辑。
  2. 它有时会产生“Notes错误 - 指定的命令在工作区中不可用”。错误信息。 (电子邮件仍然保存,所以没有大的损失。)
  3. 这两个问题都是不定期发生的。如果有模式,我还没有看到它。我可以解决这些问题吗?有关减少错误的其他任何提示吗?

    (注意:我正在遗漏错误处理程序)

    Dim NtSession As New NotesSession
    Dim NtDB As New NotesDatabase
    Dim NtWkSp As Object
    Dim NtDoc As New NotesDocument
    Dim NtObj As New NotesEmbeddedObject
    Dim NtBodyRT As New NotesRichTextItem
    NtSession.Initialize
    
    '==========================================================================
    'Open the mail server
    Set NtDB = NtSession.GetDatabase( _
        NtSession.GetEnvironmentString("MailServer", True), _
        NtSession.GetEnvironmentString("MailFile", True), _
        True)
    
    '==========================================================================
    'Fill in basic email fields
    Set NtDoc = NtDB.CreateDocument
    NtDoc.AppendItemValue "Form", "Memo"
    Set NtBodyRT = NtDoc.CreateRichTextItem("Body")
    AddFields
    
    '=========================================================================
    ' Save it to the drafts folder
    DoEvents
    NtDoc.SaveMessageOnSend = True
    NtDoc.SignOnSend = True
    NtDoc.Save False, False, True
    Set NtWkSp = CreateObject("Notes.NotesUIWorkspace")
    DoEvents
    NtWkSp.OpenDatabase _
        NtSession.GetEnvironmentString("MailServer", True), _
        NtSession.GetEnvironmentString("MailFile", True), _
        "($Drafts)"
    DoEvents
    NtWkSp.VIEWREFRESH
    NtWkSp.EDITDOCUMENT
    
    Set NtWkSp = Nothing
    Set NtSession = Nothing
    

3 个答案:

答案 0 :(得分:0)

NtWkSp.VIEWREFRESH来电之后,您需要确保视图选择在您刚刚添加的草稿上,否则,当您致电NtWkSp.EDITDOCUMENT时,它将始终打开第一个草稿,因为那是查看它指向。

除此之外,对于Lotus Objects类使用早期绑定和Lotus自动化类的后期绑定似乎很奇怪,但是可能有目的吗?

Notes错误发生在哪一行?

答案 1 :(得分:0)

NotesUIWorkspace EditDocument方法可以选择性地传递Notes文档的句柄,并以编辑模式打开该文档。所以,你可以使用类似的东西:

...
NtWkSP.EditDocument (true, NtDoc)

答案 2 :(得分:0)

这两组类是不相关的,并且使用不同的API和不同的运行时上下文 - 您的NtDoc对象将不存在于工作空间上下文中。尽管我讨厌这样做,但我建议在Notes Automation类中完成所有工作。无论如何,您必须在Notes命名空间中打开NotesSession,以确保您拥有正确的文档(无论是使用NotesDatabase.GetDocumentByUNID,NotesDatabase.GetDocumentByID还是NotesView.GetDocumentByKey)。显然有两个会话,两个数据库,两个文档等等,都指向同一组对象的不同句柄会变得混乱,实际上可能会导致冲突。

(为了回答之前的问题,Lotus Domino Objects是一个受支持的COM接口,它支持早期绑定,但只能访问后端; Notes Automation Objects接口是一个早期且不推荐使用的OLE接口,不支持早期坦率地说,具有约束力,并且有点崩溃。)