• ベストアンサー

Fillの使い方について

テキストボックスに入力された値によって、条件をつけ、データを取得、グリッドに表示するということを やりたいと思っています。 Fillメソッドにパラメータを追加して、テキストボックスの値を見るようにしています。 Me.CUSTOMERTableAdapter.Fill,Me.TextBox1.Text.ToString,TextBox2.Text.ToString,TextBox3.Text.ToString) テーブルアダプターのクエリは以下のようになっています。 SELECT FACTORY,KIGYOU,COMPANY FROM CUSTOMER WHERE (CompanyName LIKE :PARAM1 || '%') AND (TelNo LIKE :PARAM2 || '%') AND (FaxNo LIKE :PARAM3 || '%') ※前方一致検索をする仕様としています。 テキストボックスが空欄だった場合、WHERE句から外したいと考えています。 例えばTextBox1(PARAM1)が空であれば、 WHERE (TelNo LIKE :PARAM2 || '%') AND (FaxNo LIKE :PARAM3 || '%') としたいのです。 ケースごとにテーブルアダプターにクエリを作ればいいかと思ったのですが、テキストボックス1だけの場合、2だけの場合、3だけの場合、 1と2の場合…と作っていくと、かなりの数に なってしまいます。 最終的にテキストボックスは10個ほど配置する予定なので、 値がなければWHEREから外せれば一番良いのですが…。 方法がありましたらご教授ください。

noname#32335
noname#32335

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

入力条件に応じたWhere文を作成します。 テキストボックスからの入力を、Text1, Text2, Text3, ・・・として SQLのWHERE文を作成する例です。 Dim strWhere as String strWhere = "" If Text1<>"" Then   If strWhere<>"" Then     strWhere = strWhere & " AND "   End If   strWhere = strWhere & "("   strWhere = strWhere & ※(1番目の検索条件式)   strWhere = strWhere & ")" End If If Text2<>"" Then   If strWhere<>"" Then     strWhere = strWhere & " AND "   End If   strWhere = strWhere & "("   strWhere = strWhere & ※(2番目の検索条件式)   strWhere = strWhere & ")" End If If Text3<>"" Then   If strWhere<>"" Then     strWhere = strWhere & " AND "   End If   strWhere = strWhere & "("   strWhere = strWhere & ※(3番目の検索条件式)   strWhere = strWhere & ")" End If ・ ・ ・ として必要な条件の数だけ繰り返してWHERE文字列を作成します。 あとは、 strSQL = "SELECT FACTORY,KIGYOU,COMPANY FROM CUSTOMER WHERE " & strWhere としてSQL文を完成させます。 ※インデントのために全角スペ^ス使用

noname#32335
質問者

お礼

ありがとうございます。 やはりコードで制御したほうが確実なようですね。

その他の回答 (3)

回答No.4

たびたび連投すみません。 下の PL/SQL ですが、知人に試してみてもらったところ、まったくのでたらめのようです。 ごめんなさい。 SQL Server と同じ感じでいけるかと思いましたが違うようですね。 環境がないので検証できません... これ以上、嘘を書いてもしかたないので、とりあえず参考になりそうなリンクを張らせていただきます... (ちなみに SQL Server は検証済です) http://www15.ocn.ne.jp/~tashi/html/oracle/dev_plsql.html#N14.3

noname#32335
質問者

お礼

レスありがとうございます。 ストアドで制御しようかと思いましたが、 Fillのクエリを (パラメタ IS NULL OR 項目 LIKE パラメタ) とすることで、値がない時は条件なしと同様の動作を 実現させることができました。

回答No.3

お世話になります。 ちょっと書き足りなかったと思いますので 連投すみませんが補足させて下さい。 こんな感じのストアドプロシージャを作って それに対する TableAdapter を構成してやればよいと思います。 ■PL/SQL(もう何年もやってないので自信ないです、間違ってたらごめんなさい) CREATE OR REPLACE PROCEDURE TEST (   p_CompanyName VARCHAR(?) DEFAULT NULL,   p_TelNo VARCHAR(?) DEFAULT NULL,   p_FaxNo VARCHAR(?) DEFAULT NULL ) IS BEGIN   SELECT     FACTORY,     KIGYOU,     COMPANY   FROM     CUSTOMER   WHERE     ((p_CompanyName IS NULL) OR (CompanyName LIKE :p_CompanyName || '%'))     AND     ((p_TelNo IS NULL) OR (TelNo LIKE :p_TelNo || '%'))     AND     ((p_FaxNo IS NULL) OR (FaxNo LIKE :p_FaxNo || '%')) END ■T-SQL IF EXISTS (SELECT * FROM [dbo].[SYSOBJECTS] WHERE ID = OBJECT_ID(N'[dbo].[TEST]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[TEST] GO SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE TEST (   @p_CompanyName VARCHAR(?) = NULL,   @p_TelNo VARCHAR(?) = NULL,   @p_FaxNo VARCHAR(?) = NULL ) IS BEGIN   SET NOCOUNT ON;   SELECT     FACTORY,     KIGYOU,     COMPANY   FROM     CUSTOMER   WHERE     ((ISNULL(@p_CompanyName,'') IS '') OR (CompanyName LIKE @p_CompanyName + '%'))     AND     ((ISNULL(@p_TelNo,'') IS '') OR (TelNo LIKE @p_TelNo + '%'))     AND     ((ISNULL(@p_FaxNo,'') IS '') OR (FaxNo LIKE @p_FaxNo + '%')) END GO

回答No.1

お世話になります。 ストアドプロシージャにしましょう。

関連するQ&A

  • EXCEL VBAでクエリーを使用した抽出方法

    EXCEL VBAでクエリーを使用しデータを抽出する命令で困っています。 原始データ:CSVファイル (カンマ区切り) 項目の中に日付の入った項目があり指定した1日だけの抽出はうまくいきますが、 期間を指定(複数日)した場合にエラーとなってしまいます。 1日だけを指定した場合の命令(うまくいく) 日付という項目には数値タイプのデータが入っている hizukeという変数にテキストボックスの値を代入する hizuke = TEXTBOX日付1.Value SELECT * FROM ファイル名 WHERE 日付 LIKE '%" & hizuke1 & "%' " ※ ここでワイルドカード(%)を使わないとエラーとなってしまいますが・・・ 期間指定をした場合の命令(エラーとなる) 日付という項目には数値タイプのデータが入っている hizuke1という変数にテキストボックスの値を代入する hizuke2という変数にテキストボックスの値を代入する hizuke1 = TEXTBOX日付1.Value hizuke2 = TEXTBOX日付2.Value SELECT * FROM ファイル名 WHERE 日付 BETWEEN LIKE '%" & hizuke1 & "%' AND LIKE '%" & hizuke2 & "%' " この命令が正しいとは思いませんが、要はワイルドカードと演算子(BETWEEN)を併用したい訳です。 この考え方以外で期間指定のデータ抽出ができるのであればその方法を教えて下さい。 以上、よろしくお願いします。

  • オートフィルマクロで作り、パラメータを変数にす方法

    EXCEL2007にて textBoxに入力された値を オートフィルのパラメータに指定したいのですが、 どのように記述すれば良いかわかりません。 Dim a As Integer a = TextBox.Text この変数aをオートフィルのパラメータにするにはどうすれ良いでしょうか? TextBoxに"10"と入力した場合、 A1:A10までオートフィルするためのマクロです。 ..........|A|B|C .....1..|10 .....2..|10 .....3..|10 .....4..|  .....5..| .....6..| .....7..| 初心者のため説明不足で申し訳ないのですが、 よろしくお願いいたします。

  • 困っています。助けてください。(1)

    会社のシステム開発で思うように進まず困っています。 初心者なので丁寧な解説をいただけると助かります。 (1)コンボボックスの作成 ゴール:テキストボックスに入れたキーワードをあいまい検索で コンボボックスで値を絞りだし繰り返し検索したい。 textbox:「a」入力 検索ボタンclick cmbbox:「a」から始まるタイトルをすべて絞り出す       テキストボックスに入れたキーワードをあいまい検索で コンボボックスで値を絞りだすまでできていますが 元の状態に戻して別のキーワードで検索ができません。 絞り込みが解除されないでいるのです。 ※しかも、修正を、やっているうちにデータ(レコード)が出てこなくなったりしました。(最適化やロールバックが必要みたいでしょうか?) コンボボックスの値集合:select T_taitoru.name from T_taitoru where T_taitoru.name like'*"& [form]![kensaku]![textbox]&"*'; コンボボックスの値集合タイプ:テーブル/クエリ private sub textbox_click() if me!textbox="" then me!cmbbox.rowsourcetype="table/qruery" me!cmbbox.rowsource="select T_taitoru.name from T_taitoru where T_taitoru.name like'*"& [form]![kensaku]![textbox]&"*';" end if end sub 繰り返し検索したい状態にしたいのですが何が間違っているのかよく分かりません。 詳しい方教えてください。 検索ボタンのコードはcmbboxmにitemselectを使っています。 ユーザビリティの観点からコンボボックスのdrop downをボタンでするほうが操作上分かりやすいためにしています。 解決方法やコードなどをいただけると大変助かります。 requeryをしてみましたがうまくいきませんでした。 詳しい方、何卒よろしくお願いいたします。

  • VBとDB連携について

    VB.NETとDB(オラクル)を使って開発をしています。 画像の左側のテキストボックスは上から  textbox1(Nameプロパティ:txt_Name)  textbox2(Nameプロパティ:txt_Tihou)  textbox3(Nameプロパティ:txt_Category) としています SQL文で textbox1~textbox3の内容が入っている項目だけWHERE句で抽出させたいです たとえば画像の例で、 textbox1に「みかん」、textbox3に「果物」と入れているとき、 赤の四角で囲った2行をdatagridviewとかに表示しようとおもっています 実際のコード(変数等は中略しています) 'textbox1、textbox2、textbox3が空白でない if textbox1.text <> "" And textbox2.text <> "" And textbox3.text <> "" SQL = "select * from ["表名"] where 名前 = " & textbox1.text & _ " and 地方 = " &textbox2.text & " and カテゴリ = " & textbox3.text" end if 'textbox1が空白でない if textbox1.text <> "" And textbox2.text = "" And textbox3.text = "" SQL = "select * from ["表名"] where 名前 = " & textbox1.text & " end if ・ ・ ・ ・ ・・・という感じで全ての組み合わせ(10通りくらい)でIF文を書いています この例では3つなのでまだいいかもしれませんが、 テキストボックスが10個とか100個とかになったらどのように判断したらいいのか分からないです 何か効率いい方法、知っている方いましたら教えてください

  • データベースクエリで任意の値を検索する方法について

    データベースクエリについて質問させて頂きます。 下記のようなクエリがあるとして、WHERE句で指定したフィールドを対象に検索処理を行いたいのですが、 その際、フォームに配置されたテキストボックスに任意に入力した値を検索値にしたいのです。 つまり、クエリ中の<変化する値>がそれに当たります。 例えば<変化する値>が任意でなく指定値であれば'%あ%'とした時、あを含むレコードが検索されると思うの ですが、前者はどのような記述をすれば良いのか分かりません。 こういった場合、どのように記述すればよいのかご教授願います。 SELECT Code, MainType, Name, Type1, Type2, Type3, Unit, UnitPrice, Used FROM shizai_master WHERE (Code LIKE '%<変化する値>%') OR (MainType LIKE '%<変化する値>%') OR (Name LIKE '%<変化する値>%') OR (Type1 LIKE '%<変化する値>%') OR (Type2 LIKE '%<変化する値>%') OR (Type3 LIKE '%<変化する値>%')

  • アクセス(ACCESS)のリストボックスについて

    アクセスでフォームにテキストボックスとリストボックスを配置して、 テキストボックスに入力した文字列により、リストボックスに表示される データを変えたいのですが(フィルタをかけるというのでしょうか??) そこで、vbaを用い、リストボックスのプロパティの値集合ソースに SELECT * FROM aaa where aaa.bbb like "*あ*"; 'あ と言う文字のあいまい検索のつもり ”あ”はテキストボックス    に入力されている。 と入るような事を考えたのですが、ここで、aaaの部分がテーブルを基にした 場合は、該当するデータすべてが表示されますが、クエリーを基にすると 先頭のデータしか表示しないのです。 たぶん、素人の考えなのでしょうが、どうしてそうなるのかが分かりません。 教えていただけないでしょうか? できたら、クエリーを基にしても、該当データが表示できる方法も 教えてください。お願いします。 VBAは(?)かなりの初心者です。上記の方法も本に書いてあった物を やっと流用しました。猿にも解るくらいでお願いします。 ちなみに、アクセスは2000を使用しています。

  • C#のループでtextboxに値を入れる方法

    Nameが textbox1 textbox2 ... textbox10 と10個のtextboxがあったとして、 このそれぞれのtextに値を入れたいのですが、 1個ずつ書くのではなく、forとかで入れることは出来ますか? たとえば以下のように、ループで○の部分を変更していくことは可能なのでしょうか? for (int i=1; i<=10; i++) { textbox○.text = i.ToString(); } よろしくお願いします。

  • 「Or検索」をするには?

    グーグルやヤフーのようにアクセスのフォーム上からクエリの検索も「Or検索」をしたいのですがやり方がわかりません。 (長くなりますがお付き合いくださいませ(*_ _)ペコリ) ******************************************************* テーブル1 フィールド名:果物 りんご みかん ******************************************************* クエリ1 SELECT テーブル1.果物 FROM テーブル1 WHERE (((テーブル1.果物) Like "*" & [Forms]![フォーム1]![テキスト1] & "*")); ******************************************************* フォーム1 テキスト1とコマンド0を配置。 コマンド0のイベントに Private Sub コマンド0_Click() DoCmd.OpenQuery "クエリ1" End Sub ******************************************************* と作りました。 これで、テキスト1に「み」と入力し、コマンド0を押せば クエリ1は「みかん」が表示され、 「ん」と入力すれば、 「りんご」「みかん」のどちらも表示されます。 今からやりたいことは 「りんご」「みかん」のどちらも入力して どちらも表示させたいのです。 (こちらのサイトもそのような仕組みですよね?) 多分、 WHERE (((テーブル1.果物) Like "*" & [Forms]![フォーム1]![テキスト1] & "*")) の部分をどうにかするのだと思うのですが わかりません。 どなたかご教授いただけないでしょうか? イメージとして画像をUPします。 よろしくお願いします。

  • ストアドプロシージャの条件分岐に関して

    お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = ''  -- 画面から渡されるパラメータ1 @param2 = ''   -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B    -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL    -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2              -- ここまで (2) AND A.COLUMN1 = B.COLUMN1       -- (3) AND A.COLUMN2 = B.COLUMN2      -- (4)   ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。

  • アクセス カッコをフィルタしたい

    アクセスのテーブルでデータにカッコがはいってるのですが それをフィルタで抽出しようとするとエラーになります。 例えば、タイトルフィールドに 「映画名(邦画)」が入ってる場合、 右クリック→テキストフィルタを押すと 「ユーザー設定フィルター」が出てきて、 タイトルが次の値で終わる:の所に「)」を入れると、 「正しい値を入力してください」とメッセージが出てしまいます。 (邦画)を入れても同じエラーです。 「指定の値を含む」にして、「邦画」と入れれば問題なく抽出できるのですが、 カッコを抽出したい場合どうすればいいのでしょうか? クエリで WHERE (((T_test. タイトル) Like "*)")); とするしかないのでしょうか? できれば直接テーブルでフィルタがかけられるようにしたいです