• ベストアンサー

Access:リンクテーブルでの参照、更新処理

マスターmdbにメインとなるテーブルを置き (ID,課,担当者名,商品番号,商品名,価格・・・) 3課まであるのですが、各課の専用フォルダに編集するmdb (仮に編集mdbとします)を置いて メインテーブルをリンクし、同じフィールドを用意した編集用テーブルを置き、フォームやクエリを作成して作業しようとしています。 基本的に同じ顧客に一斉に手を加える事はないので 編集用テーブルに一旦格納したデータを追加クエリでリンクしたメインテーブルへ書き込み、削除クエリで編集用テーブルを綺麗にしています。 が。そもそも新規ばかりではなくメインテーブルに既存のデータを読み込んで編集したい事もあります。 この処理をどうしたら良いのか分かりません。誰かがメインテーブルを参照していたら他の人が見れないと思うし、1レコードだけ見るのであればそれだけ一旦編集用テーブルへ置けば良いのかと思いましたが、 一覧を見てソートしてみたりする事もあります。 管理者が全部のデータを掌握したいのでマスターmdbにメインとなるテーブルを置いたのですが、これを課ごとのテーブルに分ければ良いのでしょうか? Accessをいじればいじる程毎回発見がありますので、知らないだけで他に簡潔な方法などありましたら教えて下さい。宜しくお願いします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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)【削除クエリ】編集用テーブルのレコードを全て削除 ・・・以上のように、新規レコードの追加の場合に比べて、メインテーブルからの レコードのコピーが入るのと、編集用テーブルからメインテーブルへの反映に使用する のが追加クエリか更新クエリ/削除クエリかの違い、です。 (・・・そのわりに、長文になってしまいましたが・・・(汗))

yuky-4126
質問者

お礼

回答ありがとうございます! 編集は、一旦テーブルを全部コピってきて、編集したレコードだけをクエリで上書きする、という事ですね? 成る程成る程・・・と思っていじっていましたが、一覧をソートしたりなんだりする事も発生します。 いっそ1つのワークテーブルに一旦全部コピってきて、更新フラグを 0=新規追加 : 1=編集 : 2=削除 とか数値で立てて 更新フラグが立っている物を、値を見て処理を振り分けるとかしたら変ですか? あれ・・・?丁寧に教えて頂いたのに変な質問してしまっていましたらすみません;もぅ1つの回答の方と両方試そうと試行錯誤してわたわたしています。すみません。ありがとうございます。

yuky-4126
質問者

補足

回答へのお礼の補足なのですが。。。 ワークテーブルを分けた方が、クエリ処理一発で済むのですね。 やはりワークテーブルは3つ作る事にします。 ありがとうございました!

その他の回答 (1)

  • tag1701
  • ベストアンサー率54% (67/123)
回答No.1

こんにちは。 文面を見るとこの方式で既に作業をされているのでしょうか? MDBをメインDBと作業用DBに分けるという事は良い事と思います。 アクセスは基本的に5クライアント迄のDBへのアクセスをコンセプト にしているようです。 よって、作業クライアント数も問題は無いようです。 作り方ですが、せっかくリンクテーブルとしてあるので別に 各テーブルに同じ形式のテーブルを作らず、直接このリンクテーブル を基にクエリを作成し、データ追加用クエリ・データ編集用クエリ・ データ削除用クエリの大体3種類を作って行なえばよいのでは 無いでしょうか?他のクライアントがテーブルを参照していても 作業者のマシンで同じテーブルは使えるはずです。 又、基本的に同じ顧客に一斉にアクセスしないとの事ですので、 多少不安ながら削除クエリを作動させる際にデータロックも 必要ないのでは?(VBA調べれば、削除実行前にテーブルロック させる方法もあったはずですのでそれを使えばより安全ですが) 以上、参考まで

yuky-4126
質問者

お礼

回答ありがとうございます! 直にリンクテーブルをいじるのもアリなんですね。 誰かが参照していると開かないのかな…と思っていたのですが。 試しに自分のPC内ではありますが、複数の編集用mdbを作成して (リンクするテーブルはMaster.mdb)同時に リンクしているテーブルを参照しているクエリを使ったフォームを開いてみたのですが動きました!シンプルで良いですね。 同時に一覧を眺める事もありそうなので、これは助かります。 データロックは知りませんでした。何かあってはいけないのでその処理を頭に入れておきます。 ありがとうございました!

関連するQ&A

  • 「テーブルリンク」なのか「インポート」なのか?

    アプリケーション(1).mdb アプリケーション(2).mdb アプリケーション(3).mdb と3つの空のデータベースを用意しました。 (1).mdbに新規テーブルを作成し、保存します。 (2).mdbを開いて、「テーブルのリンク」で(1).mdbのテーブルをリンクしました。 (3).mdbを開いて、「テーブルのリンク」で(2).mdbを接続した時に、先ほどリンクしたテーブル(1→2)は表示されません。 しかし、「インポート」にすると(2).mdbの(1→2)へリンクしているテーブルを(2→3)へリンクすることができました。 結果的にはこれは、「インポート」ではなく「テーブルリンク」ですよね? (1).mdbでテーブルのデータを追加して保存し、(3).mdbで確認すると、ちゃんとデータが更新されています。 よくわからなくなってきました。 これは「インポート」なのでしょうか? 「テーブルリンク」なのでしょうか? よろしくお願いします。

  • Access2003 リンクテーブルをフォームでデザインビュー表示したい

    kamuycikapです。 フォームやクエリを作成している「FQ.mdb」とデータが保存されている「DT.mdb」を分けている為、FQ.mdbではテーブルをリンクしてデータを入力したりクエリ利用したりしています。 DT.mdbに作成しているテーブルはリレーションシップされており、デザインビューで開くと「+」マークが表示されていて、紐付けられているデータを開くことが出来、非常に便利です。 メインとなるテーブルをデザインビューで開くことで、連鎖するテーブルのデータまで入力する事が出来ます。 これを、FQ.mdb側のフォームに表示したいのですが「+」マークが表示されていません。 FQ.mdbのマクロで DoCmd.OpenForm stDocName, acFormDS, , stLinkCriteria として、acFormDSで開くように記述しているのですが・・・・ リンクしている側のテーブルを開いても、「+」マークつきのビューで開くことが出来ないのでしょうか? ユーザーさんから 「入力フォームでの入力もいいんだけれど・・・・デザインビューでの入力も捨てがたいからフォームに表示できるようにしてよ」 的な要望があったのです。 識者の方、ご教示願います。

  • リンクテーブルについて・・・

    Access97で仕事関連のシステムを開発しています。 実データはテーブルだけのMDBファイルに格納して、 リンクテーブルとしています。 自宅ではアプリケーションMDBファイル、実データMDB ファイル共、ローカルディスクに入れていますが、 仕事場では実データMDBファイルはネットワーク上の サーバに有ります。 その為、アプリ変更の都度「リンクテーブルマネー ジャー」を行わないといけないのですが、これが結構 やっかいです。 自宅の環境では、数十テーブルのリンクに関して、 1回だけリンク先のMDBファイルを指定してやれば、 全てのテーブルリンクが完了しますが、仕事場では 各テーブル毎に1件づつリンク先を指定しないと いけません・・・なんで? あと、2つのリンク環境を一発で更新するとか、 出来ませんかネェ?

  • リンクテーブルで繋げているテーブルがいきなり入力・変更ができなくなった!

    ○○.mdbと○○_be.mdbのファイルがあり、○○_be.mdbはテーブルのみで、 ○○.mdbには○○_be.mdbのテーブルのコピー(リンクテーブル)があります。 なぜか今リンクテーブルで繋げている○○.mdbファイルのテーブルが 入力できなってしまいました。 このAccessファイル(○○.mdb)で作成したテーブルは変更可能です。 リンクテーブルのみ、 値の変更も新規レコードの追加もできなくなったのですが なぜでしょうか!!?? Accessを一度落として、 ファイルを開く→「開く」で再起動しても変わりません。 リンクテーブルのもとは(○○_be.mdb)変更可能です。 しかしフォームなどは○○.mdbファイルにある為、 ○○.mdbのリンクテーブルでのデータを変更したいのですができません! 何かわかる方よろしくお願い致します!!!!! (オフィス2003です)

  • Accessでリンクテーブルのパス変更

    Accessで処理mdbとデータmdbに分けて、データmdbをリンクテーブルとして読み込んでいるのですが、データmdbのパスが変わったとき、処理mdbでデータmdbのパスを変更しなければなりません。 それが、面倒なので、手軽に変更できるように作っているのですが、「MSysObjects」の「Database」を書き換えるようと、VBAでADODB処理をしているのですが、アップデートすると「更新可能なクエリであることが必要です。」となり、書き換えることが出来ません。 strSQL = "SELECT * FROM MSysObjects;" ~ data.open strSQL ~ data("Database") = NewDatabase data.Update といった感じの処理です。因みに環境はAccess2000です。 何か、リンクテーブルを自動で書き換える簡単な方法は無いものでしょうか。

  • access:テーブルからテーブルへ

    access2002を使用してます。 テーブル1とテーブル2が持っているレコードを合わせたいのですがどうしたらよいでしょうか? フィールド名とデータ型はまったく一緒です。 追加クエリとかいうの使うのでしょうか? 初心者です。お助け下さい。

  • ACCESSリンクテーブルでデータを入力しても表示されない。

    ACCESSリンクテーブルでデータを入力しても表示されない。 MS ASSECC2003を使っています、 ORG_data.mdbに元データがあります USER.mdbからリンクテーブルで上記ORG_data.mdb のテーブルを参照しています。 USER.mdbを開いてORG_data.mdbのテーブルに新規データを追加しても USER.mdbをいったん閉じて再度開かないと追加されたデータが見えません 元データのORG_data.mdbのテーブルにはデータが追加されいますが、 リンクテーブルの設定とかあるのでしょうか? USER.mdbで追加したデータがすぐに更新されて見れる方法はありませんか? どなたかお知恵を拝借させてください。 リンクテーブルで参照

  • リンクテーブル(複数)のパス変更について<ACC2003>

    現在ACCESS2003で出荷データから売上の集計が可能となるように 試みているのですが、都合上プログラムとデータを分けて処理 したいと考えております。 そこで、リンクテーブルを活用したいと思うのですが、環境に よってパスが変更となったり、データソースを切り替えたい時 などリンクテーブルのパスが変更できると非常に有難い状況です。 多少ネットで調べVBAで変更させる方法は見つかったのですが、 基本的に1つのリンク先を想定しているとの事で、複数は対応 していないようです。 例えば、リンクテーブルをそれぞれ TBL伝票データ   → C:\DB1\A.mdb TBL得意先マスター → C:\DB2\B.mdb TBL商品マスター  → C:\DB2\C.mdb と言ったように複数リンク先がある場合でそれぞれ パス変更が生じた場合に簡単に変更ができる方法は無いでしょうか。 (リンクファイルが1つの場合) Dim db As Database Dim a As TableDef Set db = CurrentDb() For Each a In db.TableDefs If Len(a.Connect) <> 0 Then a.Connect = ";database=" & NEWPATH '→新しいパス名 a.RefreshLink End If Next db.TableDefs.Refresh

  • リンクテーブルを CopyObject するとリンク情報がコピーされる

    ACCESSでリンクしたテーブルを DoCmd.CopyObject でカレントのmdbにコピーすると、テーブル本体ではなく、リンク情報がコピーされてしまいます。 リンクされたテーブルの本体をコピーするにはどうすれば良いのでしょうか。 データ用のmdbとプログラム用のmdbを分けていて、プログラム側からテーブルをバックアップしたいので、このような方法をとっていますが、他に良い方法があれば教えてください。

  • Accessのリンクテーブル

    すみません、教えてください。 Accessで複数端末から一つのMDBにデータ登録をさせる為に、VBAでツールを作っています。以下のように記述をして いるのですが、MDBを閉じるたびに、リンク先のDBを認識しなくなってしまいます。テーブルでリンクを貼りなおすとまた動くようになるのですが、どうしたらリンクを貼りなおせずにできるようになるのか、どなたか教えてください。どうかお願いいたします。 Dim LinkDB as Database Dim RST AS Recordset Set LinkDB = WorkSpaces(0).OpenDatabase("リンク先のDBの名前") Set RST = LinkDB.OpenRecordset("テーブル名",DbOpenTable)

専門家に質問してみよう