1

カスタム sharepoint (2007) リスト (testlist という名前) があり、そこにテスト ワークフロー (sharepoint designer 2007 で構築され、testwf という名前) が添付されています。このワークフローは、「ステップ 1」の「アクション」セクションで定義されたタスクのみが待機することです。 2014 年 4 月。新しいアイテムをテストリストに追加すると、testwf が開始され、グリッド ビューに切り替えると、アイテムに「testwf」フィールドが実行中として表示されます。

ここで、アイテムに関連付けられたワークフローにアクセスし、ステータスを変更してコードを介してこのタスクを「完了する」必要がありますが、次のコードを使用すると、常に item.Tasks リストが空になります (ただし、内部変数 m_allTask​​ListTasks が要素が 1 つある)。

        using (SPSite site = new SPSite("http://mysp"))
        {
            site.AllowUnsafeUpdates = true;
            SPWeb web = site.OpenWeb();
            web.AllowUnsafeUpdates = true;

            foreach (SPList list in web.Lists)
            {
                if (list.Title != "testlist") continue;
                foreach (SPListItem item in list.Items)
                {
                    item.Web.AllowUnsafeUpdates = true;
                    if(item.Tasks.Count > 0) 
                       //do work
                }
            }
        }

多分私は何かが足りない...

4

3 に答える 3

1

このコードを使用して、ワークフロータスクにアクセスします。

Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());
SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];
// now you can access the workflows tasks
SPTask task = workflow.Tasks[item.UniqueId];
于 2012-11-15T09:50:28.347 に答える
1

クロスポストされた質問。

@petauro、これについて何か前進しましたか?過去に使用して成功した次のコードに基づいて、@moontear の回答を裏付けることができます。

...
// get workflow tasks for SPListItem object item
if (item != null && item.Workflows != null && item.Workflows.Count > 0)
{
    try
    {
        var workflows = site.WorkflowManager.GetItemActiveWorkflows(item);
        foreach (SPWorkflow workflow in workflows)
        {
            // match on some indentifiable attribute of your custom workflow
            // the history list title is used below as an example

            if (workflow.ParentAssociation.HistoryListTitle.Equals(Constants.WORKFLOW_HISTORY_LIST_TITLE))
            {
                var workflowTasks = workflow.Tasks;
                if (workflowTasks != null && workflowTasks.Count > 0)
                {
                    // do work on the tasks
                }
            }
        }
    }
    catch
    {
        // handle error
    }
}
...

最新のコメントで投稿したコードとはわずかに異なりますが、役立つかどうかを確認してください。

もう 1 つの重要なポイント: "testlist"SPWeb 内に複数のタイトル付きリストのインスタンスがありますか? そうでない場合、なぜ反復するのweb.Listsですか?1 つのリストを直接取得するだけで、余分な CPU サイクルを回避できます: SPWeb.GetList()

于 2012-12-29T20:54:59.233 に答える
0

これについては別の方法で行う必要があります。ワークフロー タスク リストを取得し、そこからタスクを取得して終了する必要があります。

最初に、アイテムでワークフローが実行されているかどうかを確認する必要があります。if (item.Workflows > 0)そこから、リスト アイテムのすべてのワークフロー インスタンスを反復処理し、SPWorkflowAssociation と関連するタスクおよび履歴リストを取得できます。そこから、関連付けられたタスク リストで探しているタスクを見つけるだけで済みます。

于 2012-11-05T13:38:22.030 に答える