dポイントプレゼントキャンペーン実施中!

お世話になります。
Access2000を使用しております。

削除ボタン(cmd削除)を用いてリストボックス(lst一覧)で選択したレコードをテーブルから削除したいのですが、以下の●→の個所でエラーがでて困っております。

サンプルコードをコピーして使用しております故、原因・理由が解りません。
何方かご教授の程よろしくお願いいたします。
---
Private Sub cmd削除_Click()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim var条件 As Variant
Dim var行 As Variant
Dim mySQL As String
Dim i As Long

For Each var行 In Me.lst一覧.ItemsSelected
var条件 = var条件 & IIf(Not var条件 = "", ",", "") & _
Me.lst一覧.Column(0, var行)
Next

If Not var条件 = "" Then
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset

mySQL = "SELECT * FROM T_自社情報 WHERE ID IN (" & var条件 & ")"
●→ rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic
Do Until rs.EOF
rs.Delete
rs.MoveNext
Loop
For i = 0 To Me.lst一覧.ListCount - 1
Me.lst一覧.Selected(i) = False
Next
Me.lst一覧.Requery
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End If

End Sub
---
実行時エラー -2147217904
(1つ以上の必要なパラメータの値が設定されていません。)

T_自社情報の各フィールド
自社No.  (オートナンバー)
会社名
郵便番号
住所
TEL
FAX
備考

A 回答 (8件)

s_husky です。



複数選択可能な設定で複数レコードを削除したい。
しかも、リストは複数の列であるということですね。
よく読まなかったもので済みません。

Private Sub コマンド0_Click()
  Dim I As Integer
  Dim N As Integer
  
  N = Me.リスト_削除対象.ListCount - 1
  For I = 0 To N
    If Me.リスト_削除対象.Selected(I) Then
      CnnExecute "DELETE FROM Table1 WHERE ID=" & _
            Me.リスト_削除対象.Column(0, I)
    End If
  Next I
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。とても助かります。

上記の指示頂いたコードで早速試してみたところ、CnnExecuteの箇所でエラーが出てしまいます。
何度も申し訳ありませんが、再度ご教授お願いできないでしょうか。
よろしくお願いします。

お礼日時:2006/12/20 10:44

s_husky です。



主キー列名は、[ID]ではなく[自社No.]ではありませんか?
主キー列名を、[ID]ではなく間違って[IDD]と書いたら同じエラーを取得したとの回答。
「この辺りのチェックを!」ということです。
    • good
    • 0
この回答へのお礼

おはようございます。

>主キー列名は、[ID]ではなく[自社No.]ではありませんか?
仰る通りです。
ほんとどうもすみませんでした。
おかげさまで質問タイトル通りの結果を得る事が出来ました!

本当にありがとうございました!

お礼日時:2006/12/21 09:23

s_husky です。



同じエラーを返すことに成功しました。

? CnnExecute( "DELETE FROM TEST WHERE IDD=3")
False

つまり、Access.adp ではなく Access.mdb でテストしました。
単なるテーブル名か列名のミスです。
Access.adp と Access.mdb とではエラー内容が違っていました。
重ね重ねのミスお詫びします。
    • good
    • 0
この回答へのお礼

ありがとうございます。

>単なるテーブル名か列名のミスです。
との事ですが、表記のミスでしょうか。
それとも何か使用してはいけない文字を使用しており
それによるミスなのでしょうか。

お礼日時:2006/12/20 18:02

s_husky です。



CnnExecute 関数が感知したエラーを表示しています。
ですから、何らかの理由でSQL文の実行時にエラーが発生しています。

Private Sub コマンド0_Click()
  CnnExecute "Delete FROM T_自社情報 WHERE ID=3"
End Sub

ところで、これを実行すると、列[ID]=3のレコードが削除されます。
エラーは確認されません。
ということは、SQL文そのものには誤りはないと考えられます。
また、SQL文のエラーは、それはそれとして返ってくる筈です。

もしかしたら、[T_自社情報]自体をオープンできますか?
それ自体がクエリか何かでパラメータに問題があるとか・・・。
判りません。

※ウーン!これは、経験豊かなプロの出番かも・・・。
※力不足ですみません。
    • good
    • 0

s_husky です。



以下の関数を適当なモジュールにコピペして下さい。
一応、トランザクションのロールバック機能もあります。
一応、CnnErrors も表示します。

Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
   MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & CnnErrors.Description & Chr$(13) & _
      "・Err.Number=" & CnnErrors.Number & Chr$(13) & _
      "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
      "・SQL Text=" & strSQL, _
      vbExclamation, " ADO関数エラーメッセージ"
End Sub

Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
   Dim isOK As Boolean
   Dim cnn As ADODB.Connection
  
   isOK = True
   Set cnn = CurrentProject.Connection
   With cnn
     .Errors.Clear
     .BeginTrans
     .Execute strSQL
     .CommitTrans
   End With
Exit_CnnExecute:
On Error Resume Next
   cnn.Close
   Set cnn = Nothing
   CnnExecute = isOK
   Exit Function
Err_CnnExecute:
   isOK = False
   If cnn.Errors.Count > 0 Then
     ErrMessage cnn.Errors(0), strSQL
     cnn.RollbackTrans
   Else
     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
        vbExclamation, " 関数エラーメッセージ"
   End If
   Resume Exit_CnnExecute
End Function
    • good
    • 0
この回答へのお礼

本当にありがとうございます。

早速上記のコードを示唆通りコピペしたところ、以下のメッセージが表示されます。
また、何度も申し訳ありませんがご教授の程よろしくお願い致します。
m(__)m

ADO関数エラー
Err.Discription =1つ以上の必要なパラメータの値が設定されていません。
Err.Number = -2147217904
SQL State =
SQL Text=Delete FROM T_自社情報 WHERE ID=3

お礼日時:2006/12/20 15:04

s_husky です。



もしかして、選択したリストだけを削除するのであれば次のようです。

Private Sub コマンド0_Click()
  CnnExecute "DELETE FROM Table1 WHERE ID=" & _
        Me.リスト_削除対象.ItemData(Me.リスト_削除対象.ListIndex)
End Sub
    • good
    • 0

少し、ルーチンが複雑かなと思いました。


次のように書くことも可能かと思います。

Private Sub コマンド0_Click()
  Dim I  As Integer
  Dim N  As Integer
  
  N = Me.リスト_削除対象.ListCount - 1
  For I = 0 To N
    CnnExecute "DELETE FROM Table1 WHERE ID=" & Me.リスト_削除対象.ItemData(I)
  Next I
End Sub

長く、なりますので CnnExecute 関数は後ほど補足します。
    • good
    • 0

検証したわけではありませんが気になったのは


『var条件 = ""』で十分なのか。
Debug.Print で何が格納されているか。,,,,,,,,,,

レコードセットを回さずとも
mySQL = "SELECT * FROM ・・・をmySQL = "Delete * FROM・・・
にして
cn.Execute mySQL ・・・
にした方が速いのではないか。

ボケレス御免
    • good
    • 0

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

関連するカテゴリからQ&Aを探す