チュートリアル: 関連付けフォームと開始フォームを持つワークフローの作成

このチュートリアルでは、組み込まれたかたちで関連付けフォームと開始フォームを使用する基本的なシーケンシャル ワークフローの作成方法について説明します。 関連付けフォームと開始フォームは、それぞれ、SharePoint 管理者が初めてワークフローの関連付けを行うときと、ユーザーがワークフローを開始するときに、ワークフローにパラメーターが追加されるようにする ASPX フォームです。

このチュートリアルでは、次の要件を満たす経費明細書承認ワークフローを作成します。

  • 管理者がワークフローをリストに関連付けようとすると、関連付けフォームが表示され、経費明細書の上限金額を入力するよう求められます。

  • 従業員は各自の経費明細書を共有ドキュメント リストにアップロードしてワークフローを開始し、経費の合計をワークフローの開始フォームに入力します。

  • 従業員の経費明細書の合計が、管理者によってあらかじめ定義された上限を超えている場合は、その従業員の上司が経費明細書を承認するためのタスクが作成されます。 従業員の経費明細書の合計が経費の上限と等しい場合、またはそれよりも少ない場合は、自動承認メッセージがワークフローの履歴リストに書き込まれます。

このチュートリアルでは、次の作業について説明します。

  • SharePoint リスト定義シーケンシャル ワークフロー プロジェクトを Visual Studio で作成する。

  • ワークフロー スケジュールを作成する。

  • ワークフロー アクティビティのイベントを処理する。

  • ワークフローの関連付けフォームと開始フォームを作成する。

  • ワークフローを関連付ける。

  • ワークフローを手動で開始する。

注意

このチュートリアルではシーケンシャル ワークフロー プロジェクトを使用していますが、ステート マシン ワークフローでも手順は同じです。

また、次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前または場所が異なる場合があります。 これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。 詳細については、「設定の操作」を参照してください。

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

SharePoint シーケンシャル ワークフロー プロジェクトの作成

まず、Visual Studio でシーケンシャル ワークフロー プロジェクトを作成します。 シーケンシャル ワークフローは、最後のアクティビティが完了するまで順番に実行される一連の手順です。 この手順では、SharePoint の共有ドキュメント リストに適用するシーケンシャル ワークフローを作成します。 ワークフローのウィザードを使用すると、サイト定義またはリスト定義のいずれかにワークフローを関連付けることができ、またワークフローを開始するタイミングを指定することができます。

SharePoint シーケンシャル ワークフロー プロジェクトを作成するには

  1. [ファイル] メニューの [新規作成] をポイントし、[新しいプロジェクト] をクリックして、[新しいプロジェクト] ダイアログ ボックスを表示します。

  2. [Visual C#] または [Visual Basic][SharePoint] ノードを展開して、[2010] をクリックします。

  3. [テンプレート] ウィンドウでシーケンシャル ワークフローを選択します。

  4. [名前] ボックスに「ExpenseReport」と入力し、[OK] をクリックします。

    SharePoint カスタマイズ ウィザードが表示されます。

  5. [デバッグに使用するローカル サイト] ページで、[次へ] をクリックして、既定のサイトをそのまま使用します。

    また、この段階で、ソリューションの信頼レベルがファーム ソリューション (ワークフロー プロジェクトではこれ以外は選択できません) として設定されます。

  6. [デバッグのワークフロー名の指定] ページで、既定の名前 (ExpenseReport - Workflow1) を受け入れます。 既定のワークフロー テンプレートの種類である [リスト ワークフロー] を受け入れます。 [次へ] をクリックします。

  7. [デバッグ セッション中に Visual Studio によってワークフローが自動的に関連付けられるようにする] ページで、ワークフロー テンプレートを自動的に関連付けるためのチェック ボックスがオンの場合は、チェック ボックスをオフにします。

    この手順によって、後で関連付けフォームを表示し、ワークフローを共有ドキュメント リストに手動で関連付けることができます。

  8. [完了] をクリックします。

ワークフローへの関連付けフォームの追加

次に、SharePoint 管理者が初めてワークフローを経費明細書ドキュメントに関連付けるときに表示される .ASPX 形式の関連付けフォームを作成します。

ワークフローに関連付けフォームを追加するには

  1. ソリューション エクスプローラー[Workflow1] ノードをクリックします。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックして、[新しい項目の追加] ダイアログ ボックスを表示します。

  3. ダイアログ ボックスのツリー ビューで、(プロジェクトの言語に応じて) [Visual C#] または [Visual Basic] を展開し、[SharePoint] ノードを展開して、[2010] をクリックします。

  4. テンプレートの一覧から [ワークフロー関連付けフォーム] を選択します。

  5. [名前] ボックスに「ExpenseReportAssocForm.aspx」と入力します。

  6. [追加] をクリックして、プロジェクトにフォームを追加します。

関連付けフォームのデザインとコーディング

この手順では、関連付けフォームにコントロールとコードを追加して必要な機能を組み込みます。

関連付けフォームのデザインとコーディングを行うには

  1. 関連フォーム (ExpenseReportAssocForm.aspx) で、ID="Main" の asp:Content 要素を特定します。

  2. このコンテンツ要素の先頭行の直後に次のコードを追加して、承認する経費の上限 (AutoApproveLimit) を入力するよう求めるラベルとテキスト ボックスを作成します。

    <asp:Label ID="lblAutoApproveLimit" Text="Auto Approval Limit:" runat="server" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="AutoApproveLimit" runat="server" />
    <br /><br />
    
  3. ソリューション エクスプローラーExpenseReportAssocForm.aspx ファイルを展開して、その依存ファイルを表示します。

    注意

    Visual Basic のプロジェクトである場合、この手順を実行するには、[すべてのファイルを表示] ボタンをクリックする必要があります。

  4. ExpenseReportAssocForm.aspx ファイルを右クリックし、[コードの表示] を選択します。

  5. GetAssociationData メソッドを次のコードに置き換えます。

    Private Function GetAssociationData() As String
        ' TODO: Return a string that contains the association data that 
        ' will be passed to the workflow. Typically, this is in XML 
        ' format.
        Return Me.AutoApproveLimit.Text
    End Function
    
    private string GetAssociationData()
    {
        // TODO: Return a string that contains the association data that 
        // will be passed to the workflow. Typically, this is in XML 
        // format.
        return this.AutoApproveLimit.Text;
    }
    

ワークフローへの開始フォームの追加

次に、ユーザーが各自の経費明細書に対してワークフローを実行すると表示される開始フォームを作成します。

開始フォームを作成するには

  1. ソリューション エクスプローラー[Workflow1] ノードをクリックします。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックして、[新しい項目の追加] ダイアログ ボックスを表示します。

  3. ダイアログ ボックスのツリー ビューで、(プロジェクトの言語に応じて) [Visual C#] または [Visual Basic] を展開し、[SharePoint] ノードを展開して、[2010] をクリックします。

  4. テンプレートの一覧から [ワークフローの開始フォーム] を選択します。

  5. [名前] ボックスに「ExpenseReportInitForm.aspx」と入力します。

  6. [追加] をクリックして、プロジェクトにフォームを追加します。

開始フォームのデザインとコーディング

次に、開始フォームにコントロールとコードを追加して必要な機能を組み込みます。

開始フォームのコーディングをするには

  1. 初期化フォーム (ExpenseReportInitForm.aspx) で、ID="Main" の asp:Content 要素を特定します。

  2. このコンテンツ要素の先頭行の直後に、次のコードを追加して、関連付けフォームで入力された承認する経費の上限 (AutoApproveLimit) を表示するラベルとテキスト ボックス、および経費の合計 (ExpenseTotal) を入力するよう求めるラベルとテキスト ボックスを作成します。

    <asp:Label ID="lblAutoApproveLimit" Text="Auto Approval Limit:" runat="server" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="AutoApproveLimit" ReadOnly="true" runat="server" />
    <br /><br />
    <asp:Label ID="lblExpenseTotal" Text="Expense Total:" runat="server" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="ExpenseTotal" runat="server" />
    <br /><br />
    
  3. ソリューション エクスプローラーExpenseReportInitForm.aspx ファイルを展開して、その依存ファイルを表示します。

  4. ExpenseReportInitForm.aspx ファイルを右クリックし、[コードの表示] を選択します。

  5. Page_Load メソッドを次のコード例に置き換えます。

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As 
      EventArgs) Handles Me.Load
        InitializeParams()
        Me.AutoApproveLimit.Text = workflowList.WorkflowAssociations(New 
          Guid(associationGuid)).AssociationData
        ' Optionally, add code here to pre-populate your form fields.
    End Sub
    
    protected void Page_Load(object sender, EventArgs e)
    {
        InitializeParams();
        this.AutoApproveLimit.Text = 
          workflowList.WorkflowAssociations[new 
          Guid(associationGuid)].AssociationData;
    }
    
  6. GetInitiationData メソッドを次のコード例に置き換えます。

    ' This method is called when the user clicks the button to start the workflow.
    Private Function GetInitiationData() As String
        Return Me.ExpenseTotal.Text
        ' TODO: Return a string that contains the initiation data that 
        ' will be passed to the workflow. Typically, this is in XML 
        ' format.
        Return String.Empty
    End Function
    
    // This method is called when the user clicks the button to start the workflow.        
    private string GetInitiationData()
    {
        // TODO: Return a string that contains the initiation data that 
        // will be passed to the workflow. Typically, this is in XML 
        // format.
        return this.ExpenseTotal.Text;
    }
    

ワークフローのカスタマイズ

次に、ワークフローをカスタマイズします。 後で 2 つのフォームをワークフローに関連付けます。

ワークフローをカスタマイズするには

  1. プロジェクトの [Workflow1] をダブルクリックして、ワークフロー デザイナーにワークフローを表示します。

  2. ツールボックスの [Windows Workflow v3.0] ノードを展開し、[IfElse] アクティビティを探します。

  3. このアクティビティをデザイナーにドラッグし、ワークフローの [onWorkflowActivated1] アクティビティの直下にドロップしてワークフローに追加します。 これで、IfElseActivity1 というアクティビティがデザイナーに作成されます。

  4. ツールボックスの [SharePoint ワークフロー] ノードを展開し、[CreateTask] アクティビティを探します。

  5. IfElseActivity1 内に 2 つある [ここにアクティビティをドロップしてください] 領域のいずれかに、このアクティビティをドラッグ アンド ドロップしてワークフローに追加します。

  6. [プロパティ] ウィンドウで、CorrelationToken プロパティの taskToken のプロパティ値を入力します。

  7. CorrelationToken プロパティの横に表示される正符号 (TreeView 正符号) をクリックして展開します。

  8. OwnerActivityName サブプロパティのドロップダウン矢印をクリックし、Workflow1 を選択します。

  9. TaskId プロパティをクリックし、省略記号 (ASP.NET モバイル デザイナー楕円) ボタンをクリックして、[プロパティのバインド] ダイアログ ボックスを表示します。

  10. [新しいメンバーへのバインド] タブをクリックし、[フィールドの作成] を選択し、[OK] をクリックします。

  11. TaskProperties プロパティをクリックし、省略記号 (ASP.NET モバイル デザイナー楕円) ボタンをクリックして、[プロパティのバインド] ダイアログ ボックスを表示します。

  12. [新しいメンバーへのバインド] タブをクリックし、[フィールドの作成] を選択し、[OK] をクリックします。

  13. ツールボックスの [SharePoint ワークフロー] ノードを展開し、[LogToHistoryListActivity] アクティビティを探します。

  14. IfElseActivity1 内にある、もう一方の [ここにアクティビティをドロップしてください] 領域に、このアクティビティをドラッグ アンド ドロップしてワークフローに追加します。

ワークフローへのコードの追加

次に、ワークフローにコードを追加して、必要な機能を実装します。

ワークフローにコードを追加するには

  1. ワークフロー デザイナーで [createTask1] アクティビティをダブルクリックして、MethodInvoking イベントに対する空のメソッドを生成します。

  2. MethodInvoking メソッドを次のコードに置き換えます。

    Private Sub createTask1_MethodInvoking(ByVal sender As 
      System.Object, ByVal e As System.EventArgs)
        createTask1_TaskId1 = Guid.NewGuid
        createTask1_TaskProperties1.AssignedTo = "somedomain\\someuser"
        createTask1_TaskProperties1.Description = "Please approve the 
          expense report"
        createTask1_TaskProperties1.Title = "Expense Report Approval 
          Needed"
    End Sub 
    
    private void createTask1_MethodInvoking(object sender, EventArgs e)
    {
        createTask1_TaskId1 = Guid.NewGuid();
        createTask1_TaskProperties1.AssignedTo = "somedomain\\someuser";
        createTask1_TaskProperties1.Description = "Please approve the 
          expense report";
        createTask1_TaskProperties1.Title = "Expense Report Approval 
          Needed";
    } 
    

    注意

    コード内の somedomain\\someuser の部分を、タスクの作成対象のドメインとユーザー名に置き換えます (例: "Office\\JoeSch")。 テストの目的では、開発用のアカウントを使用するのが最も簡単です。

  3. MethodInvoking メソッドの下に、次のコード例を追加します。

    Private Sub checkApprovalNeeded(ByVal sender As Object, ByVal e As 
      ConditionalEventArgs)
        Dim approval As Boolean = False
        If (Convert.ToInt32(workflowProperties.InitiationData) > 
          Convert.ToInt32(workflowProperties.AssociationData)) Then
            approval = True
        End If
        e.Result = approval
    End Sub 
    
    private void checkApprovalNeeded(object sender, ConditionalEventArgs 
      e)
    {
        bool approval = false;
        if (Convert.ToInt32(workflowProperties.InitiationData) > 
          Convert.ToInt32(workflowProperties.AssociationData))
        {
            approval = true;
        }
        e.Result = approval;
    } 
    
  4. ワークフロー デザイナーで、[ifElseBranchActivity1] アクティビティをクリックします。

  5. [プロパティ] ウィンドウで、[条件] プロパティのドロップダウン矢印をクリックし、Code Condition を選択します。

  6. [条件] プロパティの横に表示される正符号 (TreeView 正符号) をクリックして展開し、その値を checkApprovalNeeded に設定します。

  7. ワークフロー デザイナーで、[logToHistoryListActivity1] アクティビティを右クリックし、[ハンドラーの生成] を選択して、MethodInvoking イベントに対する空のメソッドを生成します。

  8. MethodInvoking コードを次の内容に置き換えます。

    Private Sub logToHistoryListActivity1_MethodInvoking(ByVal sender As 
      System.Object, ByVal e As System.EventArgs)
        Me.logToHistoryListActivity1.HistoryOutcome = ("Expense was auto 
          approved for " + workflowProperties.InitiationData)
    End Sub 
    
    private void logToHistoryListActivity1_MethodInvoking(object sender, 
      EventArgs e)
    {
        this.logToHistoryListActivity1.HistoryOutcome = "Expense was 
          auto approved for " + workflowProperties.InitiationData;
    } 
    
  9. F5 キーを押して、プログラムをデバッグします。

    これで、アプリケーションがコンパイルされ、パッケージ化されて配置されます。さらに、そのフィーチャーがアクティブ化され、IIS アプリケーション プールがリサイクルされて、ブラウザーが起動されます。このとき、ブラウザーには、[サイト URL] プロパティで指定されている場所が表示されます。

ドキュメント リストへのワークフローの関連付け

次に、SharePoint サイトの共有ドキュメント リストにワークフローを関連付けることによって、ワークフローの関連付けフォームを表示します。

ワークフローを関連付けるには

  1. クイック起動バーの [共有ドキュメント] をクリックします。

  2. [ライブラリ ツール] リボン タブの [ライブラリ] をクリックし、[ライブラリの設定] リボン ボタンをクリックします。

  3. [権限と管理] セクションの [ワークフロー設定] リンクをクリックし、[ワークフロー] ページの [ワークフローの追加] リンクをクリックします。

  4. ワークフロー設定ページの一番上のリストから [ExpenseReport - Workflow1] テンプレートを選択します。

  5. その次のフィールドに「ExpenseReportWorkflow」と入力して、[次へ] をクリックします。

    これにより、ワークフローと共有ドキュメント リストが関連付けられ、ワークフローの関連付けフォームが表示されます。

  6. [Auto Approval Limit] ボックスに「1200」と入力し、[ワークフローの関連付け] をクリックします。

ワークフローの開始

次に、共有ドキュメント リストのいずれかのドキュメントにワークフローを関連付けて、ワークフローの開始フォームを表示します。

ワークフローを開始するには

  1. SharePoint ページの [ホーム] ボタンをクリックし、クイック起動バーの [共有ドキュメント] リンクをクリックして、SharePoint サイト上の共有ドキュメント リストを表示します。

  2. ページ上部の [ライブラリ ツール] タブの [ドキュメント] リンクをクリックし、リボンの [ドキュメントのアップロード] ボタンをクリックして、共有ドキュメント リストに新しいドキュメントをアップロードします。

  3. アップロードしたドキュメントをマウスでポイントすると、ドロップダウン矢印が表示されます。 ドロップダウン矢印をクリックし、[ワークフロー] を選択します。

  4. ExpenseReportWorkflow の横に表示されるイメージをクリックします。

    これでワークフローの開始フォームが表示されます。 [Auto Approval Limit] ボックスに表示される値は、関連付けフォームで入力された値であるため読み取り専用です。

  5. [Expense Total] ボックスに「1600」と入力し、[ワークフローの開始] をクリックします。

    共有ドキュメント リストが再度表示されます。 たった今ワークフローによって開始された項目に、ExpenseReportWorkflow という新しい列が追加され、列の値は [完了] になっています。

  6. アップロードしたドキュメントの横に表示されるドロップダウン矢印をクリックし、[ワークフロー] をクリックして、ワークフローの状態ページを表示します。 [完了したワークフロー] 下の [完了] の値をクリックします。 [タスク] セクションにタスクが表示されます。

  7. タスクのタイトルをクリックして、そのタスクの詳細を表示します。

  8. 共有ドキュメント リストに戻り、同じドキュメントまたは別のドキュメントを使用して再度ワークフローを開始します。

  9. 開始ページに、関連付けページで入力した値 (1200) と同じかそれよりも少ない金額を入力します。

    この場合、タスクは作成されずに、履歴リストのエントリが作成されます。 このエントリは、ワークフローの状態ページの [ワークフローの履歴] セクションに表示されます。 履歴イベントの [結果] 列に表示されたメッセージに注目してください。 logToHistoryListActivity1.MethodInvoking イベントで入力したテキスト (自動承認された金額を含む) が出力されています。

次の手順

ワークフロー テンプレートの作成方法の詳細については、以下のトピックを参照してください。

参照

その他の技術情報

SharePoint ワークフロー ソリューションの作成

チュートリアル: ワークフローへのアプリケーション ページの追加