ACCESS97でSQL文中の変数の扱い方について

このQ&Aのポイント
  • ACCESS97を使用しています。SQL文中で変数を使用する方法がわかりません。具体的には、フォーム上で入力された値によって、SQL文の条件を変更したいです。
  • フォーム上で入力された値に応じて、SQL文の条件を変更する方法を教えてください。具体的には、項目(2)の値によって、項目(4)または項目(5)を選択し、入力_2の値との一致するデータを取得したいです。
  • ACCESS97のSQL文で変数を使用して、フォーム上で入力された値に基づいてデータを取得したいです。具体的には、項目(2)の値によって、項目(4)または項目(5)を選択し、入力_2の値との一致するデータを取得したいです。パラメーターが少ないとエラーが出てしまいます。
回答を見る
  • ベストアンサー

条件によって、Where分のキーを変更させたい

ACCESS97を使用しています。SQL文の中で、変数?を使用したいのですが、 その扱いがわかりません。 例) 下記のようなテーブルがあります。 項目(1) 項目(2) 項目(3) 項目(4) 項目(5) 1 A 100 EE RR 2 B 200 EE RR 3 A 100 EE RR 4 A 100 CC EE 5 B 300 RR EE 6 A 100 RR EE 7 B 200 CC RR フォーム上で、項目(2)を入力します。(入力_1) また、もう1つ、データを入力します。(入力_2、EE,CC,RR) 項目(2)の値によって、 Aの時、項目(4) Bの時、項目(5)をみにいくようにしたいのです。 例えば、入力_1=A、入力_2=EEの時、 合計値200 (項目(1)は、1,3)     入力_1=B、入力_2=EEの時、 合計値300 (項目(1)は、5) この時、下記のようなロジックを組んでみたのですが パラメーターが少なすぎます と出てきます。  (SELECT対象は、一旦 * にしています) Dim KEY As String If (ME.入力_1 = "A") Then  '条件は別入力です。 KEY = "項目(4)" Else KEY = "項目(5)" End If Set RS = Nothing Set DB = Nothing Set DB = CurrentDb() strSQL = "SELECT * FROM テーブル WHERE " strSQL = strSQL + "KEY='" & Me.入力_2 & ";" strSQL = strSQL + "AND 項目(2)='" & Me.入力_1 & "'" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) KEY をどのようにすればいいのかがわかりません。 宜しくお願いします。

  • cdma
  • お礼率36% (91/247)

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 内容はともかく、SQLの記述ミスは以下の通りです。 誤:strSQL = strSQL + "KEY='" & Me.入力_2 & ";" 正:strSQL = strSQL & "[" & KEY & "]='" & Me.入力_2 & "' " 誤:strSQL = strSQL + "AND 項目(2)='" & Me.入力_1 & "'" 正:strSQL = strSQL & "AND [項目(2)]='" & Me.入力_1 & "';" フィールド名はかっこが使われているので、念のため[]で括っておいた方が無難かも知れません。(なくてもOKかも知れません。) なお、直接関係ありませんが、文字列の結合は「+」ではなく「&」を使用するようにしましょう。

cdma
質問者

お礼

ありがとうございました。 上手くいきました。

関連するQ&A

  • SQLの条件分に ( ) が入っている場合

    Access97を使用しています。 SQLの条件で、項目名に '(' が入っている場合 どうすればいいのでしょうか? 例えば 下記の場合 " 式に未定義関数 '出荷日'があります " と出てきます。 Set DB = CurrentDb() strSQL = "SELECT SUM(数量) AS A FROM GAH100 WHERE " strSQL = strSQL + "出荷日(新)='" & Me.日付入力 "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) 項目名に() が無いようにするしかないのでしょうか?

  • "カレントレコードがありません"とでてきます

    Access97を使用しています。 データは テーブルAの項目B、項目Cが下記のようにあるとします。 フォーム上のText"B"に項目Bを入力します。 項目B 項目C 11 a 11 b 22 aa 22 bb 22 cc 33 aaa 33 ccc この時 Set DB = CurrentDb() strSQL = "SELECT * FROM A WHERE " strSQL = strSQL + "B='" & Me.B & "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) RS.MoveFirst RS.MoveLast m = RS.RecordCount For i = 1 To m COIL_N = RS.Fields("C") Call RS.MoveNext Next i 上記のようなモジュールですが、例えば 項目Bの"11"を選んだ時、項目Cの二番目のデータbが 取得できません。 "カレントレコードがありません"とでてきます。何故でしょうか?

  • Recordcountについて

    ACCESS97を使用しています。 テーブルAの項目1の中で、テキスト1に入力した値をキーに SELECTし そのデータ件数を知りたいのです。 しかし、下記のようにすると、0件の時はintcountは 0 になるのですが 1以上の場合、複数でも intcountは 1になります。 1件と 2件以上が区別できません。 何故でしょうか? Set db = CurrentDb() strSQL = "SELECT * FROM テーブルA WHERE " strSQL = strSQL + "項目1='" & Me.テキスト1 & "';" Set RS1 = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) intcount = RS1.RecordCount If (intcount = 0) Then Me.テキスト2 = "使用無し" ElseIf (intcount = 1) Then Me.テキスト2 = "1件使用" ElseIf (intcount > 1) Then Me.テキスト2 = "複数使用" End If

  • ACCESS97のMAX関数について

    ACCESS97を使用しています。 "関数"の使い方が全くわかりません。 (というより、SQLも含めて…)  テーブル"TBL_A"の"項目B" から最大値を変数SDHSに取得したいのですが どうすればいいのでしょうか?  Dim db As DATABASE Dim RS As Recordset Dim SDHS, strSQL As String Set db = CurrentDb() strSQL = "SELECT Max(項目B) FROM TBL_A ;" Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) SDHS = Max(項目B)

  • 条件分に数値型は可能?

    ACCESS97を使用しています。 SQLの中で 数値型の場合、条件式に適用できないのでしょうか? 例えば 下記の場合 Set DB = CurrentDb() strSQL = "SELECT * FROM テーブルA WHERE " strSQL = strSQL + "コード ='" & YU(i) & "'" strSQL = strSQL + " AND ラベルNO='" & RA(i) & "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) YU(i)は、文字型、RA(i)は数値型です。 RA(i)で"抽出条件でデータ型が合いません"と出ます。 コードは文字型、ラベルNOは数値型です。数値型では条件として適用できないのでしょうか? 可能な場合、上のような表現ではできないのでしょうか?

  • DAOでのコードをADOへ書き直し

    Access2003、WinXPです。 レコードセットの取得関係をDAOで書いていたのですが ADOに途中から変更しました。 変数宣言を Public db As DAO.Database ⇒Public cn As ADODB.Connection Public rs As DAO.Recordset ⇒Public rs As ADODB.Recordset Public Fld As DAO.field  ⇒Public Fld As ADODB.field レコードセット取得を Set db = CurrentDb      Set rs = db.OpenRecordset(strSQL) ↓ Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open strSQL, cn レコードセット クローズを Set rs = Nothing Set db = Nothing ↓ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing としました。今のところ動いているようですが、 何か勘違い、気をつけないといけない事等ありますでしょうか・・・?

  • Access97 SQLでINSERT されない

    Access97を使って下記のようなモジュールを作成しました。  が、接続DAT にはデータが追加されません。  何故でしょうか?   j = 10 i = 1 strSQL = "" Do Until i = j JIJI = JI(i) strSQL = "INSERT INTO 接続DAT (重複ID,区別記号" strSQL = strSQL & ") VALUES (" strSQL = strSQL & "'" & JIJI & "'" strSQL = strSQL & ", '" & D & "'" strSQL = strSQL & ")" Set DB = CurrentDb() DB.Execute strSQL Set DB = Nothing Set RS = Nothing i = i + 1 Loop

  • DAOでデータベースを二つ開くには?

    環境 Windows2000 VB6 DAOで同じデータベースを開くためのやり方がわかりません。 下記のようにマスタのキーを使用して他のテーブルの 内容を更新したいのですが よろしくお願いします。m(__)m Dim ws As Workspace Dim db As Database Dim qd As QueryDef Dim rs As Recordset Dim STRSQL As String dim strsql2 as string Set ws = DBEngine.Workspaces(0) Set db = ws.Databases(0) STRSQL = "SELECT KEY FROM マスタ" Set qd = db.CreateQueryDef("", STRSQL) Set rs = qd.OpenRecordset() Do While Not rs.EOF strsql2 = "Update data from マスタ where key = " & rs!key ???? rs.MoveNext Loop rs.Close qd.Close db.Close

  • DELETEのwhere句について

    SQL文について教えていただけないでしょうか? 力不足のため苦しんでおります。 宜しくお願い致します。 TBLいいの項目EEが100以外かつFFが50以下で 抽出される全ての項目AAをKEYにしてTBLいいを 削除したいのですがわかりません。 DELETEののwhere句について教えてくいただけ ないでしょうか?。  条件  DB:SQLServer2000   TBLああ AA BB CC DD   TBLいい AA EE FF GG  

  • DBから取得したオブジェクトの受け渡し方法

    はじめましてVB初心者でわけが分からなくなっています。DBをクローズした後に取得したレコードセットを他の関数に渡すにはどうしたらよいでしょうか?おそらく、そんなのcloseせずにやればいいと思うかもしれませんが、可能かどうかがわかりません。どうか教えてくださいよろしくお願い致します。 下記のコードにて行ってます。Set rs = cn.Execute(strSQL)で取得しています。rsをDBを閉じた後も他の関数に渡せるようにしたい訳です。m(..)m Dim cn As Object Dim rs As Object Private Sub getData() Dim strSQL As String Set cn = CreateObject("ADODB.Connection") cn.Open "省略" strSQL = "SELECT * FROM swan" Set rs = cn.Execute(strSQL) Set rs = nothing Set cn.close Set cn = nothing End Sub

専門家に質問してみよう