我正在尝试从viewPanel1
删除所选的文档。视图已分类(可以是> 1类),并列出来自2个不同数据源的文档,例如:Cdoc
和Pdoc
。这些文档。由一个共同领域联系在一起。
我的场景:如果用户选择了Cdoc
=>删除操作将发生在相应的Cdoc
,但也适用于属于同一类别的所有Pdoc
。如果用户选择Pdoc
=>只删除Pdoc
。另外,我想添加一些确认文本,其中包含所选文档中的一些信息(值字段)。
我尝试了以下
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"));
... //删除方法 }
你能告诉我在上面的代码中我做错了什么以及我错过了什么?谢谢你的时间!
答案 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是否为空。这也应该做到。我的期望是,基于上述原因检索集合存在问题。