- PR -

Gridview 複数検索

投稿者投稿内容
ぴんふ
ベテラン
会議室デビュー日: 2006/07/13
投稿数: 80
投稿日時: 2008-01-15 16:32
あれれ?
もしかしてすべてACCESSでやりたいってこと?
となると投稿先はDataBase Expertあたりのほうが良くはないですか?
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2008-01-15 16:40
引用:

ぴんふさんの書き込み (2008-01-15 16:32) より:

もしかしてすべてACCESSでやりたいってこと?



ぴんふさん、わたしが勝手に解釈してしまいました。
最初に書いてあった文字列のあいまい検索の部分で、
パラメータに入力がないときの判別をSQL文内でされていたので。。。
なんか無理やりやった感じもあります。

ぴんふさんのようにしたほうがコードは分かりやすくていいと思います。
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2008-01-15 22:18
引用:

ぴんふさんの書き込み (2008-01-15 16:01) より:
ヒマがあったので組んでみた。
検索条件の「日付」がDateTimeだともうちょっと違ってくるでしょうが、
要は条件によってSQLを変えてあげればいけますよね?
ってそういうことが聞きたいんじゃないのかな・・・。
(テキトーに組んでるので異常処理とかは省いてます)

VS2005 C#

表示用グリッド:
private System.Windows.Forms.DataGridView dataGrid1;
開始日テキストボックス:
private System.Windows.Forms.TextBox textFmDt;
終了日テキストボックス:
private System.Windows.Forms.TextBox textToDt;
検索ボタン:
private System.Windows.Forms.Button btnSearch;

DB
ACCSESS2003 SP2
テーブル
ID:オートナンバー型
Hiduke:テキスト型

ソース
〜割愛
using System.Data.OleDb;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnSearch_Click(object sender, EventArgs e)
{
// 1)変数の宣言
OleDbConnection OleConn = new OleDbConnection();
OleDbDataAdapter OleDA;
DataSet dtSet = new DataSet("DataTable");
DataTable dtTable;
string strSql ;

// 2)接続文字列の作成
OleConn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=C:\WORK\実験\@IT\TestDB.mdb;" +
"Persist Security Info=False";

// 3)データを取得するためのSQL文を作成する
strSql = "SELECT * FROM TABLE1 ";

if ((textFmDt.Text != "") && (textToDt.Text != ""))
{
//開始・終了ともに入力あり
strSql += "WHERE Hiduke BETWEEN ";
strSql += "'" + textFmDt.Text + "'";
strSql += " AND ";
strSql += "'" + textToDt.Text + "'";
}
else if (textFmDt.Text != "")
{
//開始のみ入力あり
strSql += "WHERE Hiduke = ";
strSql += "'" + textFmDt.Text + "'";
}
else if (textToDt.Text != "")
{
//終了のみ入力あり
strSql += "WHERE Hiduke = ";
strSql += "'" + textToDt.Text + "'";
}
else
{
//開始・終了ともに入力なし
MessageBox.Show("検索条件を指定してください。");
return;
}

OleDA = new OleDbDataAdapter(strSql, OleConn);

// 4)データセットにデータを取得する
OleDA.Fill(dtSet, "DataTable");

// 5)データセットからテーブルを取得する
dtTable = dtSet.Tables["DataTable"];

// DataGridにデータを表示する
dataGrid1.DataSource = dtSet.Tables[0];


}
}
}


お返事ありがとうございます
私の質問不足で申し訳ないのですが
C#ではなくVisualBasicを使用しています
VisualBasicはおろかC#はまったく未知です、すみません
ヒマとはいえ大変ありがとうございます。
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2008-01-16 11:49
引用:

むーみんさんの書き込み (2008-01-15 16:03) より:
コード:
 and (日付列 >= IIf(IsDate(@StartDate) = False, Null, @StartDate) or IsDate(@StartDate) = False)
 and (日付列 <= IIf(IsDate(@EndDate) = False, Null, @EndDate) or IsDate(@EndDate) = False)



@StartDate、@EndDateは10桁の"yyyy/MM/dd"形式の文字列です。

この方法でどうでしょうか。
もっといい方法があるのかもしれないですが、私にはこれしか思いつきませんでした。

参考にならなかったらすみません。



お返事ありがとうございます
とんでもありません参考にさせて頂いております。
パラメータの書き方がいまいち分からないのですが現在は
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="False" Name="?"PropertyName="Text" />
</SelectParameters>
ですが回答を頂いたSQL分を使用すると分からなくてやっぱり
1 つ以上の必要なパラメータの値が設定されていません。
と出てしまいます。
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2008-01-16 13:30
引用:

BBSRさんの書き込み (2008-01-16 11:49) より:

<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="False" Name="?"PropertyName="Text" />
</SelectParameters>
ですが回答を頂いたSQL分を使用すると分からなくてやっぱり
1 つ以上の必要なパラメータの値が設定されていません。
と出てしまいます。



すみません、私は、Visual BasicでWindowsアプリケーションを開発する知識しかないので、原因はわかりません。投稿しておいて、中途半端でお役に立てずすみません。

一応、BBSRさんのご質問への回答にはならないですが、
Windowsアプリケーションで、正常に動作すると思われるコードを載せておきます。
お役にたてばいいのですが

コード:

' 検索用SQL作成
Dim sql As String = String.Empty
sql = "select * from table1"
sql &= " where ((列1 LIKE '%' + @param1 + '%') OR (列1 IS NULL AND @param1 = ''))"
sql &= " and ((列2 LIKE '%' + @param2 + '%') OR (列2 IS NULL AND @param2 = ''))"
sql &= " and (日付列 >= IIf(IsDate(@StartDate) = False, Null, @StartDate) or IsDate(@StartDate) = False)"
sql &= " and (日付列 <= IIf(IsDate(@EndDate) = False, Null, @EndDate) or IsDate(@EndDate) = False)"

' 接続の宣言
Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "パスを記述")
' Select Commandの宣言
Using cmd As New OleDbCommand(sql, cn)
With cmd.Parameters
.Add("@Param1", OleDbType.VarChar).Value = TextBox1.Text
.Add("@Param2", OleDbType.VarChar).Value = TextBox2.Text
.Add("@StartDate", OleDbType.VarChar).Value = TextBox3.Text
.Add("@EndDate", OleDbType.VarChar).Value = TextBox4.Text
End With

' DataAdapterの宣言
Using da As New OleDbDataAdapter(cmd)
Dim dt As New DataTable

da.Fill(dt)

' DataGridViewにバインド
DataGridView1.DataSource = dt
End Using
End Using
End Using



ただ、ぴんふさんの書いたようにしたほうがSQL文がすっきりすると思いますし、Parameterを作成する必要もなくなります。

コード:

' 検索用SQL作成
Dim sql As String = String.Empty
sql = "select * from table1"
sql &= "where 1 = 1"
If Not TextBox1.Text = "" Then
sql &= " and 列1 LIKE '%' + " & TextBox1.Text & " + '%'"
End If
If Not TextBox2.Text = "" Then
sql &= " and 列2 LIKE '%' + " & TextBox2.Text & " + '%'"
End If
If IsDate(TextBox3.Text) Then
sql &= " and 日付列 >= " & TextBox3.Text
End If
If IsDate(TextBox4.Text) Then
sql &= " and 日付列 <= " & TextBox4.Text
End If

' 接続の宣言
Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "パスを記述")
' Select Commandの宣言
Using cmd As New OleDbCommand(sql, cn)
' DataAdapterの宣言
Using da As New OleDbDataAdapter(cmd)
Dim dt As New DataTable

da.Fill(dt)

' DataGridViewにバインド
DataGridView1.DataSource = dt
End Using
End Using
End Using



あと、ちなみにC#のコードをVBに翻訳してくれるページがありますよ。
http://authors.aspalliance.com/aldotnet/examples/translate.aspx


[ メッセージ編集済み 編集者: むーみん 編集日時 2008-01-16 13:33 ]
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2008-01-16 14:53
貴重なコードありがとうございます
参考にさせていただきます。
逆に私はWEBだけなのでごめんなさい質問内容が大雑把せいで・・・
ご迷惑をお掛けします
私もWindowsアプリを実現させたいのですが
WEBからはいってしまいWindowsアプリはさっぱりです;;
やはり管理簿製作はWindowsアプリのほうが手軽なのでしょうか?

時間をあけもう一度詳しく質問をし直してみたいと思います。
ありがとうございましたm(__)m
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2008-01-16 15:24
引用:

BBSRさんの書き込み (2008-01-16 14:53) より:
貴重なコードありがとうございます
参考にさせていただきます。
逆に私はWEBだけなのでごめんなさい質問内容が大雑把せいで・・・
ご迷惑をお掛けします
私もWindowsアプリを実現させたいのですが
WEBからはいってしまいWindowsアプリはさっぱりです;;

やはり管理簿製作はWindowsアプリのほうが手軽なのでしょうか?

時間をあけもう一度詳しく質問をし直してみたいと思います。
ありがとうございましたm(__)m


WebでもWindowsでもこのあたりって変わらねーんじゃね?
ミドルウェアから先の話だよね?
Webに自信があるなら余裕だと思うけどなぁ・・・
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2008-01-17 20:05
引用:

ぶさいくろうさんの書き込み (2008-01-16 15:24) より:
引用:

BBSRさんの書き込み (2008-01-16 14:53) より:
貴重なコードありがとうございます
参考にさせていただきます。
逆に私はWEBだけなのでごめんなさい質問内容が大雑把せいで・・・
ご迷惑をお掛けします
私もWindowsアプリを実現させたいのですが
WEBからはいってしまいWindowsアプリはさっぱりです;;

やはり管理簿製作はWindowsアプリのほうが手軽なのでしょうか?

時間をあけもう一度詳しく質問をし直してみたいと思います。
ありがとうございましたm(__)m


WebでもWindowsでもこのあたりって変わらねーんじゃね?
ミドルウェアから先の話だよね?
Webに自信があるなら余裕だと思うけどなぁ・・・



WEBも自身がありません初心者ですみません

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