代码改变世界

揪出未完成的SharePoint Server 2007调查答复

2009-03-27 11:35  Windie Chai  阅读(...)  评论(... 编辑 收藏

SharePoint的调查功能是一种用来收集反馈的极为有效的方法。在调查列表中,可以设置权限来规定用户是否能看到其他用户的答复以及是否能编辑其他用户的答复,但这种权限仅限于其他用户已经正常完成了的答复。

也就是说,如果某一用户的答复没有正常完成,只是暂时保存了,那么除了创建者之外,所有人都无法在调查列表中看到该答复,甚至管理员也不例外。

在包含未完成答复的情况下,调查列表的“答复数量”中显示的数字会多余点击“显示所有答复”后显示的答复数量。那么此时,如果想要知道哪些用户还没有完成答复,该怎么做呢?

上面说过,网站管理员也无法看到未完成的答复;而我尝试过使用SharePoint对象模型来获取该调查列表中的Items,也只能获取到已经完成的答复;最后只好进入SharePoint的数据库中来寻找答案……

在包含调查列表的内容数据库中执行下面这段SQL查询,然后就可以得到指定调查列表中的所有未完成答复的用户:

select UserInfo.tp_login,UserInfo.tp_Title,UserInfo.tp_Email --取出用户登录名、显示名和邮箱

from UserInfo,AllUserData,AllLists

where AllUserData.tp_Author = UserInfo.tp_ID --关联用户数据的创建者和用户信息ID

and AllUserData.tp_ListID = AllLists.tp_ID --关联用户数据的列表和列表ID

and AllUserData.tp_DeleteTransactionId = 0x --除去用户数据中已经被删除的条目

and AllUserData.tp_CheckoutUserId is not NULL --除去没有被签出的条目(签出即表示没有完成)

and AllLists.tp_DeleteTransactionId = 0x --除去列表中已经被删除的条目

and AllLists.tp_Title = N'调查测试' --传入列表名称

 

这段SQL查询看其来有点儿复杂,其实不难理解,这里简单地解释一下涉及到的3张表:

  • UserInfo表包含了所有用户的信息,我们将在此表中获取用户信息;
  • AllUserData表包含了所有用户所产生的数据,当然也包含未完成的答复;
  • AllLists表包含了所有列表,当然也包含了调查列表,我们将在此表中根据列表名称获取列表ID;

上面的SQL查询只是简单地列出了某调查列表中所有未完成答复的创建者信息,这样管理员就可以通知这些创建者去完成各自的答复了。

本文仅适用于SharePoint Server 2007,它的数据库结构和SPS 2003有所区别,关于如何在SPS2003中获取调查答复,可以参考这篇文章:http://cregan.wordpress.com/2006/07/28/sharepoint-surveys-finding-the-results-in-the-database/

另外,直接操作SharePoint数据库并不是微软所推荐的方式,在可以使用SharePoint对象模型或其他方法的情况下,尽量不要去直接操作SharePoint数据库。