客户要求统计出当前月内SharePoint 内修改文档的数量。
这里需要先说明一点,新上传的文档的创建时间和修改时间是相同的,只有文档本修改后,修改时间才会变化。
那么根据上面的内容,查询条件也就出来:1,修改时间在本月内;2.修改时间不等于创建时间(事实上修改时间只会大于或等于创建时间).
根据这个条件写caml查询是做不到的,因为CAML中至少要保证value是个范围或常量的。我们第二个条件查询都是变量。下面是我的解决方案:
1.写caml查询获取修改时间在本月内的文档。
首先提供两个获取当前月份第一天和最后一天日期的方法:
private string GetFirstDay()
{
DateTime dtdd = DateTime.Now;
DateTime start = new DateTime(dtdd.Year, dtdd.Month, 1); //月初日期
return start.ToString("yyyy-MM-dd");
}
private string GetEndDay()
{
DateTime time = DateTime.Now;
DateTime start = new DateTime(time.Year, time.Month, 1);
DateTime end = start.AddMonths(1).AddDays(-1);//月末日期
return end.ToString("yyyy-MM-dd");
}
下面是查询相关代码片段:如何获取列表相关代码就略去了。
SPQuery query = new SPQuery();
query.ViewFields = "<FieldRef Name='Modified' /><FieldRef Name='Created' />";//这里只查询包含创建时间和修改时间的栏
query.ViewFieldsOnly = true;
string sql = "<Where>" + "<And>" + "<Geq>" + "<FieldRef Name='Modified' />"
+ "<Value Type='DateTime'>" + "{0}" + "</Value>" + "</Geq>"
+ "<Leq>" + "<FieldRef Name='Modified' />" + "<Value Type='DateTime'>"
+ "{1}" + "</Value>" + "</Leq>" + "</And>" + "</Where>";
query.Query = string.Format(sql, GetFirstDay(), GetEndDay());
SPListItemCollection listItems = list.GetItems(query);
DataTable dt = listItems.GetDataTable();//将其转换成datatable,然后再对datatable进行第二次查询
if (dt != null)
{
// Presuming the DataTable has a column named Date.
string expression = "Modified <> Created";//查询条件是创建时间不等于修改时间
string sortOrder = "Created DESC";
DataRow[] foundRows;
// Use the Select method to find all rows matching the filter.
foundRows = dt.Select(expression, sortOrder);
Label1.Text = foundRows.Length.ToString();//显示符合条件的文档数量
}
总结:
如果用caml查询创建时间不等于修改时间的记录是做不到的,所以这里分步进行:
首先利用caml查询修改时间在当前月内的记录,并将结果转换成datatable
然后对datatable进行第二次查询,获取创建时间不等于修改时间的行数。
感谢网友大连的TG哥提供思路:
他的思路:step1:CAML查询出本月修改的文档;
step2:对查询出的数据进行筛选,重构数据源
step3:根据新的数据源绑定数据