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

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

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 поля в форме.

Теперь я создал агент, как указано выше, и хочу вызвать его из пользовательского интерфейса как в сценарии лотоса, так и на языке @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, я не получаю никаких окон сообщений или вывода на печать.

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


person George Duckett    schedule 21.12.2011    source источник


Ответы (2)


Было бы полезно узнать, почему вы переместили его из 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 немодальный, но вы можете найти параметр, чтобы сделать его модальным здесь, если необходимо.

person Rob Darwin    schedule 21.12.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

person Ken Pespisa    schedule 21.12.2011
comment
Спасибо за этот пример, похоже, это решение для получения текущего документа. Однако мой первый вопрос: почему не отображается окно сообщения. Первая строка агента должна отображать один. - person George Duckett; 21.12.2011
comment
Это как бы согласуется с тем фактом, что методы пользовательского интерфейса не разрешены, когда агенты запускаются таким образом. Представление окна сообщений или печать заявления будет функцией пользовательского интерфейса. Однако я думаю, вы должны увидеть сообщение в журналах сервера. Либо так, либо весь агент сканируется на наличие вызовов пользовательского интерфейса в начале и даже не запускается, если он их содержит. Я смутно помню, что это было в случае с ошибкой, с которой я имел дело несколько лет назад, но не цитируйте меня по этому поводу :) - person Ken Pespisa; 21.12.2011
comment
Хмм хорошо. Это раздражает, но имеет смысл. Спасибо еще раз. - person George Duckett; 21.12.2011