関連情報と紹介:
WIN32 を使用して C++ でダイアログ ボックスを作成し、データを収集してから ADO を使用して MS Access データベースに送信しました。
データベースには 2 つのテーブルがあり、1 つはメインで、もう 1 つはそれと 1 対多の関係にあります。
わかりやすくするために、名前を付けます。メイン テーブルは Building、子テーブルは ElectricEnergy です。
テーブルでは、ElectricEnergy は月と年のエネルギー消費量が格納されているため、テーブルには次のスキーマがあります。
電気エネルギー< #ElectricEnergy_pk, $Building_pk, January,February, ...,December, Year>
塗りつぶされたテーブルは次のようになります。
YEAR | January | February | ... | December | Building_pk | ElectricEnergy_pk |
2012 | 20.5 | 250.32 | ... | 300.45 | 1 | 1 |
2013 | 10.5 | 50.32 | ... | 300 | 1 | 2 |
ご覧のとおり、table には、2012 年から現在までのすべての年のビルの毎月の電気エネルギー消費量が格納されています。
ダイアログ ボックスで、ユーザーは上向き矢印を介して別の編集コントロールから選択された 1 年間の月間消費量を入力できます。
これを示す図は次のとおりです。
赤い長方形は月を示します。月はアップダウン コントロールで選択されます。
青い長方形は年を示します。年もアップダウン コントロールで選択されます。
紫色の矢印は、月ごとの消費量を入力する編集コントロールを示しています。
左側の + ボタンをクリックすると、データが何らかの変数に格納されます。
上記の例では、2013 年 1 月のデータを保存する必要があります。
問題:
上記の動作を適切に実装するために、どのデータ型/アルゴリズムを選択すればよいかわかりません。
ADO でデータを挿入する方法は知っていますが、このケースは私には難しいです。
毎年のデータの保存を実装し、それらをすべてデータベースにダンプする方法がわかりません。
これまでに行ったこと:
消費量は保存できる年数が不明なので、ベクターで保存することにしました。
1 年分のデータを格納するベクトルは 13 (12 か月 + 年) の配列であり、DataForSingleYear という名前が付けられます。
すべての年のデータを格納する別のベクトルがあり、ConsumtionForAllYears という名前です。
ちょっとした説明:
vector< wstring > DataForSingleYear;
vector< vector< wstring > > ConsumtionForAllYears;
データをベクター DataForSingleYear に正常にプッシュでき、これらすべての年をベクター ConsumtionForAllYears に正常にプッシュできます。
私はこのようにしました:
// this handler is simplified to preserve space
case IDC_BUTTON_PLUS_ON_THE_PICTURE:
DataForSingleYear[ // month chosen from red edit control ] =
( //data from purple edit control );
DataForSingleYear[ 12 // last element stores chosen year ] =
( //data from blue edit control );
ConsumtionForAllYears[ // ( chosen year from blue edit control ) - 2012 ] =
DataForSingleYear;
ダイアログ WM_INITDIALOG で、次のようなベクトルの初期化を行いました。
DataForSingleYear.assign( 13, L”-1” ); // -1 is default value
for( int i = 0; i < nYears; i++ )
ConsumtionForAllYears.push_back( DataForSingleYear );
ダイアログには、すべてのデータをデータベースにロードする保存ボタンがありますが、上の図ではスペースを節約するために省略されています。
そのボタンが押され、データがデータベースに正常に挿入されると、上記のベクトルは新しいエントリのためにリセットされます。
次のようにベクトルをリセットしました。
DataForSingleYear.clear();
DataForSingleYear.assign( 13, L”-1” );
ConsumtionForAllYears.clear();
for( int i = 0; i < nYears; i++ )
ConsumtionForAllYears.push_back( DataForSingleYear );
私は初心者で、ベクトルのリセットを行うためのより良い方法を見つけていませんが、この方法は良くなく、バッファ オーバーフローが発生しやすいと感じています。
質問:
1.上記のデータ入力の仕組みを見て、その実装のためのベクトルの選択が適切であったことを確認できますか?
2.ベクター データ型が適切な選択であった場合、ベクターのリセットについてコメントしていただけますか?
2.1. 悪い場合、改善点を教えてください。
3.最後に、より適切なデータ型、または上記のデータ入力メカニズムの実装がある場合は、それを提案していただけますか?
最後のメモ:
MS Visual Studio 2008 を使用して、Windows XP で作業しています。
他のコード、情報、またはその他のものが必要な場合は、それを求めてください。できるだけ早く提供します.
ありがとうございました。