Получите доступ к текущему документу и отобразите окно сообщения от агента, вызванного через lotusscript из пользовательского интерфейса - PullRequest
3 голосов
/ 21 декабря 2011

У меня есть агент со следующим кодом:

Sub Initialize
    MessageBox "AgentStart"
    Print "AgentStart"

    Dim ws As New NotesUIWorkspace
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim vItemsBySupplierSpec As NotesView
    Dim Doc As NotesDocument
    Dim DocsWithSameSupplierSpec As NotesDocumentCollection
    Dim MatchingDoc As NotesDocument
    Set Doc = ws.CurrentDocument.Document

    If Len(Doc.ItemSupplierSpecification(0)) > 0 Then
        ' Check that this supplier specification isn't use anywhere else.'
        Set db = s.CurrentDatabase
        Set vItemsBySupplierSpec = db.GetView("vItemsBySupplierSpec")

        Set DocsWithSameSupplierSpec = vItemsBySupplierSpec.GetAllDocumentsByKey(Doc.ItemSupplierSpecification(0), True)
        Set MatchingDoc = DocsWithSameSupplierSpec.GetFirstDocument

        Dim ItemsString As String

        ItemsString = "The following items already use this supplier specification." + Chr(10) + Chr(10) + _
        "You should check whether you really want to raise another, or use the existing one." + Chr(10)


        While Not MatchingDoc Is Nothing
            ItemsString = ItemsString + Chr(10) + MatchingDoc.ItemNumber(0) + " - " + MatchingDoc.ItemDescription(0)
            Set MatchingDoc = DocsWithSameSupplierSpec.GetNextDocument(MatchingDoc)
        Wend

        If DocsWithSameSupplierSpec.Count > 0 Then
            Print ItemsString
            MsgBox ItemsString
        End If
    End If
End Sub

Ранее он запускался в событии onchange поля в форме.

Я создал агента, как указано выше, и хочу вызвать его из пользовательского интерфейса как в сценарии lotus, так и на языке @formula.

Dim s As New NotesSession
Dim db As NotesDatabase

Set db = s.CurrentDatabase

Dim CheckSupplierSpec As NotesAgent
Set CheckSupplierSpec = db.GetAgent("CheckSupplierSpec")

If CheckSupplierSpec.Run = 0 Then
    MessageBox "Agent Ran"
End If

Я создал агент как триггер, по событию - выбор меню, цель: нет, опции: общая. Я получаю сообщение "Агент Ран".

Однако я попробовал это сделать, хотя, проверяя агента, он говорит, что последний раз запускался, когда было запущено событие onchange. Я не получаю никаких сообщений или вывода на печать.

Первый вопрос: почему не работает окно сообщений? 2-й вопрос: как я могу получить текущий документ?

Ответы [ 2 ]

5 голосов
/ 21 декабря 2011

Проблема в том, что вы теряете контекст при вызове агента с помощью метода Run.Как подсказывает дизайнер :

Пользователь не может напрямую взаимодействовать с вызываемым агентом.Вывод пользователя идет в журнал Domino.

Вместо этого вы можете попытаться передать идентификатор документа в качестве параметра методу выполнения:

Dim ws as New NotesUIWorkspace
Dim s As New NotesSession
Dim db As NotesDatabase

Set db = s.CurrentDatabase

Dim CheckSupplierSpec As NotesAgent
Set CheckSupplierSpec = db.GetAgent("CheckSupplierSpec")

If CheckSupplierSpec.Run(ws.CurrentDocument.Document.NoteID) = 0 Then
    MessageBox "Agent Ran"
End If

Этот параметр доступен для агентав свойстве ParameterDocID:

http://www -12.lotus.com / ldd / doc / domino_notes / rnext / help6_designer.nsf / Main? OpenFrameSet

2 голосов
/ 21 декабря 2011

Было бы полезно узнать, почему вы перевели его с onChange на агента, но я думаю, что есть способы сделать то, что вы хотите.

Вы упомянули вызов агента из языка формул - мне удалось отобразить окно сообщений, вызывающее агента следующим образом:

@Command([RunAgent];"CheckSupplierSpec")

Другой вариант - использовать агента в качестве агента Java. Это дает вам доступ к классам пользовательского интерфейса Java, которые будут отображаться даже при вызове NotesAgent.Run. Пример здесь .

Если вы не хотите переделывать весь агент в Java, вы можете использовать LS2J для доступа к классам пользовательского интерфейса Java. Например, вы можете создать библиотеку сценариев Java под названием «Java Messagebox»:

import javax.swing.JOptionPane;

public class JavaMessagebox {

    public void Messagebox (String message) {
        JOptionPane.showMessageDialog(null, message);
    }

}

, а затем вызвать его из агента LotusScript следующим образом:

Use "Java Messagebox"
Uselsx "*javacon"
Sub Initialize
    Dim mySession  As JavaSession
    Dim myClass As JavaClass
    Dim myObject As JavaObject
    Set mySession = New JavaSession()
    Set myClass = mySession.GetClass("JavaMessagebox")
    Set myObject = myClass.CreateObject()
    myObject.Messagebox(|This is my Java messagebox!|)
End Sub

Для более изощренного примера использования компонента Java AWT, который использует собственный внешний вид вашей операционной системы, я рекомендую изучить База данных примеров LS2J Джулиана Робичо . Его пример StatusBox не является модальным, но вы можете найти параметр, чтобы сделать его модальным здесь , если необходимо.

...