如果对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
="<View><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
>