sharepoint异常之"此任务当前被某个正在运行的工作流锁定,无法对其进行编辑"
2010-08-28 11:21
417 查看
Sharepoint 2007中,用SPD设计的工作流并没有提供任务重新指派的功能,但是在某些场景下,我们确实很需要这样的功能,但是如何实现呢?
界面上就很简单了,无非就是在下拉菜单中添加一个操作项“重新指派”就可以了,使用Feature就可以了,不再多讲。
但是后台如何实现呢?我们最直接想到的方法就是将“分配对象”属性直接设置为其他用户:
代码如下:
//test reassign
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite spsite = new SPSite("http://localhost:1000/yoursite%22))
using (SPWeb spweb = spsite.OpenWeb())
{
SPList list = spweb.Lists["工作任务"];
SPListItem task1 = list.GetItemById(1);
task1[SPBuiltInFieldId.AssignedTo] = spweb.SiteUsers["zhangsan"];
task1.Update();
}
});
//end test reassign
运行的时候你会发现,执行到task1.Update(); 的时候,会扔出一个异常“此任务当前被某个正在运行的工作流锁定,无法对其进行编辑。”
如果你不用task1.Update(),而是用task1.SystemUpdate(),那么虽然能够成功更新“分配对象”,但是在完成任务时会有如下问题“数据源控件未能执行更新命令”:
所以用SystemUpdate()不行,我认为SystemUpdate是绕过了工作流的一些触发操作,从而导致任务不可用。
所以仍然检查第一个异常产生的原因,我一直认为工作流有可能对正在运行的任务进行了“Lock”处理,于是反复在Microsoft.SharePoint.Workflow寻找加锁和解锁的处理机制,结果均没有找到,经过多次尝试、反编译和查找资料,发现在类“Microsoft.SharePoint.Workflow.SPWinOEItemReceiver”中,扔出了该异常,如下:
SPResource.GetString("WorkflowTaskLocked", new object[0]);
而扔出该异常的条件是:
((int) itemById[SPBuiltInFieldId.WorkflowVersion]) != 1
很奇怪的现象!
于是修改了代码,做了如下处理:
//test reassign
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite spsite = new SPSite("http://localhost:1000/yoursite%22))
using (SPWeb spweb = spsite.OpenWeb())
{
SPList list = spweb.Lists["工作任务"];
SPListItem task1 = list.GetItemById(1);
task1[SPBuiltInFieldId.WorkflowVersion] = 1;
task1[SPBuiltInFieldId.AssignedTo] = spweb.SiteUsers["zhangsan"];
task1.Update();
}
});
//end test reassign
结果成功!
原来是类SPWinOEItemReceiver的ItemUpdating(SPItemEventProperties properties)监听了Task的更新事件,如果task1[SPBuiltInFieldId.WorkflowVersion]不等于1,那么则扔出“此任务当前被某个正在运行的工作流锁定,无法对其进行编辑。”,这是一个容易让人迷惑的信息。
目前还不是很明白Sharepoint这样设置
跟我遇到类似的问题:http://geekswithblogs.net/MTex/archive/2008/03/01/120117.aspx
http://geek.hubkey.com/2007/09/locked-workflow.html
用上述的方法,可以实现工作流任务的的重新指派。
更进一步的完善,可以考虑和OutLook日历相结合,实现自动委派。
本文转自:http://www.cnblogs.com/HeavyMetal/archive/2009/09/03/1559681.html
界面上就很简单了,无非就是在下拉菜单中添加一个操作项“重新指派”就可以了,使用Feature就可以了,不再多讲。
但是后台如何实现呢?我们最直接想到的方法就是将“分配对象”属性直接设置为其他用户:
代码如下:
//test reassign
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite spsite = new SPSite("http://localhost:1000/yoursite%22))
using (SPWeb spweb = spsite.OpenWeb())
{
SPList list = spweb.Lists["工作任务"];
SPListItem task1 = list.GetItemById(1);
task1[SPBuiltInFieldId.AssignedTo] = spweb.SiteUsers["zhangsan"];
task1.Update();
}
});
//end test reassign
运行的时候你会发现,执行到task1.Update(); 的时候,会扔出一个异常“此任务当前被某个正在运行的工作流锁定,无法对其进行编辑。”
如果你不用task1.Update(),而是用task1.SystemUpdate(),那么虽然能够成功更新“分配对象”,但是在完成任务时会有如下问题“数据源控件未能执行更新命令”:
所以用SystemUpdate()不行,我认为SystemUpdate是绕过了工作流的一些触发操作,从而导致任务不可用。
所以仍然检查第一个异常产生的原因,我一直认为工作流有可能对正在运行的任务进行了“Lock”处理,于是反复在Microsoft.SharePoint.Workflow寻找加锁和解锁的处理机制,结果均没有找到,经过多次尝试、反编译和查找资料,发现在类“Microsoft.SharePoint.Workflow.SPWinOEItemReceiver”中,扔出了该异常,如下:
SPResource.GetString("WorkflowTaskLocked", new object[0]);
而扔出该异常的条件是:
((int) itemById[SPBuiltInFieldId.WorkflowVersion]) != 1
很奇怪的现象!
于是修改了代码,做了如下处理:
//test reassign
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite spsite = new SPSite("http://localhost:1000/yoursite%22))
using (SPWeb spweb = spsite.OpenWeb())
{
SPList list = spweb.Lists["工作任务"];
SPListItem task1 = list.GetItemById(1);
task1[SPBuiltInFieldId.WorkflowVersion] = 1;
task1[SPBuiltInFieldId.AssignedTo] = spweb.SiteUsers["zhangsan"];
task1.Update();
}
});
//end test reassign
结果成功!
原来是类SPWinOEItemReceiver的ItemUpdating(SPItemEventProperties properties)监听了Task的更新事件,如果task1[SPBuiltInFieldId.WorkflowVersion]不等于1,那么则扔出“此任务当前被某个正在运行的工作流锁定,无法对其进行编辑。”,这是一个容易让人迷惑的信息。
目前还不是很明白Sharepoint这样设置
跟我遇到类似的问题:http://geekswithblogs.net/MTex/archive/2008/03/01/120117.aspx
http://geek.hubkey.com/2007/09/locked-workflow.html
用上述的方法,可以实现工作流任务的的重新指派。
更进一步的完善,可以考虑和OutLook日历相结合,实现自动委派。
本文转自:http://www.cnblogs.com/HeavyMetal/archive/2009/09/03/1559681.html
相关文章推荐
- 此任务当前被某个正在运行的工作流锁定,无法对其进行编辑
- TFS - AT - Reporting配置 - 因为有正在运行的作业导致,"编辑"无法使用
- sql-"无法删除数据库,因为该数据库当前正在使用"问题解决
- 无法删除数据库 "aaa",因为该数据库当前正在使用
- "无法删除数据库,因为该数据库当前正在使用"问题解决
- 解决编辑SharePoint 的Excel文件时(使用本地Excel 2010) 报错。"Microsoft Excel 无法打开或修复此工作薄,因为它已损坏"
- [BAT]批处理脚本双击可运行,但在定时计划任务中无法执行(当前工作路径不对导致的)
- 用户收到"无法显示页面"的错误消息和"Connections_refused"条目记录在正在运行 Windows Server 2003,Exchange 2003 中,IIS 6.0 的服务器上的 Httperr.log 文件
- 技术贴】QQ空间打开缓慢,无法编辑日志,由于您当前网络不稳定导致QQ空间打开异常的解决办法。
- com.microsoft.sqlserver.jdbc.SQLServerException: 此查询使用的不是 ANSI 外部联接运算符("*=" 或 "=*")。若要不进行修改即运行此查询,请使用存储过程 sp_dbcmptlevel 将当前数据库的
- VC中向数据库插数据,执行“UPDATE()”时,出现异常:无法更新,当前被锁定
- SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)
- 转载 :sql server 2005 无法删除数据库 "#Test",因为该数据库当前正在使用
- 正在进行生成的同时试图签出,因为无法对必须修改的文件"Web.config等"进行更改...
- "无法删除数据库,因为该数据库当前正在使用"问题解决
- 在ubuntu上安装netbeans出问题:“无法初始化 UI 正在 headless 模式下运行"
- "Windows Update 时提示当前无法检查更新,因为未运行服务"解决办法
- 获取当前正在运行的虚拟机(Vmware Workstation),并对虚拟机进行控制
- 无法删除数据库 "#Test",因为该数据库当前正在使用
- vxWorks对于当前(正在运行)任务时间片操作小结