プロが教えるわが家の防犯対策術!

お世話になります。

Access2000

あるテーブルの一覧をフォームのリストボックス(lst_1)に表示し、
そのリストボックスから選択された行を
フィールド上の各テキストボックス(非連結)に表示しております。

そこで、表示されているテキストボックスの値を変更した時に
テーブルに変更された値を反映させる方法をご教授よろしくお願いします。

A 回答 (5件)

>フィールド上の各テキストボックス(非連結)に表示しております。


これをどのようにやっているのかが関係してきますね

この回答への補足

ありがとうございます。
説明不足で御手数を取らせてしまい申し訳ありませんでした。

>フィールド上の各テキストボックス(非連結)に表示しております。
リストボックス(lst_1)のクリック時イベントで
txt1 = Me.lst_1.Column(0)
のように、各テキストボックスへ値を代入しております。

補足日時:2006/12/22 13:27
    • good
    • 0

次は、フォームに配置された非連結コントロールの値をテーブルに書き込むサンプルコードです。


各コントロールが更新される都度に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 関数に関しては、下記の<リストボックスの値・・・>の回答を参照して下さい。
    • good
    • 0

s_husky です。



ErrMessage 関数を使っていました。
同様に下記の回答で紹介しています。

※なお、プログラマではなく単なる素人ですので参考程度に・・・。
    • good
    • 0

要は非連結のフォームに既存のレコードを取り出し


そこで入力した値に更新したいということですね

レコードの更新は連結フォームで行うのが簡単なんですが
非連結フォームからやりたいという人も結構いますね
その場合データの整合性チェックなどは全部自分で行わなければいけなくなります
(テーブルに格納できない値を書き込もうとするとコードが止まってしまいます)
その辺はいいのでしょうか?(覚悟はできているのでしょうか?)

後はテーブルに主キーはあるのか
主キーを書き換えることがあるのか
などで難しさが変わってきますね
その辺はどうなんでしょうか
    • good
    • 0

テーブルに「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

こんな感じでどうでしょうか?
    • good
    • 0

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

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

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


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