レコード更新について
環境:ACCESS2000
状況:メインフォーム(マスター登録ボタン付)
サブフォーム(マスターテーブルをドラッグして貼り付けたもの)
マスターテーブル(品番 / レンタル日 / 返却日 / 貸出状況)
やりたい事:サブフォームに表示してあるデータに
返却日をサブフォーム上で入力し(件数は不定)、そして
返却日が入力されたものの貸出状況を"返却済"と変更登録したい。
現状:コマンドボタンのイベントに
Private Sub マスター登録ボタン_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("マスターテーブル", dbOpenDynaset)
If rs!返却日 <> "" Then
rs.Edit
rs!貸出状況 = "返却済"
rs.Update
End If
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub
しかし、上記コードでは返却日はマスターテーブルに反映しているのですが
貸出状況が変わってなく、どのようにしたら良いかわからないため
ご質問させて頂きました。
まだまだACCESS勉強中で未熟なため、検討違いなコードになっているかもしれませんが
コードの修正・改善、または全く違う方法等ご教授願えればと思います。
もしかすると、返却日が入っているものすべての貸し出し状況を「返却済」に変えたいのであれば、
更新クエリを一つ作るのが一番楽です。 sqlを実行させる形でも同じことです。
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "UPDATE マスターテーブル SET 貸出状況 = '返却済' WHERE 返却日 Is Not Null"
set db = nothing
勉強のためにいうなら、
(一件ずつチェックしながら更新する場合、)
Set rs = db.OpenRecordset("マスターテーブル", dbOpenDynaset)
do while not rs.eof
If not isnull(rs!返却日) then
rs.Edit
rs!貸出状況 = "返却済"
rs.Update
end if
rs.movenext
loop
・・・・
のような形と、そのほかには(対象レコードのみを抽出して更新する方法)
Set db = CurrentDb
strSQL = "SELECT * FROM マスターテーブル WHERE rs!返却日 is not null"
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
do while not rs.eof
rs.Edit
rs!貸出状況 = "返却済"
rs.Update
rs.movenext
loop
・・・・
などがあります。(debugしていません。)
>Set rs = db.OpenRecordset("マスターテーブル", dbOpenDynaset)
特定のレコードを開いているのではなくて、マスターテーブルを開いて一番最初に出てきたレコードを更新している。
ので、
strSQL = "SELECT * FROM マスターテーブル WHERE 品番 = '" & TEXT1 &"'"
としておいて、
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
とするか、
UPDATE マスターテーブル SET 貸出状況 = '返却済' WHERE 品番 = '" & TEXT1 &"'"
のようなSQLを(更新クエリでも)を実行させればレコードを変更させることができます。
(TEXT1は品番が入っているテキストボックスのことです。)
質問者
お礼
ShowMeHowさん、ありがとうございます。
すみません。私SQLまだ使った事なくてあまりわかってないのですが
なんとなくコード書いてみたところ、エラーが出てしまいました。
Private Sub マスター登録ボタン_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL
Set db = CurrentDb
strSQL = "SELECT * FROM マスターテーブル WHERE 貸出状況 = '貸出中'"
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) ← ここで実行時エラー424
オブジェクトが必要です。
If rs!返却日 <> "" Then
rs.Edit
rs!貸出状況 = "返却済"
rs.Update
End If
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub
今SQL文について調べてはいるのですが、まだわかっておらず
どこがどのように間違っているのか教えて頂ければと思います。
宜しく御願い致します。
質問者
補足
ShowMeHowさん、すみません。
先ほどのエラーは、私の打ち間違いでした。
>Set rs = d.OpenRecordset(strSQL, dbOpenDynaset)
db⇒d になっていました。
これでいけるかと思ったのですが、貸出状況が反映されなかったです。
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL
Set db = CurrentDb
strSQL = "SELECT * FROM マスターテーブル WHERE 貸出状況 = '貸出中'"
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
If rs!返却日 > # Then/1/1900# Then ← <>"" が悪いと思い変更
rs.Edit
rs!貸出状況 = "返却済"
rs.Update
End If
上記コードでエラーは出ませんが、最初にヒットしたレコードのみ
"返却済"に変わっておりました。
これを返却日を入れた全てに対応させるにはどこを改善、又は
コード追加したら良いですか?
宜しくお願い致します。
お礼
ShowMeHowさん、色々ありがとうございます。 今回は、更新クエリでやる事にしました。 1つずつチェックする do while~ は少し考え込む時間が長かったのが 難点で、最後の抽出&更新より更新クエリの方がイメージだったので。 今回初めてSQL関連をいじったのですが、とても勉強になりました。 少し自分ができる動作の範囲が広がったと思います。 とても感謝です。 更新クエリは、動作確認取れました。 思い通りのイメージでした。 誠にありがとうございました。