- ベストアンサー
サブクエリ内のORとANDについて
見にくくて申し訳ないです。 以下のSQLについてなのですが、 (1)のSQLでは正常にフォームが開きます、 (2)のSQLで実行しますと、 「実行時エラー3163: The field too small to accept of data you attempted to add.Try inserting less data.」 が出てしまいます。(1)と(2)SQLの違いは、2つの条件をANDかORで結んでるところなのですが なぜORだけにエラーが出るのか原因がわかりません・・ お時間がある方、よろしければご教授ください。 よろしくお願い致します。 (1) DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN(select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC'))) AND (tbl_press.UNIT = 1)" (2) DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN(select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC'))) OR (tbl_press.UNIT = 1)"
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すみません。まだ原因が分かりません・・・。 もしかしたら、なのですが、検索条件のカッコの位置は正しいですか? 検索の意味合いが分からないので、amoamo様に確認していただくほか無いのですが・・・。 もしかしたら、以下の条件でよいのではないか、と思ったのですが。カッコの位置だけが違います。 DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN(select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC') OR (tbl_press.UNIT = 1)))" 意味合いをよく検討して、SQLを見直していただけますか。
その他の回答 (4)
- oscarity
- ベストアンサー率37% (11/29)
先のANO#2回答にあるように括弧の位置が悪いんじゃないのかと。。。 (1)の条件だと、「・・・な条件のtbl_press.IDに含まれるQ_kyogo.IDが欲しいな、ついでにUNIT=1もね!」って感じ。これってANDでつながれるレコードを別々のクエリで引っ張ってくっつけたのと同じでしょ? (2)だと、「・・・な条件のtbl_press.IDに含まれるQ_kyogo.IDが欲しいな、ところでUNIT=1も?」 ORの前のクエリは理解できるけど、後のクエリを走らせることってできるのかな? もし、クエリの求めるものが、ANO#2の書いたように ” [Q_kyogo.ID]が以下のID群に含まれること。 tbl_press.メーカー IN('ABC') なるレコードのID もしくは tbl_press.UNIT = 1 なるレコードのID ” って具合?だとすれば、括弧の位置を変えて、 DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN (select tbl_press.ID from tbl_press where tbl_press.メーカー IN ('ABC') OR (tbl_press.UNIT = 1) ) )" すなわち、 DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN (select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC') OR (tbl_press.UNIT = 1)))" 私の仮定があなたのやろうとしてることと一致していれば幸いです。 で、クエリの条件を作りにくいときは、CとかVBでやるように、意味が通る範囲で段落を丁寧に作って、括弧の位置を確認することをお薦めします。
お礼
oscarityさん ご返信ありがとうございます。 ご指摘の通り括弧の位置が悪かったです。 段落をつける事も今回勉強させていただきました。。 貴重なアドバイスありがとうございます!
- space_needle
- ベストアンサー率48% (174/362)
#1のspace_needleです。 いくつか、確認させてください。 ・ORの時、エラーが発生している場所は、DoCmd.OpenFormのところなのですよね? エラーメッセージが出たとき、デバッグボタンを押すと、DoCmd.OpenFormの部分がハイライト表示されるのですよね? ・DoCmd.OpenFormメソッドを、省略せずに全て書いてみてください。 ・何か、Access標準以外のコントロールは使用していませんか?できれば、使用しているコントロールをお教えください。 よろしくお願いします。
補足
space_needleさん 確認の回答です。 >・ORの時、エラーが発生している場所は、DoCmd.OpenFormのところなのですよね? エラーメッセージが出たとき、デバッグボタンを押すと、DoCmd.OpenFormの部分がハイライト表示されるのですよね? A.その通りです。 >DoCmd.OpenFormメソッドを、省略せずに全て書いてみてください。 A.これは(2)のままです。省略しているところはありません。ちなみにこのメソッドは、ボタンクリック時のイベントで実行されます。 >何か、Access標準以外のコントロールは使用していませんか?できれば、使用しているコントロールをお教えください。 A.標準のもの以外使用しておりません。 ライブラリは ・Visial Basic For Applications ・Microsoft Access 9.0 Object Library ・Microsoft DAO 3.6 Object Library ・OLE Automation ・Microsoft ActiveX Data Objects 2.1 Library space_needleさんはじめ皆さんのアドバイスを参考に試行錯誤しておりますが、状況は変わりません・・・ (2)のSQLをクエリデザインに貼り付けて実行してもまったく同じエラーが返ってきます。 回答者の方々の迅速なレスポンスに感謝いたします。
- Gin_F
- ベストアンサー率63% (286/453)
Q_kyogo.ID IN(select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC') ) ) OR (tbl_press.UNIT = 1)" 括弧の数があっていないような。。 あと、なぜ IN('ABC') を使っているのでしょうか? 条件が一つなら、普通に = を使ってもいいと思いますけど。。 Q_kyogo.ID IN(select tbl_press.ID from tbl_press where (tbl_press.メーカー = 'ABC') OR (tbl_press.UNIT = 1)"
お礼
Gin_Fさん、ご返信ありがとうございます。 INを使っているのは、動的にINの中身が変化するため(条件が増えたり減ったり)です。通常ならSQL文自体は変数に入っていますが、今回は説明のためということで。。
- space_needle
- ベストアンサー率48% (174/362)
Microsoft Access ですよね? エラーメッセージを見る限り、tbl_pressの、UNITが1のレコードが多すぎるのでは無いでしょうか。 SQLの文法的には、引用された部分に関してエラーはありません。 エラーメッセージは直訳すると、「あなたが加えようと試みたデータを受け入れるにはフィールドが小さすぎます。もっと少ないデータを入れるのを試してください」という感じです。
お礼
space_needleさん、さっそくのご返信ありがとうございます。 肝心な事をいい忘れてました。 Access2000の、VBAでの質問です。 文法的にエラーがないとなると、あとはテーブルの中身の問題なのでしょうか? 今回作っているのは参照しかできないデータビューアなので、インサートやアップデートクエリは一切使っておりません。エラーメッセージの直訳を拝見すると、インサートするときのメッセージ?と感じてしまうのですが。。勉強不足ですみません。 UNITが1のレコードが多すぎて、このデータを削除するとなると、ビューアとしての意味がなくなってしますので…どうにもならないものでしょうか? 重ね重ねの質問で恐縮ですが、お時間のありますときに ご教授くださいましたら幸いです。
お礼
sapace_needleさん たびたびのアドバイス本当にありがとうございます。 原因は括弧の位置でした。問題は解決です! まさか質問した日に解決してしまうなんてビックリです。貴重なお時間を割いていただき感謝しております。