1

MOSS (SharePoint 2007 Enterprise)、32 ビット、SP2 を使用しています。

私が開発し、SharePoint Designer (SPD) ワークフローで使用しているカスタム ワークフロー アクティビティに奇妙な問題があることに気付きました。これらのアクションは正しく機能しているように見えますが、ワークフローの残りの部分ではうまくいきません(具体的には、根本的な問題は次の場所に投稿されました:カスタム WF アクティビティの変更権限に関するタイミングの問題です。もっと掘り下げて…)

問題を突き止めるのを助けるために、私は非常に簡単なテストを開発しました。これについては以下で詳しく説明しますが、このテストでさらに奇妙な動作に気付いています。これが最初に説明します...

したがって、このテストの最後に、このテスト用に作成したリストで手動で開始できる単純な SPD WF を取得しました。このリストには、「TextField」という名前の単一行のテキスト フィールド/列が含まれています。WF には、4 つのアクションを実行する 1 つのステップが含まれています。

  1. フィールドを値に設定 (カスタム WFA を使用して TextField 列に「1」を割​​り当てます)
  2. ワークフロー履歴リストに「設定 1」を記録する
  3. 現在のアイテムにフィールドを設定 (OOTB アクションを使用して「2」を TextField 列に割り当てます)
  4. 「Set 2」をワークフロー履歴リストに記録する

このワークフローは完全に実行され、ワー​​クフロー メッセージが正常に完了し、TextField==2 になります。

ただし、最後の 2 つのアクションをアクション リストの一番上に移動すると、WF のシングル ステップは次のようになります。

  1. 現在のアイテムにフィールドを設定 (OOTB アクションを使用して「2」を TextField 列に割り当てます)
  2. 「Set 2」をワークフロー履歴リストに記録する
  3. フィールドを値に設定 (カスタム WFA を使用して TextField 列に「1」を割​​り当てます)
  4. ワークフロー履歴リストに「設定 1」を記録する

この場合、ワークフロー ステータスは「エラーが発生しました」であり、TextField==1 (2 番目の割り当て) にもかかわらず、ワークフロー履歴のアイテムは次のとおりです。

  1. リスト アイテムの更新中にエラーが発生しました
  2. セット フィールド テストでエラーが発生しました。

(「Set Field Test」は SPD WF の名前です)

つまり、問題は次のようになります。カスタム WFA が最初に発生した場合、WF は 100% 機能しますが、カスタム WFA が 2 番目に発生した場合、(フィールドが正しく更新されても) 毎回失敗します。アクションの反転を複数回実行するなど、このテストを何度も繰り返しました。

カスタム WFA でばかげたことをしている可能性があるので、全体を以下に示します (会社の頭字語を公的機関に置き換えました - 税金の価値を得る)。

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Reflection;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;

namespace NASA.workflowActivity {
public partial class TestSetFieldValueActivity : Activity {

    #region Dependency Properties

        public static DependencyProperty itemFieldProperty = DependencyProperty.Register("itemField", typeof(String), typeof(TestSetFieldValueActivity));

        public static DependencyProperty newValueProperty = DependencyProperty.Register("newValue", typeof(String), typeof(TestSetFieldValueActivity));

        public static DependencyProperty __ActivationPropertiesProperty = DependencyProperty.Register("__ActivationProperties", typeof(Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties), typeof(TestSetFieldValueActivity));

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        [ValidationOption(ValidationOption.Required)]
        [Browsable(true)]
        public String itemField {
            get { return base.GetValue(TestSetFieldValueActivity.itemFieldProperty).ToString(); }
            set { base.SetValue(TestSetFieldValueActivity.itemFieldProperty, value); }
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        [ValidationOption(ValidationOption.Required)]
        [Browsable(true)]
        public String newValue {
            get { return base.GetValue(TestSetFieldValueActivity.newValueProperty).ToString(); }
            set { base.SetValue(TestSetFieldValueActivity.newValueProperty, value); }
        }

        [ValidationOption(ValidationOption.Required)]
        public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties {
            get { return (Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)base.GetValue(TestSetFieldValueActivity.__ActivationPropertiesProperty); }
            set { base.SetValue(TestSetFieldValueActivity.__ActivationPropertiesProperty, value); }
        }

    #endregion

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) {
        try {
            SPListItem listItem = this.__ActivationProperties.Item;
            SPField field = listItem.Fields[this.itemField];
            listItem[field.Id] = this.newValue;
            listItem.SystemUpdate();                
        } catch {
            return ActivityExecutionStatus.Faulting;
        }
        return ActivityExecutionStatus.Closed;
    }

}
}

そして、私の .ACTIONS ファイル ( C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\1033\Workflow に保存) には、このアクションの次のエントリが含まれています。

<Action 
            Name="Set field in current item (Custom WFA)"
            ClassName="NASA.workflowActivity.TestSetFieldValueActivity"
            Assembly="NASA.workflowActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f579ebeb24170bf5"
            AppliesTo="all"
            Category="NASA WFA: Test">
        <RuleDesigner Sentence="Set %1 to %2 (Custom WFA)">
            <FieldBind Id="1" Field="itemField" DesignerType="FieldNames" text="field" />
            <FieldBind Id="2" Field="newValue" DesignerType="Text" text="value" />
        </RuleDesigner>
        <Parameters>
            <Parameter Name="itemField" Type="System.String, mscorlib" Direction="In" />
            <Parameter Name="newValue" Type="System.String, mscorlib" Direction="In" />
            <Parameter Name="__ActivationProperties" Type="Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties, Microsoft.SharePoint" Direction="In" />
        </Parameters>
    </Action>

最後に、もちろん、私の web.config には私のアセンブリのエントリが含まれています。

もちろん、これは非常に単純なアクションですが私の SPD WF では正しく動作しません。私は何か間違ったことをしているに違いありませんが、カスタム WFA の作成に関するドキュメントはすべて正しいように見えます。誰かが私のコードに問題を見つけたり、自分の環境でこれを試したりできますか?

4

1 に答える 1

1

私は自分のオープン ソース プロジェクトでこの問題を実際に解決しました。http://spdactivities.codeplex.com/からソース コードをダウンロードし、アクセス許可アクティビティの 1 つのソースを確認します。コードが機能しない理由は、OOTB アクティビティがトランザクションに参加し、カスタム アクティビティが参加しないためです。そのため、カスタム アクティビティはすべての OOTB アクティビティの前に実行されます。

ワークフローに参加するには、IPendingWorkを実装し、 WorkflowEnvironment.WorkBatchに送信する必要があります。HTH

于 2011-06-27T13:55:23.093 に答える