3

我有一个具有以下代码的代理:

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 事件中运行的。

我现在已经像上面那样创建了一个代理,并且想从 ui 中以 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

我将代理创建为触发器,事件 - 菜单选择,目标:无,选项:共享。我确实收到了“特工 Ran”消息框。

我已经尝试过了,但是虽然检查了它说它最后一次在onchange事件触发时运行的代理,但我没有收到任何消息框或打印输出。

第一个问题,为什么消息框不工作?第二个问题是如何获取当前文档?

4

2 回答 2

5

问题是当您使用 Run 方法调用代理时会丢失上下文。正如设计师帮助所述

用户不能直接与被叫代理交互。用户输出进入 Domino 日志。

您可以尝试将文档的 ID 作为参数传递给 run 方法:

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

于 2011-12-21T14:05:01.623 回答
2

了解您为什么将其从 onChange 移至代理会有所帮助,但我认为有一些方法可以做您想做的事情。

您提到从公式语言调用代理 - 我能够以这种方式显示一个调用代理的消息框:

@Command([RunAgent];"CheckSupplierSpec")

另一种选择是将您的代理作为 Java 代理。这使您可以访问即使被 NotesAgent.Run 调用也会显示的 Java UI 类。这里的例子。

如果您不想在 Java 中重做整个代理,可以使用 LS2J 访问 Java UI 类。例如,您可以创建一个名为“Java Messagebox”的 Java 脚本库:

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 组件的更复杂的示例,我建议学习Julian Robichaux 的 LS2J 示例数据库他的 StatusBox 示例是非模态的,但如果需要,您可以在此处找到使其成为模态的参数。

于 2011-12-21T18:59:07.320 回答