代码之家  ›  专栏  ›  技术社区  ›  Johannes Hädrich

通过列表Web服务更新列表项来启动SharePoint工作流

  •  16
  • Johannes Hädrich  · 技术社区  · 17 年前

    我正在开发一个简单的SharePoint顺序工作流,它应该绑定到文档库。将小工作流关联到文档库时,我选中了这些选项

    • 允许手动执行此工作流 由经过身份验证的用户启动 具有编辑项目权限。
    • 起点 当新项目为 创建。
    • 启动此工作流的时间 项目已更改。

    现在我将一个文档上载到这个库,工作流开始,例如发送一封邮件。一切都很好。

    当我在新项目上选择“编辑属性”并保存更改时,工作流将再次激发。绝对是我们所期望的。

    即使在copy.asmx webservice的帮助下将新项目复制到库中,工作流也会正常启动。

    但是 现在 我想更新这个项目 通过SharePoint Web服务列表.asmx .

    我的 CAML 走到这里:

    <Method ID='1' Cmd='Update'>
      <Field Name='ID'>1</Field>
      <Field Name='myDummyPropertyField'>NewValue</Field>
    </Method>
    

    正在更新该项(时间戳也已更改,并且是一个虚拟属性),但工作流不会再次启动。

    这种行为在我们的发展过程中是可以复制的。 测试系统。

    检查错误日志(C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Logs),我发现一条奇怪的错误消息:

    09/25/2008 16:51:40.17  w3wp.exe (0x1D94)                           0x1D60  Windows SharePoint Services     General                         6875    Critical    Error loading and running event receiver Microsoft.SharePoint.Workflow.SPWorkflowAutostartEventReceiver in Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c. Additional information is below.  : The object specified does not belong to a list.
    

    有谁能证实这种行为吗?或者有什么解决方案提示?


    我会随时通知你关于这个话题的任何进展。

    4 回复  |  直到 14 年前
        1
  •  11
  •   Johannes Hädrich    17 年前

    最后,我们通过了微软的支持服务流程,得到了一个解决方案!

    首先,微软称这是一个错误。这是一个小错误,因为有一个很好的解决方法,所以可能需要更长的时间,直到这个错误被修复(支持技术人员用下一个Service Pack或下一个版本(!)说了些什么).

    但现在问题来了。

    重新认识

    让我们从我的问题中看一下CAML代码:

    <Method ID='1' Cmd='Update'>
      <Field Name='ID'>1</Field>
      <Field Name='myDummyPropertyField'>NewValue</Field>
    </Method>
    

    由于任何原因,工作流管理器都不使用ID,我们在第二行中输入。奇怪的是,所有其他的SharePoint命令都使用ID,而不是工作流管理器。工作流管理器使用“完全限定”文档名。因此,由于我们没有线索,也没有输入任何完全限定的文档名,因此工作流管理器默认为当前文档库的名称。现在错误信息开始有意义了:

    The object specified does not belong to a list.
    

    当然,对象(文档库)不属于列表,它是列表。

    解决方案

    我们必须在caml查询中再添加一行:

    <Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field>
    

    fileref将完全限定的文档名传递给工作流管理器,工作流管理器现在非常乐意启动项目的工作流。

    注意,必须包含完整的绝对服务器路径,省略服务器名称(例如在spiem的serverRelativePath属性中找到)。

    全工作凸轮查询:

     <Method ID='1' Cmd='Update'>
        <Field Name='ID'>1</Field>
        <Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field>
        <Field Name='myDummyPropertyField'>NewValue</Field>
      </Method>
    

    未来

    也许这种未记录的行为将在即将到来的服务包中得到修复,也许不会。Microsoft技术支持人员对此表示道歉,并将发布有关此主题的msdn文章。在下个月,我希望这篇关于stackoverflow的文章能够帮助处于同样情况下的开发人员。

    谢谢你的阅读!

        2
  •  3
  •   SharePoint Newbie    17 年前

    我们在审批流程中遇到了类似的问题。 为了解决这个问题,我们编写了自己的事件接收器并将其附加到列表中。 根据项目是更新的还是编辑的,我们随后启动了审批工作流。

    希望这有帮助…

        3
  •  0
  •   Kyle Trauberman pestades    17 年前

    我也遇到过这个问题,发现一旦工作流启动,它就不能自动重新启动,无论您如何更新项目。但是,您可以根据需要多次手动重新启动工作流。

        4
  •  0
  •   Brock Adams    14 年前

    我也看到过同样的行为。但之后你会 posts like this ,向人们演示如何每天创建一个电子邮件提醒。