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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

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

Q&A

解決済

2回答

795閲覧

【条件文】Datasourceの有無でボタンの押下フラグを変更する方法

kentasuzuki_

総合スコア28

VB.NET

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

0グッド

1クリップ

投稿2019/07/12 06:07

編集2019/07/12 13:21

前提・実現したいこと

Visual Basicで事務システムを作っています。

Datasourceの有無でボタンの押下フラグを変更する方法が分かりません。

データベースに接続して持ってきたDatasourceAとBをLEFT JOINで
事務マスタという画面のDataGridに表示しているのですが、

DataGridに持ってきたDatasourceBのデータが空の場合は、
事務マスタの画面のDataGridにはデータソースAのデータしか見えないようになっています。

ここまでは完成しているのですが、

DataGridに持ってきたDatasourceAが存在し、Bのデータが空の場合に、
ボタンの押下フラグをTrueにしたいのですが、やり方が分からず、
ご質問させていただきました。

ご教示いただけますと幸いです。宜しくお願い致します。

発生している問題・エラーメッセージ

'構文的に無理だと分かっているのですが、やり方が分かりません。 IF Dim stbSql As New System.Text.StringBuilder stbSql = New System.Text.StringBuilder stbSql.AppendLine("SELECT *") stbSql.AppendLine("FROM DatasourceB") stbSql.AppendLine("WHERE TargetYear = 2019") BindingSource.DataSource = GetData(stbSql.ToString) Then 'DatasourceBのデータが1件もない場合は下記の処理を行う If BindingSource.Count = 0 Then   'ボタン制御 btnYearUp.Enabled =True Else 'ある場合はこちらの処理↓ btnYearUp.Enabled =False End If End IF

該当のソースコード

'割愛させていただきますが、 'DatasourceAにはTargetYear=2019のデータソースが入っているとします。 'そして事務マスタの画面のDataGridにはDatasourceABが画面上に見えていますが、 '実際にはDatasourceBのデータが空のためDatasourceAしか見えていないとします。 Private Sub CheckYear() 'このSQL構文に条件文を書きたいと思っています。 Dim stbSql As New System.Text.StringBuilder stbSql = New System.Text.StringBuilder stbSql.AppendLine("SELECT *") stbSql.AppendLine("FROM DatasourceB") stbSql.AppendLine("WHERE TargetYear = 2019") BindingSource.DataSource = GetData(stbSql.ToString) 'DatasourceBのデータが1件もない場合は下記の処理を行う If BindingSource.Count = 0 Then   'ボタン制御 btnYearUp.Enabled =True Else 'ある場合はこちらの処理↓ btnYearUp.Enabled =False End If

試したこと

補足情報(FW/ツールのバージョンなど)

Windows Formsを作っています。
OSはWindows10です。
Visual Studio2017
Microsoft SQL Server Management Studio 2017

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

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

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

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

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

YAmaGNZ

2019/07/12 06:56

「DatasourceAが存在し、Bのデータが空」という条件の書き方が分からないということですか?
kentasuzuki_

2019/07/12 07:48

いえ、違います。 DatasourceBが空だった場合は、btnYearUp.Enabled =Trueにしたいということです。
退会済みユーザー

退会済みユーザー

2019/07/12 08:01

プログラミングの質問をするなら、あなたが何を作っているか(Windows Forms? WPF? ASP.NET Web Forms? その他?)と開発環境(OS, .NET, Visual Studio のバージョン、DB は何かとそのバージョン・エディション)ぐらいは書けませんかね。
YAmaGNZ

2019/07/12 08:12 編集

該当のソースコードに 'DatasourceBのデータが1件もない場合は下記の処理を行う とありますが、これで出来ているのではないのですか?
kentasuzuki_

2019/07/12 08:23

説明不足で申し訳ございません。 Windows Formsを作っています。 OSはWindows10です。 Visual Studio2017 Microsoft SQL Server Management Studio 2017 を利用しています。
退会済みユーザー

退会済みユーザー

2019/07/12 08:28 編集

質問を編集して質問欄に書いていただくようお願いします。コメント欄は通常閉じているので、見ない人がいると思いますので。 あと、Microsoft SQL Server Management Studio 2017 は DB サーバーではないです。SQL Server ということで良いのですね?
kentasuzuki_

2019/07/12 08:25

DatasourceBのデータが1件もない場合は下記の処理を行うと書いているのですが、 分かりやすく申し上げますと、 ここから Dim stbSql As New System.Text.StringBuilder stbSql = New System.Text.StringBuilder stbSql.AppendLine("SELECT *") stbSql.AppendLine("FROM DatasourceB") stbSql.AppendLine("WHERE TargetYear = 2019") BindingSource.DataSource = GetData(stbSql.ToString) ここまでをIF文でまとめたいと思っています。 その方法が分からないということです。
退会済みユーザー

退会済みユーザー

2019/07/12 10:10 編集

SELECT * FROM DatasourceB WHERE TargetYear = 2019 で抽出できるレコードの有無が分かれば良いのですよね? であれば重い DataTable に取得するなどということはせず、SELECT COUNT(*) ... というクエリを使って、もっと軽く簡単に SqlCommand.ExecuteScalar メソッドでレコードを取得できるか否かを調べれば済むはずです。 あと、クエリはパラメータ化しましょう。SQL インジェクション防止に必須です。パラメータ化してないクエリは問題外&議論の対象外と個人的には思っています。 ところで、上にお願いしたことは無視ですか?
kentasuzuki_

2019/07/12 13:22

ご指摘いただいたのにちゃんとできていなくて申し訳ございません。 少々勉強不足の部分があるため、出直してきます。
guest

回答2

0

ベストアンサー

YAmaGNZ さんの回答に対する質問者さんの 2019/07/12 18:28 のコメントで、

あくまでDataTableにデータソースを表示させずに、裏でデータソースを持っていて、

そのデータソースの件数が0件ならば、btnYearUp.Enabled =Trueとしたかったのです。

とありました。それと最初の質問にあった、

データベースに接続して持ってきたDatasourceAとBをLEFT JOINで事務マスタという画面のDataGridに表示しているのですが、

というところから想像するに、DatasourceA と DatasourceB から以下のようなコードで生成済みの 2 つの DataTable のインスタンスを保持していて、

GetData("SELECT * FROM DatasourceA WHERE TargetYear=2019") GetData("SELECT * FROM DatasourceB WHERE TargetYear=2019")

その 2 つの DataTable を Linq とかで JOIN した結果が DataGrid の表示できているのが現状ということですか?

そして、やりたいことは、その「現状」から、

DataGridに持ってきたDatasourceAが存在し、Bのデータが空の場合に、ボタンの押下フラグをTrueにしたいのですが、

ということで、「DatasourceAが存在し、Bのデータが空」を判定するやり方が分からないということですか?

その理解が合っているとすると、DataTable.Rows.Count プロパティ(DataTable 内の DataRow オブジェクトの数)で判定できます(整数型を返すのでゼロなら「空」、1 以上なら「存在」)。

現状までのコードを書くのは初学者では難しいはずで、それが書ける人がどうしてこういう質問をするのかが解せません。なので上記の私の想像は違うのかもしれませんが。

上の想像が違っていて、DataTable のインスタンスなどは存在せず、ゼロから SELECT * FROM DatasourceB WHERE TargetYear=2019 で抽出できるレコードの有無を知りたいということであれば、上の質問に対するコメントでも書きましたが、重い DataTable に取得するなどということはせず、SELECT COUNT(*) ... というクエリを使って、もっと軽く簡単に SqlCommand.ExecuteScalar メソッドでレコードを取得できるか否かを調べれば済むはずです。

もう一つ、質問とは直接関係ないことですが、クエリはパラメータ化しましょう。SQL インジェクション防止に必須です。パラメータ化してないクエリは問題外&議論の対象外と個人的には思っています。

投稿2019/07/13 01:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kentasuzuki_

2019/07/15 13:57

というところから想像するに、DatasourceA と DatasourceB から以下のようなコードで生成済みの 2 つの DataTable のインスタンスを保持していて、 GetData("SELECT * FROM DatasourceA WHERE TargetYear=2019") GetData("SELECT * FROM DatasourceB WHERE TargetYear=2019") その 2 つの DataTable を Linq とかで JOIN した結果が DataGrid の表示できているのが現状ということですか? はい!おっしゃる通りです。 LEFT JOINした結果をDataGridに表示させております。 そして、やりたいことは、その「現状」から、 DataGridに持ってきたDatasourceAが存在し、Bのデータが空の場合に、ボタンの押下フラグをTrueにしたいのですが、 ということで、「DatasourceAが存在し、Bのデータが空」を判定するやり方が分からないということですか? はい!こちらもおっしゃる通りでございます。 もう一つ、質問とは直接関係ないことですが、クエリはパラメータ化しましょう。SQL インジェクション防止に必須です。パラメータ化してないクエリは問題外&議論の対象外と個人的には思っています。 すみません。まだプログラミング初心者のため、分からないことも多いのですが、 クエリをパラメータ化するとはどういうことなのでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/15 21:01

それで課題は解決できたのですか? できてないとすると何が問題なのですか? 解決できたのであればこのスレッドはクローズしてください。 クエリのパラメータ化は、ググれば参考になる記事はいくらでも見つかると思います。それでも分からなければ、主題とは違う話ですので、新たに別のスレッドを立てて質問してください。
kentasuzuki_

2019/07/16 00:08

失礼いたしました。 まだ解決できていないところがありますが、考えを整理したいので、一旦スレッドをクローズとさせていただきます。
kentasuzuki_

2019/07/16 05:04 編集

教えていただいたのを参考にさせていただきましたが、 SELECT ISNULL(COUNT(*),0) というクエリを使って、 SqlCommand.ExecuteScalar メソッドでNULLのレコードを0にして、レコードを取得できるか否かを調べることによって、 ボタンのTrueかFalseの条件分岐をすることが出来ました! なぜか自分の中でsqlのクエリやメソッドの使い方について苦手意識があり、少し克服できた気がします。 ご丁寧に教えていただき、ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/07/16 05:12 編集

DatasourceA と DatasourceB から生成済みの 2 つの DataTable のインスタンスを保持しているという状態から始めるのではないのですか? そこから始めるのであれば再度クエリを投げる必要はないし、DataGrid に表示した後でそのクエリを投げるまでの間に誰かが DB を更新したら不整合が出てマズいのでは?
kentasuzuki_

2019/07/16 05:27

説明力が無くて、申し訳ございません。 DatasourceA と DatasourceB から生成済みの 2 つの DataTable のインスタンスを保持しているという状態から始めたいわけではなく、 あくまで片方(DatasourceA)のDataTable のインスタンスを保持しているという状態で、 DatasourceB のDataTableのデータカウントが0の状態が確認できたら、 DatasourceB を生成するということを実現したかったのです。
退会済みユーザー

退会済みユーザー

2019/07/16 05:34 編集

私が私の回答で、 > DatasourceA と DatasourceB から以下のようなコードで生成済みの 2 つの DataTable のインスタンスを保持していて、・・・ と書いたのに対して、あなたは、上の 2019/07/15 22:57 のあなたのコメントで、 > はい!おっしゃる通りです。 と返事しているのですけど。
kentasuzuki_

2019/07/16 05:40

申し訳ございません。 その時は自分でも整理できていなかった部分がありまして、 これ以上質問をしても、余計に自分の中で迷宮入りになってしまう可能性がありましたし、 全力で回答いただいている方をこれ以上困らせてしまうのも申し訳ないと思ったので、 そう言ってしまいました。
退会済みユーザー

退会済みユーザー

2019/07/16 05:47

次回はきちんと理解してから、もし回答を理解できなかったら質問して理解してから答えていただくようお願いします。
kentasuzuki_

2019/07/16 06:00

分かりました。 今後とも宜しくお願い致します。
guest

0

もしかしてこういったことですか?
GetDataが何物か分からないので、DataTableを返すものと書いてます。

VB.NET

1Private Function GetDataBCount() As Integer 2 Dim stbSql As New System.Text.StringBuilder 3 4 stbSql = New System.Text.StringBuilder 5 stbSql.AppendLine("SELECT *") 6 stbSql.AppendLine("FROM DatasourceB") 7 stbSql.AppendLine("WHERE TargetYear = 2019") 8 Return GetData(stbSql.ToString).Rows.Count  'GetDataの戻り値をDataTableと予想 9 10End Function 11 12 13Private Sub CheckYear() 14 15'DatasourceBのデータが1件もない場合は下記の処理を行う 16If GetDataBCount() = 0 Then 17 18  'ボタン制御 19 btnYearUp.Enabled =True 20Else 21 'ある場合はこちらの処理↓ 22 btnYearUp.Enabled =False 23 24End If

投稿2019/07/12 08:36

YAmaGNZ

総合スコア10258

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

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

kentasuzuki_

2019/07/12 08:42

ご丁寧にありがとうございます。 GetDataはDataTableを返すもので合っています。
YAmaGNZ

2019/07/12 08:47

私の回答はデータを取得する処理を別関数に書いただけで、提示されたソースと同じなのですが・・・ DatasourceBの件数を取得する部分が複数あるのであれば別関数にする意味があると思いますが、この1箇所なのであれば別に分けなくてもいいと思います。 何故こうしようと思われたのでしょうか?
kentasuzuki_

2019/07/12 09:28

私の説明が下手で申し訳ありません。 YAmaGNZ様が回答していただいたコードで実現できるのかまだ試していないので分かりませんが、 あくまでDataTableにデータソースを表示させずに、裏でデータソースを持っていて、 そのデータソースの件数が0件ならば、btnYearUp.Enabled =Trueとしたかったのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問