代码之家  ›  专栏  ›  技术社区  ›  Florin M.

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

  •  1
  • Florin M.  · 技术社区  · 11 年前

    我正在尝试从中删除所选文档 viewPanel1 。视图被分类(可以是>1个类别),并且列出了来自2个不同数据源的文档,例如: Cdoc Pdoc 。这些文档。由公共字段链接。

    我的场景:如果用户选择 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 回复  |  直到 11 年前
        1
  •  0
  •   Greg    11 年前

    你要做的第一件事是确认。与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()。这不是最好的解决方案,因为它需要服务器更新才能获得字符串。正如保罗·威瑟斯所说,最好的解决方案是使用CSJS进行确认。但我还没有这样做。
    /编辑

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

    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函数中输入只有两个值的向量,它必须是三个。因此,如果您想删除“mycomp”的所有内容,并使用下面的pdocs“Greg”“Sally”“Bob”,只需使用alldocsbykey(“myomp”),如果视图如下所示:

    迈肯
    ---格雷格
    ---萨莉
    ---鲍勃

    但是如果视图看起来像

    波兰
    ---分枝杆菌属
    ------格雷格
    ------萨莉
    ------鲍勃

    那么必须使用带有波兰和mycomp的a向量。“波兰”没有得到正确的文件--只是有时会遇到的麻烦和陷阱。

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

     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一次删除多个,但这可能会很危险,具体取决于您所做的操作,因为NotesDocument不可串行化。在这种情况下,我建议使用与getSelected文档相同的代码,使用for循环获取文档ID,获取文档,如果文档不为空,则删除。

    apropos getAllDocumentsByKey(带矢量)

    按照当前设置的方式,不需要Vector。
    如果您有一个包含类别和子类别的视图,并且希望获取该子类别中的所有文档,则必须使用矢量来获取。如果您包含一个简单字符串或一个只有一个值的矢量,则不会返回子类别中文档。向量可以被认为是“cat1”、“subcat”、“furtSubCat”

    此外,这里没有检查从文档返回的字符串是否为空。应该这样做。也没有检查DocumentCollection是否为空。这也应该做到。我的预期是,基于上述原因检索集合时会出现问题。