リスト Web サービスを通じてリスト アイテムを更新して SharePoint ワークフローを起動する
-
02-07-2019 - |
質問
私は、ドキュメント ライブラリにバインドする必要がある単純な SharePoint シーケンシャル ワークフローを開発しています。小さなワークフローをドキュメント ライブラリに関連付けるときに、次のオプションをオンにしました
- このワークフローを、アイテムのアクセス許可を編集した認証されたユーザーによって手動で開始できるようにします。
- 新しいアイテムが作成されたら、このワークフローを開始します。
- アイテムが変更されたら、このワークフローを開始します。
ここでドキュメントをこのライブラリにアップロードすると、ワークフローが開始され、たとえばメールが送信されます。それは完了し、すべてがうまくいきます。
新しいアイテムの [プロパティの編集] を選択して変更を保存すると、ワークフローが再度起動されます。まさに私たちが期待していた通りです。
Copy.asmx Web サービスを使用して新しいアイテムをライブラリにコピーする場合でも、ワークフローは正常に開始されます。
しかし 今 アイテムを更新したい SharePoint WebService Lists.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.
この動作を確認できる人はいますか?それとも解決策のヒントはありますか?
このトピックに関する進展があれば随時お知らせします。
解決
最終的に、Microsoft のサポート サービス プロセスを通過し、解決策を入手しました。
まず、Microsoft はこれをバグであると述べました。これは軽微なバグですが、適切な回避策があるため、このバグが修正されるまでにはもう少し時間がかかる可能性があります (サポート技術者は、次のサービス パックまたは次のバージョンで何かを言っています (!))。
しかし、ここからが問題です。
その理由
私の質問の CAML コードを見てみましょう。
<Method ID='1' Cmd='Update'>
<Field Name='ID'>1</Field>
<Field Name='myDummyPropertyField'>NewValue</Field>
</Method>
何らかの理由でワークフロー マネージャーがその ID で動作しないため、2 行目に入力しました。奇妙なことに、他のすべての SharePoint コマンドはその ID で機能しますが、ワークフロー マネージャーでは機能しません。ワークフロー マネージャーは、「完全修飾された」ドキュメント名を使用して動作します。したがって、手がかりがなく、完全修飾ドキュメント名を入力しなかったため、ワークフロー マネージャーはデフォルトで現在のドキュメント ライブラリの名前を使用します。そして今、エラー メッセージが意味を持ち始めています。
The object specified does not belong to a list.
もちろん、オブジェクト (ドキュメント ライブラリ) はリストに属していません。それはリストです。
ソリューション
CAML クエリにもう 1 行追加する必要があります。
<Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field>
FileRef は完全修飾ドキュメント名をワークフロー マネージャーに渡し、これで完全に満足してアイテムのワークフローが開始されます。
注意してください。サーバー名 (SPItem の ServerRelativePath プロパティなどにあります) を省略して、完全な絶対サーバー パスを含める必要があります。
完全に機能する CAML クエリ:
<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 記事をリリースする予定です。今後 1 か月間、stackoverflow に関するこの記事が同じ状況にある開発者に役立つことを願っています。
読んでくれてありがとう!
他のヒント
私たちは承認ワークフローでも同様の問題に直面しました。これを解決するために、独自のイベント レシーバーを作成し、リストに追加しました。アイテムが更新されたか編集されたかに応じて、承認ワークフローを起動しました。
お役に立てれば...
私もこの問題に遭遇し、ワークフローが一度開始されると、アイテムをどのように更新しても自動的に再開始できないことがわかりました。ただし、ワークフローは何度でも手動で再開できます。
私も同じ行動を見たことがある。しかし、その後、あなたは得る このような投稿, では、1 日あたり 1 件のリマインダーを作成して電子メールのリマインダーを設定する方法を示しています。