式におけるデータ型の使用 (Reporting Services)
データを効率よく格納し、処理できるように、さまざまなデータの種類を表すデータ型が用意されています。代表的なデータ型としては、テキスト (文字列) 型、数値型 (小数点以下桁数を含む)、数値型 (小数点以下桁数を含まない)、日付/時刻型、イメージ型などがあります。データを効率の良いデータ型で格納しておき、実際にレポートに表示する時点で目的に応じた形式に変換できます。たとえば、通貨を表すフィールドの場合、データを浮動小数点数として格納しておき、実際には、指定した書式設定プロパティに従ってさまざまな形式で表示することができます。表示形式の詳細については、「レポートとレポート アイテムの書式設定」を参照してください。
グループ式、フィルタ式、集計計算など、値を比較したり結合したりする式を作成する際は、データ型について十分に理解しておく必要があります。比較と計算は、同じデータ型のアイテム間でしか行えません。データ型が異なる場合は、式を使用して、レポート アイテムのデータ型を明示的に変換する必要があります。データ型の変換が必要になるケースとしては、次のような場合が考えられます。
レポート パラメータの値を別のデータ型のデータセット フィールドと比較する。
データ型が異なる複数の値を比較するフィルタ式を作成する。
データ型が異なる複数のフィールドを結合する並べ替え式を作成する。
データ型が異なる複数のフィールドを結合するグループ式を作成する。
データ ソースから取得した値を別のデータ型に変換する。
レポート データのデータ型を調べる
レポート アイテムのデータ型を調べるには、そのアイテムのデータ型を返す式を作成します。たとえば、MyField というフィールドのデータ型を確認するには、テーブルのセルに =Fields!MyField.Value.GetDataType().ToString() という式を追加します。式の結果には、MyField に使用されている CLR データ型 (System.String や System.DateTime など) が表示されます。
データセット フィールドを異なるデータ型に変換する
レポートで使用するデータセット フィールドを事前に変換することもできます。既存のデータセット フィールドを変換するには、次のような方法があります。
- データセット クエリを修正して、変換済みのデータを使った新しいクエリ フィールドを追加する。リレーショナル データ ソースや多次元データ ソースの場合は、データ ソース リソースを使用して変換を行います。
- 既存のレポート データセット フィールドに基づく計算フィールドを作成する。それには、結果セット列のすべてのデータを異なるデータ型の新しい列に変換する式を作成します。たとえば、Year フィールドを整数値から文字列値に変換するには、=CStr(Fields!Year.Value) という式を作成します。詳細については、「レポート データ ペインでフィールドを追加、編集、削除する方法」を参照してください。
- 使用しているデータ処理拡張機能に、書式設定済みのデータを取得するためのメタデータが含まれているかどうかを確認する。たとえば、SQL ServerAnalysis Services MDX クエリには、キューブの処理時に書式設定されたキューブ値を保持する FORMATTED_VALUE という拡張プロパティがあります。詳細については、「Analysis Services データセットに対する拡張フィールド プロパティの使用」を参照してください。
パラメータのデータ型について
レポート パラメータに使用できるデータ型は、Boolean、DateTime、Integer、Float、Text (String) の 5 つだけです。データセット クエリにクエリ パラメータが含まれている場合は、レポート パラメータが自動的に作成されて、対応するクエリ パラメータに関連付けられます。レポート パラメータの既定のデータ型は String です。レポート パラメータの既定のデータ型を変更するには、[レポート パラメータのプロパティ] ダイアログ ボックスの [全般] ページで、[データ型] ボックスの一覧から該当する値を選択します。
注意 |
---|
DateTime データ型のレポート パラメータは、ミリ秒をサポートしていません。ミリ秒を含む値に基づいてパラメータを作成することはできますが、ミリ秒が指定された Date 値または Time 値を値ドロップダウン リストから選択することはできません。 |
データ型を変換する式やデータの一部を抽出する式を作成する
テキストとデータセット フィールドを連結演算子 (&) で結合する場合、通常は共通言語ランタイム (CLR) の既定の書式を使用できます。データセット フィールドまたはパラメータを特定のデータ型へと明示的に変換する場合は、CLR のメソッドを使用するか、Visual Basic のランタイム ライブラリ関数を使ってデータを変換する必要があります。
データ型の変換例を次の表に示します。
変換の種類 |
例 |
---|---|
DateTime から String |
=CStr(Fields!Date.Value) |
String から DateTime |
=DateTime.Parse(Fields!DateTimeinStringFormat.Value) |
String から DateTimeOffset |
=DateTimeOffset.Parse(Fields!DateTimeOffsetinStringFormat.Value) |
年を抽出 |
=Year(Fields!TimeinStringFormat.Value) -- or -- =Year(Fields!TimeinDateTimeFormat.Value) |
Boolean から Integer |
=CInt(Parameters!BooleanField.Value) True は -1、False は 0 になります。 |
Boolean から Integer |
=System.Convert.ToInt32(Fields!BooleanFormat.Value) True は 1、False は 0 になります。 |
DateTimeOffset 値から DateTime 部分のみを抽出 |
=Fields!MyDatetimeOffset.Value.DateTime |
DateTimeOffset 値から Offset 部分のみを抽出 |
=Fields!MyDatetimeOffset.Value.Offset |
Format 関数を使用して、値の表示形式を制御することもできます。詳細については、「関数 (Visual Basic)」を参照してください。
高度な例
データ ソースへの接続に使用するデータ プロバイダが、すべてのデータ型の変換をサポートしているとは限りません。このような場合、サポートされていないデータ ソースの種類に対する既定のデータ型は String になります。次の例では、データ型が文字列として返される場合の対処方法について説明します。
String 型と CLR DateTimeOffset 型の連結
CLR には、ほとんどのデータ型について既定の変換方法が用意されているため、& 演算子を使用することで、データ型が異なる値を 1 つの文字列に連結できます。たとえば、"The date and time are: " というテキストと、StartDate という System..::..DateTime 型のデータセット フィールドを連結するには、="The date and time are: " & Fields!StartDate.Value という式を使用します。
データ型によっては、ToString 関数が必要になる場合があります。たとえば、先ほどと同じ例を、CLR データ型の System..::..DateTimeOffset (日付、時刻、および、UTC タイム ゾーンを基準とするタイム ゾーン オフセットで構成される) を使って記述する場合は、="The time is: " & Fields!StartDate.Value.ToString() とします。
String 型から CLR の DateTime 型への変換
データ ソースで定義されているすべてのデータ型をデータ処理拡張機能がサポートしていない場合、サポート対象外のデータはテキストとして処理される可能性があります。たとえば、datetimeoffset(7) データ型の値は String データ型として処理されます。"July 1, 2008, at 6:05:07.9999999 A.M." に対応する文字列値は、オーストラリアのパースでは次のようになります。
2008-07-01 06:05:07.9999999 +08:00
この例では、日付 (July 1, 2008) に続けて、小数点以下 7 桁の時刻値 (6:05:07.9999999 A.M.) と UTC タイム ゾーン オフセット (+8 時間、0 分) が続きます。以下の例では、この値が MyDateTime.Value という String 型のフィールドに格納されています。
次のいずれかの方法を使用することで、このデータを 1 つまたは複数の CLR 値に変換できます。
テキスト ボックスに、文字列の一部分を抽出する式を入力します。次にその例を示します。
UTC タイム ゾーン オフセットの時間部分だけを抽出し、分に変換するには、=CInt(Fields!MyDateTime.Value.Substring(Fields!MyDateTime.Value.Length-5,2)) * 60 という式を使用します。
結果は 480 です。
文字列を日時の値に変換するには、=DateTime.Parse(Fields!MyDateTime.Value) という式を使用します。
MyDateTime.Value の文字列に UTC オフセットが含まれている場合、まず、DateTime.Parse 関数によって UTC オフセットの調整が行われます (ここでは、午前 7 時から [+08:00] を差し引いて、前日の午後 11 時という UTC 時刻が求められます)。次に、DateTime.Parse 関数は、レポート サーバーのローカル UTC オフセットを適用し、必要に応じて夏時間のために再度時刻調整を行います。たとえば、ワシントン州レドモンドの場合、夏時間調整後のローカル時刻オフセットは [-07:00] (午後 11 時の 7 時間前) になります。したがって、2007-07-06 04:07:07 PM (2007 年 7 月 6 日午後 4 時 07 分) という DateTime 値が得られます。
文字列型から DateTime 型への変換の詳細については、MSDN の「日付と時刻文字列の解析」および「固有カルチャの日付と時刻の形式指定」を参照してください。
レポート データセットに、文字列の一部分を抽出する式を使った新しい計算フィールドを追加します。詳細については、「レポート データ ペインでフィールドを追加、編集、削除する方法」を参照してください。
Transact-SQL 関数を使って日付と時刻の値を別々に抽出し、別個の列を作成するように、レポートのデータセット クエリを修正します。次の例では、DatePart 関数を使用して、年の列と UTC タイム ゾーン (分単位) の列を追加しています。
SELECT
MyDateTime,
DATEPART(year, MyDateTime) AS Year,
DATEPART(tz, MyDateTime) AS OffsetinMinutes
FROM MyDates
結果セットには、3 つの列が格納されます。1 列目には日付と時刻が、2 列目には年が、3 列目には分単位の UTC オフセットが格納されます。次の行はサンプル データを示しています。
2008-07-01 06:05:07 2008 480
SQL Server データベースの型の詳細については、「データ型 (データベース エンジン)」および「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。