やりたい事は、
やりたい事ポイント
フォームの非連結テキストボックスの値で、テーブルの値を更新したい
だけの処理です。
いつもなら簡単にVBAで処理できるのですが、SQLの部分でどうしても乗り越えられませんって時に試すといいかもしれませんコードです。
非連結テキストボックスの値で更新したい
stock_editというフォームの上に、select_noというdbo_arrivalというテーブルからレコードを抽出する非連結のテキストボックスと、修正したい数値が入れられる非連結テキストボックスのedit_stockというのを設置しました。
在庫修正というボタンをクリックした時にdbo_arrivalのstockフィールドの値をedit_stockの値に変更したいという処理です。
いつもならこのコードで更新できるのに・・・
Private Sub stock_edit_Click() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim SQL As String On Error GoTo ErrRtn If IsNull(edit_stock) Then MsgBox ("修正データが入力されていません。") Exit Sub End If If MsgBox("選択NOに間違いないですか?更新しますか? yes/no", vbYesNo, "更新確認") = vbYes Then 'SQL = "SELECT * FROM dbo_arrival WHERE no = " & Forms![stock_edit]![select_no] SQL = "SELECT * FROM dbo_arrival WHERE no =" & Me!select_no Set cn = CurrentProject.Connection rs.Open SQL, cn, adOpenKeyset, adLockOptimistic cn.BeginTrans While Not rs.EOF rs!stock = edit_stock rs.Update rs.MoveNext Wend cn.CommitTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing Else MsgBox ("更新しませんでした。") Exit Sub End If ExitErrRtn: DoCmd.ShowAllRecords Exit Sub ErrRtn: MsgBox "エラー: " & Err.description cn.RollbackTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
フォームからの値の引っ張り方でSQL抽出ができないので、色々と試してみましたが、debug.printでSQLを確認すると、
SELECT * FROM dbo_arrival WHERE no = 37
しかし、debug.print rs!stockで確認するとデータが抽出されていません。
一つのレコードを抽出するだけなので、While Not rs.EOF~Wendというループも必要ないように思えますが、外すと
注意ポイント
BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。
となります。
つまり、ループコードが必要とか必要じゃなく、SQLでレコードが抽出されてないのが原因のようです。
いったい何がダメなのでしょうか!?
フィルターで抽出後更新でうまく行った
Private Sub stock_edit_Click() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim SQL As String On Error GoTo ErrRtn If IsNull(edit_stock) Then MsgBox ("修正データが入力されていません。") Exit Sub End If If MsgBox("選択NOに間違いないですか?更新しますか? yes/no", vbYesNo, "更新確認") = vbYes Then Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "dbo_arrival", cn, adOpenKeyset, adLockOptimistic rs.Filter = "no = " & select_no Debug.Print rs!stock ' トランザクションの開始 cn.BeginTrans rs!stock = edit_stock rs.Update ' トランザクションの保存 cn.CommitTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing Else MsgBox ("更新しませんでした。") Exit Sub End If ExitErrRtn: DoCmd.ShowAllRecords Exit Sub ErrRtn: MsgBox "エラー: " & Err.description cn.RollbackTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
結局、SQLで抽出して更新じゃなく、フィルターで抽出して更新という方法になった。
テーブルサイズが巨大になった場合を考えるとどっちがいいのかわかりませんが、動かないんじゃ意味がないので、
ココがポイント
通常のやり方でダメな場合は、フィルターという方法
でも仕方ないですね。