• ベストアンサー

アクセス2007の抽出

アクセス2007の抽出 クエリをもとに検索画面を作り部署の抽出をします、 検索画面は 部署名:部署名を入力するところ    コマンドボタンで実行です     クエリの部署のフィールドのところに[部署]としていますが 部署を複数抽出する場合どうしたらいいかわかりません。 [部署]のパラメータのところに部署名ひとつ「総務」と入れると総務を抽出してくれます これを部署を複数抽出したい場合はどうしたらできますか?たとえば総務と経理を抽出 したい場合 部署は30くらいあります。 説明がよく出来なくてすみません どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

抽出条件に "総務" Or "経理" ですが、こういうことではなく?

その他の回答 (15)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

遅くなりました。仕事でなかなか時間が取れなくて 急いでまとめました。提案しようとした案も出て いるみたいなのですが。 [仕様] テーブル名 テーブル1 (部署(テキスト型)、日付(日付/時刻型)、スケジュール(テキスト型)) フォーム名 frm検索 ボタン名 cmd検索 テキストボックス名 tx日付FROM テキストボックス名 tx日付TO リストボックス名 lst検索 [リストボックスの設定] リストボックスのプロパティを開いて 複数選択を標準にしておいてください。 リストボックスの値集合ソースに以下を 張り付けてください。 SELECT テーブル1.部署 FROM テーブル1 GROUP BY テーブル1.部署; これは、テーブルに部署が重複して出て来る であろうという想定のもとで、ユニオンクエリで 部署名の名寄せをしています。 [その他] DAOを使用しているのでコード表のツールから 参照設定を選択し、DAOの一番バージョンの 高いものにチェックが入っているか確認して ください。 Microsoft DAO xx Obuject Library xxは数値です。たとえば3.6 [コード] ボタンのクリック時のイベントに以下を張り付けてください。 Private Sub cmd検索_Click() Call mkSQL End Sub 次に、以下のコードを同じフォームに張り付けてください。 Private Sub mkSQL() Dim db As Database Dim qdf As QueryDef Dim ctl As Control Dim strKey As String Dim strSQL As String Dim varitm As Variant Set db = CurrentDb On Error Resume Next '前回作成したクエリを削除。二重作成によるエラーの回避 For Each qdf In db.QueryDefs If qdf.Name = "Q_Temp検索" Then DoCmd.DeleteObject acQuery, "Q_Temp検索" End If Next qdf Set ctl = Me!lst検索 For Each varitm In ctl.ItemsSelected strKey = strKey & ",'" & ctl.ItemData(varitm) & "'" Next varitm strKey = Mid(strKey, 2) strSQL = "SELECT テーブル1.部署, テーブル1.日付, テーブル1.スケジュール " & _ "FROM テーブル1 " & _ "WHERE (((テーブル1.部署) In (" & strKey & ")) AND ((テーブル1.日付) " & _ "Between [Forms]![frm検索]![tx日付FROM] " & _ "And [Forms]![frm検索]![tx日付TO]));" Set qdf = db.CreateQueryDef("Q_Temp検索", strSQL) DoCmd.OpenQuery ("Q_Temp検索") qdf.Close Set qdf = Nothing db.Close Set db = Nothing End Sub 以上です。 [説明] テキストボックスに期間を入れ、リストボックスで 適当にいくつかを選択してボタンを押すとクエリが 作成され、表示されます。このクエリはその都度 プログラムから作成、削除されます。Accessのクエリ の制限があるため一応、応急的にこのような方法を とります。削除はあらたに検索をするときに行い ますから、一時的にクエリはデータベースに保存されます。 作成されたクエリを観察してみてください。 期間は、二つのテキストボックスに入れますが、 特定の日を指定する場合は二つのテキストボックスに 同じ日付をいれてください。たとえば、 2010/01/01を両方のテキストボックスに 入れます。 [追加] 日付検索を回避する方法もありますが、 一応、日付は必須だろうということで 日付が無い場合は空のクエリが表示されます。 なお、これを元にフォームに表示することも できます。 一応、提案の内容を確認され、その後 必要なことを質問してみてください。 なお、クエリはコード中にSQL文をもとにして 作成しますから、実際のフィールド名が わかればSQLの中にねじ込んでおきます。 字数一杯

lotsqq
質問者

補足

:piroin654さん 忙しいのにありがとうございます。 なぜか、家のアクセスは停止してしまうerrが続出 なんとか動いています。 もしかしたら家のアクセスは2002で会社が2007の違いでしょうか、これはおきまして 教えて頂いたように作ってみましたがうまくできませんでした。 frm検索から日付をいれて入力しましたが結果がでてこないので クエリ Q_Temp検索をあけようとすると下記のerrが出ます。 クエリ式’(((テーブル1部署)In())AND((テーブル1日付)Between[Forms]![frm検索]! [tx日付FROM]And[froms]![frm検索]!「tx日付TO」))'の構文エラー:;演算子がありません となりQ_Temp検索もあきません 言いたいこと解ってもらえますか、 ここまで教えて頂いてるのにまた申し訳ありませんが助けてください よろしくお願い致します。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

視点を変えてみませんか。 フォーム「F1」のテキストボックス「txt検索」に検索用の文字列を入力するとします。 また、比較するフィールド名を「部署」とします。 (以下は、クエリをSQLビューで見た時の記述になります) 一般的?な考え) テキストボックス「txt検索」に、「総」と入れた時、「総務」を抽出したい時には WHERE [部署] Like "*" & [Forms]![F1]![txt検索] & "*" になると思いますが、 視点を変えて?) テキストボックス「txt検索」に「総務 経理」が入力された時には、 WHERE [Forms]![F1]![txt検索] Like "*" & [部署] & "*" と、すれば良いと思います。 WHERE の後は、評価した結果が True になれば抽出、False で抽出対象外になるものだと思っています。 (フィールドの内容にかかわらず) 極端に言えば、 WHERE 1+3=4 ・・・・ なら抽出 WHERE 1+3=5 ・・・・ なら抽出対象外 テーブルTA1から抽出するクエリ記述が、以下であった場合の表示を確認してみてください。 SELECT * FROM TA1 WHERE 1+3=4; ・・・・ 多分、全件抽出 SELECT * FROM TA1 WHERE 1+3=5; ・・・・ 多分、抽出なし どうすれば True にできるかを考えると楽だと思います。 テキストボックス「txt検索」が未入力であることも考慮すると、 WHERE IIF(IsNull([Forms]![F1]![txt検索]),True,[Forms]![F1]![txt検索] Like "*" & [部署] & "*") になると思います。(未入力時には全件抽出) 一般的には、あるフィールドの値が・・・・で、テーブル内のフィールドを参照することが多いです。 フィールドを用いない評価の記述があっても・・・・・ 後は、テキストボックスに入れる時の形式等を考えられればと思います。 スペース区切り、カンマ区切り・・・・・ 嘘を言っているかもしれません。検証はしてください。 ただ、1つのテキストボックスに( xx の区切りを用いて)30個・・・・ は、記述する方も疲れるかと思いますが。 全部署をリストボックスに表示して、複数選択を許可して、選択した部分を VBAなりで展開した形で、抽出条件を作り直せば楽そうですが。 そうすれば、抽出条件部分に In 句 を用いた記述もできると思います。 WHERE [部署] IN ("総務","経理") ※ ここでの "総務","経理" 部分をVBA等で展開して、置き換えれば・・・・

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

2つや3つならパラメータクエリ([]を条件のところで使う。クエリのグリッドで「または」の行でとりあえず2行で各部署として指定)で出来るのでは。 要らない分はエンターを押して、やり過ごす必要があるが。 ーー >部署は30くらいあります。 1度に検索したい部署が最多30社まで設けて置きたいのか。 現状の部署数が30程度なのか、正確に質問に書いてほしい。 SQLとフォームを組み合わせれば 1つのテキストに会社名を1つ入れさせ、それを繰り返し、条件を累積したり、 カンマ(スペース)などで区切って入れさせて、SQLのWhere句の文に組み立てれば出来そう。 ただしVBAの領分になる。この質問はどの程度の経験でやろうとしているのか、はっきりしない。

lotsqq
質問者

補足

imogasiさん ありがとうございます。 >1度に検索したい部署が最多30社まで設けて置きたいのか。  一度に検索したいのは1-10くらいです >現状の部署数が30程度なのか、正確に質問に書いてほしい。  細かく分けているから30くらいあります  分け方は、  1050A  1050B  1050C  1060A  1060B  1070A  1070B  という分け方をしているのでかたまり1050*でもできるといいと  思います >この質問はどの程度の経験でやろうとしているのか、はっきりしない。  超初心者と同じです。  だいぶ前にDbaseIIIというソフトがありそれを使ったことあります、  アクセスは7年くらい前に少し触ったことあるくらいです。  勉強しながら進めていきたいと思っています。どうぞよろしくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

意図されていることは十分わかりました。 テキストボックスに複数項目を並べて 抽出条件に設定するのは関数を作成し、 クエリを条件に合わせて作成すれば 不可能ではないですが、 30近い項目があるということであれば 非効率なので違う方法をとることになります。 そこで、お聞きしたいことがあるのですが、 検索結果について、 (1)フォームに表示する (2)クエリで表示する (3)検索結果をさらに他の絞込みに利用する (4)(3)の場合、フォームに表示する のどれでしょう。あるいは他の方法でしょうか。 また、(1)のような場合、フォームのレコードソース になるクエリ、あるいはSQL文には部署以外に 抽出条件があるフィールドが存在しますか。

lotsqq
質問者

補足

piroin654さん 解って戴きありがとうございます。 下記に記しました。 検索結果について、 >(1)フォームに表示する >(2)クエリで表示する  私の考えていたのはクエリと考えていました。 >(3)検索結果をさらに他の絞込みに利用する  はい、日付と部署とでできたらいいのですが。 >(4)(3)の場合、フォームに表示する  フォームとクエリの表示よく理解できていないかもしれませんが  結果が表示できるといいのかなと。 のどれでしょう >また、(1)のような場合、フォームのレコードソース >になるクエリ、あるいはSQL文には部署以外に             ---------------? >抽出条件があるフィールドが存在しますか。  私の理解が間違えているかも知れないのですが、  上記(3)で言っている日付と部署の抽出はこれに  該当しませんか? 以上、どうぞよろしくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

追加 "総務" Or "経理" Or "資材" のようにすれば必要な部署が抽出されます。 ただし、 "総務" And "経理" のようにAndで結ぶと抽出されません。 And条件、Or条件についてはヘルプや WEBでしらべてみてください。

lotsqq
質問者

補足

piroin654さん ありがとうございます。助かります。 フォームの >検索画面は >部署名:部署名を入力するところ    コマンドボタンで実行です   上記、部署名のところに "総務" Or "経理" Or "資材"は入らないですね?  クエリの抽出のところに"総務" Or "経理" Or "資材"を入れると次に  "総務" Or "資材"の二つだけを抽出する場合はその都度、抽出のところを  書き換えなければいけませんか?  できたらクエリのもとにして作ったフォームの検索画面で総務、経理と資材を  抽出、または総務と経理だけを抽出できると思うのでうが、  伝わりにくい説明で申し訳ありませんがよろしくお願いいたします。

関連するQ&A

専門家に質問してみよう