2011年4月6日水曜日

CSV に出力する Activity

以前の記事でデータベースからデータを抽出する事を行いましたので、今回はその結果を CSV として出力する Activity を実装してみます。いきなりコードの貼付けからですw

Public NotInheritable Class CsvOutputActivity
    Inherits CodeActivity

    Public Property OutputFileName As InArgument(Of String)
    Public Property TargetData As InArgument(Of DataRow)

    Protected Overrides Sub Execute(ByVal context As System.Activities.CodeActivityContext)

        Dim columnIndex As Integer = 0
        Dim outputBuilder As New System.Text.StringBuilder
        For Each child In context.GetValue(Me.TargetData).ItemArray
            If columnIndex <> 0 Then outputBuilder.Append(", ")
            outputBuilder.Append(child.ToString)
            columnIndex += 1
        Next
        outputBuilder.Append(ControlChars.NewLine)

        My.Computer.FileSystem.WriteAllText(
                  context.GetValue(Me.OutputFileName),
                  outputBuilder.ToString, True)

    End Sub

Context を通して DataRow 形式にて抽出したデータを受け取るようにし、DataRow.Item に含まれるすべての項目をそのまま出力するようにしています。エンコードもサンプルですので特に気にしていませんw

このようなアクティビティを用意した後に Workflow を作成します。

WF4-1

今回はこのような形です。以前のサンプルでは ForEach アクティビティ内部で DisplayActivity を利用していましたが、そこを置き換える形になります。これを実行する事で、ReadSQLDataActivity で抽出したデータが CSV として出力されるようになります。

実際の業務ではこれにもう少し手を加える必要があると思いますが、CSV 出力するようなケースでは大体このような形のロジックを作成しているのではないでしょうか。もし Workflow を利用して業務 AP を作成するような場合では、今紹介しているような小さい単位でのアクティビティをたくさん利用するのではなく、もう少し大きい単位でのアクティビティを用意する事が適していると感じています。

上記の例では ForEach アクティビティとその内部に CsvOutputActivity を設定した形を一つのカスタムアクティビティとして提供するだけで、かなり利用シーンが増えてくるのではないでしょうか。このあたりをどこまで進める事ができるかが、Workflow を上手く利用するポイントになると思います。

0 件のコメント:

コメントを投稿