式の例 (Reporting Services)

レポートでは、内容と外観を制御するために式をよく使用します。式は MicrosoftVisual Basic で記述し、組み込み関数、カスタム コード、グローバル変数、レポート変数とグループ変数、およびユーザー定義変数を使用することができます。

このトピックでは、レポート内で一般的なタスクに使用できる式の例を示します。

  • Visual Basic の関数   Visual Basic の日付関数、文字列関数、変換関数、および条件関数の例

  • レポートの関数   集計および組み込みのレポート関数の例

  • レポート データの表示方法   レポートの外観を変更する例

  • プロパティ   形式または表示を制御するために、レポート アイテムのプロパティを設定する例

  • パラメーター   式の中でパラメーターを使用する例

  • カスタム コード   埋め込まれたカスタム コードの例

特定用途ごとの式の例については、次のトピックを参照してください。

単純型と複合型の式、式を使用できる場所、式に使用できる参照の種類など、レポート式の詳細については、「レポート式を使用した作業」のトピックを参照してください。集計計算で式が評価されるコンテキストの詳細については、「合計およびその他の集計の計算 (Reporting Services)」を参照してください。

また、式エディターには、組み込み関数を階層形式で表示できるビューが用意されています。特定の関数を選択すると、[値] ペインにコード例が表示されます。詳細については、「[式] ダイアログ ボックス」を参照してください。

関数

レポート内の多くの式には、関数が含まれています。これらの関数を使用して、データの書式を設定し、ロジックを適用し、レポートのメタデータにアクセスできます。MicrosoftVisual Basic ランタイム ライブラリの関数や、System..::..Convert 名前空間および System..::..Math 名前空間の関数を使用する式を記述できます。また、他のアセンブリまたはカスタム コードの関数への参照も追加できます。System.Text.RegularExpressions など、Microsoft.NET Framework のクラスを使用することもできます。Visual Basic の関数の詳細については、msdn.microsoft.com の「Visual Basic ランタイム ライブラリ」を参照してください。

.NET Framework では、特定の日付書式など、カスタム書式を指定する多数の方法が提供されます。詳細については、MSDN の「型の書式設定」を参照してください。

Visual Basic の関数

Visual Basic の関数を使用して、テキスト ボックスに表示されるデータや、レポートのパラメーター、プロパティ、または他の領域に使用されるデータを操作できます。ここでは、このような関数のうち、いくつかの例を紹介します。Visual Basic の定数は、DateInterval.Month のように、列挙値として指定されています。式エディターは、列挙値の IntelliSense をサポートしていませんが、式に含まれる値は正しくコンパイルされます。

Visual Basic の関数の詳細については、Visual Basic のドキュメントを参照してください。

日付関数

  • Today 関数は現在の日付を返します。この式は、レポートに日付を表示するテキスト ボックス、または現在の日付に基づいてデータをフィルター処理するパラメーターに使用できます。

    =Today()
    
  • DateAdd 関数は、1 つのパラメーターに基づいて日付の範囲を指定する場合に役立ちます。次の式では、StartDate という名前の System..::..DateTime 型のパラメーターで指定した日付の 6 か月後の日付が返されます。

    =DateAdd(DateInterval.Month, 6, Parameters!StartDate.Value)
    
  • Year 関数は、特定の日付の年を表示します。この関数を使用して、日付をグループ化したり、一連の日付のラベルとして年を表示したりできます。次の式では、指定した販売注文日グループの年が返されます。また、Month 関数および他の関数を使用して、日付を操作することもできます。詳細については、Visual Basic のドキュメントを参照してください。

    =Year(Fields!OrderDate.Value)
    

文字列関数

  • 連結演算子および Visual Basic の定数を使用して、複数のフィールドを組み合わせます。次の式では、2 つのフィールドが、同じテキスト ボックス内の別々の行に返されます。

    =Fields!FirstName.Value & vbCrLf & Fields!LastName.Value 
    
  • Format 関数を使用して、文字列内の日付と数値の書式を設定します。次の式では、StartDate パラメーターおよび EndDate パラメーターの値が長い日付形式で表示されます。

    =Format(Parameters!StartDate.Value, "D") & " through " &  Format(Parameters!EndDate.Value, "D")  
    

    日付または数値のみを格納するテキスト ボックスに書式を適用する場合は、テキスト ボックス内で Format 関数を使用するのではなく、テキスト ボックスの Format プロパティを使用する必要があります。

  • Right、Len、InStr の各関数は、サブストリングを返す場合に役立ちます。たとえば、DOMAIN\username の文字列からユーザー名だけを返します。次の式では、User というパラメーターで取得できる文字列のうち、円記号 (\) より右側の部分のみが返されます。

    =Right(Parameters!User.Value, Len(Parameters!User.Value) - InStr(Parameters!User.Value, "\"))
    

    次の式では、Visual Basic の関数の代わりに .NET Framework の System..::..String クラスのメンバーを使用しています。返される値は、上記の式と同じです。

    =Parameters!User.Value.Substring(Parameters!User.Value.IndexOf("\")+1, Parameters!User.Value.Length-Parameters!User.Value.IndexOf("\")-1)
    
  • 複数の値を持つパラメーターから選択した値を表示します。次の例では、Join 関数を使用して、パラメーター MySelection から選択した複数の値を連結して単一の文字列にし、その文字列をレポート アイテム内のテキスト ボックスの値を表す式として設定できるようにしています。

    = Join(Parameters!MySelection.Value)
    
  • .NET Framework の RegularExpressions に含まれている一連の Regex 関数は、電話番号の書式を設定するなど、既存の文字列の書式を変更する場合に役立ちます。次の式では、フィールドに含まれる、"nnn-nnn-nnnn" 形式の 10 桁の電話番号を、Replace 関数を使用して "(nnn) nnn-nnnn" 形式に変更しています。

    =System.Text.RegularExpressions.Regex.Replace(Fields!Phone.Value, "(\d{3})[ -.]*(\d{3})[ -.]*(\d{4})", "($1) $2-$3")
    
    注意注意

    Fields!Phone.Value に余分なスペースがないことと、データ型が System..::..String であることを確認してください。

変換関数

Visual Basic の関数を使用して、フィールドのデータ型を別のデータ型に変換することができます。変換関数を使用すると、フィールドの既定のデータ型を、計算やテキストの連結に必要なデータ型に変換できます。 

  • 次の式では、フィルター式の [値] フィールドの Transact-SQL money データ型と比較するために、定数 500 を Decimal 型に変換します。

    =CDec(500)
    
  • 次の式では、複数の値を持つパラメーター MySelection で選択された値の数が表示されます。

    =CStr(Parameters!MySelection.Count)
    

決定関数

  • Iif 関数では、式が True かどうかによって、2 つの値のいずれかが返されます。次の式では、Iif 関数を使用して、LineTotal の値が 100 を超える場合にブール値 True が返されます。それ以外の場合は、False が返されます。

    =IIF(Fields!LineTotal.Value > 100, True, False)
    
  • 複数の IIF 関数 ("入れ子になった IIF" とも呼ばれます) を使用すると、PctComplete の値に応じて 3 つの値のいずれかを返すことができます。次の式をテキスト ボックスの塗りつぶしの色に使用すると、テキスト ボックスの値に応じて背景色を変更できます。

    =IIF(Fields!PctComplete.Value >= 10, "Green", IIF(Fields!PctComplete.Value >= 1, "Blue", "Red"))
    

    背景は、値が 10 以上の場合は緑色、1 ~ 9 の場合は青色、1 未満の場合は赤色になります。

  • 同じ機能を実現するには、Switch 関数を使用するという方法もあります。Switch 関数は、検証する条件が 3 つ以上ある場合に役立ちます。Switch 関数は、True に評価される一連の式のうちの最初の式に関連付けられた値を返します。

    =Switch(Fields!PctComplete.Value >= 10, "Green", Fields!PctComplete.Value >= 1, "Blue", Fields!PctComplete.Value = 1, "Yellow", Fields!PctComplete.Value <= 0, "Red",)
    

    背景は、値が 10 以上の場合は緑色、1 ~ 9 の場合は青色、1 の場合は黄色、0 以下の場合は赤色になります。

  • 同じ機能を実現する 3 つ目の方法は、Choose 関数を使用することです。Choose 関数では、第 1 パラメーターが、それ以外のパラメーターに対するインデックスとして使用されます。第 1 パラメーターは整数であることが必要です。テーブル内のテキスト ボックスの背景色の値として、この式を設定した場合、MyIndex の値によって背景色が制御されます。

    =Choose(Fields!MyIndex.Value,"Red","Green","Yellow")
    

    たとえば、MyIndex が 1 の場合、背景色は赤色 ("Red") になります。クエリの結果セットで、MyIndex のデータが、パラメーター リストの範囲を超えていないことを確認してください。

  • ImportantDate フィールドの値を検証し、経過日数が 1 週間を超えている場合は "Red"、それ以外の場合は "Blue" を返します。この式を使用して、レポート アイテムに含まれるテキスト ボックスの Color プロパティを制御できます。

    =IIF(DateDiff("d",Fields!ImportantDate.Value, Now())>7,"Red","Blue")
    
  • PhoneNumber フィールドの値を検証し、値が null (Visual Basic では Nothing) の場合は "No Value" を返し、それ以外の場合は電話番号の値を返します。この式を使用して、レポート アイテムに含まれるテキスト ボックスの値を制御できます。

    =IIF(Fields!PhoneNumber.Value Is Nothing,"No Value",Fields!PhoneNumber.Value)
    
  • Department フィールドの値を検証し、サブレポート名または null (Visual Basic では Nothing) を返します。この式は、条件付きドリルスルー サブレポートで使用できます。

    =IIF(Fields!Department.Value = "Development", "EmployeeReport", Nothing)
    
  • フィールド値が NULL かどうかを検証します。この式を使用すると、画像レポート アイテムの Hidden プロパティを制御できます。次の例では、LargePhoto というフィールドの値が NULL でない場合にのみ、このフィールドで指定された画像が表示されます。

    =IIF(IsNothing(Fields!LargePhoto.Value),True,False)
    

レポートの関数

Reporting Services にはこの他にも、レポート内のデータの操作に使用できるレポート関数があります。ここでは、このような関数のうち 2 つの例を紹介します。レポートの関数の詳細については、「式での組み込みのレポート関数と集計関数の使用 (Reporting Services)」を参照してください。

Sum

  • Sum 関数を使用すると、グループまたはデータ領域内の値を合計できます。この関数は、グループのヘッダーまたはフッターで役立ちます。次の式では、Order グループまたは Order データ領域内のデータの合計が表示されます。

    =Sum(Fields!LineTotal.Value, "Order")
    
  • Sum 関数は、条件付き集計計算にも使用できます。たとえば、データセットに State という名前のフィールドが存在し、Not Started、Started、Finished という値を設定できる場合、次の式をグループ ヘッダーで使用すると、値 Finished の合計のみが計算されます。

    =Sum(IIF(Fields!State.Value = "Finished", 1, 0))
    

RowNumber

  • RowNumber 関数をデータ領域内のテキスト ボックスで使用すると、式が表示されるテキスト ボックスの各インスタンスの行数が表示されます。この関数は、テーブル内の行数を数える場合に役立ちます。また、行数に基づいた改ページの指定など、より複雑なタスクにも役立ちます。詳細については、このトピックの「改ページ」を参照してください。

    RowNumber に指定したスコープによって、どの時点で番号の再設定を開始するかが制御されます。この関数に Nothing キーワードを指定することで、最も外側のデータ領域内の最初の行からカウントが開始されます。入れ子になったデータ領域内でカウントを開始するには、データ領域の名前を使用します。グループ内でカウントを開始するには、グループの名前を使用します。

    =RowNumber(Nothing)
    

レポート データの表示方法

式を使用して、レポートにデータを表示する方法を操作できます。たとえば、2 つのフィールドの値を 1 つのテキスト ボックスに表示したり、レポートに関する情報を表示したり、レポートに改ページを挿入する方法に影響を与えたりすることができます。

ページ ヘッダーとページ フッター

レポートをデザインする場合、必要に応じてレポート名とページ番号をレポート フッターに表示できます。この操作を行うには、以下の式を使用できます。

  • 次の式では、レポート名、およびレポートが実行された時刻が返されます。この式は、レポート フッターまたはレポート本文のテキスト ボックスで使用できます。時間の書式は、.NET Framework の短い日付用の書式設定の文字列を使用して設定されます。

    =Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")
    
  • 次の式では、レポートのページ番号および全ページ数が返されます。この式は、レポートのフッター内のテキスト ボックスで使用できます。

    =Globals.PageNumber & " of " & Globals.TotalPages
    

以下の例では、ディレクトリの一覧の内容と同様に、ページ ヘッダーにページの最初と最後の値を表示する方法について説明します。この例では、LastName という名前のテキスト ボックスを含むデータ領域を想定しています。

  • 次の式は、ページ ヘッダーの左側にあるテキスト ボックスで使用されます。この式では、そのページの LastName テキスト ボックスの最初の値が返されます。

    =First(ReportItems("LastName").Value)
    
  • 次の式は、ページ ヘッダーの右側にあるテキスト ボックスで使用されます。この式では、そのページの LastName テキスト ボックスの最後の値が返されます。

    =Last(ReportItems("LastName").Value)
    

次の例では、合計ページ数の表示方法について説明します。この例では、Cost という名前のテキスト ボックスを含むデータ領域を想定しています。

  • 次の式は、ページ ヘッダーまたはページ フッターで使用されます。この式では、Cost テキスト ボックスの値の合計がそのページに返されます。

    =Sum(ReportItems("Cost").Value)
    
注意注意

ページ ヘッダーまたはページ フッターでは、1 つの式につき 1 つのレポート アイテムしか参照できません。また、ページ ヘッダーまたはページ フッターの式では、テキスト ボックスの名前を参照することはできますが、テキスト ボックス内の実際のデータ式は参照できません。

改ページ

レポートによっては、グループやレポート アイテムに改ページを設定せずに、またはグループやレポート アイテムの改ページに追加する形で、指定した行数の最後に改ページを挿入したい場合があります。この操作を行うには、必要なグループや詳細レコードを含むグループを作成し、そのグループに改ページを追加した後、指定された行数でグループ化を行うグループ式を追加します。

  • 次の式をグループ式で使用すると、25 行ごとに数値が割り当てられます。グループに改ページが定義されている場合は、この式の結果として、25 行ごとに改ページが行われます。

    =CInt(Ceiling(RowNumber(Nothing)/25))
    

    ユーザーが 1 ページあたりの行数の値を設定できるようにするには、RowsPerPage という名前のパラメーターを作成し、次の式で示すように、そのパラメーターに基づいてグループ式を作成します。

    =CInt(Ceiling(RowNumber(Nothing)/Parameters!RowsPerPage.Value))
    

    グループに改ページを設定する方法の詳細については、「改ページを追加する方法 (Reporting Services)」を参照してください。

プロパティ

式は、テキスト ボックスにデータを表示するためだけに使用するものではありません。レポート アイテムにプロパティを適用する方法を変更する場合にも使用できます。レポート アイテムのスタイル情報を変更したり、情報の表示を変更することができます。

書式設定

  • テキスト ボックスの Color プロパティで次の式を使用すると、Profit フィールドの値に応じてテキストの色が変更されます。

    =Iif(Fields!Profit.Value < 0, "Red", "Black")
    
  • データ領域にあるレポート アイテムの BackgroundColor プロパティで次の式を使用すると、各行の背景色に薄緑色と白が交互に設定されます。

    =Iif(RowNumber(Nothing) Mod 2, "PaleGreen", "White")
    

    特定のスコープに対して式を使用する場合は、次のように、集計関数に対してデータセットを指定する必要があります。

    =Iif(RowNumber("Employees") Mod 2, "PaleGreen", "White")
    
注意注意

使用できる色は、.NET Framework の KnownColor 列挙体の色です。

表示

レポート アイテムの表示プロパティを使用して、レポート内のアイテムの表示/非表示を切り替えることができます。テーブルなどのデータ領域では、最初に、式の値に基づいて詳細行を非表示にできます。

  • グループ内の詳細行の初期表示に次の式を使用すると、PctQuota フィールドで 90% を超えるすべての売上の詳細行が表示されます。

    =Iif(Fields!PctQuota.Value>.9, False, True)
    
  • テーブルの Hidden プロパティに次の式を設定すると、テーブルの行数が 12 行を超えた場合にのみテーブルが表示されます。

    =IIF(CountRows()>12,true,false)
    

URL

レポート データを使用して URL をカスタマイズできます。また、テキスト ボックスに対するアクションとして URL を追加するかどうかを、条件付きで制御することもできます。

  • 次の式をテキスト ボックスに対するアクションとして使用すると、URL パラメーターとしてデータセット フィールド EmployeeID を指定する、カスタマイズされた URL が生成されます。

    ="http://adventure-works/MyInfo?ID=" & Fields!EmployeeID.Value
    

    詳細については、「URL へのハイパーリンクを追加する方法 (Reporting Services)」を参照してください。

  • 次の式では、テキスト ボックス内に URL を追加するかどうかを、条件付きで制御します。この式では、アクティブ URL をレポートに含めるかどうかをユーザーが決定できるように、IncludeURLs という名前のパラメーターを使用しています。この式は、テキスト ボックスに対するアクションとして設定されます。パラメーターを False に設定してからレポートを表示すると、ハイパーリンクなしでレポートを Microsoft Excel にエクスポートできます。

    =IIF(Parameters!IncludeURLs.Value,"http://adventure-works.com/productcatalog",Nothing)
    

レポート データ

式を使用して、レポートで使用するデータを操作できます。パラメーターおよび他のレポート情報を参照できます。レポートのデータを取得するために使用されるクエリを変更することもできます。

パラメーター

パラメーターの式を使用して、パラメーターの既定値を変更できます。たとえば、パラメーターを使用して、レポートの実行に使用されるユーザー ID に基づき、特定のユーザーに合わせてデータをフィルター処理することができます。

  • パラメーターの既定値として次の式を使用すると、レポートを実行するユーザーのユーザー ID が収集されます。

    =User!UserID
    
  • レポートのクエリ パラメーター、フィルター式、テキスト ボックスなどの領域でパラメーターを参照するには、Parameters グローバル コレクションを使用します。この例では、パラメーターの名前が Department であることを想定しています。

    =Parameters!Department.Value
    
  • パラメーターはレポート内に作成できますが、非表示に設定されます。レポート サーバーでレポートが実行される際、パラメーターがツール バーに表示されないため、レポートを表示するユーザーは既定値を変更できません。既定値に設定された非表示パラメーターは、カスタム定数として使用できます。この値は、フィールド式など、あらゆる式で使用できます。次の式では、ParameterField という名前のパラメーターの既定値で指定されたフィールドを特定しています。

    =Fields(Parameters!ParameterField.Value).Value
    

    詳細については、「パブリッシュ済みレポートのパラメータ プロパティの設定」を参照してください。

カスタム コード

レポート内では、カスタム コードを使用できます。カスタム コードは、レポート内に埋め込むか、レポートで使用されるカスタム アセンブリに格納します。カスタム コードの詳細については、「式でのカスタム コード参照の使用 (Reporting Services)」を参照してください。

  • 次の例では、埋め込みコードの ToUSD というメソッドが呼び出され、StandardCost フィールドの値が米ドル単位に変換されます。

    =Code.ToUSD(Fields!StandardCost.Value)
    
  • 次の例は、カスタムの定数および変数を定義する方法を示しています。

    [Visual Basic]

    Public Const MyNote = "Authored by Bob"
    Public Const NCopies As Int32 = 2
    Public Dim  MyVersion As String = "123.456"
    Public Dim MyDoubleVersion As Double = 123.456
    

    式エディターの [定数] ビューには組み込み定数のみ表示され、カスタムの定数および変数は表示されませんが、次の例に示すように、任意の式から参照を追加できます。これらは、Variant 型として扱われます。

    [Visual Basic]

    =Code.MyNote
    =Code.NCopies 
    =Code.MyVersion
    =Code.MyDoubleVersion
    

カスタム定数を作成したり、式の値をカスタマイズしたりする方法としては、レポート変数またはグループ変数を使用する方法もあります。

グループ変数を使用したカスタム集計

特定のグループ スコープ内のローカルなグループ変数の値を初期化し、その変数を式の中で参照することができます。カスタム コードでグループ変数を使用するシナリオとしては、カスタム集計の実装が挙げられます。詳細については、「グループ変数を使ったカスタム集計 (Reporting Services 2008)」を参照してください。

変数の詳細については、「式におけるレポート変数コレクションとグループ変数コレクションの参照の使用 (Reporting Services)」を参照してください。

実行時のフィールド内のテキストの置換

次の例では、FixSpelling という埋め込みメソッドが呼び出され、SubCategory.Value 内の "Bike" というテキストがすべて "Bicycle" に置き換えられます。

=Code.FixSpelling(Fields!SubCategory.Value)

レポート定義に埋め込んで使用する次のコードは、FixSpelling メソッドの実装を示しています。この例では、.NET Framework の System.Text..::..StringBuilder クラスを参照する方法を示しています。詳細については、「レポートにコードを追加する方法 (Reporting Services)」および「レポートにアセンブリへの参照を追加する方法 (Reporting Services)」を参照してください。

Public Function FixSpelling(ByVal s As String) As String
   Dim strBuilder As New System.Text.StringBuilder(s)
   If s.Contains("Bike") Then
      strBuilder.Replace("Bike", "Bicycle")
      Return strBuilder.ToString()
      Else : Return s
   End If
End Function

実行時の NULL 値または 0 の非表示

式内の一部の値は、レポート処理時に NULL または未定義と評価されることがあります。その結果、ランタイム エラーが発生して、評価した式ではなく "#Error" がテキスト ボックスに表示される場合があります。IIF 関数は特にこの動作の影響を受けます。これは、If-Then-Else ステートメントとは異なり、IIF ステートメントの各部分 (関数呼び出しを含む) が、true であるか false であるかを検証するルーチンに渡される前に評価されるためです。=IIF(Fields!Sales.Value is NOTHING, 0, Fields!Sales.Value) ステートメントを実行すると、Fields!Sales.Value が NOTHING の場合は、表示されたレポートに " #Error" と表示されます。

この状況を回避するには、次のいずれかの方法を使用します。

  • フィールド B の値が 0 または未定義の場合は、分子に 0、分母に 1 を設定します。それ以外の場合は、分子にフィールド A の値、分母にフィールド B の値を設定します。

    =IIF(Field!B.Value=0, 0, Field!A.Value / IIF(Field!B.Value =0, 1, Field!B.Value))
    
  • カスタム コード関数を使用して、式の値を返します。次の例では、現在の値と前の値の差がパーセンテージで返されます。これを使用すると、任意の連続する 2 つの値の差を計算できます。また、最初の比較のエッジ ケース (前の値が存在しない場合) と、前の値または現在の値が null (Visual Basic では Nothing) であるケースを処理できます。

    Public Function GetDeltaPercentage(ByVal PreviousValue, ByVal CurrentValue) As Object
        If IsNothing(PreviousValue) OR IsNothing(CurrentValue) Then
            Return Nothing
        Else if PreviousValue = 0 OR CurrentValue = 0 Then
            Return Nothing
        Else 
            Return (CurrentValue - PreviousValue) / CurrentValue
        End If
    End Function
    

    次の式では、このカスタム コードをテキスト ボックスから呼び出す方法を示しています。

    =Code.GetDeltaPercentage(Previous(Sum(Fields!Sales.Value),"ColumnGroupByYear"), Sum(Fields!Sales.Value))
    

変更履歴

変更内容

Choose 関数の使用例のほか、グループ変数とカスタム コードを使用してカスタム集計を計算する例を追加しました。