- 締切済み
フォームで 保存ボタンを押して保存する方法【MS Access2000】
初めて質問させて頂きます。宜しくお願いいたします。 MS Access2000を使用して会社の顧客管理をしていおり、 現在フォームに表示されたデータを更新・修正等をした場合 修正をした時点で、元のテーブルの情報も変更されてしまいます。 これを、修正等が終了して、例えば【保存】というボタンを作成し、 それを押して始めてテーブルに反映させるという仕様にしたいと 思っています。 ご回答・助言をなにとぞ宜しくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
補足: Access で非連結フォーム仕様は考え物。 非連結フォームはクライアント・サーバーシステムでのネットワークの混雑回避が目的。 スタンドアロンで仕掛ける必要はないと思います。 更新ボタンと復元ボタンを持たせて逃げて良いと思います。
customer: テーブル [id]_[company]_________[kname]________[zipcode]__[address_1]________[address_2]__________[building]______[phone] _1___スポーツランド_____鈴木 義男____1500001__東京都 渋谷区__渋谷 2-20-20_SLビル________034303333 _2___有田スポーツ店___有田 喬_______1500002__東京都 渋谷区__渋谷 2-20-30__並木ビル 3F_034613838 customer: フォーム ===================================================== id_____________[id_____] <----------名前=id、連結 company____[非連結_______]<-----名前=field_company、非連結 kname_______[非連結_______]<-----名前=field_kname、非連結 zipcode______[非連結__]<--------名前=field_zipcode、非連結 address_1___[非連結__]<--------名前=field_address_1、非連結 address_2___[非連結__]<--------名前=field_address_2、非連結 building______[非連結_____]<-------名前=field_building、非連結 phone________[非連結_____]<-------名前=field_phone、非連結 ----------------------------------------------------- [Update][Delete] ===================================================== このように、主キー列[id]または[coutomer_num]だけを連結したフォームを用意します。 普通にフォームを生成した後に非連結にされてもいいです。 そして、連結列以外のテキストコントロールの名前を’field_'+'列名’にします。 Private Sub cmdUpdate_Click() UpdateRecord Me, "SELECT * FROM icustomer WHERE id=" & Me.id, True End Sub Private Sub Form_Current() If Not Me.NewRecord Then DisplayRecord Me, "SELECT * FROM customer WHERE id=" & Me.id End If End Sub こういう仕掛けですと、このように DisplayRecord関数でデータを表示することが可能です。 こういう仕掛けですと、このように UpdateRecord関数で更新することが可能です。 これに、新規レコード発生時の主キーの生成の仕掛けが加わると半非連結フォームの仕組みが出来上がります。 ※昔から知られているいわゆる非連結フォームの仕掛けを主キーだけ連結させることでより簡略化したものです。 ※このように、書くべきコードは極めて少ないやり方です。 ※が、当然のように UpdateRecord関数、DisplayRecord関数は自作する必要があります。 Public Function DisplayRecord(ByVal frm As Form, _ ByVal strQuerySQL As String) As Boolean On Error GoTo Err_DisplayRecord Dim isOK As Boolean Dim I As Integer Dim N As Integer Dim rst As ADODB.Recordset Dim fld As ADODB.Field isOK = True Set rst = New ADODB.Recordset rst.Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not rst.BOF Then ' ================= ' Begin With: frm ' ----------------- With frm N = .Controls.Count - 1 For Each fld In rst.Fields For I = 0 To N If Mid$(.Controls(I).Name, 7) = fld.Name Then .Controls(I).Value = fld.Value Exit For End If Next I Next fld End With ' --------------- ' End With: frm ' =============== Else MsgBox " フォームに表示する情報はありません。(DisplayRecord)", vbInformation, " お知らせ" End If Exit_DisplayRecord: On Error Resume Next rst.Close Set rst = Nothing DisplayRecord = isOK Exit Function Err_DisplayRecord: isOK = False MsgBox "実行時エラーが発生しました。(DisplayRecord)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DisplayRecord End Function Public Function UpdateRecord(ByVal frm As Form, _ ByVal strSQL As String, _ Optional 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 ' ----------------- With cnn .Errors.Clear .BeginTrans 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 ' --------------- ' 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
- noah7150
- ベストアンサー率46% (116/251)
#2ののあです。 フォームが単票形式ならばESCを押せば元に戻せるはずですが試されましたか? 別レコードに移らない限りはDBに対して変更は行われていないはずです
- bonaron
- ベストアンサー率64% (482/745)
こちらがご希望のものかと思います。 http://www.accessclub.jp/bbs2/wforum.cgi?no=35561&reno=35541&oya=35541&mode=msgview&page=0
お礼
ご返答ありがとうございます。 まだ試せておりませんがたぶん求めているもののようです。 アクセスのバージョンが違ったのが若干の不安が・・・。 トライあるのみということで、まずは反映してみます。 ありがとうございますm(_ _)m
- noah7150
- ベストアンサー率46% (116/251)
Accessの変更点の確定、つまりデータベースへの確定は行を移動した時となります 単票形式で画面を作られているなら質問のような造りにすることも可能ですが、一覧形式で作成している場合は無理です。 これはAccessの仕様で基本的には変更しようがありません。 Access開発時の考え方なのでしょうね。 共有した場合、変更箇所が逸早く他の端末での操作に反映させると考えられたのと思います。 ちなみに修正した時点で保存は行われていませんので間違って元に戻したい場合はESCキーを押すと修正を止め元の値に戻してくれます 尚、カーソルのあるフィールドが修正中の場合そのフィールドのみを元に戻し、フィールド移動直後の場合レコード全体が元に戻ります。 2回押せば必ずレコード全体が変更前に戻ります。 一覧形式で複数レコードを変更後に保存ボタンで保存したい要求があるならNo1の回答者さんが書いておられるようにコピーしたテーブルを修正後に保存で元のテーブルに戻す または、それが出来るocxを購入しAccessに組み込むかしかないようです
お礼
ご回答ありがとうございます。 形式は単票形式となっております。 間違えた場合に変更前に、戻るのはとても欲しい機能?です。 ワークテーブルを利用した方法を検討いたします。 ご回答ありがとうございましたm(_ _)m
- Pakkun10
- ベストアンサー率44% (22/50)
データの持ち方や表示の仕方によっていろいろな方法があると思いますが、 たとえば、ワークテーブルを使う方法などがあります。 編集したいデータを選択したら、元のテーブルと同じ設定のワークテーブルにデータをコピーします。 編集が終わったら、ワークテーブルのデータを元テーブルに書き込みます。 また、画面にはテーブルをソースとして使用せず、テキストボックスに直接データを表示したりします。 保存時にそれを元のテーブルに書き込みます。 どちらの方法にせよ、ある程度はVBAが必要になると思われるので、 それをふまえて検討してみてください。
お礼
さっそくのご回答ありがとうございます。 データの持ち方は、一番基本的な形で、 一人の情報を一つのレコードに書いてある状態です。 VBAに関しましては、ほんとにさわり程度しか したことがありませんので、ワークテーブルで 調べてみようと思います。 ありがとうございましたm(_ _)m
お礼
ありがとうございます。 これは使い方に問題があるのでお恥ずかしいですが、 スタッフが他の業務をやっている間に(PC作業以外)、 触ってしまって勝手にデータを消してしまうことが あるようなのです。 ですので、その後使用した際に、気付かずそのまま PCを使いデータがおかしくなったまま保存されて しまうようです。 ですので、保存ボタン(仮名)を押さなければ変更を しないように出来れば、防止になると思いまして。。 お恥ずかしい限りですが・・・。。