• ベストアンサー

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をしてみましたがうまくいきませんでした。 詳しい方、何卒よろしくお願いいたします。

  • accessvba 複数条件でFilterをしたい

    テーブル1 --------------------------------------- ID フィールド1 フィールド2 1 あ A 2 い B 3 う C 4 え D 5 お E --------------------------------------- を作成し、そのテーブルをもとに、帳票フォームを作成しました。 そのフォームに非連結のテキストボックス ID_テキスト フィールド1_テキスト フィールド2_テキスト 3つを設置しました。 行いたい事をクエリ(SQL文)で例えると、 --------------------------------------- SELECT テーブル1.ID, テーブル1.フィールド1, テーブル1.フィールド2 FROM テーブル1 WHERE (((テーブル1.ID) Like "*" & Forms!テーブル1!ID_テキスト & "*") And ((テーブル1.フィールド1) Like "*" & Forms!テーブル1!フィールド1_テキスト & "*") And ((テーブル1.フィールド2) Like "*" & Forms!テーブル1!フィールド2_テキスト & "*")); --------------------------------------- なのですが、 これをクエリを作成せずに、VBAで行いたいです。 各非連結のテキストボックスには、 更新後処理:[イベント プロシージャ] としています。 --------------------------------------- Private Sub ID_テキスト_AfterUpdate() Me.Form.Filter = _ "ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" Me.Form.FilterOn = True End Sub --------------------------------------- は、問題なくできるのですが、 Private Sub ID_テキスト_AfterUpdate() Me.Form.Filter = _ "ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" and & _ "フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'" Me.Form.FilterOn = True End Sub にすると、エラーになります。 andの繋げ方が良くないと思うのですが、どうすればいいでしょうか? 最終的には、 Private Sub ID_テキスト_AfterUpdate() Me.Form.Filter = _ "ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" "フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'" "フィールド2 like '" & "*" & Me.フィールド2_テキスト.Value & "*" & "'" Me.Form.FilterOn = True End Sub のような感じにしたいです。 ご回答よろしくお願いします。

  • 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 '%<変化する値>%')

  • 入力された値の動的取得方法について

    WINアプリ作成において画面上に非常に多くの項目(textboxなど) が存在しており、その項目データ全てに対しmysqlを利用して保存したいと考えております。 例えばユーザーIDとパスワードがテキストボックスに入力され それをDBへ保存するといったものです。こういった項目が数百 存在しております。 この処理の中で当然クエリを作成しなければならないのですが 項目数が非常に多いため動的にクエリを作成できればと 考えております。 insert into table名 (列1,列2,,,,) values(textbox1.text,textbox2.text,,,,,,) このようなクエリになるのですが、結局のところ 動的にテキストファイルなどの値をどう取り出すか ということになるかと思います。 現在は、自分で全て列名と値を書いているので効率が大変悪く、 動的に連続して処理させたいと考えております。 ※入力されるtextbox(項目)が毎回同じではないので、入力された項目に従属して列名にinsertされるようにしたいと思っています。

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

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

  • Access リストボックス複数選択を抽出条件に

    Access リストボックスで複数選択した値をクエリの抽出条件にしたいです。 ※PC環境:Win7 Access2007 Excel2007 リストボックスで複数選択した値を取得する事はできるのですが、 クエリ実行をすると結果が0件になってしまいます。 他の方のQAなどを参考に以下を作成しましたが、ほしい結果が得られず困っています。 おわかりになる方、ご教示いただけますようお願い致します。 <動作概要> 「画面」の「リストボックス」で複数選択し、 [実行]ボタンを押して、「リストボックス」で選択した値を、「テキストボックス」にセットし、 クエリの抽出条件に、in(テキストボックス)をセットし、テーブルから合致するデータを抽出したい <リストボックス> ※年区分テーブル参照 区分,区分名 1,1年 2,2~3年 3,4~5年 「2,2~3年」「3,4~5年」を選択 ※「区分」は数値型 <VBA> Private Sub 実行_Click()  Dim i As Variant  Me.テキストボックス = Null  For Each i In Me.リストボックス.ItemsSelected Me.テキストボックス = Me.テキストボックス & Me.リストボックス.Column(0, i) & "," Next If Me.テキストボックス <> "" Then  Me.テキストボックス = Left(Me.テキストボックス, Len(Me.テキストボックス) - 1) End If   'ここで画面を確認すると「テキストボックス」には、「2,3」 がセットされている DoCmd.OpenQuery "クエリ"   'テーブルには抽出条件に該当するデータがあるが、クエリ実行結果は0件 End Sub <クエリ SQL> SELECT テーブル FROM テーブル WHERE (((テーブル.区分) in([Forms]![画面]![テキストボックス]))); ※「テーブル.区分」は、数値型 どうぞよろしくお願い致します。

  • テキストボックス内に記入されたデータの取得方法

    お願いします。 画面にテキストボックスが500あります。 そのなかに入力されたデータだけを動的に取り出したいと思っています。 ※取り出してデータベース(mysql)へインサートします。 詳しくは、tableが複数あり其の中にそれぞれ特定のテキストボックスが存在しているようになっていますので、特定のテーブル単体では毎回列名は固定されています。 たとえば、一画面にAとBテーブルがあったとして、AとBのテーブル内に ○A→3つのテキストボックス(列名のこと) ○B→6つつのテキストボックス(列名のこと) があったとして、 まず、Aのテーブル内のテキストボックス2つに値を入力されたとします。(3つめのテキストボックスは入力されていない) また、同時にBテーブルのボックス3つに入力されたとします。(残り3ボックスは入力されていません) その際、入力されたAテーブルの2つのボックスに対応する列名(データベース内の)とVALUESの値(テキストボックス内に記入されたデータ)がINSERT文に記述されるような事を考えています。 また、Bテーブルでも同様にしたいと考えています。 つまり、入力されたボックスに焦点をあてて動的にINSERT文を作れないか?という事で、入力されていないテキストボックス名はINSERT文から省きたいと考えています。これを動的にしたいのです。 >strSql = strSql & "'" & textbox1.Text & "'," 上の文の「 textbox1.Text  」を入力されたテキストボックスから動的に変更出来ないのかが気になっています。 例えば 、3つのテキストボックスがありそのうち、1番目と2番目に入力があったとき、変数をiとして 1 と 2 が入るようにしたいので以下のように文が書けるのだろうか?? 「 textbox[i].Text 」 と思っています。