• ベストアンサー

accessの自動更新処理をできないようにするにはどうすれば良いですか?

accesで顧客データベースを作成しています。 「顧客リスト」テーブルを作り、そのテーブルを閲覧しやすいように「顧客リスト」フォームを作成しました。 また、フォーム上でデータの修正をした際、その修正内容を保存する為のコマンドボタンを取り付けました。 しかし、現在の状態では、そのコマンドボタンを押さなくても×印をクリックして閉じると自動的にデータの更新内容がテーブルに反映されてしまいます。 データを修正した際、保存用のコマンドボタンを押した場合にのみ、その修正内容がテーブルに反映されるようにするのにはどうしたら良いのでしょうか?? 説明足らずかもしれませんが、ご存知の方教えてください。 ご回答宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Nii
  • ベストアンサー率48% (79/162)
回答No.2

Access2000迄しかさわってないので、ヴァージョンによっては違ってくるかもしれませんが・・・ フォームでレコードソース・コントロールソースを指定している場合は、テーブルが直接編集可能です。なので、リンクしなければいいだけなのですが、その場合は、レコードの移動時に自力でフォームへ値を設定する必要があったり、テーブルとフォームに設定されている入力規則が同期が取れていない場合は、テーブルへ追加時にエラーが出たり(逆に2重にチェックが掛かったり)します。 また、非リンク時は入力途中でフォームやアクセス事態を閉じてしまった場合に、履歴が残っておらず、再度入力しなければならない状態になったりしますので、ダミーテーブルに入力し、コマンドボタンクリックで入力内容を反映さすような作りが無難かと思います。 この場合ですと、入力済みのデータ編集は、別フォームが必要になりますが^^; 1.「顧客リスト」テーブルを「顧客入力」テーブルという名前でコピーする。 2.「顧客入力」テーブルへ追加済みというフィールドを作成 3.「顧客リスト」フォームのレコードソースを「顧客リスト」テーブルから「顧客入力」テーブルへ変更 4.「顧客入力」テーブルから「顧客リスト」テーブルへデータを反映させる為のコマンドボタンを作成し、追加クエリ(入力からリストへ)・更新クエリ(追加済みフィールドを更新)を実行するように記述。入力履歴が必要ない場合は、削除クエリでも可(この場合は2.は必要なし) 他には、フォーム上で編集しても他のレコードに移動したり、閉じたりしない間はテーブルに移動されていませんので、レコード移動時や閉じる時のイベントで、編集をキャンセルする処理を書いてもいいかも・・・

370739
質問者

お礼

どうもありがとうございます! 教えてくださったとおりに「顧客入力」テーブルを作成し、「顧客入力」テーブルから「顧客リスト」テーブルへデータを追加する追加クエリを作成しました。そして、「顧客入力」テーブルから「顧客リスト」テーブルへデータを反映させる為のコマンドボタンを作成しました。新規の顧客を登録する際には、これで大丈夫なのですが、既存のデータに修正をかける時にはどうしたら良いのでしょうか?既存データ修正用のフォームを別に作成したのですが、「顧客リスト」テーブルと非連結のフォームにすると既存のデータを抽出することができませんし、「顧客リスト」テーブルと非連結にしないと、閉じた時に自動的にデータが保存されてしまいます。VBAの知識がないのですが、VBAを使わない方法はありますか?また、もしVBAでなければできないのなら、どのようなコードをどこに書けば良いのでしょう?

その他の回答 (3)

noname#60992
noname#60992
回答No.4

VBAの知識は少し必要ですが、 フォーム1をコピぺし、フォーム2とする フォーム2のレコードソースを消す。 フォーム2の各テキストボックスのデータを非連結にする。 フォーム2のインデックス(ID)が入っている所の編集ロックをかけておく。 フォーム1のコマンドボタンを押したときのイベントに DoCmd.OpenForm "フォーム2" Forms![フォーム2]![id] = Forms![フォーム1]![id] Forms![フォーム2]![氏名] = Forms![フォーム1]![氏名] Forms![フォーム2]![住所] = Forms![フォーム1]![住所] と書いておくと フォーム2をひらき、フォーム2の id,氏名,住所 と名前のついたテキストボックスにフォーム1の同じ名前のテキストボックスの値を入れます。 フィールドがたくさんあるときはループを使うこともできますが、割愛(省略)します。  フォーム2のレコードセレクタなどは非表示にしておくとうるさくなくて良いです。

370739
質問者

お礼

詳しく教えてくださって、本当にどうもありがとうございました!! 早速試してみます。試行錯誤しながら作成していたのですが、これでできそうです!

noname#60992
noname#60992
回答No.3

いろんなやり方があると思いますが、一番手っ取り早いのが、 フォームの「更新の許可」「削除の許可」「追加の許可」を「いいえ」にしておく。 更新の際は、コマンドボタンなどで 別のフォーム(非連結)を開き、インデックス(レコードの識別情報) と更新する可能性のあるフィールドの情報を渡す。 このフォームの内容を元テーブルに更新させるクエリを作り、コマンドボタンを押下したときに実行させるようにする。 別フォームについては原則的に最初のフォームをコピーしたものでかまわないが、 ・非連結にする。 ・インデックスを渡すテキストボックスは「編集ロック」をかけておかなくてはいけない。 ・見た目で最初のフォームと違うようにしておくと、間違いがおきにくいと思う。

370739
質問者

お礼

どうもありがとうございます! フォームのプロパティで「更新の許可」「削除の許可」「追加の許可」を「いいえ」にしました。これで既存データへの入力を防ぐことができるようになりました。 「更新の際は、コマンドボタンなどで別のフォーム(非連結)を開き、インデックス(レコードの識別情報)と更新する可能性のあるフィールドの情報を渡す。」と教えてくださいましたが、「インデックス(レコードの識別情報)と更新する可能性のあるフィールドの情報を渡す」には具体的にどうしたら良いのでしょうか?教えてくださると嬉しいです。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

考え方としては 1)入力用フォームを非連結のもの にするか 2)入力用一時テーブルに連結したもの にし、本テーブルへのデータの追加・更新・削除はVBAで行うようにします どちらにしてもかなりのVBAのスキルが必要です

370739
質問者

お礼

早速教えてくださってありがとうございます! かなりのVBAのスキルが必要なんですね・・・。 現在の私にはVBAの知識がないのですが、上司より作成を頼まれていて困っています。 VBAの知識が無くてもできる方法はないでしょうか?

関連するQ&A

専門家に質問してみよう