xpages自定义删除文档。从视图面板

时间:2014-08-11 06:47:40

标签: xpages xpages-ssjs

我正在尝试从viewPanel1删除所选的文档。视图已分类(可以是> 1类),并列出来自2个不同数据源的文档,例如:CdocPdoc。这些文档。由一个共同领域联系在一起。

我的场景:如果用户选择了Cdoc =>删除操作将发生在相应的Cdoc,但也适用于属于同一类别的所有Pdoc。如果用户选择Pdoc =>只删除Pdoc。另外,我想添加一些确认文本,其中包含所选文档中的一些信息(值字段)。

enter image description here

我尝试了以下

    var viewPanel=getComponent("viewPanel1");
var docIDArray=viewPanel.getSelectedIds(); 
for(i=0;i < docIDArray.length;i++){

    var docId=docIDArray[i];
    var doc=database.getDocumentByID(docId);
    var formName = (doc == null)? null : doc.getItemValueString("Form");


if( formName =="fmPersContact" ){
     .....
   } // in this case, it works OK.

else if ( formName =="fmCompanie" ){ // here if I selected > 1 Cdoc, it deletes just one Cdoc + the respective PDocs.

var doc:NotesDocument = null;
doc=database.getDocumentByID(docId);
var ky:java.util.Vector = new java.util.Vector();
ky.add(doc.getItemValueString("txt_NumeCompanie"));

... //删除方法     }

你能告诉我在上面的代码中我做错了什么以及我错过了什么?谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

您要做的第一件事就是确认。与Lotusscript不同,您不能在脚本中间使用函数来打开确认对话框并获得答案。为此,我建议在进入执行脚本简单操作之前使用确认简单操作。

<xp:button
        value="delete"
        id="button1"
    >
    <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
        <xp:this.action>
            <xp:actionGroup>
                <xp:confirm message="Are you certain?"></xp:confirm>
                <xp:executeScript
                    script="#{javascript:doSomething();}"
                >
                </xp:executeScript>
            </xp:actionGroup>
        </xp:this.action></xp:eventHandler></xp:button>

修改
在过去,我还使用扩展库构建了自己的对话框,用SSJS填充了文本,然后从对话框本身调用了doWhatever()或close()。这不是最佳解决方案,因为它需要从服务器更新以获取字符串。正如Paul Withers所说,最好的解决方案是使用CSJS来执行确认。我还没有这样做。
/编辑

对于您的删除功能,我建议您获取要删除的文档,然后通过表单名称或您使用的任何机制来判断它是P-还是C- doc,然后删除单个文档或通过使用getAllDocumentsBykey()从视图中获取documentcollection,然后遍历它们,逐个删除它们。

var ky:java.util.Vector = new java.util.Vector();
ky.add("MainCat");
ky.add("subCat");
ky.add("subCat2");
var vw:NotesView = database.getView("vw_myView");
var docs:NotesDocumentCollection = vw.getAllDocumentsByKey(ky);
//... delete stuff...
//dont forget to recycle

发布问题编辑
我建议使用以下内容来获取表单名称:

    var getSelectedDoc = function(){
        var vwPnl = getComponent("viewpanel");
        var ids = vwPnl.getSelectedIds();
        var id = null;
        var doc:NotesDocument = null;
        if(ids.length > 0){ //could use for loop var i = 0; i < ids.length;i++
            id = ids[0]; //could pack all ids into java.util.ArrayList and return that list to work on further
//be warned that if the user selects a parent doc and those automatically deleted by it that you need a mechanism to check if the document was already deleted!
        }
        if(id != null){
            doc = database.getDocumentByID(id);
        }
        return doc;
    }

    var doc = getSelectedDoc();
    var formName = (doc == null)? null : doc.getItemValueString("form");
    if(PDOC_FORM_NAME.equalsIgnoreCase(formName)){
        deleteFunctionComplete(doc);
    } else if (CDOC_FORM_NAME.equalsIgnoreCase(formName)){
        deleteFunctionTwo(doc);
    } else {
       // uh-oh
    } 

这也允许您拥有该文档,以防您想立即删除它。

修改评论 如果Cdoc应该删除多个文档,那么是。您应该使用getAllDocumentsBykey,记住需要为它构建视图。我的意思是,如果你有一个单一类别的视图,没有问题,只需插入字符串,你就可以了。如果您有一个包含三个类别的视图,则无法仅使用两个值将向量提供到getalldocs函数中,它必须全部为三个。所以,你要删除所有的&#34; mycomp&#34;与底层的pdocs&#34; Greg&#34; &#34; Sally&#34; Bob&#34;,如果视图如下所示,只需使用alldocsbykey(&#34; mycomp&#34;):

mycomp
---格雷格
---萨莉
---鲍勃

但如果视图看起来像

波兰
--- mycomp
------格雷格
------萨利
------鲍勃

然后必须使用带有波兰和mycomp的矢量。 &#34;波兰&#34;没有得到正确的文件。 - 只是有时候会有一个错误和陷阱。

进一步澄清问题后编辑
我更喜欢这种循环风格来删除文档

 var doc_temp:NotesDocument = null;
var doc_toDelete:NotesDocument = null;
var coll_docs:NotesDocumentCollection = ...; //get document collection

var doc_nextDoc = coll_docs.getFirstDocument();
while(doc_nextDoc != null){
    doc_temp = doc_nextDoc; //set document to delete
    doc_nextDoc = coll_docs.getNextDocument(doc_nextDoc);  // set next document before deletion
    try{
        doc_temp.remove(true);//lots of errors can happen here, such as ACL settings
    } catch(e) {
    //handle, or just break
    } finally{
        if(doc_temp != null) try{doc_temp.recycle()} catch(e){}// try to recycle, could also cause errors
        doc_temp = null;// for the sense of completeness 
    }
}

根据问题编辑进一步编辑
当然你只是删除一个Pdoc,你设置的方式,你只返回一个文件。您可以扩展getSelectedDoc()以将所有选定的文档放入java.util.ArrayList或其他内容,然后使用该arraylist一次删除多个,但这可能很危险,具体取决于您执行的操作,因为NotesDocuments不是serialisable。在这种情况下,我建议使用与getSelected doc相同的代码,使用for循环获取文档ID,获取文档,如果文档不为null,则删除。

apropos getAllDocumentsByKey(带矢量)

目前设置的方式,不需要Vector 如果您有一个包含类别和子类别的视图,并且您想要获取该子类别中的所有文档,那么您必须使用向量来获取它。如果包含简单字符串或仅包含一个值的向量,则不会返回子类别中的文档。矢量可以被认为是&#34; cat1&#34;,&#34; subcat&#34;,&#34; FurtherSubCat&#34;

此外,此处不会检查文档返回的字符串是否为空。应该这样做。也没有检查DocumentCollection是否为空。这也应该做到。我的期望是,基于上述原因检索集合存在问题。