2

関連情報と紹介:

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 で作業しています。

他のコード、情報、またはその他のものが必要な場合は、それを求めてください。できるだけ早く提供します.

ありがとうございました。

4

1 に答える 1

2

私の見解では、単一年のデータにベクトルを使用するのは間違っています。同じタイプの可変長データがある場合は、ベクトルを使用する必要があります。あなたの場合はどちらも当てはまりません。常に 13 個のデータ要素があり、最初 (年) は残り (月の値) と同じタイプではありません。

必要と思われるデフォルトの初期化のために、コンストラクターを使用して単純な構造体を宣言します

struct YearlyData
{
    YearlyData() { year = -1; for (int i = 0; i < 12; ++i) months[i] = -1; }
    int year;
    double months[12];
}

次に、初期化コードは簡単です

ConsumtionForAllYears.assign(nYears, YearlyData());

リセットコードはまったく同じです

ConsumtionForAllYears.assign(nYears, YearlyData());

の必要はありませんDataForSingleYear

于 2013-09-12T07:46:26.147 に答える