- 締切済み
テキストボックスの値をテーブルに追加
お世話になります。 Access2000 あるテーブルの一覧をフォームのリストボックス(lst_1)に表示し、 そのリストボックスから選択された行を フィールド上の各テキストボックス(非連結)に表示しております。 そこで、表示されているテキストボックスの値を変更した時に テーブルに変更された値を反映させる方法をご教授よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- soaikats
- ベストアンサー率58% (14/24)
テーブルに「ID」「名称」があり、 lst_1でIDを、txt_1で名称を表示しているとします。 Private Sub lst_1_AfterUpdate() txt_1.Value=lst_1.column(1) End Sub Private Sub txt_1_AfterUpdate() If (<名称をtxt_1.value1とテーブルで比較> = False ) then <名称をtxt_1.Valueで更新するクエリ> End If End Sub こんな感じでどうでしょうか?
- CHRONOS_0
- ベストアンサー率54% (457/838)
要は非連結のフォームに既存のレコードを取り出し そこで入力した値に更新したいということですね レコードの更新は連結フォームで行うのが簡単なんですが 非連結フォームからやりたいという人も結構いますね その場合データの整合性チェックなどは全部自分で行わなければいけなくなります (テーブルに格納できない値を書き込もうとするとコードが止まってしまいます) その辺はいいのでしょうか?(覚悟はできているのでしょうか?) 後はテーブルに主キーはあるのか 主キーを書き換えることがあるのか などで難しさが変わってきますね その辺はどうなんでしょうか
s_husky です。 ErrMessage 関数を使っていました。 同様に下記の回答で紹介しています。 ※なお、プログラマではなく単なる素人ですので参考程度に・・・。
次は、フォームに配置された非連結コントロールの値をテーブルに書き込むサンプルコードです。 各コントロールが更新される都度にcmdUpdateRecord_Clickをコールしてもいいです。 が、ネットワークトラフィックの混雑の原因になるのでお勧めしません。 Private Sub cmdUpdateRecord_Click() Dim StopNow As Boolean StopNow = Not UpdateRecord(Me, "SELECT * FROM id管理表 WHERE id_name='Test'") If Not StopNow Then Message "[id管理表] を更新しました。" End If End Sub UpdateRecord関数は、いわゆる非連結フォームに入力されたデータをデータベースに書き込む関数です。 書き込む表の列とフォームに配置したコントロールとの対応関係は、コントロールの名前で判断します。 もちろん、更新対象を特定する情報も引数として渡す必要があります。 フォーム上の書き込むべきコントロールは field_列名しておきます。 そうすれば、書き込むべきコントロールもテーブルの列名も知ることができます。 非連結フォームを解読してテーブルを更新できる理由です。 Public Function UpdateRecord(ByVal frm As Form, _ ByVal strSQL As String, _ Optional ByVal Echo As Boolean = False) _As Boolean On Error GoTo Err_UpdateRecord Dim isOK As Boolean Dim I As Integer Dim N As Integer Dim fldName AS String Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim fld As ADODB.Field isOK = True Set cnn = CurrentProject.Connection ' ================= ' Begin with: cnn ' ----------------- .Errors.Clear .BeginTrans ← 最初に書かないとエラートラップでエラーが発生する可能性があります。 ' ---------------- ' Recordset Open ' ---------------- Set rst = New ADODB.Recordset rst.Open strSQL, _ cnn, _ adOpenStatic, _ adLockOptimistic ' ================= ' Begin With: rst ' ----------------- With rst IF Not .BOF Then N = frm.Controls.Count - 1 For Each fld In .Fields For I = 0 To N fldName = frm.Controls(I).Name If Left$(fldName, 6) = "field_" Then If Mid$(fldName, 7) = fld.Name Then fld.Value = frm.Controls(I).Value Exit For End If End If Next I Next fld .Update End If End With ' --------------- ' End With: rst ' =============== .CommitTrans ' --------------- ' End With: cnn ' =============== If Echo Then MsgBox " 1件のレコードを更新または保存しました。", vbInformation, " お知らせ" End If Exit_UpdateRecord: On Error Resume Next rst.Close Set rst = Nothing UpdateRecord = isOK Exit Function Err_UpdateRecord: isOK = False If cnn.Errors.Count > 0 Then ErrMessage cnn.Errors(0), strSQL cnn.RollbackTrans Else MsgBox "プログラムエラーが発生しました。(UpdateRecord)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " 関数エラーメッセージ" End If Resume Exit_UpdateRecord End Function なお、単一列であれば、 CnnExecute UPDATE文 で事足ります。 CnnExecute 関数に関しては、下記の<リストボックスの値・・・>の回答を参照して下さい。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>フィールド上の各テキストボックス(非連結)に表示しております。 これをどのようにやっているのかが関係してきますね
補足
ありがとうございます。 説明不足で御手数を取らせてしまい申し訳ありませんでした。 >フィールド上の各テキストボックス(非連結)に表示しております。 リストボックス(lst_1)のクリック時イベントで txt1 = Me.lst_1.Column(0) のように、各テキストボックスへ値を代入しております。