我正在尝试使用旧的LotusScript代理预先填充XPage(创建新文档)上的某些字段。我在XPage上的代码是:
<xp:dominoDocument var="document1"
formName="myForm">
<xp:this.postNewDocument><![CDATA[#{javascript:
var agent = database.getAgent("MyAgent");
document1.save();
agent.runOnServer(document1.getNoteID());
}]]></xp:this.postNewDocument>
</xp:dominoDocument>
<xp:inputText value="#{document1.fname}" id="fname"
styleClass="formInputText">
<xp:this.defaultValue><![CDATA[#{javascript:
document1.getItemValueString("fname");}]]></xp:this.defaultValue>
</xp:inputText>
代理(本例)是:
Dim agent As NotesAgent
Dim db As NotesDatabase
Sub Initialize
Dim rDoc As NotesDocument
Dim s As New NotesSession
Set db = s.CurrentDatabase
Set agent = s.CurrentAgent
Set rDoc = db.GetDocumentByID(agent.Parameterdocid)
rDoc.fname = "Barney"
rDoc.lname = "Rubble"
Call rDoc.Save(True, True)
End Sub
我知道代理正在运行(如果我检查Notes客户端中的doc属性,代理日志会显示此信息并且文档上的字段已完成)但是XPage上的字段始终为空白?是否可以从LS代理预填充?我添加了document1.save(),所以我知道我得到了一个有效的NoteID传递(再次,它是相同的 - 通过记录检查) - 任何洞察感激地收到...
答案 0 :(得分:5)
您可以将文档传递到代理程序运行中。将unid传递给代理上下文的方法不会让你到达那里。你需要
agent.runwithDocumentContext(doc)
请参阅此处的示例:http://www.wissel.net/blog/d6plinks/SHWL-8SF7AH
请勿保存文档。您需要将代理重新编写为JavaBean。缩短处理时间。
我实际上会做什么:使用bean作为数据源,更容易处理验证,默认值等。
它的工作量比它看起来要少,它可以偿还一些技术债务(总是存在技术债务)。
<强>更新强>
我在示例应用程序中尝试过它。这是我的经纪人:
Sub Initialize
Dim db As NotesDatabase
Dim rDoc As NotesDocument
Dim s As New NotesSession
Set db = s.CurrentDatabase
Set rDoc = s.Documentcontext
rDoc.fname = "Barney"
rDoc.lname = "Rubble"
End Sub
代码的两个主要区别:a)DocumentContext而不是parameterdocid和没有保存文档。
然后页面如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="person">
<xp:this.postNewDocument><![CDATA[#{javascript:var agent = database.getAgent("Background");
var doc = document1.getDocument();
agent.runWithDocumentContext(doc);}]]></xp:this.postNewDocument>
</xp:dominoDocument>
</xp:this.data>
<xp:label value="First name:" id="fName_Label1" for="fName1">
</xp:label>
<xp:inputText value="#{document1.fName}" id="fName1"></xp:inputText>
<br />
<xp:label value="Last name:" id="lName_Label1" for="lName1"></xp:label>
<xp:inputText value="#{document1.lName}" id="lName1"></xp:inputText>
<xp:button value="Save" id="button1"><xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="false" save="true"></xp:eventHandler></xp:button>
</xp:view>
这里的主要区别是:
最后:代理必须设置为&#34;以网络用户身份运行&#34; (它可能已经存在)。就像一个魅力(我仍然会选择一个豆)。
答案 1 :(得分:1)
小心保存来自不同事件/来源的文档,就像处理代理一样。考虑将代理的代码重新编码为Xpage数据源的postNewDocument事件。您也可以在那里设置值。如果要在创建新文档时计算字段,可以通过设置postNewDocument事件中的值来实现此目的:
datasourceName.setValue("fieldName", "value")
答案 2 :(得分:1)
在XPage中没有获取代理设置的字段的原因是代理运行太晚&#34;。 XPage字段已由空的新值设置。似乎,代理执行后没有简单的方法来刷新数据源。
所以,我建议创建一个额外的XPage(&#34; XAgent&#34;)&#34; MyFormNew.xsp&#34;其中:
额外的XPage可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
rendered="false">
<xp:this.beforePageLoad><![CDATA[#{javascript:
var doc:NotesDocument = database.createDocument();
doc.replaceItemValue("form", "myForm");
doc.save();
var agent = database.getAgent("MyAgent");
agent.runOnServer(doc.getNoteID());
var pageUrl = "MyForm.xsp?action=editDocument&documentId=" +
doc.getUniversalID().toString();
context.redirectToPage(pageUrl);
}]]></xp:this.beforePageLoad>
</xp:view>
原始XPage中的数据源不再需要postNewDocument事件。
这是一个快速而又脏的解决方案,可以保留您的LotusScript代理(正如您在评论中指出的那样)。
答案 3 :(得分:0)
一切都与时俱进。我正在使用这个:
<xp:this.beforePageLoad><![CDATA[#{javascript:var tempdoc:NotesDocument=compositeData.WFDoc.getDocument(true)
if (tempdoc.isNewNote())
{
var agent:NotesAgent=database.getAgent("(A_WF)")
if(agent!=null)
{
agent.runWithDocumentContext(tempdoc)
}
}
}]]></xp:this.beforePageLoad>
通过使用before pageload事件,您可以在某些内容可能来自xpage本身之前设置文档。您甚至不必将文档保存在代理中。
使用这种方法,您可以保留当前文档,而不必使用ibm建议的任何临时文档。