- PR -

データグリッドの計算。

1
投稿者投稿内容
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-12-27 17:43
データグリッドにCSV形式のファイルを読み込みます。コラム1は予定振込金、コラム2は実際振込金となっています。
それらをCSVで読み込むことは出来るのですが、私がやりたいのは、
ボタンを押すと、データグリッドにコラム3というものを作り、コラム1からコラム2をひき、答えが0ならばコラム3に0と、もしそれ以外なら1と自動的に入るようにしたいのです。
さらに出来るのならば、コラム3はチェックボックスで表示されると尚よいのですが・・・。
皆様のお力をお貸しいただけないでしょうか?
うまく説明できていないかもしれませんが、どうぞ宜しくお願いいたします<(_ _)>

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-12-28 09:24
こんにちわ。諸農です。

考え方は色々あると思います。

CSVデータを分解して読み込むことが出来るのであれば、
CSVデータを読み込むためのテーブルを用意しておき、
CSVの各フィールドに対応したカラム1,2を作成し、
計算結果を格納するカラム3を追加で作成。
カラム3のDataColumn.Expressionに計算式を入れておけば
OKになるんじゃないかと思います。
#深く考えていないのでダメかもしれませんが、
#試してみる価値はありそうな。。(^^;

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-12-29 03:02
DataSet ds_kaihi = new DataSet();
ds_kaihi.Tables.Add("会費");
ds_kaihi.Tables["会費"].Columns.Add("会員番号");
ds_kaihi.Tables["会費"].Columns.Add("年度");
ds_kaihi.Tables["会費"].Columns.Add("入金予定額");
ds_kaihi.Tables["会費"].Columns.Add("入金金額");
ds_kaihi.Tables["会費"].Columns.Add("入金年月日");
ds_kaihi.Tables["会費"].Columns.Add("入力日");
ds_kaihi.Tables["会費"].Columns.Add("入力時刻");
ds_kaihi.Tables["会費"].Columns.Add("更新日");
ds_kaihi.Tables["会費"].Columns.Add("入力者ID");
ds_kaihi.Tables["会費"].Columns.Add("更新者ID");

System.IO.StreamReader streamReader = new System.IO.StreamReader("c:\\会費\\money.CSV", System.Text.Encoding.GetEncoding(932));
while (streamReader.Peek() != -1)
{
DataColumn dc = new DataColumn("過不足確認", typeof(int));
string D = DateTime.Today.ToString() ;
string[] stringBuffer;
stringBuffer = streamReader.ReadLine().Split(',');
//DataSetの作成
DataRow row = ds_kaihi.Tables["会費"].NewRow();
for (int counter = 0; counter < stringBuffer.Length; counter++)
{
row[counter] = stringBuffer[counter];
dc.Expression = "入金予定額-入金金額";
ds_kaihi.Tables["会費"].Columns.Add(dc);
}
ds_kaihi.Tables["会費"].Rows.Add(row);
}
streamReader.Close();
dataGrid1.DataSource = ds_kaihi;
dataGrid1.DataMember = "会費";
とやってみたのですが、うまく行きません。エラーで、
'System.ArgumentException' のハンドルされていない例外が system.data.dll で発生しました。

追加情報 : 列 '過不足確認' は既にこのデータ テーブルに属しています。

とでてしまいます。みなさま、お力をお貸ししていただけないでしょうか。
宜しくお願いいたします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-12-29 10:23
こんにちわ。諸農です。

引用:

hirokoさんの書き込み (2003-12-29 03:02) より:


とやってみたのですが、うまく行きません。エラーで、
'System.ArgumentException' のハンドルされていない例外が system.data.dll で発生しました。

追加情報 : 列 '過不足確認' は既にこのデータ テーブルに属しています。

とでてしまいます。みなさま、お力をお貸ししていただけないでしょうか。
宜しくお願いいたします。



うむむ。まずは問題の切り分けをしないといけませんね。
簡単なコードで、当初の目的が実現できるという検証は出来ます。
#当初の目的は、計算の結果が0なら、チェックボックスでONの表示ですよね。

コード:
private void WinForm_Load(object sender, System.EventArgs e)
{
    DataTable t = new DataTable("TEST");
    t.Columns.Add("Fil1",typeof(int));
    t.Columns.Add("Fil2",typeof(int));
    t.Columns.Add("Fil3",typeof(bool));
    t.Columns["Fil3"].Expression = "(Fil1 - Fil2) = 0";

    int i = 0;
    DataRow r;
    while (i < 10){
        r = t.NewRow();
        r["Fil1"] = 5;
        r["Fil2"] = i;
        t.Rows.Add(r);
        i++;
    }
    dataGrid1.DataSource = t;
}



ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-12-29 17:54
なるほど!切り分けてやってみるのですね。
少し見えた気がします。
DataSet ds1 = new DataSet();
ds1.Tables.Add("会費");

ds1.Tables["会費"].Columns.Add("会員番号");
ds1.Tables["会費"].Columns.Add("年度");
ds1.Tables["会費"].Columns.Add("入金予定額");
ds1.Tables["会費"].Columns.Add("入金金額");
ds1.Tables["会費"].Columns.Add("入金年月日");
ds1.Tables["会費"].Columns.Add("入力日");
ds1.Tables["会費"].Columns.Add("入力時刻");
ds1.Tables["会費"].Columns.Add("更新日");
ds1.Tables["会費"].Columns.Add("入力者ID");
ds1.Tables["会費"].Columns.Add("更新者ID");
ds1.Tables["会費"].Columns.Add("過不足確認", typeof(bool));
ds1.Tables["会費"].Columns["過不足確認"].Expression = "(入金予定額 - 入金金額) = 0";

System.IO.StreamReader streamReader = new System.IO.StreamReader("c:\\会費\\money.CSV", System.Text.Encoding.GetEncoding(932));
while (streamReader.Peek() != -1)
{
string[] stringBuffer;
stringBuffer = streamReader.ReadLine().Split(',');
//DataSetの作成
DataRow row = ds1.Tables["会費"].NewRow();
for (int counter = 0; counter < stringBuffer.Length; counter++)
{
row[counter] = stringBuffer[counter];
}
ds1.Tables["会費"].Rows.Add(row);
}
streamReader.Close();
dataGrid1.DataSource = ds1;
dataGrid1.DataMember = "会費";

Jubei様のコードを実行したところ実行できたので、私の方に応用させていただき、チェックの方は出来ました。
CSVの読み込み自体も問題なしです。
ただ、CSVを読み込んで、それを計算するようなものになると、エラーが出てしまいました。コードは上記のものです。

エラー内容は、'System.Data.EvaluateException' のハンドルされていない例外が system.data.dll で発生しました。

追加情報 : System.String および System.String で '-' 操作を実行できません。
というようなものです。
コード上のwhile (streamReader.Peek() != -1)部分で出ました。

どういうことでしょうか・・・。streamReaderの問題でしょうか?
どうか、ご指導いただけると、大変助かります。
宜しくお願いいたします。



[ メッセージ編集済み 編集者: hiroko 編集日時 2003-12-29 17:56 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-12-29 21:42
こんにちわ。諸農です。

現象が再現できる最小限のコードはどのようなものですか?

引用:

hirokoさんの書き込み (2003-12-29 17:54) より:

CSVの読み込み自体も問題なしです。
ただ、CSVを読み込んで、それを計算するようなものになると、エラーが出てしまいました。コードは上記のものです。



本当にすべての意味においてCSVからの読み込みは問題ないと言えますか?
読み込んで、データテーブル行にセットしたデータは、
型も含めて計算にふさわしいものになっていると思われていますか?
何をどのように検証しましたか?
読み込んだデータをダンプしてみましたか?

先にアップしたコードを次のように変更してみました。
hirokoさんが遭遇した例外と同じものが報告されます。
先のコードとの違いはどこにありますか。
hirokoさんのコードとの類似点や間違いに通じる原因となっている点は
どこにあるのか、よく考えてみてくださいね。
コード:
private void Form1_Load(object sender, System.EventArgs e)
{
    DataTable t = new DataTable("TEST");
    t.Columns.Add("入金予定額",typeof(string));
    t.Columns.Add("入金金額",typeof(string));
    t.Columns.Add("過不足金額",typeof(bool));
    t.Columns["過不足金額"].Expression = "(入金予定額 - 入金金額) = 0";

    int i = 0;
    DataRow r;
    while (i < 10)
    {
        r = t.NewRow();
        r["入金予定額"] = 5.ToString();
        r["入金金額"] = i.ToString();
        t.Rows.Add(r);
        i++;
    }
    dataGrid1.DataSource = t;
}



ではでは(^^)/

#何もかもを他力本願でするのは、ご自身のためにはなりませんよ。
#解決した場合は、解決に至った情報をフィードバックしてくださいね。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-12-29 22:32
Jubei様、度々の返信ありがとうございます。

CSVの読み込み自体は正常でしたが、型の問題でした。
文字列型でよみ込まれていたため、正常に動作しませんでした。

ds1.Tables["会費"].Columns.Add("入金予定額",typeof(int));
ds1.Tables["会費"].Columns.Add("入金金額",typeof(int));
とすることで解決いたしました。
それと、
ds1.Tables["会費"].Columns["過不足確認"].Expression = "IIF(入金予定額-入金金額=0, 0, 1)";
とすることで、計算結果を別けることも出来ることがわかりました。
適切なコーチングのおかげで、スムーズに勉強することが出来ました。
ありがとうございました!!
1

スキルアップ/キャリアアップ(JOB@IT)