Используя Lotus из VBA, как импортировать элементы расширенного текста в новый сеанс? - PullRequest
1 голос
/ 20 августа 2009

У меня есть функция VBA, которая инициализирует сессию лотосных заметок, создает документ и отправляет его по почте. Он также принимает в качестве необязательного параметра NotesRichTextItem, который я добавляю в тело письма.

Однако я получаю сообщение об ошибке «Все объекты должны быть из одного сеанса». Как «импортировать» этот NotesRichTextItem в мой сеанс?

Добавлен код редактирования

Sub SendLotusMail(SubjTxt As String, _
                BodyTxt As String, _
                EmailTo As String, _
                EmailCC As String, _
                AutoSend As Boolean, _
                Attach As String, _
                ReportTitle As String, _
                Optional AppendToBody As NotesRichTextItem = Null)
On Error GoTo EH
    NtSession.Initialize
    OpenMailDb ReportTitle
    Set NtDoc = Ntdb.CreateDocument

    NtDoc.AppendItemValue "Form", "Memo"
    NtDoc.AppendItemValue "SendTo", EmailTo
    NtDoc.AppendItemValue "CopyTo", EmailCC
    NtDoc.AppendItemValue "Subject", SubjTxt
    Set NtBodyRT = NtDoc.CreateRichTextItem("Body")
    NtDoc.AppendItemValue "Body", NtBodyRT
    If Attach <> "" Then NtBodyRT.EmbedObject EMBED_ATTACHMENT, "", Attach, "Attachment"
    NtBodyRT.AppendText BodyTxt

    'This next line throws the error "All objects must be from the same session"
    NtBodyRT.AppendRTItem AppendToBody

Правка-решение найдено
Мне это не очень нравится, но я обошел все эти проблемы, передав объекту RichTextItem, его родительский NotesDocument и родительский NotesSession его родителя. Итак, теперь я вызываю эту процедуру с 3 дополнительными объектами вместо 1. Ура.

Правка - найдено новое решение Что ж, предыдущее решение вызывало у меня проблемы, поэтому, пока я не найду (или кто-то не предложит) обходной путь, я просто буду использовать некоторые пользовательские процедуры электронной почты для отчетов, которые требуют этого. Это действительно дублирует некоторый код, но незначительно.

Ответы [ 3 ]

1 голос
/ 20 августа 2009

Проблема может заключаться в том, что объект NtSession переинициализируется в вашей подпрограмме. Если вызывающая процедура отправляет элемент расширенного текста, я предполагаю, что она также создала и инициализировала NotesSession. Если это так, вы бы хотели, чтобы ваш код повторно использовал тот же сеанс. Похоже, что NtSession является глобальным - в этом случае вы могли бы:

  1. Обеспечить, чтобы вызывающая маршрутизация всегда инициализировала этот глобальный сеанс;
  2. При необходимости передайте объект NtSession в качестве аргумента (и ваш код может проверить, является ли этот объект нулевым, перед созданием и инициализацией своего собственного сеанса); или
  3. Перед вызовом Initialize проверьте, инициализирована ли уже NtSession - чтобы сделать это, вы можете проверить атрибут и посмотреть, генерирует ли объект ошибку (не проверенный код):

    function isNotesSessionInitialized (ns)  
        on error goto err  
        dim sUser  
        sUser = ""  
        sUser = ns.commonUserName  
    err:  
        if (sUser = "") then  
            return false  
        else  
            return true  
        end if  
    end function
    
0 голосов
/ 16 сентября 2010

(я пишу это, чтобы закрыть мой вопрос) Я справился с этой проблемой, просто имея отдельные почтовые программы для отчетов, которые требуют пользовательских настроек. Да, есть некоторое дублирование кода, но оно намного лучше, чем у бегемота, которого я собирался сделать.

0 голосов
/ 20 августа 2009

Это поможет увидеть код здесь. Я все же угадаю, что происходит.

В вашей функции VBA вам необходимо создать новый объект NotesRichTextItem в вашей электронной почте. Например:

Dim docMail as New NotesDocument(db)
Dim rtBody as New NotesRichTextItem(docMail, "Body")

Call rtBody.AppendRTItem(myRTparameter)

Я представляю, что должно работать без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...