记录postopen事件未在配置文件上运行

时间:2014-05-09 16:52:08

标签: xpages xpages-extlib xpages-ssjs

我需要在配置文件中保存文档的序列号,这是一个操作代码Execute Script:

if (document1.isNewNote()){
   var pdoc:NotesDocument=database.getProfileDocument("LastNumber","")
   var lnm=pdoc.getItemValue("lastNumber")[0];
   var inputText6:com.ibm.xsp.component.xp.XspInputText = getComponent("inputText6");
    inputText6.setValue(lnm);
    pdoc.replaceItemValue("lastNumber",lnm);
    pdoc.save();
    }

此代码根本没有打开个人资料文档。代码中有什么问题吗?

2 个答案:

答案 0 :(得分:1)

" LastNumber"是用于创建个人档案文档的表单的名称? 这个档案文件已经存在? 此配置文件中没有读者字段? 你在这一行上有一个错误:var pdoc:NotesDocument = database.getProfileDocument(" LastNumber","")? 或者你已经调试它并看到pdoc为null?

而不是pdoc.getItemValue(" lastNumber")[0]你可以使用pdoc.getItemValueInteger(" lastNumber")来获得一个打字结果 我想这个字段包含一个数字,你想增加它

而不是使用inputText字段,您可以直接使用document1.setValue(" NumberField",lnm)设置值;

答案 1 :(得分:1)

我是第二个Per建议的警告。档案文件可以是野兽。您应该抽象访问"下一个号码"进入SSJS函数调用。顺便说一句。在您的代码段中,您实际上并未递增最后一个数字。另外:如果绑定了输入文本控件,请在数据源之后,而不是UI。

粗略的方法(我会使用托管的应用程序bean来实现更好的隔离)以获得更好的功能:

if(document1.isNewNote() {
     document1.setValue("DocumentNumber",applicationTools.getNextNumber());
}

然后在SSJS库中你会得到:

var applicationTools = { 
    "getNextNumber" : function() {
        synchronized(applicationScope){
           var pdoc:NotesDocument=database.getProfileDocument("LastNumber","");
           if (!applicationScope.lastNumber) {
                applicationScope.lastNumber = pdoc.getItemValueInteger("lastNumber");
           }
           applicationScope.lastNumber++;
           pdoc.replaceItemValue("lastNumber",applicationScope.lastNumber);
           pdoc.save(); //Make sure pdoc is writeable by ALL!!!!
           pdoc.recycle();
           return applicationScope.lastNumber;
        }
    },

    "someOtherUtility" : function(nameToLookup, departments) {
       // more stuff here
    }
}

以某种方式has been asked before,但不是个人资料字段。有人仍然可以简单地追踪applicationScope.lastNumber变量,这是我宁愿使用bean的原因之一。另一个:你可以异步进行保存,因此会更快。

注意:在任何情况下,只有拥有非复制数据库时,数字生成才有效。但是,抽象函数可以通过调用中央数字生成器......或任何其他机制来替换从配置文件中获取数字...而无需再次更改表单。