質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

3299閲覧

VB.Netで SQL Server のテーブルを一行ずつ読み取って処理したいです

hrb

総合スコア2

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2022/06/09 08:10

編集2022/06/10 01:42

まだ始めたばかりで、説明の足らない点があるかと思います。

考え方としては、VB上でデータの読み込みを一度に全部読み込むのではなく、
for each文などの繰り返し処理を使用して一行ずつ読み込みたいです。

下記のテーブルから、日付ごとに金額をまとめたテーブルを作成したいです。

| 日付コード | 売上金額 |   
|2022/04/05| 20000|
|2022/04/05| 20000|
|2022/04/06| 20000|
|2022/04/07| 20000|
|2022/04/07| 20000|

| 日付コード | 売上金額 |  
|2022/04/05| 40000|
|2022/04/06| 20000|
|2022/04/07| 40000|

現状、一度にすべてを読みこみ、書き出す形式のコードは書いてあります。

Using con As New SqlConnection(connect)

Dim cmd As New SqlCommand("SELECT date_code, sum(sales_amount) as Total FROM control_break group by date_code ORDER BY date_code ASC", con) Dim a As New SqlDataAdapter(cmd) Dim dt As New DataTable a.Fill(dt) DataGridView2.DataSource = dt End Using

行いたい想定の手順を一からまとめます。

1、計算前のtテーブルを一行読み取る
日付コードを変数に入れる、売上金額を別の変数に入れる。

2,次の行を読み取り、日付が一致していたら売上金額をプラスする。
不一致の場合、その時点での日付と売上金額を別のテーブルに出力し、売上金額を0にする。
その後、日付を新しく変数に入れ、売上金額を変数に入れる

3、 2を繰り返し行い、最後まで出力したら、計算後のテーブルをDataGridViewに出力する。

この流れを想定しています。
結果としては、今書いてあるコードであっているのですが、その過程を変更したいというところです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/09 11:19 編集

> VB.NetでDataTableを一行ずつ読み取りたいです。 あなたの言う DataTable とは何ですか? a.Fill(dt) でデータを読み込んだ dt のこと? 違いますか? 違うとすると、SqlDataReader を使って読んできたいということではなかろうかと想像してますが、だとすると何故そういうことがしたいのですか? それを書きましょう。
hrb

2022/06/10 00:42

ご指摘ありがとうございます。 自分の考えているものとしては、 | 日付コード | 売上金額 |    |2022/04/05| 20000| |2022/04/05| 20000| |2022/04/06| 20000| |2022/04/07| 20000| |2022/04/07| 20000| これを一行ずつ読み取り、日付ごとに計算したいという感じです。 目的としては、課題だからといったところです。。
退会済みユーザー

退会済みユーザー

2022/06/10 00:59

> | 日付コード | 売上金額 |    > |2022/04/05| 20000| > |2022/04/05| 20000| > |2022/04/06| 20000| > |2022/04/07| 20000| > |2022/04/07| 20000| > これを一行ずつ読み取り、日付ごとに計算したいという感じです。 回答いただいたのですが理解できません。質問者さんのコードで DataGridView には質問に書いてある 2 つ目のテーブルが表示されているのではないですか? もしそうであれば「これを一行ずつ読み取り、日付ごとに計算」は既にできていてその結果が表示されているということになりますけど。 そうではなくて、現状、質問のコードでは DataGridView には期待する結果(即ち、質問に書いてある 2 つ目のテーブル)が表示されてないということですか?
hrb

2022/06/10 01:16

自分の完全な言葉足らずでした。 行いたい想定の手順を一からまとめます。 1、計算前のtテーブルを一行読み取る 日付コードを変数に入れる、売上金額を別の変数に入れる。 2,次の行を読み取り、日付が一致していたら売上金額をプラスする。 不一致の場合、その時点での日付と売上金額を別のテーブルに出力し、売上金額を0にする。 その後、日付を新しく変数に入れ、売上金額を変数に入れる 3、 2を繰り返し行い、最後まで出力したら、計算後のテーブルをDataGridViewに出力する。 この流れを想定しています。 結果としては、今書いてあるコードであっているのですが、その過程を変更したいというところです。
退会済みユーザー

退会済みユーザー

2022/06/10 01:29

上のことを追加情報として質問欄を編集して追記願います。あと、表題も書き換えてください。 ×: VB.NetでDataTableを一行ずつ読み取りたいです。 〇: VB.Netで SQL Server のテーブルを一行ずつ読み取って処理したいです
退会済みユーザー

退会済みユーザー

2022/06/10 01:38

それから、その目的を果たすのに自分ではどこまでコードが書けていて、どこで躓いていて、何が分かれば解決するかを、自分が書いたコードを提示して説明してください。今の質問では丸投げでマイナス評価対象です。
退会済みユーザー

退会済みユーザー

2022/06/10 01:40

> 変更しました。 不十分です。上の 2022/06/10 10:16 のあなたのコメントをそのまま質問欄にコピペしてください。
hrb

2022/06/10 01:46

再度変更しました。 現状の自分の知識ではどこまでが理解していて、どこが理解できていないかを言葉として説明できるレベルではないため、このような質問文となりました。
sazi

2022/06/10 02:25

> for each文などの繰り返し処理を使用して一行ずつ読み込みたいです。 その為にはSQL文も変更しなければなりませんが、それは質問の範囲外ですか?
hrb

2022/06/10 02:39

この修正を行うための変更はすべて範囲内といえます。
matukeso

2022/06/10 03:05

いまgroup byでSQLでやっている部分をやめにして、同等の処理をvb.net側に移したい、ってことですか?
hrb

2022/06/10 04:10

まったくその通りです。 説明不足、言葉足らずで申し訳ないです。
guest

回答2

0

ベストアンサー

ヒントを書いておきます。コーディングは自分でお願いします。不明なことがあれば、自分で検索するなどして十分調べた上で、下のコメント欄で聞いてください。

1、計算前のtテーブルを一行読み取る
日付コードを変数に入れる、売上金額を別の変数に入れる。

SELECT クエリを以下のように変更し、

SELECT date_code, sales_amount FROM control_break

SqlDataReader を使って一行ずつ読んでいきます。詳しくは Microsoft のドキュメントを見てください。サンプルコードもあります。

SqlDataReader クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqldatareader?view=netframework-4.8

上のドキュメントのサンプルコードの while (reader.Read()) ループが一回回るごとに SQL Server のテーブルから一行取得できます。

2,次の行を読み取り、日付が一致していたら売上金額をプラスする。
不一致の場合、その時点での日付と売上金額を別のテーブルに出力し、売上金額を0にする。
その後、日付を新しく変数に入れ、売上金額を変数に入れる

その操作には Dictionary(Of TKey, TValue) クラスを利用するのが良さそうです。(TKey, TValue は SQL Server のテーブルの列の型に合わせて適切なものを選ぶ)

Dictionary(Of TKey, TValue) クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.8

上に紹介した SqlDataReader クラスのサンプルコードで While ループの中を自分の目的に合わせて変更してください。例えば、

(1) SqlDataReader.GetXxxx(Int32) メソッド(Xxxx は SQL Server のテーブルの列の型に合わせて適切なものを選ぶ)で date_code と sales_amount の値を取得

(2) 取得した date_code の値が Dictionary の既存の Key の中にあるか否かを Dictionary.ContainsKey メソッドで判定

(3) 判定結果 ⇒ 無い: 取得した date_code と sales_amount の値を Dictionary.Add メソッドで追加

(4) 判定結果 ⇒ 有る: 当該 Key の Drctionaty の Value に sales_amount の値を加える

3、 2を繰り返し行い、最後まで出力したら、計算後のテーブルをDataGridViewに出力する。

Dictionary は DataGridView の DataSource には使えませんので、List 型に変換してやります。具体例は以下の記事を見てください。

Dictionaryの内容をDataGridViewにデータバインドで表示する(VB2008)
https://www.backyrd.net/entry/20090313/p5

投稿2022/06/10 03:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hrb

2022/06/10 09:08

細かいところまで本当にありがとうございます。 じぶんなりに調べて何とか完了しました。
guest

0

別に全部DataTableにFillしてから、RowsをFor Eachでまわせばいいと思うけど。
どうしてもっていうなら、cmd.ExecuteReader()で「1行づつ結果を返すDataReader」が戻ってくるので、それを使えば。

投稿2022/06/09 10:29

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hrb

2022/06/10 00:39

回答ありがとうございます。 Dim a As New SqlDataAdapter(cmd) Dim dt As New DataTable a.Fill(dt) For Each rows As DataRow In dt.Rows DataGridView2.DataSource = Next このような形にしてみたのですが、 DataGridView2.DataSource = の=のさきのところに当てはめるには何がいいでしょうか。 dtを入れると同じ処理になるよな、と思ったのですが、 ほかに何か当てはめることができるでしょうか 。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問