DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Datagridview内日付範囲検索について

環境/言語:[Win7, VB.NET]
分類:[.NET]

お世話になっています。

VB2010で受注管理データベース作成しています。受注入力してあるデータを受注明細と言うクエリー(Ordermeisai)作成してDatagridviewに表示しています。受注明細フォームにDatetimepickerを2個とボタン1個貼り付けています。そこで、DatetimepickerにYYYY/MM/DDからYYYY/MM/DDを入力してボタンクリックするとその日付範囲のみを表示させたいのですが、コーディングがわからなくてできません。教えていただければと思います。


Public Class OrderMeisai

Private Sub OrderMeisai_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'OrderDataSet.ordermeisai' table. You can move, or remove it, as needed.
Me.OrdermeisaiTableAdapter.Fill(Me.OrderDataSet.ordermeisai)


' 合計を計算して表示する
CalcTotal()


End Sub

Sub CalcTotal()
Dim price, count, subtotal, total As Integer
Dim r As Integer
total = 0
For r = 0 To OrdermeisaiDataGridView.Rows.Count - 1
' 各商品の単価/個数/金額を求める
Try
price = Val(OrdermeisaiDataGridView.Rows(r).Cells(6).Value)
count = Val(OrdermeisaiDataGridView.Rows(r).Cells(5).Value)
subtotal = price * count
Catch ex As Exception
subtotal = 0
End Try
' 金額を表示する
OrdermeisaiDataGridView.Rows(r).Cells(7).Value = subtotal
' 合計に金額を足す
total += subtotal
Next
' 合計を表示する
txtTotal.Text = total
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

End Sub
End Class
方法としては、
日付の条件をSQL検索時にセットして要るものだけ取ってくる方法と、
取ってきた中でのメモリデータに条件を加える方法とがありますが、
今現在、Me.OrderDataSet.ordermeisaiの検索はどのようになっているのですか?
 ※名称から判断すると、運用を続ければ増えまくるテーブルでしょうから、
 余計なものを拾ってきてメモリに蓄えたりしない前者を圧倒的に推奨、となりますが。

なお、照会専用で考えているんですよね?(=内容変更や行削除は行わない。)


前者は日付欄の変更時(だか、検索ボタンクリック時)に、Me.OrderDataSet.ordermeisaiのデータをクリアしてから(既にある場合。)
検索のSQLに日付条件部分をセットしてからFillすることで対応でき、
後者は、DataGridViewで表示するのをMe.OrderDataSet.ordermeisaiではなくこれを覗くためのDataViewを作成してそれを設定しておき、
日付欄を変更時(だか、検索ボタンクリック時)に、DataViewの条件部の日付範囲を変えることで対応できます。
(データのクリアは不要。)

なお、前者の場合、SQL検索前に日付を入力する必要があるので、
Loadでデータを呼び出したり計算処理をしないようにしてください。

というかそもそも、
後者の場合でも即時性の点から、フォーム開始時に取ったきりのデータをいつまでも使っても仕方ないので、
どちらにしろLoadで呼ぶのではなくボタンを押すとデータを取ってきた方がよいでしょう。
(結局そうなるので、やはり前者推奨です。)
■No29380に返信(とん。さんの記事)
> 方法としては、
> 日付の条件をSQL検索時にセットして要るものだけ取ってくる方法と、
> 取ってきた中でのメモリデータに条件を加える方法とがありますが、
> 今現在、Me.OrderDataSet.ordermeisaiの検索はどのようになっているのですか?
>  ※名称から判断すると、運用を続ければ増えまくるテーブルでしょうから、
>  余計なものを拾ってきてメモリに蓄えたりしない前者を圧倒的に推奨、となりますが。
>
> なお、照会専用で考えているんですよね?(=内容変更や行削除は行わない。)
>
>
> 前者は日付欄の変更時(だか、検索ボタンクリック時)に、Me.OrderDataSet.ordermeisaiのデータをクリアしてから(既にある場合。)
> 検索のSQLに日付条件部分をセットしてからFillすることで対応でき、
> 後者は、DataGridViewで表示するのをMe.OrderDataSet.ordermeisaiではなくこれを覗くためのDataViewを作成してそれを設定しておき、
> 日付欄を変更時(だか、検索ボタンクリック時)に、DataViewの条件部の日付範囲を変えることで対応できます。
> (データのクリアは不要。)
>
> なお、前者の場合、SQL検索前に日付を入力する必要があるので、
> Loadでデータを呼び出したり計算処理をしないようにしてください。
>
> というかそもそも、
> 後者の場合でも即時性の点から、フォーム開始時に取ったきりのデータをいつまでも使っても仕方ないので、
> どちらにしろLoadで呼ぶのではなくボタンを押すとデータを取ってきた方がよいでしょう。
> (結局そうなるので、やはり前者推奨です。)


お世話になっています。


> 今現在、Me.OrderDataSet.ordermeisaiの検索はどのようになっているのですか?

今現在、受注明細フォームが、今まで入った受注を照会専用で内容の変更や削除はしないことになっています。

これからやりたいのは、その受注の中からある期間内の受注情報絞り込んで表示するようにしたいです。
添付ファイル: 1321788446.jpg (72 KB)
まず、先に書いたとおり、データ呼び出しと合計計算の二行をボタンクリックの方へ移動しておいてください。
また、Fillの前に
Me.OrderDataSet.ordermeisai.Clear
を追加して置いてください。
条件を変えて何度も押す可能性があるため、二度目以降、前のデータが残っていては困るので。


データセットデザイナを開き、OrdermeisaiTableAdapterにて「クエリの追加」をします。
FillByDateTimeRange等適当な日付範囲指定呼び出し用のクエリ(Fill〜)を一つ追加し、
これに、日付範囲を指定できるパラメータを二つ追加します。(From用・To用)
とりあえず簡易的な処理でよければシンプルに「between @dt_from and @dt_to」とかで作成します。
http://msdn.microsoft.com/ja-jp/library/kda44dwy%28v=VS.80%29.aspx
※ピッカーには実際には色々入るでしょうから、本来は適正に処理されるようこまごまとしたWHEREを書く必要がありますが、
とりあえず、まず動かすのを優先し、シンプルなbetweenだけのままで行ってもよいでしょう。
(おかしな動作しても仕方ないので、うまく動くようになったらちゃんと書き加えるのを忘れないでくださいね。)

で、ですが。Clickの中で現在
Me.OrdermeisaiTableAdapter.Fill(Me.OrderDataSet.ordermeisai)
としてある部分を、
Me.OrdermeisaiTableAdapter.FillByDateTimeRange(Me.OrderDataSet.ordermeisai, DateTimePickerFrom.Value, DateTimePickerTo.Value)
等として、先ほど作成したクエリと連携するようにし、ピッカーの二つの値を送ってデータ呼び出しされるようにします。
※この際の日付を渡す部分の型は実際のDBと合わせてください。
(多分DateTimeで持っているのでしょうから、そうならそのままValueを送って使えますね。)

なお、クエリの作成についてはデザイナで拡張する以外にも、パーシャルなソースの追記で直接拡張する方法もあります↓
http://msdn.microsoft.com/ja-jp/library/ms233697%28v=VS.80%29.aspx
が、まぁ今回の場合は特別なことはしないので必要ないでしょう。


(あと、DataGridViewの方も、行新規作成や内容変更を禁止するようプロパティを設定してくださいね。)
あ、ひとつ処理を忘れました。
DBで日時を扱っているため時刻データまで持っているので、
これだけだと、toの方の日のデータに2011/11/11を指定した例で、2011/11/11のデータは0時のもの以外引っかからないでしょう。
なので、ピッカーの日データの時刻部分を一日の最後の時刻(23:59:99…)に調整してから渡す工夫が必要です。
(whereの中をかなり頑張れば色々厳密にできますが、とりあえずはこの方法でもまぁ大丈夫、というところで。)
■No29383に返信(とん。さんの記事)
> あ、ひとつ処理を忘れました。
> DBで日時を扱っているため時刻データまで持っているので、
> これだけだと、toの方の日のデータに2011/11/11を指定した例で、2011/11/11のデータは0時のもの以外引っかからないでしょう。
> なので、ピッカーの日データの時刻部分を一日の最後の時刻(23:59:99…)に調整してから渡す工夫が必要です。
> (whereの中をかなり頑張れば色々厳密にできますが、とりあえずはこの方法でもまぁ大丈夫、というところで。)


いろいろありがとうございました。
おかげさまで、解決できました。これからもよろしくお願いいたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板