我有以下按钮,可以使用computeWithForm
在for循环中保存多个值//to keep the code simple, I use hardcode value to save document except values in for loop
var forloopvalues = @DbLookup(@DbName(),"CompetencyCourseViewCourseFirst", "myFieldValue1",2 );//use myFieldValue1 to lookup in the view
var date ="13/03/2017";
for(var i =0;i<forloopvalues.length;i++)
{
var mdoc = database.createDocument();
cdate = session.createDateTime(date);
mdoc.replaceItemValue("Form", "myForm");
mdoc.replaceItemValue("myField1","myFieldValue1")
mdoc.replaceItemValue("myField2", forloopvalues[i]); //suppose there are four values in the forloopvalues
mdoc.replaceItemValue("myField3","myFieldValue3");
mdoc.replaceItemValue("myField4", "myFieldValue4");
mdoc.replaceItemValue("myField5", "myFieldValue5");
if(mdoc.computeWithForm(false,false))
{
mdoc.save(true, true);
getComponent("computedField1").setValue("Record saved");
}
else
{
}
}
单击按钮时,可以保存文档。在Lotus Notes客户端中,我可以看到视图中有四个文档。表格中的所有计算字段也已填写。但是,我注意到myField2只保存forloopvalues中的第一个值而不是所有值。因此,虽然有四个文档,但它们都只保存myField2中的第一个值。因此,如果包含myField2的形式的计算字段加上其他值,它只显示myField2中的第一个值加上其他值
我查看代码,for循环中有forloopvalues [i],我不明白为什么它只保存第一个值。
例如,假设forloopvalues是valueA,valueB,valueC,valueD。 myField2只保存值四次。如果表单中有一个计算字段将myField2与其他值连接在一起,则计算字段值将显示valueA + othervalues四次。
我有另一次尝试,如果我使用document.save()+ On文档保存在数据选项卡中的运行表单验证
在Lotus Notes Client中打开视图并读取保存的文档。它不会在表单中显示计算字段,但循环值是正确的
例如,假设forloopvalues是valueA,valueB,valueC,valueD。 myField2为每个文档保存valueA,valueB,valueC,valueD。如果表单中有一个计算字段将myField2与其他值连接在一起,则计算字段值将显示每个forloopvalues + othervalues四次(例如valueA + othervalues,valueB + othervalues,valueC + othervalues,valueD + othervalues)
我相信computeWithForm几乎接近结果,尽管它只保存了forloopvalues中的第一个值。在帮助内容中,我搜索computeWithForm。它的语法是 computeWithForm(dodatatypes:boolean,raiseerror:boolean):boolean
并与应用程序中的代码进行比较我认为语法很好。我仔细检查for循环,不明白为什么它只保存第一个值。
那么如何使用computeWithForm来保存循环值。非常感谢。
更新
我认为computeWithForm几乎接近结果,因为它可以填充表单中的所有计算字段,但它会多次保存一个值,具体取决于forloopvalues的数量。
如果forloopvalues只有一个值,那么它会节省一次。它的forloopvalues有三个值,它保存三次,每个文件(在myField2中)包含forloopvalues的值。
如果我使用document.save(),它可以单独保存forloopvalues中每个值的文档,但不会填写表单中的计算字段。
更新
我尝试以下代码来查看值是否在函数
中正确显示var forloopvalues = @DbLookup(@DbName(), "CompetencyCourseViewCourseFirst", "myFieldValue1", 2);
for (var index in forloopvalues) {
if (forloopvalues.hasOwnProperty(index)) {
makeAnewDoc(forloopvalues[index]);
}
}
function makeAnewDoc(field2Value) {
var mdoc = database.createDocument();
cdate = session.createDateTime(date);
mdoc.replaceItemValue("Form", "myForm");
mdoc.replaceItemValue("myField1", "myFieldValue1")
mdoc.replaceItemValue("myField2", field2Value);
if (!viewScope.resultMessage) {
viewScope.resultMessage = [];
}
if (mdoc.computeWithForm(false, false)) {
mdoc.save(true, true);
viewScope.resultMessage.push("Record saved " + forloopvalues[index]);
} else {
viewScope.resultMessage.push("Save failed for " + forloopvalues[index]);
}
// Bleeding memory otherwise!
mdoc.recycle();
}
结果是当我点击按钮时,屏幕可以显示此消息(假设forloopvalues有四个值)
Record saved valueA ,Record saved valueB ,Record saved valueC ,Record saved valueD
由于屏幕可以显示forloopvalues,我觉得奇怪,为什么它只保存相同的值四次。
答案 0 :(得分:0)
您的代码实际上会保存最后一个值。不要遍历值并保存相同的文档4次。 ReplaceItemValue可以将数组作为输入。因此,您可以直接使用查找结果。不需要循环。应该更快
在微小的手机屏幕上误读了你的问题。你需要稍微改变你的循环:
var forloopvalues = @DbLookup(@DbName(), "CompetencyCourseViewCourseFirst", "myFieldValue1", 2);
var mdoc; // In SSJS (ES3 there are no block level variables!)
for (var index in forloopvalues) {
if (forloopvalues.hasOwnProperty(index)) {
mdoc = database.createDocument();
cdate = session.createDateTime(date);
mdoc.replaceItemValue("Form", "myForm");
mdoc.replaceItemValue("myField1", "myFieldValue1")
mdoc.replaceItemValue("myField2", forloopvalues[index]);
// Bind your UI field to a scope variable
// don't access them directly
if (!viewScope.resultMessage) {
viewScope.resultMessage = [];
}
if (mdoc.computeWithForm(false, false)) {
mdoc.save(true, true);
viewScope.resultMessage.push("Record saved " + index);
} else {
viewScope.resultMessage.push("Save failed for " + index);
}
// Bleeding memory otherwise!
mdoc.recycle();
}
}
或更好:拉出函数保存文档(变量是SSJS中的函数级别,而不是块级别):
var forloopvalues = @DbLookup(@DbName(), "CompetencyCourseViewCourseFirst", "myFieldValue1", 2);
for (var index in forloopvalues) {
if (forloopvalues.hasOwnProperty(index)) {
makeAnewDoc(forloopvalues[index]);
}
}
function makeAnewDoc(field2Value) {
var mdoc = database.createDocument();
cdate = session.createDateTime(date);
mdoc.replaceItemValue("Form", "myForm");
mdoc.replaceItemValue("myField1", "myFieldValue1")
mdoc.replaceItemValue("myField2", field2Value);
if (!viewScope.resultMessage) {
viewScope.resultMessage = [];
}
if (mdoc.computeWithForm(false, false)) {
mdoc.save(true, true);
viewScope.resultMessage.push("Record saved " + index);
} else {
viewScope.resultMessage.push("Save failed for " + index);
}
// Bleeding memory otherwise!
mdoc.recycle();
}
让我们知道它是怎么回事。
答案 1 :(得分:0)
ComputeWithForm在Domino 9.0.1修订包循环中的某个时刻出现了问题。不确定哪个FP打破了它。 IBM已经确认了这个问题并正在寻找解决方案。 onload,onsave和两个选项都不起作用。 SPR #LHEYAKALAH