• 締切済み

テキストボックスの値をテーブルに追加

お世話になります。 Access2000 あるテーブルの一覧をフォームのリストボックス(lst_1)に表示し、 そのリストボックスから選択された行を フィールド上の各テキストボックス(非連結)に表示しております。 そこで、表示されているテキストボックスの値を変更した時に テーブルに変更された値を反映させる方法をご教授よろしくお願いします。

みんなの回答

  • soaikats
  • ベストアンサー率58% (14/24)
回答No.5

テーブルに「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)
回答No.4

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

noname#22222
noname#22222
回答No.3

s_husky です。 ErrMessage 関数を使っていました。 同様に下記の回答で紹介しています。 ※なお、プログラマではなく単なる素人ですので参考程度に・・・。

noname#22222
noname#22222
回答No.2

次は、フォームに配置された非連結コントロールの値をテーブルに書き込むサンプルコードです。 各コントロールが更新される都度に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)
回答No.1

>フィールド上の各テキストボックス(非連結)に表示しております。 これをどのようにやっているのかが関係してきますね

Tks1234
質問者

補足

ありがとうございます。 説明不足で御手数を取らせてしまい申し訳ありませんでした。 >フィールド上の各テキストボックス(非連結)に表示しております。 リストボックス(lst_1)のクリック時イベントで txt1 = Me.lst_1.Column(0) のように、各テキストボックスへ値を代入しております。