VBScript 式は、レポートのコンテンツを取得、計算、表示、グループ化、ソート、フィルタ、パラメータ化、および書式設定するためにレポート定義内で広く使用されます。いくつかの式は自動的に作成されます。たとえば、ツールボックスからフィールドをレポートのセクションにドラッグすると、テキストボックスにそのフィールドの値を取得する式が表示されます。ただし、ほとんどの場合、レポートに機能を追加するには独自に式を作成する必要があります。
VBScript の式と文には次の違いがあります。
Field1.Text.Expression = "iif( 1=1, 1+2, 1+3 )"
c1FlexReport.OnOpen = "if 1=1 then msgbox("OK!!!") else msgbox("ooops")"
C1FlexReport は VBScript を使用して、計算フィールドの式を評価したり、レポートイベントを処理します。
VBScript は完全な機能を備えた言語で、C1FlexReport の式を記述する際は、VBScript のすべてのメソッドと関数にアクセスできます。VBScript 言語の組み込みの機能については、Microsoft Developer's Network (MSDN) を参照してください。
新しい VBScript エディタでグローバルスクリプトを記述できます。このエディタを使用して、レポート全体からアクセス可能な VBScript の関数やサブルーチンを定義できます。VBScript エディタに直接アクセスするには、F7 を押します。エディタを閉じて変更を保存するには、ショートカット Ctrl+W を使用します。エディタ内で、スクリプトを切り替えたり、フォントや色などのオプションを変更することができます。また、構文チェック、定義済み VBScript 関数、再編成されたスクリプト関数などの高度な機能を使用して、直感的なスクリプティングを簡単に行うことができます。
[VBScript エディタ]オプションを使用してグローバルスクリプトを記述するには
function Backcolor()
Detail.Backcolor=rgb(255,0,0)
end function
次のように、C1FlexReportDesigner の GlobalScripts プロパティを使用してグローバルスクリプトを記述することもできます。
これで、レポート全体から使用できるグローバル関数 'Backcolor()' が定義されます。
VBScript エディタには、次の追加機能があります。
C1FlexReport は、追加のオブジェクト、変数、および関数を公開することで、VBScript を拡張します。以下のセクションでは、これらの拡張機能について説明します。
次の表に、VBScript の要素、オブジェクト、および変数を示します。
次の表に、VBScript の演算子を一覧します。
演算子 | 説明 |
---|---|
And | 2 つの式の論理積を実行します。 |
Or | 2 つの式の論理和を実行します。 |
Not | 式の否定を求めます。 |
Mod | 2 つの数値で割り算を実行し、余りだけを返します。 |
次の表に、VBScript の予約シンボルとそれらの使用方法を一覧します。
キーワード | 説明 |
---|---|
True | True キーワードは、-1 と等しい値を持ちます。 |
False | False キーワードは、0 と等しい値を持ちます。 |
Nothing | 実オブジェクトからオブジェクト変数の関連付けを解除します。オブジェクト変数に Nothing を割り当てるには、Set 文を使用します。たとえば、Set MyObject = Nothing とします。複数のオブジェクト変数が同じ実オブジェクトを参照している場合があります。1 つのオブジェクト変数に Nothing を割り当てた場合、その変数は実オブジェクトを参照しなくなります。複数のオブジェクト変数が同じオブジェクトを参照している場合、それらの変数が参照するオブジェクトに関連付けられているメモリおよびシステムリソースは、Set を使用することで明示的に、または最後のオブジェクト変数が Nothing に設定されることで暗黙的に、すべての変数が Nothing に設定された後でのみ解放されます。 |
Null | Null キーワードは、変数に有効なデータが含まれていないことを示すために使用されます。 |
vbCr | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbCrLf | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbLf | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbFormFeed | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbNewLine | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbNullChar | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbTab | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbVerticalTab | 印刷および表示機能を呼び出す際に、コード内で実際の値の代わりに次の定数を使用できます。 |
vbBlack | 黒色。値 = 0x0 |
vbRed | 赤色。値 = 0xFF |
vbGreen | 緑色。値 = 0xFF00 |
vbYellow | 黄色。値 = 0xFFFF |
vbBlue | 青色。値 = 0xFF0000 |
vbMagenta | マゼンタ。値 = 0xFF00FF |
vbCyan | シアン。値 = 0xFFFF00 |
vbWhite | 白色。値 = 0xFFFFFF |
VBScript の組み込み関数を次の表に一覧します。
Abs | Date | Iif | Minute | Sign |
Acos | DateAdd | InputBox | Month | スペース |
Asc | DateDiff | InStr | MonthName | Sqr |
Asin | DatePart | InStrRev | MsgBox | StrComp |
Atn | DateSerial | Int | Now | String |
CBool | DateValue | IsDate | Oct | Tan |
CByte | Day | IsEmpty | Pi | Time |
CCur | Exp | IsNull | Replace | Timer |
CDate | Fix | IsNumeric | RGB | TimeSerial |
CDbl | Format | IsObject | Right | TimeValue |
Chr | FormatCurrency | LCase | Rnd | Trim |
CInt | FormatDateTime | Left | Round | TypeName |
CLng | FormatNumber | Len | RTrim | UCase |
Cos | FormatPercent | Log | Second | WeekDay |
CSng | Hex | LTrim | Sgn | WeekDayName |
CStr | Hour | Mid | Sin | Year |
VBScript 関数の詳細については、MSDN のドキュメントを参照してください。
C1FlexReport は、VBScript の次の主要機能をサポートしています。
組み込みスクリプト関数 Like と In は、SQL 演算子 LIKE と IN と同様の機能を備え、True または False を返します。
Like(str, template):str を template と比較します。template にはワイルドカード「%」を使用できます。Like 関数の例を次にいくつか示します。
In(obj, obj1, ... objN):obj がオブジェクト obj1、...、objN の中にあるかどうかをテストします。In 関数の例を次にいくつか示します。
このように、どちらの関数も大文字と小文字が区別されるので、abc と Abc は同じではありません。
C1FlexReport では、次の VBScript 関数がサポートされていません。
VBScript 文のキーワードを次の表に一覧します。
If | ElseIf | To | While | Dim |
Then | EndIf | Next | Wend | Redim |
Else | For | Step | Const |
Field オブジェクトの名前は、評価されると、オブジェクトの参照を返します。これにより、フィールドのプロパティにアクセスできます。Field オブジェクトのデフォルトプロパティは Value なので、フィールド名自体はフィールドの現在の値を返します。次に例を示します。
MyField.BackColor = RGB(200,250,100)
MyField.Font.Size = 14
MyField * 2 ' (MyField.Value * 2 と同じ)
Section オブジェクトの名前は、評価されると、オブジェクトの参照を返します。これにより、セクションのプロパティにアクセスできます。Section オブジェクトのデフォルトのプロパティは Name です。次に例を示します。
If Page = 1 Then [Page Footer].Visible = False
レポートのデータセットソース内のフィールド名は、評価されると、現在のフィールドの値を返します。フィールド名にスペースまたはピリオドが含まれる場合は、フィールド名を角かっこで囲む必要があります。次に例を示します。
OrderID
UnitsInStock
[Customer.FirstName]
[Name With Spaces]
Page
Page 変数は、Page プロパティの値を取得または設定します。このプロパティは、レポートのレンダリングの開始時にコントロールによって初期化され、ページ区切りごとに 1 ずつ増加します。コードを使用してこの値をリセットできます。次に例を示します。
If Country <> LastCountry Then Page = 1
LastCountry = Country
Pages
Pages 変数は、レポートのレンダリングの終了時に総ページ数に置き換えられるトークンを返します。読み取り専用のプロパティで、通常は、ページのヘッダーフィールドまたはフッターフィールドで使用されます。次に例を示します。
"ページ " & Page & " / " & Pages
レポートオブジェクトは、コントロールオブジェクトへの参照を返します。これにより、スクリプトや式から C1FlexReport オブジェクトモデル全体にアクセスできます。次に例を示します。
"フィールド:" & Report.Fields.Count
Cancel を True に設定すると、レポートのレンダリング処理をキャンセルできます。次に例を示します。
If Page > 100 Then Cancel = true
Visual Basic や Microsoft Access(VBA)で記述されたコードとの互換性を高めるために、C1FlexReport は、VBScript にはない Iif および Format という 2 つの関数を公開しています。
Iif は、ブール式を評価し、その結果に基づいて 2 つの値のうちの 1 つを返します。次に例を示します。
Iif(SalesAmount > 1000, "Yes", "No")
Format は、書式設定式に含まれる指定に従って、値を書式設定された文字列に変換します。この値には、数字、ブール値、日付、または文字列を使用できます。書式は、Visual Basic または VBA で使用される書式文字列に似た構文で、文字列として構築されます。
次の表で、書式文字列に使用される構文について説明します。
値の型 | 書式文字列 | 説明 |
---|---|---|
Number | Percent、% | 数値をパーセント値として書式設定します(小数点以下は 0 または 2 桁)。例:Format(0.33, "Percent") = "33%" |
#,###.##0 | マスクを使用して数値を書式設定します。認識される記号は、#(桁のプレースホルダ)、0(常に表示される桁のプレースホルダ)、,(桁区切り)、()(負の値を囲む)、%(パーセント値として書式設定)です。例:Format(1234.1234, "#,###.##") = "1,234.12" |
|
Currency | Currency、$ | 数値を通貨値として書式設定します。必要に応じて桁区切りを付けて数値を表示します。小数点以下を 2 桁で表示します。例:Format(1234, "$") = "$1,234.00" |
Boolean | Yes/No | Yes または No を返します。 |
Date | Long Date | Format(#12/5/1#, "long date") = "December 5, 2001" |
Short Date | Format(#12/5/1#, "short date") = "12/5/2001" |
|
Medium Date | Format(#12/5/1#, "medium date") = "05-Dec-01" |
|
q,m,d,w,yyyy | 日付の一部(四半期、月、月通算日、年通算週、年)を返します。例:Format(#12/5/1#, "q") = "4" |
|
String | @@-@@/@@ | マスクを使用して文字列を書式設定します。@ 文字は、1 文字(@ が 1 つだけの場合は、値文字列全体)のプレースホルダです。その他の文字はリテラルとして扱われます。例:Format("AC55512", "@@-@@@/@@") = "AC-555/12" |
@;Missing | 値が null または空文字列ではない場合は、セミコロン(;)の左側の書式文字列を使用します。null または空文字列の場合は、セミコロン(;)の右側の部分を返します。例:Format("@;Missing", "UK") = "UK" |
VBScript には、独自の組み込み書式設定関数(FormatNumber、FormatCurrency、FormatPercent、FormatDateTime など)があります。ここで説明した VBA スタイルの Format 関数の代わりに、これらの関数を使用することもできます。
集計関数は、レンダリングされるグループのデータをまとめるために使用されます。レポートヘッダーフィールドで使用すされた集計関数は、データセット全体の集計値を返します。グループのヘッダーまたはフッターで使用された集計関数は、そのグループの集計値を返します。
FlexReport の集計関数はすべて、次の 2 つの引数を受け取ります。
FlexReport では、次の集計関数が定義されています。
関数 | 説明 |
---|---|
Avg | 現在のグループ内の式の平均値。たとえば、次の式は、グループ全体の平均売上高と特定の製品の平均売上高を計算します。Avg(SalesAmount) |
Sum | グループ内のすべての値の合計。 |
Count | グループ内で null 以外の値を持つレコードの数。式にアスタリスク(*)を使用すると、すべてのレコードを数えることができます。たとえば、次の式は、住所の値が有効な(null ではない)従業員の数と従業員の総数をカウントします。Count(Employees.Address) |
CountDistinct | グループ内で null 以外の値を持つレコードの数(重複する値は数えない)。 |
Min、Max | 式の最小値および最大値。例:"Max Sale = " & Max(SaleAmount) |
Range | 式の最小値と最大値の範囲。 |
StDev、Var | 現在のグループ内の式の標準偏差および分散。SQL や Microsoft Excel と同様に、標本(n-1)の式を使用して値が計算されます。 |
StDevP、VarP | 現在のグループ内の式の標準偏差および分散。SQL や Microsoft Excel と同様に、母集団(n)の式を使用して値が計算されます。 |
Median | グループ内の値のメジアン(中央値)を返します。 |
Mode | グループ内の値のモード(最頻値)を返します。 |
集計関数を使用するには、ヘッダーセクションまたはフッターセクションに計算フィールドを追加し、フィールドの Text プロパティに式を割り当てます。
たとえば、NWind.xml サンプルファイルの "Employee Sales by Country" レポートには、複数の集計フィールドが含まれます。このレポートは、レコードを国別および従業員別にグループ化します。
Employee グループのフッターセクションにある SalespersonTotal フィールドには、次の式が含まれています。
=Sum([SaleAmount])
このフィールドは Employee グループのフッターにあるため、この式は、従業員別の総売上高を返します。
CountryTotal フィールドと GrandTotal フィールドにも、まったく同じ式が含まれます。しかし、これらのフィールドはそれぞれ、Country グループのフッターおよびレポートフッターにあるため、式は国別の総売上高およびレコードセット全体の売上高を返します。
グループ内から上位レベルの集計値を参照する場合があります。たとえば、"Employee Sales by Country" レポートには、国別の売上高を総売上高に対する割合(%)で表示するフィールドがあります。Country グループ内で計算されるすべての集計値は、現在の国を参照するため、この割合を直接計算することはできません。その代わり、PercentOfGrandTotal フィールドでは次の式を使用します。
=[CountryTotal]/[GrandTotal]
CountryTotal と GrandTotal はそれぞれ、Country フッターセクションとレポートフッターセクションにあるフィールドです。したがって、CountryTotal は国別の合計値を、GrandTotal はレコードセット全体の合計値を保持します。
コントロールがレコードセット全体のデータを調べる必要があるため、集計関数の評価には時間がかかることをよく理解する必要があります。そのため、集計関数は、できる限り少数の計算フィールドでのみ使用してください。これで他のフィールドでは、集計式を再度評価するのではなく、集計関数を使用するフィールドから集計値を直接読み取ることができます。
たとえば、NorthWind データベースの "Employee Sales by Country" レポートには、各売上高を国別の総売上高に対する割合(%)で表示する詳細フィールド PercentOfCountryTotal があります。このフィールドには、次の式が含まれています。
=[SaleAmount]/[CountryTotal]
SaleAmount は、レコードセットフィールドへの参照で、各詳細レコードごとに値が変化します。CountryTotal は、集計関数を含むレポートフィールドへの参照です。コントロールは、この式を評価する際に、レポートフィールドから直接集計値を取得します。集計の再計算は行いません。
レポートの完全なサンプルについては、ComponentOne Samples フォルダにある Nwind.xml レポート定義ファイルの「Employee Sales by Country」レポートを参照してください。