MOSS (SharePoint 2007 Enterprise)、32 ビット、SP2 を使用しています。
私が開発し、SharePoint Designer (SPD) ワークフローで使用しているカスタム ワークフロー アクティビティに奇妙な問題があることに気付きました。これらのアクションは正しく機能しているように見えますが、ワークフローの残りの部分ではうまくいきません(具体的には、根本的な問題は次の場所に投稿されました:カスタム WF アクティビティの変更権限に関するタイミングの問題です。もっと掘り下げて…)
問題を突き止めるのを助けるために、私は非常に簡単なテストを開発しました。これについては以下で詳しく説明しますが、このテストでさらに奇妙な動作に気付いています。これが最初に説明します...
したがって、このテストの最後に、このテスト用に作成したリストで手動で開始できる単純な SPD WF を取得しました。このリストには、「TextField」という名前の単一行のテキスト フィールド/列が含まれています。WF には、4 つのアクションを実行する 1 つのステップが含まれています。
- フィールドを値に設定 (カスタム WFA を使用して TextField 列に「1」を割り当てます)
- ワークフロー履歴リストに「設定 1」を記録する
- 現在のアイテムにフィールドを設定 (OOTB アクションを使用して「2」を TextField 列に割り当てます)
- 「Set 2」をワークフロー履歴リストに記録する
このワークフローは完全に実行され、ワークフロー メッセージが正常に完了し、TextField==2 になります。
ただし、最後の 2 つのアクションをアクション リストの一番上に移動すると、WF のシングル ステップは次のようになります。
- 現在のアイテムにフィールドを設定 (OOTB アクションを使用して「2」を TextField 列に割り当てます)
- 「Set 2」をワークフロー履歴リストに記録する
- フィールドを値に設定 (カスタム WFA を使用して TextField 列に「1」を割り当てます)
- ワークフロー履歴リストに「設定 1」を記録する
この場合、ワークフロー ステータスは「エラーが発生しました」であり、TextField==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 の作成に関するドキュメントはすべて正しいように見えます。誰かが私のコードに問題を見つけたり、自分の環境でこれを試したりできますか?