现在的位置: 首页 > 综合 > 正文

DataFormWebPart CrossList 跨网站列表查询

2012年09月30日 ⁄ 综合 ⁄ 共 2984字 ⁄ 字号 评论关闭

如果对DatFormWebPart了解很少,可以参考一下前一篇文档DataFormWebPart 单列表查询

为了方便样式和过滤条件的设置,DataFormWebPart跨列表查询 首选以一个List或者Library为原型,

原原本本按照单列表查询来设置,

可以参考 ,这时 SPD2007版本Microsoft SharePoint Designer Team Blog,还是很具有参考性

http://blogs.msdn.com/b/sharepointdesigner/archive/2007/04/24/spdatasource-and-rollups-with-the-data-view.aspx

 

都设置好后

1.把DataSourceMode="List" 修改成CrossList

2.在SelectCommand的view 后面添加类似下面的

这是很类似SPSiteDataQuery的语法,

实际上,后台就是调用SPSiteDataQuery, CQWB也是,所以都悲剧的不支持Multi-value lookup字段的查询

这个RowLimit就是限制返回的总数

<Webs Scope='Recursive'></Webs>
  
<Lists ServerTemplate='101' BaseType='1'></Lists>
  
<RowLimit>200</RowLimit>

 

这里也可以自己写好caml语句,直接替换 selectcommand

例如,

注意

1 .如果是lookup或者是user类型最好 加上type=lookup

2. 如果字段可能在可以某些列表不存在,Nullable=true,

切记:Nullable最大数量为8,超过了8,也将不返回任何数据(管理中心可以配置)

3. 查询某内容类型及子类型 

BeginsWith><FieldRef Name='ContentTypeId'/><Value Type='Text'>xxx...</Value></BeginsWith>

 

<View><Webs Scope='Recursive'></Webs><Lists ServerTemplate='101' BaseType='1'></Lists><Query><OrderBy><FieldRef Name='Modified' Ascending='FALSE'/></OrderBy><Where><BeginsWith><FieldRef Name='ContentTypeId'/><Value Type='Text'>xxxxxx....</Value></BeginsWith></Where></Query><ViewFields><FieldRef Name='ID'/><FieldRef Name='ContentTypeId'/><FieldRef Name='Title'/><FieldRef Name='Modified'/><FieldRef Name='Created'/><FieldRef Name='Editor'/><FieldRef Name='FileRef'/><FieldRef Name='FileLeafRef'/><FieldRef Name='PermMask'/><FieldRef Name='File_x0020_Type'/><FieldRef Name='HTML_x0020_File_x0020_Type'/>
<FieldRef Name='L_x0020_V' Nullable='True' Type='Lookup'/><FieldRef Name='FSObjType'/><FieldRef Name='ServerUrl'/></ViewFields><RowLimit>200</RowLimit></View>

  

基本就大功告成。

最后参考

http://blog.gutek.pl/post/2008/07/04/Global-Tasks-View-Web-Part.aspx

删除几个几个地方就好了,

说很容易,其实也很容易出错的 

 

我这里只说一下很需要注意的地方

1.过滤条件(Filter)尽量在修改成CrossList前配置后

其一:为什么呢? 因为当你设置为 CrossList后,字段过滤名称会改变的,

例如,某字段名称为  L V,其InnerName将为 L_x0020_V,SPD的Filter中会显示为 L_0x500F_0x0020_V,

你这时候设置过滤,将不能正确的Filter ,

为什么呢?你这个Filter 设置将转为 SPDataSource的SelectCommand,

而SelectCommand需要的是 InnerName,那么将不能正确查询

<SharePoint:SPDataSource runat="server" DataSourceMode="CrossList" SelectCommand="&lt;View&gt;&lt;Webs

所以如果后设置过滤条件,只是麻烦些

找到SelectCommand中,找到对应的FieldRef Name =对应的地方,修改过来就ok

其二:

修改为CrossList后,例如Greater Than,Less Than的语句会消失,

这也没关系,找到对应的SelectCommand修改过来 

有人就会问,那直接写好Caml语句,替换SelectCommand就好了,是可以这么做的,

2 .如果字段有空格或者特殊字符等,确保检查

例如 L V,应该如下,

<xsl:value-of disable-output-escaping="yes" select="substring-after(@L_x005F_x0020_V,';#')" />

3。表头 切记检察

L V应该如下

<xsl:call-template name="dvt.headerfield" ddwrt:atomic="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">
                            
<xsl:with-param name="fieldname">@L_x0020_V</xsl:with-param>
                            
<xsl:with-param name="fieldtitle">L V</xsl:with-param>
                            
<xsl:with-param name="displayname">L V</xsl:with-param>
                            
<xsl:with-param name="sortable">1</xsl:with-param>
                            
<xsl:with-param name="fieldtype">x:string</xsl:with-param>
                        
</xsl:call-template>

 

 

抱歉!评论已关闭.