電子書籍の厳選無料作品が豊富!

アクセス2007の抽出

クエリをもとに検索画面を作り部署の抽出をします、
検索画面は
部署名:部署名を入力するところ    コマンドボタンで実行です    

クエリの部署のフィールドのところに[部署]としていますが
部署を複数抽出する場合どうしたらいいかわかりません。

[部署]のパラメータのところに部署名ひとつ「総務」と入れると総務を抽出してくれます
これを部署を複数抽出したい場合はどうしたらできますか?たとえば総務と経理を抽出
したい場合
部署は30くらいあります。

説明がよく出来なくてすみません
どうぞよろしくお願いいたします。

A 回答 (16件中11~16件)

クエリ式’(((テーブル1部署)In())AND((テーブル1日付)Between[Forms]![frm検索]!


[tx日付FROM]And[froms]![frm検索]!「tx日付TO」))'の構文エラー:;演算子がありません


もし、このようなエラーならば、二つのANDが前後と
くっついているのでAccessがSQL文を解釈できなく
なっている、と思われます。

コード中のSQL文はAccessがSQL文として解釈できる
ように半角のスペースが構文中や構文の途中の末尾
などに入れてあります。もしSQL文を手直しされたならば
一度、張り付けた状態でそのまま使ってみてください。

なお、張り付けるときは、コード表の一番左端に張り付けて
ください。

また、Q_Temp検索をデザインビューで開いてSQLビュー
にすると、以下のようなSQL文が出てきます。

SELECT テーブル1.部署, テーブル1.日付, テーブル1.スケジュール
FROM テーブル1
WHERE (((テーブル1.部署) In ('経理部','人事部')) AND ((テーブル1.日付) Between

[Forms]![frm検索]![tx日付FROM] And [Forms]![frm検索]![tx日付TO]));

これは、実際にリストで経理部、人事部と選んだ状態の
もので、これに日付を入れればクエリが結果を表示
します。このまま日付を無視して開くと空の
クエリ結果が表示されます。


もし、他に表示するクエリ、またはテーブルの
フィールドがあるならば、いくつか入れたSQL文を
表示してもいいですが。


コード中のSQL文はここに張り付けたときに
長いと改行されてエラーを起こしたり、
分かりにくくなったりするのを防ぐために
少し短めに区切ってあります。

この回答への補足

piroin654さん
お世話になります。
途中経過ですが、
Q_Temp検索動きました。本当に良かったです。
まだfrm検索はこれからです。
また、よろしくお願いいたします。

補足日時:2010/08/16 17:40
    • good
    • 0

遅くなりました。

仕事でなかなか時間が取れなくて
急いでまとめました。提案しようとした案も出て
いるみたいなのですが。

[仕様]
テーブル名 テーブル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の中にねじ込んでおきます。
字数一杯

この回答への補足

:piroin654さん
忙しいのにありがとうございます。
なぜか、家のアクセスは停止してしまうerrが続出 なんとか動いています。
もしかしたら家のアクセスは2002で会社が2007の違いでしょうか、これはおきまして

教えて頂いたように作ってみましたがうまくできませんでした。
frm検索から日付をいれて入力しましたが結果がでてこないので
クエリ Q_Temp検索をあけようとすると下記のerrが出ます。

クエリ式’(((テーブル1部署)In())AND((テーブル1日付)Between[Forms]![frm検索]!
[tx日付FROM]And[froms]![frm検索]!「tx日付TO」))'の構文エラー:;演算子がありません
となりQ_Temp検索もあきません

言いたいこと解ってもらえますか、
ここまで教えて頂いてるのにまた申し訳ありませんが助けてください
よろしくお願い致します。

補足日時:2010/08/15 17:22
    • good
    • 0

視点を変えてみませんか。




フォーム「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等で展開して、置き換えれば・・・・
    • good
    • 0

2つや3つならパラメータクエリ([]を条件のところで使う。

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

この回答への補足

imogasiさん
ありがとうございます。

>1度に検索したい部署が最多30社まで設けて置きたいのか。
 一度に検索したいのは1-10くらいです

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

補足日時:2010/08/11 22:07
    • good
    • 0

意図されていることは十分わかりました。



テキストボックスに複数項目を並べて
抽出条件に設定するのは関数を作成し、
クエリを条件に合わせて作成すれば
不可能ではないですが、
30近い項目があるということであれば
非効率なので違う方法をとることになります。

そこで、お聞きしたいことがあるのですが、
検索結果について、
(1)フォームに表示する
(2)クエリで表示する
(3)検索結果をさらに他の絞込みに利用する
(4)(3)の場合、フォームに表示する
のどれでしょう。あるいは他の方法でしょうか。

また、(1)のような場合、フォームのレコードソース
になるクエリ、あるいはSQL文には部署以外に
抽出条件があるフィールドが存在しますか。

この回答への補足

piroin654さん
解って戴きありがとうございます。
下記に記しました。

検索結果について、
>(1)フォームに表示する
>(2)クエリで表示する
 私の考えていたのはクエリと考えていました。
>(3)検索結果をさらに他の絞込みに利用する
 はい、日付と部署とでできたらいいのですが。
>(4)(3)の場合、フォームに表示する
 フォームとクエリの表示よく理解できていないかもしれませんが
 結果が表示できるといいのかなと。
のどれでしょう

>また、(1)のような場合、フォームのレコードソース
>になるクエリ、あるいはSQL文には部署以外に
            ---------------?
>抽出条件があるフィールドが存在しますか。
 私の理解が間違えているかも知れないのですが、
 上記(3)で言っている日付と部署の抽出はこれに
 該当しませんか?

以上、どうぞよろしくお願いいたします。

補足日時:2010/08/11 08:51
    • good
    • 0

追加


"総務" Or "経理" Or "資材"
のようにすれば必要な部署が抽出されます。

ただし、
"総務" And "経理"
のようにAndで結ぶと抽出されません。
And条件、Or条件についてはヘルプや
WEBでしらべてみてください。

この回答への補足

piroin654さん
ありがとうございます。助かります。

フォームの
>検索画面は
>部署名:部署名を入力するところ    コマンドボタンで実行です 

 上記、部署名のところに "総務" Or "経理" Or "資材"は入らないですね?

 クエリの抽出のところに"総務" Or "経理" Or "資材"を入れると次に
 "総務" Or "資材"の二つだけを抽出する場合はその都度、抽出のところを
 書き換えなければいけませんか?

 できたらクエリのもとにして作ったフォームの検索画面で総務、経理と資材を
 抽出、または総務と経理だけを抽出できると思うのでうが、
 伝わりにくい説明で申し訳ありませんがよろしくお願いいたします。

補足日時:2010/08/10 21:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!