使用computeWithForm

时间:2017-03-14 02:43:50

标签: xpages

我有以下按钮,可以使用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,我觉得奇怪,为什么它只保存相同的值四次。

2 个答案:

答案 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