概要
前回の記事では、GitHub Copilotを活用してActiveReportsのページレポート(.rdlx)からコントロール一覧を自動生成する方法を紹介しました。
本記事では、その一歩先として、適当なコントロール名(TextBox1, TextBox2...)を、内容に基づいた意味のある名前(txtTitle, txtCustomerName...)に自動でリファクタリングする方法を紹介します。
注意事項・免責事項
本記事について
- 本記事は個人の検証プロジェクトです
- ActiveReports試用版を使用しています
- 商用利用時は正式ライセンスが必要です
- メシウス社の公式見解ではありません
- あくまで個人的な試みであり、推奨される開発手法とは限りません
- 生成AIによる編集結果は必ず手動で確認してください
メシウス社について
本記事で使用しているActiveReportsは、株式会社メシウス(MESCIUS inc.)が開発・販売する優れた.NET帳票コンポーネントです。
公式サイト: https://www.mescius.jp/activereports/
より詳しい情報や正式な開発ガイドは、公式ドキュメントをご参照ください。
背景と課題
ActiveReportsでレポートを開発していると、以下のような課題に直面することがあります。
よくある問題
- デフォルトで生成されるコントロール名が
TextBox1,TextBox2,Table1など、連番になっている - どのコントロールが何を表示しているのか、名前からは分からない
- メンテナンス時にコントロールを探すのに時間がかかる
- 設計書とソースコードの紐づけが困難
例:請求書レポートの場合
<Textbox Name="TextBox1"> <!-- これが何のTextBoxか分からない -->
<Value>請求書</Value>
</Textbox>
<Textbox Name="TextBox2"> <!-- これも何を表示しているか不明 -->
<Value>=Fields!CustomerName.Value+" 御中"</Value>
</Textbox>
<Table Name="Table1"> <!-- テーブルの用途が不明 -->
...
</Table>
このような状況では、コードを読んでも一目で理解できず、開発効率が低下します。
理想的な命名
コントロール名は、その役割や表示内容を反映した名前にすることで、可読性と保守性が向上します。
命名規則の例
| プレフィックス | コントロールタイプ | 例 |
|---|---|---|
| txt | TextBox | txtTitle, txtCustomerName |
| lbl | Label | lblAmount, lblDate |
| tbl | Table | tblInvoiceDetails, tblOrderList |
| img | Image | imgCompanyLogo, imgProductPhoto |
| line | Line | lineSeparator, lineHeader |
リファクタリング後のコード例
<Textbox Name="txtTitle"> <!-- タイトル用TextBoxと分かる -->
<Value>請求書</Value>
</Textbox>
<Textbox Name="txtCustomerName"> <!-- 顧客名用TextBoxと分かる -->
<Value>=Fields!CustomerName.Value+" 御中"</Value>
</Textbox>
<Table Name="tblInvoiceDetails"> <!-- 請求明細テーブルと分かる -->
...
</Table>
開発環境
| 名称 | バージョン | 説明 |
|---|---|---|
| Windows | 10 | OS |
| Visual Studio | Community 2022 | ActiveReportsのプレビュー表示用 |
| VS Code | latest | 生成AI(GitHub Copilot)の利用 |
| .NET Framework | 4.8 | Windows Formsのフレームワーク |
| ActiveReports.NET | 18(試用版) | 帳票ツール |
実装手順
1. 前提:コントロールリストの生成
前回の記事で紹介した /getReportConrolList コマンドを使用して、まずコントロール一覧を生成します。
/getReportConrolList ActiveReport/Report/Invoice_bluegray.rdlx
これにより、以下のような情報が Invoice_bluegray_controllist.md に出力されます。
| No | コントロール名 | タイプ | データバインディング/値 |
|----|---------------|--------|------------------------|
| 1 | TextBox1 | Textbox | 請求書 |
| 2 | TextBox2 | Textbox | =Fields!CustomerName.Value+" 御中" |
| 3 | TextBox3 | Textbox | 毎度ご利用ありがとうございます... |
...
2. GitHub Copilot Chatでリファクタリングを依頼
生成されたコントロールリストを確認しながら、以下のようなプロンプトでリファクタリングを依頼します。
プロンプト例
各Nameが適当なので妥当な名前にしてくれ
編集してくれ
非常にシンプルなプロンプトですが、GitHub Copilotは以下を自動的に判断して実行してくれます。
- rdlxファイルの内容を解析
-
各コントロールの用途を判断
-
<Value>請求書</Value>→ タイトル用なのでtxtTitle -
<Value>=Fields!CustomerName.Value+" 御中"</Value>→ 顧客名なのでtxtCustomerName - テーブルのカラム(伝票№、日付、商品名...)に基づいて
tblInvoiceDetailsに
-
- 適切な命名規則を適用(txtプレフィックス、キャメルケースなど)
- rdlxファイルを一括編集
- コントロールリストも同時に更新
3. リファクタリング結果
Before(変更前)
<Textbox Name="TextBox1">
<Value>請求書</Value>
</Textbox>
<Textbox Name="TextBox2">
<Value>=Fields!CustomerName.Value+" 御中"</Value>
</Textbox>
<Textbox Name="TextBox5">
<Value>=Sum(Fields!UnitPrice.Value*Fields!Number.Value)</Value>
</Textbox>
<Table Name="Table1">
<DataSetName>DataSet1</DataSetName>
...
</Table>
<Image Name="Image1">
<Value>image</Value>
</Image>
After(変更後)
<Textbox Name="txtTitle">
<Value>請求書</Value>
</Textbox>
<Textbox Name="txtCustomerName">
<Value>=Fields!CustomerName.Value+" 御中"</Value>
</Textbox>
<Textbox Name="txtTotalAmount">
<Value>=Sum(Fields!UnitPrice.Value*Fields!Number.Value)</Value>
</Textbox>
<Table Name="tblInvoiceDetails">
<DataSetName>DataSet1</DataSetName>
...
</Table>
<Image Name="imgCompanyLogo">
<Value>image</Value>
</Image>
VS2022のデザイナで確認した結果
できてる。問題なさそうですね!

4. 変更されたコントロール名の一覧
| 元の名前 | 新しい名前 | 用途 |
|---|---|---|
| TextBox1 | txtTitle | 請求書タイトル |
| TextBox2 | txtCustomerName | 顧客名表示 |
| TextBox3 | txtGreeting | 挨拶文 |
| TextBox4 | txtAmountLabel | ご請求金額ラベル |
| TextBox5 | txtTotalAmount | 合計金額表示 |
| Line1 | lineSeparator | 区切り線 |
| TextBox6 | txtCompanyName | 会社名 |
| TextBox7 | txtCompanyAddress | 会社住所 |
| TextBox8 | txtCompanyContact | 会社連絡先 |
| Image1 | imgCompanyLogo | 会社ロゴ画像 |
| Table1 | tblInvoiceDetails | 請求明細テーブル |
テーブル内のヘッダーと明細行のコントロール名も同様に変更されています。
TextBox9 → txtHeaderSlipNo (ヘッダー:伝票№)
TextBox10 → txtHeaderDate (ヘッダー:日付)
TextBox11 → txtHeaderProducts (ヘッダー:商品名)
TextBox12 → txtDetailSlipNo (明細:伝票№)
TextBox13 → txtDetailDate (明細:日付)
...
5. コントロールリストも自動更新
GitHub Copilotは、rdlxファイルだけでなく、前回生成したコントロールリストのMarkdownファイルも同時に更新してくれます。
更新された Invoice_bluegray_controllist.md
| No | コントロール名 | タイプ | データバインディング/値 |
|----|---------------|--------|------------------------|
| 1 | txtTitle | Textbox | 請求書 |
| 2 | txtCustomerName | Textbox | =Fields!CustomerName.Value+" 御中" |
| 3 | txtGreeting | Textbox | 毎度ご利用ありがとうございます... |
...
## tblInvoiceDetails (明細テーブル) の構造
### ヘッダー行
| セル名 | 値 |
|--------|-----|
| txtHeaderSlipNo | 伝票№ |
| txtHeaderDate | 日付 |
| txtHeaderProducts | 商品名 |
...
動作確認
リファクタリング後は、必ずActiveReportsデザイナーで動作確認を行います。
Visual Studio 2022で確認
- ソリューションを開く
- リファクタリングした.rdlxファイルをダブルクリック
- デザイナーで開く
- プレビュー実行
確認ポイント
- ✅ レポートが正常に表示される
- ✅ データバインディングが正しく動作している
- ✅ レイアウトに変更がない
- ✅ 計算式が正常に動作している
重要: 名前の変更だけなので、表示結果やレイアウトに影響はありません。
効果とメリット
1. 可読性の向上
<!-- Before -->
<Textbox Name="TextBox15">
<Value>="請求書番号:" + First(Fields!BillNo.Value, "DataSet1")</Value>
</Textbox>
<!-- After -->
<Textbox Name="txtBillNo">
<Value>="請求書番号:" + First(Fields!BillNo.Value, "DataSet1")</Value>
</Textbox>
コントロール名を見ただけで、請求書番号を表示するTextBoxだと分かるようになりました。
2. メンテナンス効率の向上
従来は「どのTextBoxが請求金額を表示しているんだっけ?」と、デザイナーで一つずつクリックして確認する必要がありました。
リファクタリング後は、txtTotalAmount という名前から即座に判断できます。
3. チーム開発での理解共有
新しいメンバーがプロジェクトに参加した際も、コントロール名から用途が分かるため、学習コストが削減されます。
4. 設計書との整合性
コントロールリストに意味のある名前が記載されるため、設計書としての価値が向上します。
5. 工数削減
- 手動での命名変更: 1ファイルあたり約30分~1時間
- 生成AIを活用: 約1分(プロンプト入力 + 確認)
約30倍~60倍の効率化(個人の検証環境での測定結果)
GitHub Copilotの賢さ
今回のリファクタリングで、GitHub Copilotは以下のような判断を自動的に行いました。
1. コントロールの用途を推測
<Textbox Name="TextBox4">
<Value>ご請求金額</Value>
</Textbox>
↓
「ご請求金額」という文字列から「ラベル」であると判断し、txtAmountLabel に命名。
<Textbox Name="TextBox5">
<Value>=Sum(Fields!UnitPrice.Value*Fields!Number.Value)</Value>
</Textbox>
↓
合計計算式から「金額の合計値」を表示していると判断し、txtTotalAmount に命名。
2. 階層構造を理解
テーブル内のコントロールには、txtHeader〜(ヘッダー)と txtDetail〜(明細行)のように、階層を反映した名前を付けています。
3. 命名規則の統一
- TextBox系:
txtプレフィックス - Image系:
imgプレフィックス - Table系:
tblプレフィックス - Line系:
lineプレフィックス
プロジェクト全体で一貫した命名規則を自動適用しています。
4. 複数ファイルの同時更新
rdlxファイルとコントロールリストのMarkdownファイルを同時に更新する必要があることを理解し、両方を更新してくれました。
他の生成AIツールでも可能
今回はGitHub Copilotを使用しましたが、以下のツールでも同様のリファクタリングが可能です。
Claude (Anthropic)
VS CodeのClaude拡張機能を使用すれば、同様のプロンプトでリファクタリングできます。
このrdlxファイルのコントロール名を、内容に基づいた意味のある名前に変更してください
ChatGPT
rdlxファイルの内容をコピー&ペーストし、リファクタリングを依頼することで、変更後のXMLを取得できます。
ただし、ファイルへの直接編集はできないため、手動でコピー&ペーストする必要があります。
注意点とベストプラクティス
1. 必ずバックアップを取る
リファクタリング前に、必ずGitでコミットするか、ファイルのバックアップを取りましょう。
git add .
git commit -m "リファクタリング前のバックアップ"
2. 動作確認は必須
生成AIによる編集後は、必ずActiveReportsデザイナーでプレビュー実行し、正常に動作することを確認してください。
3. 命名規則はプロジェクトに合わせる
今回は txt, tbl, img などのプレフィックスを使用しましたが、プロジェクトの命名規則がある場合は、それに合わせて指示を出すことができます。
各コントロール名を以下の命名規則に従って変更してください:
- TextBox: lbl(ラベル)、txt(入力・表示)
- Table: grd
- Image: pic
4. 段階的に適用する
大規模なプロジェクトの場合は、一度に全てのファイルを変更するのではなく、1ファイルずつ確認しながら進めることをおすすめします。
まとめと所感
生成AIの活用場面
今回の検証を通じて、生成AIは以下の作業に特に有効であることが分かりました。
-
定型的だが時間がかかる作業の自動化
- コントロール名の変更のような、ルールは単純だが手間がかかる作業
-
XMLの構造理解
- rdlxファイルの階層構造を理解し、適切な命名を提案
-
複数ファイルの同期更新
- rdlxファイルとドキュメントファイルを同時に更新
生成AIとの協働
生成AIは「指示を出せば自動でやってくれる魔法のツール」ではなく、開発者のアシスタントとして活用すべきです。
- ✅ 生成AIに任せる: 定型的な編集作業、コード補完、候補の提示
- ❌ 生成AIに丸投げしない: 最終的な判断、品質確認、設計判断
重要: 本記事で紹介した手法は、あくまで個人の検証プロジェクトでの試みです。実際のプロジェクトに適用する際は、組織のコーディング規約や品質基準に従い、十分なテストと確認を行ってください。
今後の展開
今後は以下のような取り組みを検討しています。
- 自動レビュー機能: 命名規則に違反しているコントロールを自動検出
- 設計ドキュメント自動生成: rdlxファイルから詳細な設計書を自動生成
- テストコード生成: レポートの単体テストコードを自動生成
前回の記事
前回は、ActiveReportsのコントロール一覧を自動生成する方法を紹介しました。
生成AI活用 ActiveReports.NET 18(試用版)のページレポートの項目一覧を取得する
参考
ActiveReports公式リソース
製品ページ: https://www.mescius.jp/activereports/
公式ドキュメント: https://docs.mescius.jp/activereports/
サンプル集: https://github.com/MESCIUSJP/ActiveReports-Invoice-Reports-Sample
技術ブログ: https://www.grapecity.co.jp/developer/
GitHub Copilot - カスタム指示
GitHub差分
今回のリファクタリングの詳細な差分は以下で確認できます。


