• sharepoint异常之"此任务当前被某个正在运行的工作流锁定,无法对其进行编辑"


    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

  • 相关阅读:
    Beta版软件说明书
    团队项目第五天
    cnblogs用户体验评价
    团队项目测试计划
    Alpha版总结会议
    软件使用说明书
    团队绩效考核
    各个小组对于“我爱淘”的评价
    软件工程团队项目评价
    丹佛机场行李系统处理方案
  • 原文地址:https://www.cnblogs.com/ericgisser/p/moss_exception_tasklock.html
Copyright © 2020-2023  润新知