- ベストアンサー
Access:リンクテーブルでの参照、更新処理
マスターmdbにメインとなるテーブルを置き (ID,課,担当者名,商品番号,商品名,価格・・・) 3課まであるのですが、各課の専用フォルダに編集するmdb (仮に編集mdbとします)を置いて メインテーブルをリンクし、同じフィールドを用意した編集用テーブルを置き、フォームやクエリを作成して作業しようとしています。 基本的に同じ顧客に一斉に手を加える事はないので 編集用テーブルに一旦格納したデータを追加クエリでリンクしたメインテーブルへ書き込み、削除クエリで編集用テーブルを綺麗にしています。 が。そもそも新規ばかりではなくメインテーブルに既存のデータを読み込んで編集したい事もあります。 この処理をどうしたら良いのか分かりません。誰かがメインテーブルを参照していたら他の人が見れないと思うし、1レコードだけ見るのであればそれだけ一旦編集用テーブルへ置けば良いのかと思いましたが、 一覧を見てソートしてみたりする事もあります。 管理者が全部のデータを掌握したいのでマスターmdbにメインとなるテーブルを置いたのですが、これを課ごとのテーブルに分ければ良いのでしょうか? Accessをいじればいじる程毎回発見がありますので、知らないだけで他に簡潔な方法などありましたら教えて下さい。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> メインテーブルをリンクし、同じフィールドを用意した編集用テーブルを置き、 (中略) > 編集用テーブルに一旦格納したデータを追加クエリでリンクしたメインテーブルへ > 書き込み、削除クエリで編集用テーブルを綺麗にしています。 これができているのでしたら、既存データの編集もそれほど難しくはないかと思います。 但し、1画面で「上書き更新」と「削除」の双方に対応すると少し複雑になりますので (→新規追加/既存編集/既存削除とも、同時に複数レコードを扱うことを想定)、 ここでは更新と削除は別として考えることにします。 (メニュー画面に、「新規追加」「既存編集」「データ削除」の3つのボタンがあって、 それぞれ専用のフォームがあるイメージです) 現在行われている「新規レコードの追加」と、今回ご希望の「既存レコードの編集」 及び「既存レコードの削除」を比較して、概要を説明してみます: <新規レコードの追加> 1)【削除クエリ】編集用テーブルのレコードを全て削除 ※前回作業時に、何らかのエラーで削除が行われなかった場合への対応です。 2)【ユーザー】編集用テーブル(を元にしたフォーム)に対して、新規レコードを追加 3)【追加クエリ】コマンドボタンのクリックで、編集用テーブルからメインテーブルに 書き込み 4)【削除クエリ】編集用テーブルのレコードを全て削除 <既存レコードの編集> 1)【削除クエリ】編集用テーブルのレコードを全て削除 ※編集用テーブルは、新規レコードの追加用とは別に作成し、「更新」フィールド (データ型はYes/No型、既定値はNo)を追加しておきます。 2)【追加クエリ】メインテーブルから編集用テーブルに書き込み ※新規追加の時とは逆方向にデータをコピーするということです。 なお、追加クエリでも選択クエリと同様に、絞り込み条件を指定できますので、 担当の課に限定するとか、更に商品名を曖昧検索で抽出する、といったことも 検討してみて下さい。 3)【ユーザー】編集用テーブル(を元にしたフォーム)に対して、既存レコードを変更 ※フォームのプロパティシートの『データ』タブで以下を設定しておきます: 「追加の許可」=「いいえ」、「削除の許可」=「いいえ」 ※フォームの「更新後」イベントで、「更新」フィールドの値を「Yes」にします。 (フォームにはチェックボックスとして設置の上、プロパティシートの「書式」タブで 「可視」を「いいえ」にしておきます) 4)【更新クエリ】コマンドボタンのクリックで、編集用テーブルで「更新」フィールドが Yesのもののみ、メインテーブルのレコードを上書き ※双方のテーブルで、共にIDが主キーだと思いますので、このIDで両テーブルを 結合させてクエリを作成し、更新クエリのデザインビューの「レコードの更新」欄に 「[編集用テーブル].[担当者名]」等を記入します(→添付画像) ※主キーであるIDは、上書き更新の対象から外し、それ以外のフィールドを更新。 5)【削除クエリ】編集用テーブルのレコードを全て削除 <既存レコードの削除> 1)【削除クエリ】編集用テーブルのレコードを全て削除 ※編集用テーブルは、既存レコードの編集用のものと同様に新たに作成し、 「削除」フィールド(データ型などは「更新」と同じ)を追加します。 2)【追加クエリ】メインテーブルから編集用テーブルに書き込み 3)【ユーザー】編集用テーブル(を元にしたフォーム)に対して、削除したいレコードの 「削除」チェックボックスをYesに更新 4)【削除クエリ】コマンドボタンのクリックで、編集用テーブルで「削除」フィールドが Yesのもののみ、メインテーブルのレコードを削除 ※この削除クエリも、上と同様にIDで双方のテーブルを結合させて作成します。 5)【削除クエリ】編集用テーブルのレコードを全て削除 ・・・以上のように、新規レコードの追加の場合に比べて、メインテーブルからの レコードのコピーが入るのと、編集用テーブルからメインテーブルへの反映に使用する のが追加クエリか更新クエリ/削除クエリかの違い、です。 (・・・そのわりに、長文になってしまいましたが・・・(汗))
その他の回答 (1)
- tag1701
- ベストアンサー率54% (67/123)
こんにちは。 文面を見るとこの方式で既に作業をされているのでしょうか? MDBをメインDBと作業用DBに分けるという事は良い事と思います。 アクセスは基本的に5クライアント迄のDBへのアクセスをコンセプト にしているようです。 よって、作業クライアント数も問題は無いようです。 作り方ですが、せっかくリンクテーブルとしてあるので別に 各テーブルに同じ形式のテーブルを作らず、直接このリンクテーブル を基にクエリを作成し、データ追加用クエリ・データ編集用クエリ・ データ削除用クエリの大体3種類を作って行なえばよいのでは 無いでしょうか?他のクライアントがテーブルを参照していても 作業者のマシンで同じテーブルは使えるはずです。 又、基本的に同じ顧客に一斉にアクセスしないとの事ですので、 多少不安ながら削除クエリを作動させる際にデータロックも 必要ないのでは?(VBA調べれば、削除実行前にテーブルロック させる方法もあったはずですのでそれを使えばより安全ですが) 以上、参考まで
お礼
回答ありがとうございます! 直にリンクテーブルをいじるのもアリなんですね。 誰かが参照していると開かないのかな…と思っていたのですが。 試しに自分のPC内ではありますが、複数の編集用mdbを作成して (リンクするテーブルはMaster.mdb)同時に リンクしているテーブルを参照しているクエリを使ったフォームを開いてみたのですが動きました!シンプルで良いですね。 同時に一覧を眺める事もありそうなので、これは助かります。 データロックは知りませんでした。何かあってはいけないのでその処理を頭に入れておきます。 ありがとうございました!
お礼
回答ありがとうございます! 編集は、一旦テーブルを全部コピってきて、編集したレコードだけをクエリで上書きする、という事ですね? 成る程成る程・・・と思っていじっていましたが、一覧をソートしたりなんだりする事も発生します。 いっそ1つのワークテーブルに一旦全部コピってきて、更新フラグを 0=新規追加 : 1=編集 : 2=削除 とか数値で立てて 更新フラグが立っている物を、値を見て処理を振り分けるとかしたら変ですか? あれ・・・?丁寧に教えて頂いたのに変な質問してしまっていましたらすみません;もぅ1つの回答の方と両方試そうと試行錯誤してわたわたしています。すみません。ありがとうございます。
補足
回答へのお礼の補足なのですが。。。 ワークテーブルを分けた方が、クエリ処理一発で済むのですね。 やはりワークテーブルは3つ作る事にします。 ありがとうございました!