DataFormWebPart CrossList 跨网站列表查询

如果对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-esc ap ing ="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 >

 

 

你可能感兴趣的:(list)