アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセス2003で次のエラーが発生します。

実行時エラー 3020
Update または CancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です。

以下のソースは、「テスト」フォームにtestフィールドがある簡単なデータベースですが、全レコードを最初から最後までtestフィールドの先頭に"abc "を付加するというものです。

Public Sub Test()
Dim form_name as String
Dim frmObj As Form
Dim rstObj As Recordset
Dim fld_dat As String

form_name = "テスト"
DoCmd.OpenForm form_name
Set frmObj = Application.Forms(form_name)
Set rstObj = frmObj.Recordset

'先頭のレコードに移動する
DoCmd.GoToRecord acDataForm, form_name, acFirst
Do
fld_dat = rstObj.Fields("test").Value
fld_dat = "abc " & fld_dat
rstObj.Fields("test").Value = fld_dat '<--- *** ここでエラー ***

'次のレコード
DoCmd.GoToRecord acDataForm, form_name, acNext

DoEvents

Loop While frmObj.NewRecord = False

End Sub

A 回答 (1件)

RecordSetを使って編集をするのでしたら、エラーメッセージに出ている通り、


Editメソッドを使用する必要があります。
(また、レコード移動にはGotoRecordではなくMoveFirstやMoveNextが必要)

逆にフォーム上で処理するのでしたら、フィールドではなくコントロールへの
代入にする必要があります。

提示されたコードでは、この2通りの方法がごっちゃになってしまっています。


とりあえず、(画面描写が入る分、処理は遅くなるものの)私が使い慣れていると
いうことで、後者のコードを参考に載せます。
('「test」フィールドをコントロールソースとするコントロールの名を「Test」としました)


Sub テスト()

Dim form_name As String
Dim frmObj As Form
Dim Cntl As Control
Dim fld_dat As String

form_name = "テスト"
DoCmd.OpenForm form_name
Set frmObj = Application.Forms(form_name)
Set Cntl = frmObj.Controls("Test")  

DoCmd.GoToRecord acDataForm, form_name, acFirst

'万が一レコード未入力(全削除)後に実行してもエラーにならないよう、
'条件を「Loop」側から「Do」側に移動しました。
Do While frmObj.NewRecord = False
  fld_dat = Cntl.Value
  fld_dat = "abc " & fld_dat
  Cntl.Value = fld_dat
  DoCmd.GoToRecord acDataForm, form_name, acNext
  DoEvents
Loop

End Sub


・・・以上です。

ただ、今回のように追加する文字列がすべて同じなのでしたら、更新クエリを
使用した方が効率がよいように思います。
(「テスト」フォームのレコードソースを「テーブルA」としました)
*フォームの更新後イベント等を利用して、他のフィールドを連動更新する場合は不可*

Sub テスト2()
On Error Goto エラー処理

Dim StrSQL As String
Dim form_name As String

StrSQL = "UPDATE テーブルA SET テーブルA.test = 'abc ' & テーブルA!test;"
form_name = "テスト"
DoCmd.SetWarnings False  'SQL実行時の確認メッセージを停止
DoCmd.RunSQL StrSQL
DoCmd.OpenForm form_name  'フォームを開いて更新後の状態を確認

終了処理:
  DoCmd.SetWarnings True  'メッセージの停止を解除
  Exit Sub
エラー処理:
  MsgBox Err & ":" Error$,,"テスト(Sub)"
  Resume 終了処理
End Sub


なお、コードでSQL文を作成するのではなく、予めクエリとして保存しておいて、
それを使うこともできます。
(この場合は、「DoCmd.RunSQL StrSQL」を「DoCmd.OpenQuery "(クエリ名)"」に変更し、
 他のStrSQLが出てくる行はすべて削除します)
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A