C1Report デザイナの最も強力な機能の1つは、Microsoft Access を使って作成されたレポートをインポートできることです。*.mdb ファイルのほかにも、Access 2007 の *.accdb ファイルにも対応しています。この機能を使用するには、Microsoft Access がコンピュータにインストールされている必要があります。ただし、レポートをデザイナにインポートしてしまえば、Microsoft Access は必要なくなります。
Access ファイルからレポートをインポートするには、[インポート]ボタンをクリックするか、[ファイル|インポート]メニューを選択します。ダイアログボックスが表示され、インポートするファイルの名前の入力を求められます。
デザイナは自動的にファイルをスキャンし、インポートするファイルを選択できるダイアログを表示します。
ダイアログでは、インポート処理を行う前に既存のすべてのレポート定義をクリアするかどうか指定できます。
インポート処理が正しく動作すると、ソースレポートのほとんどの要素が処理されます。ただし、次に挙げるいくつかの例外があります。
Access は、VBA、マクロ、およびフォームを使ってレポートを動的に書式設定できます。C1Reportでも同様の処理が可能ですが、C1Report では VBScript だけが使用されるため、レポートのコードはすべて手作業で変換する必要があります。
フォーム指向のフィールドタイプ
Access レポートには、デザイナのインポートプロシージャによって処理されないフィールドが含まれていることがあります。サポートしないフィールドタイプは、Chart、CommandButton、ToggleButton、OptionButton、OptionGroup、ComboBox、ListBox、TabCtl、および CustomControl です。
VBScript の予約語を使用するレポート
Access は VBScript を使用しないため、レポートオブジェクトやデータセットフィールド名の識別子として VBScript の予約語を使用するレポートが設計されている可能性があります。その場合は、VBScript エンジンが式を評価するときに問題が発生し、レポートが正しく出力されない原因になります。
識別子として使用できない予約語には、Date、Day、Hour、Length、Minute、Month、Second、Time、TimeValue、Value、Weekday、Year などがあります。完全なリストについては、VBScript のリファレンスを参照してください。
日付を四半期順(または、曜日、月など)でソートするレポート
C1Report は、ADO.NET データセットのSort プロパティを使ってグループをソートします。このプロパティは、フィールドの値に基づいてデータセットをソートし、式は使用しません(任意の式に基づいてグループ化はできますが、ソートはできません)。グループを四半期順にソートする Access レポートをインポートすると、ソートは日付順に行われるようになります。これを解決する方法は2つあります。1つは、ソートの基準にする式の値を含むフィールドを作成する方法、もう1つは、データセットを作成する SQL 文を変更し、四半期順にソートを実行する方法です。
上のような制限を受けるレポートは比較的少ないですが、レポートをインポートしたら、すべてのレポートをプレビューし、正しく動作するかどうかを確認してください。
デザイナが実際に行う処理の一例として、製品に付属の NWind.mdb ファイルをインポートしてみます。このファイルには、次に示す13のレポートが含まれています。そこで、これらのレポートに対する処理について説明します。C1Report に付属する NWind.XML ファイルには、以下で説明する変更がすべて行われています。
処理は不要です。
処理は不要です。
処理は不要です。
このレポートには、手作業で変換する必要があるコードが含まれます。次のコードを Group 1 のヘッダセクションのOnPrint プロパティに割り当てます。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
If SalespersonTotal > 5000 Then ExceededGoalLabel.Visible = True SalespersonLine.Visible = True Else ExceededGoalLabel.Visible = False SalespersonLine.Visible = False End If |
C# コードの書き方
C# |
コードのコピー
|
---|---|
if (SalespersonTotal > 5000) { ExceededGoalLabel.Visible = true; SalespersonLine.Visible = true; } else { ExceededGoalLabel.Visible = false; SalespersonLine.Visible = false; } |
Invoice(請求書)
処理は不要です。
Products by Category(カテゴリ別製品)
処理は不要です。
Sales by Category(カテゴリ別売上高)
このレポートには、インポートされないグラフコントロールが含まれます。グラフをレポートに追加するには、アンバウンドピクチャフィールドを使用します。イベントハンドラを記述してグラフを作成し、それを画像としてアンバウンドピクチャフィールドに割り当てます。
Sales by Category Subreport(カテゴリ別売上高サブレポート)
処理は不要です。
Sales by Year(年度別売上高)
このレポートには、手作業で変換する必要があるコードおよび Form オブジェクトへの参照が含まれます。Form オブジェクトを置き換えるには、RecordSource プロパティを編集して [Show Details] パラメータを追加します。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
PARAMETERS (Beginning Date) DateTime 1/1/1994, (Ending Date) DateTime 1/1/2001, (Show Details) Boolean False; ... |
C# コードの書き方
C# |
コードのコピー
|
---|---|
PARAMETERS [Beginning Date] DateTime 1/1/1994, [Ending Date] DateTime 1/1/2001, [Show Details] Boolean False; ... |
レポートのOnOpen プロパティで新しいパラメータを使用します。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
Dim script As String = _ "bDetails = [Show Details]" & vbCrLf & _ "Detail.Visible = bDetails" & vbCrLf & _ "[Group 0 Footer].Visible = bDetails" & vbCrLf & _ "DetailsLabel.Visible = bDetails" & vbCrLf & _ "LineNumberLabel2.Visible = bDetails" & vbCrLf & _ "Line15.Visible = bDetails" & vbCrLf & _ "SalesLabel2.Visible = bDetails" & vbCrLf & _ "OrdersShippedLabel2.Visible = bDetails" & vbCrLf & _ "ShippedDateLabel2.Visible = bDetails" & vbCrLf & _ "Line10.Visible = bDetails" c1r.Sections.Detail.OnPrint = script |
C# コードの書き方
C# |
コードのコピー
|
---|---|
string script = "bDetails = [Show Details]" + "Detail.Visible = bDetails\r\n" + "[Group 0 Footer].Visible = bDetails\r\n" + "DetailsLabel.Visible = bDetails\r\n" + "LineNumberLabel2.Visible = bDetails\r\n" + "Line15.Visible = bDetails\r\n" + "SalesLabel2.Visible = bDetails\r\n" + "OrdersShippedLabel2.Visible = bDetails\r\n" + "ShippedDateLabel2.Visible = bDetails\r\n" + "Line10.Visible = bDetails"; c1r.Sections.Detail.OnPrint = script; |
最後に、2行のコードを書き換える必要があります。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
Sections ("Detail").OnPrint = _ "PageHeader.Visible = True" Sections("Group 0 Footer).OnPrint = _ "PageHeader.Visible = False" |
C# コードの書き方
C# |
コードのコピー
|
---|---|
Sections ("Detail").OnPrint = "PageHeader.Visible = true"; Sections("Group 0 Footer).OnPrint = "PageHeader.Visible = false"; |
Sales by Year Subreport(年度別売上高サブレポート)
処理は不要です。
Sales Totals by Amount(金額別総売上高)
このレポートには、手作業で変換する必要があるコードが含まれます。次のコードをページヘッダセクションのOnPrint プロパティに割り当てます。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
PageTotal = 0 |
C# コードの書き方
C# |
コードのコピー
|
---|---|
PageTotal = 0; |
次のコードを詳細セクションのOnPrint プロパティに割り当てる必要があります。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
PageTotal = PageTotal + SaleAmount HiddenPageBreak.Visible = (Counter = 10) |
C# コードの書き方
C# |
コードのコピー
|
---|---|
PageTotal = PageTotal + SaleAmount; HiddenPageBreak.Visible = (Counter = 10); |
Summary of Sales by Quarter(四半期別売上高のサマリー)
このレポートには、四半期順にソートされるグループがあります(前述の4番目の例外を参照)。これを解決するには、RecordSource プロパティを次のように変更することによって、ShippedDate 四半期の値を含むフィールドをソースデータセットに追加します。
SELECT DISTINCTROW Orders.ShippedDate,
Orders.OrderID,
[Order Subtotals].Subtotal,
DatePart("q",Orders.ShippedDate) As ShippedQuarter
FROM Orders INNER JOIN [Order Subtotals]
ON Orders.OrderID = [Order Subtotals].OrderID;
WHERE (((Orders.ShippedDate) Is Not Null));
新しいフィールド ShippedQuarter を使用するように、グループのGroupBy プロパティを変更します。
Summary of Sales by Year(年度別売上高のサマリー)
処理は不要です。
以上をまとめると、NorthWind データベースからインポートされる 13 のレポートのうち、編集の必要がないレポートが8つ、コードを変換する必要があるレポートが3つ、SQL 文を変更する必要があるレポートが1つ、置き換えられないグラフコントロールがあるレポートが1つあるということになりますが、それでも編集に必要な手間はわずかです。インポート機能を使用すれば既存レポートの移行がいかに簡単かお分かりいただけたことと思います。