• 締切済み

フォームで 保存ボタンを押して保存する方法【MS Access2000】

初めて質問させて頂きます。宜しくお願いいたします。 MS Access2000を使用して会社の顧客管理をしていおり、 現在フォームに表示されたデータを更新・修正等をした場合 修正をした時点で、元のテーブルの情報も変更されてしまいます。 これを、修正等が終了して、例えば【保存】というボタンを作成し、 それを押して始めてテーブルに反映させるという仕様にしたいと 思っています。 ご回答・助言をなにとぞ宜しくお願いいたします。

みんなの回答

noname#140971
noname#140971
回答No.6

補足: Access で非連結フォーム仕様は考え物。 非連結フォームはクライアント・サーバーシステムでのネットワークの混雑回避が目的。 スタンドアロンで仕掛ける必要はないと思います。 更新ボタンと復元ボタンを持たせて逃げて良いと思います。

noname#140971
noname#140971
回答No.5

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)
回答No.4

#2ののあです。 フォームが単票形式ならばESCを押せば元に戻せるはずですが試されましたか? 別レコードに移らない限りはDBに対して変更は行われていないはずです

slamdunk55
質問者

お礼

ありがとうございます。 これは使い方に問題があるのでお恥ずかしいですが、 スタッフが他の業務をやっている間に(PC作業以外)、 触ってしまって勝手にデータを消してしまうことが あるようなのです。 ですので、その後使用した際に、気付かずそのまま PCを使いデータがおかしくなったまま保存されて しまうようです。 ですので、保存ボタン(仮名)を押さなければ変更を しないように出来れば、防止になると思いまして。。 お恥ずかしい限りですが・・・。。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.3
slamdunk55
質問者

お礼

ご返答ありがとうございます。 まだ試せておりませんがたぶん求めているもののようです。 アクセスのバージョンが違ったのが若干の不安が・・・。 トライあるのみということで、まずは反映してみます。 ありがとうございますm(_ _)m

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.2

Accessの変更点の確定、つまりデータベースへの確定は行を移動した時となります 単票形式で画面を作られているなら質問のような造りにすることも可能ですが、一覧形式で作成している場合は無理です。 これはAccessの仕様で基本的には変更しようがありません。 Access開発時の考え方なのでしょうね。 共有した場合、変更箇所が逸早く他の端末での操作に反映させると考えられたのと思います。 ちなみに修正した時点で保存は行われていませんので間違って元に戻したい場合はESCキーを押すと修正を止め元の値に戻してくれます 尚、カーソルのあるフィールドが修正中の場合そのフィールドのみを元に戻し、フィールド移動直後の場合レコード全体が元に戻ります。 2回押せば必ずレコード全体が変更前に戻ります。 一覧形式で複数レコードを変更後に保存ボタンで保存したい要求があるならNo1の回答者さんが書いておられるようにコピーしたテーブルを修正後に保存で元のテーブルに戻す または、それが出来るocxを購入しAccessに組み込むかしかないようです

slamdunk55
質問者

お礼

ご回答ありがとうございます。 形式は単票形式となっております。 間違えた場合に変更前に、戻るのはとても欲しい機能?です。 ワークテーブルを利用した方法を検討いたします。 ご回答ありがとうございましたm(_ _)m

  • Pakkun10
  • ベストアンサー率44% (22/50)
回答No.1

データの持ち方や表示の仕方によっていろいろな方法があると思いますが、 たとえば、ワークテーブルを使う方法などがあります。 編集したいデータを選択したら、元のテーブルと同じ設定のワークテーブルにデータをコピーします。 編集が終わったら、ワークテーブルのデータを元テーブルに書き込みます。 また、画面にはテーブルをソースとして使用せず、テキストボックスに直接データを表示したりします。 保存時にそれを元のテーブルに書き込みます。 どちらの方法にせよ、ある程度はVBAが必要になると思われるので、 それをふまえて検討してみてください。

slamdunk55
質問者

お礼

さっそくのご回答ありがとうございます。 データの持ち方は、一番基本的な形で、 一人の情報を一つのレコードに書いてある状態です。 VBAに関しましては、ほんとにさわり程度しか したことがありませんので、ワークテーブルで 調べてみようと思います。 ありがとうございましたm(_ _)m

関連するQ&A