• ベストアンサー

アクセスでのデータ管理について(長文です。)

アクセス初心者です。 これからデータの入力、管理、帳票をアクセスで構築しようと思っているのですが、アクセスはデータを入力した時点でデータが保存されてしまうので過去のデータが残りません。またデータの変更及び共有をうまくやりたいのですがよい方法がわかりません。 今回構築したいデータベースは、 1.過去の記録がすぐわかるようにしたい。(更新前のデータがわかるようにしたい。) 2.データの変更及び共有を簡略化したい。(A社で変更したデータをB社のデータベースにいれこみたい。) 【データベースの概略イメージ】  A社      B社 データベース1 データベース2(1と同じもの) テーブル1 → テーブル1 テーブル2 → テーブル2 テーブル3 → テーブル3 クエリ1    クエリ1 クエリ2    クエリ2 フォーム1   フォーム1 フォーム2   フォーム2 *リレーションあり *A社でテーブル1の内容を変更して、B社のテーブル1を新しいものに置き換えたい。 (本を読むとリレーションが崩れると書いてありました。) *B社で変更してA社に戻すこともある。 テーブル1 項目 ID 100 住所 あああ 氏名 △△様 電話番号 111-1111 *例えば、ID100のデータの氏名を変更するとき、変更前がどうだったかわかるようにしたい。(1月時点では△△様、2月時点では□□様とか) 誰かアクセスの操作方法に詳しい方がおられましたら、よい方法又はアクセスに関する詳しい本とかサイト等教えて下さい。よろしくお願いいたします。

  • Sky-H
  • お礼率69% (54/78)

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

  • ベストアンサー
回答No.5

「アクセスはデータを入力した時点でデータが保存さ れてしまうので過去のデータが残りません」 ↑これはフォームのデータソースがテーブルになってるからで、テキストボックスは全て非連結にし、更新ボタン押下でテーブル更新するように作ればよいです。 テーブルと他のオブジェクトは切り離しましょう。 データソース1.mdb-DB1.mdb データソース2.mdb-DB2.mdb 実体-入物の関係。 データソース1、2にはテーブルのみが入ってます。 DB1、2には残りのオブジェクトたちがが入ってます。 データソース.mdbをA社→B社とかB社→A社とすればよいかと。 リレーションは崩れません。 もちろんAB社とも過去のデータソース.mdbはきっちり保存しておく。 そして検索フォームを作っておけば、すぐ過去データが調査できるかと。 もしくは、データソース.mdbを管理する別mdbを作って、テーブルが更新された際、テーブルをインポートし、中でグループ化すればよいかと。 こちらも長文でわかりにくい。

Sky-H
質問者

補足

回答ありがとうございます。 >更新ボタン押下でテーブル更新するように作ればよいです。 更新ボタン押下で更新? >もしくは、データソース.mdbを管理する別mdbを作って、テーブルが更新された際、テーブルをインポートし、中でグループ化すればよいかと。 マクロとかVBとか利用する?グループ化? すみませんが、なにぶん初心者なものでいまいちわかりません。よろしくお願いします。

その他の回答 (5)

回答No.6

ANo.#5です。 この手のツールを作るにはマクロかVBAの知識が必要です。 多分ですが、理解されるべきは 1.非連結フォームを作成し、入力したデータをテーブルにインサートする。 2.テーブルが更新されたらテーブルをまるごとインポートし、クエリでグループ化し、さらにテーブル作成クエリで最新テーブルを作る。 3.データとアプリを分ける。 中でも2を早急に理解されることでかなり実現の近道になるかと思います。 要するに更新履歴が残るという意味です。

noname#223623
noname#223623
回答No.4

前の回答でテーブルが決まってからと言ったのですが「テーブルの更新」についてちょっとだけ書きます。私事ですがちょっと事情がありまして(あとで書きます)。 まずは更新の話。 > *A社でテーブル1の内容を変更して、B社のテーブル1を新しいものに置き換えたい。 > (本を読むとリレーションが崩れると書いてありました。) というのはテーブルそのものを上書きしようとするからでしょう。こういう場合は差分をテーブルに追加(または更新になるんでしょうが)してあげた方がいいと思います。今のところテーブルをどのようにするかが不明確なので具体的な方法はまだ書けませんが(あと、書くと長くなりすぎるので今回はご勘弁)。とりあえずのヒントにしてください。 それで私の事情なんですが、明日からしばらくマシンのない生活を送ることになりました。急なことで申し訳ないのですが私が回答することはもうできません。ごめんなさい。でも私よりもよっぽどできる人がいっぱいいるので大丈夫です(きっと)。なんか途中で投げ出すようで心苦しいのですが御理解下さい(今日はもうちょっと見てますけど)。 この質問を読んでいる方々、「何を勝手なことを」と怒られそうですがSky-Hさんを助けてあげて下さいね。すみません。

noname#223623
noname#223623
回答No.3

全貌がわからないのでもう少し詳しく聞かせて下さい。 このシステムは稼働中、もしくはテーブル構造の変更はしないという前提ですか? > IDを外のテーブルとリンク(リレーション)させないといけない... これは決定ですか?決定でなければ、テーブル1にレコードを識別する項目(例えばrec_idとか)を追加して、これをキーにしてリンクしてもいいと思うんですが。どちらにしても外のテーブルの項目が知りたいですね。 あと、マクロ、VBAとかを使うのはありですか? 更新の話はテーブルが決まってからにします。

noname#223623
noname#223623
回答No.2

> 2.データの変更及び共有を簡略化したい 質問を読みかえしてみると、A社の変更が直ちにB社の方に反映しなくてもいいのかな?例えば1日一回更新するとか。どっちですか? あと、サイトの紹介をしてなかったので参考URLを書いときます。このURLは過去の質問です。とりあえず、ここに書いてあるサイトを覗いてみては。

参考URL:
http://okweb.jp/kotaeru.php3?q=1119191
Sky-H
質問者

補足

早速の回答ありがとうございます。 質問がわかりづらくてすみません。 1.過去のデータについて 登録日を追加して、IDと登録日を組み合わせたキーを作成というのも確かに考えたのですが、IDを外のテーブルとリンク(リレーション)させないといけないことを考えるとどうしたらいいのか迷ってしまいました。 2.データの変更・共有について 1つのDBをネットワークを介して共有するのが一番だと思うのですが、それは出来そうにない(技術的にではなく、ネット環境が整いそうにない。)ので、お互い同じDBをもっておいて、基本的にはA社でデータ管理(変更等)を行い、あとでB社のデータを更新するように考えています。項目によってはB社のほうで変更したいテーブルもあるので、データを更新するときにお互いが変更した箇所だけ更新したいと考えています。つまり更新するときにDBそのものを入れ替えるのではなく、テーブルだけとかフォームだけとか更新できないかということです。よろしくお願いします。

noname#223623
noname#223623
回答No.1

> 1.過去の記録がすぐわかるようにしたい 既存のレコードはそのまま置いといて、新規レコードで登録する。登録日のフィールドを追加して、通常は登録日の一番新しいものを使う。履歴が見たかったらIDで抽出すれば見られる。IDは重複するのでキーとなるフィールドも追加する必要がある(もしくはIDと登録日を組合せてキーにする。できたかな?)。 > 2.データの変更及び共有を簡略化したい わざわざDBを2つ作らないで、A社、B社ともに同じDBを使用する。おそらくネットワークを介してアクセスすることを考えているんでしょう。接続方法は環境がわからないので書けません(わかっても詳しくないんですけど。詳しい人が教えてくれるでしょう)。基本的にAccess(MDB)は複数ユーザで使うようには考えられていないので、できれば違うDBを使用した方がいいんじゃないでしょうか。ユーザ数が多くないならMSDEでも。

関連するQ&A

  • アクセス 数値型にするとフォームの入力ができない

    お世話になります。色々調べたり、実験してみたのですが、分からない点があります。 簡単でいいので、可能性のある原因を教えてください。 アクセス2003です。 ■パターン1  フォームC の入力ができる テーブルA(主キーがオートナンバー型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る ■パターン2  フォームC の入力ができない テーブルA(主キーが数値型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る 簡単にいうと、テーブルのデータ型によって、入力可否が変わるのです。 なぜ、パターン2は、入力できないのか分かりません。 よろしくお願いします。

  • Accessでデータシートに同じデータがいくつもでてしまいます。

    こんにちは。 今、Accessであるデータベースを作っているんですが、 テーブルを作って、リレーションをはって、クエリを実行 すると、データシートに同じデータがいくつも出てきて しまいます。 例えば、Aさんのレコードが3つ表示されてしまうんです。 5人分のデータが入っているとすると、3倍の15のレコードが出てしまうんですね・・・。 Accessの勉強をはじめて1ヶ月位の私には、何がなんだか 意味不明です。 こういうエラーの原因は何にあるのでしょうか??? どなたか、教えてください。

  • アクセス2007 クエリの作り方

    アクセス2007 クエリの作り方 テーブルA 氏名  生れ年 ---------------- 佐藤   1990 鈴木   1950 斎藤   2000 伊藤   1970 テーブルB ------------------ 年齢   項目 10    少年 20    成人 60    還暦 とあった時 テーブルAを元に「クエリ1」で「年齢」を追加し 年齢: Year(Date())-[生れ年]としました クエリ1 氏名  生れ年 年齢 -------------------- 佐藤   1990  20  鈴木   1950  60 斎藤   2000  10 伊藤   1970  40 更に、「テーブルB」の年齢と「クエリ1」の年齢をリレーション(多対1?)して「クエリ2」としました。 クエリ2 氏名  生れ年 年齢 項目 --------------------------- 佐藤   1990  20 成人 鈴木   1950  60 還暦 斎藤   2000  10 少年 伊藤   1970  40「空欄」 アクセスはまだ良く理解していないのですが、これだとレコードの更新ができません。 フォームでレコードセットを「ダイナセット (矛盾を許す)」にすると更新はできますが不安です。 こんな時「ダイナセット (矛盾を許さない)」で行い場合どんなリレーションにしたら良いのでしょうか?    

  • アクセス2000でクエリを組んだのですが。。。

    こんにちわ。アクセス初心者です。まず順に追って説明します。 (1)15000件ある顧客名簿と1500件ある担当会社のテーブルをリレーションで結び、クエリを組みました。「Q_顧客名簿」と名づけました。その時点で15000件データが存在します。 (2)フォーム「Q_顧客名簿」を元にフォームを作成しました。そして氏名の曖昧検索をしたいのでまずフォームのテキストボックスに「氏名検索」と名づけて、クエリの画面に戻り「Q_顧客名簿」を元に新たなクエリを組み、「氏名」のフィールドの抽出方法に以下のような文を入れました。 『Like "*" & [forms]![集合フォーム_1]![氏名検索] & "*"』 このクエリを「Q_氏名検索」と名づけました。 (3)フォームの左端をに「Q_氏名検索」が生きるよう設定をし、「氏名検索」のテキストボックスに「再クエリ」を組んだのですが、顧客データ数が15000あるはずなのが11000まで減ってしまいました。 おそらく検索式に何かが足りないのだと思うのですが、SQLやVBAがわからないのでどうすればいいかわかりません。 アクセスの詳しい方、教えていただけませんでしょうか?よろしくお願いいたします。

  • ACCESSのリレーションシップについての疑問

    ACCESS初心者です。 ACCESS2002 OSはWindowsXP SP2です。 基本が分かっていないせいなのかもしれませんが、私には理解できない現象が起こっています。対応方法があれば教えていただくようお願いします。 ACCESSでデータ更新のフォームを作っています。 そのフォームは2・3日前に作ったもので、たとえばテーブルAを更新するためにマスターテーブルのBとCを参照しているような形になっています。このリレーションはクエリで指定してあります。 このフォームではクエリに対して更新する形になっています。 このフォームのデザインを編集しているときに「ツール」の「リレーションシップ」をクリックすると画面にはBとCだけが表示されます。 なぜメインのテーブルのAが表示されないのか?と思いながら、しょうがないので右クリックして「すべてのリレーションシップの表示」を押すと、驚いたことにDのテーブルが表示されました。 実はこのDというテーブルは以前に作ったAを作る前に使っていたAによく似たテーブルなのです。 当然、以前にはDとB・Cのリレーションも作っていましたが、今編集中のフォームではDは関係ありません。 リレーションシップの画面は不必要に広大なもので横に3スクロール分と縦にも5スクロール分くらいあって、その右下の端っこにD・B・Cのリレーションだけが表示されていて、それ以外はただただスペースがあるだけです。 なぜ肝心のA・B・Cのリレーションが表示されずD・B・Cのリレーションが表示されるのでしょう? 試しに今では不要であるDのテーブルを削除してみましたがリレーションシップではさすがにDは消えたもののB・Cが表示されるだけで、Aは出てきません。 そもそもACCESSにおけるリレーションシップというのは個々のフォーム内で定義されるものではないのですね?(根本的なことで申し訳ないのですが、買った2冊の本を見てもインターネットで探してもその辺の説明が見当たりませんでした) SQLであれば個々のSQL文で都度JOIN等の記述をすると思うのですが、ACCESSではデータベース全体の共通事項(?)としての定義になるのでしょうか? ACCESSは初心者で見当はずれな質問かもしれませんがどうかよろしくお願いします。

  • Access データの追加について

    大変基本的なことで申し訳ありません。 Accessのデータベースを作成したあと、追加して情報を入力すると 例えば、クエリで抽出しても、加わったデータがすぐにリストに 反映されるはずだと思うのですが なぜかそれがうまくいきません。 たとえば、クエリAを作ったあとに、データBをフォームから入力して、 クエリAを開くと、そこにデータBが反映されないということはあるのでしょうか。 その場合は何が原因でしょうか。クエリの設定方法でしょうか。 データは、私のPCのみで管理しており、複数人で入力しているものではありません。 Accessが2003を使用しています。 宜しくお願い致します。

  • ACCESS2000 クエリーを開いてテーブルのデータを更新したい

    ウィンドウズ98,ACCESS2000です。 二つのテーブルがあって、リレーションがあります。 これを元にクエリーを作成して、クエリーを表示させたフォームでデータの更新や削除を行いたいと思っております。 が、実際やろうとするとこのレコードセットは更新できませんとでます。 何か考えられる理由はありますか? よろしくお願いします。

  • Accessのデータ共有について

    現在社内の顧客管理システムをAccessにて構築しており、データテーブルファイル(mdb)をファイルサーバに置き、クライアントPCはフォームやクエリだけのmdbを使用してテーブルのリンクでデータ共有しています(Accessのデータ分割ツールにてテーブルとフォーム、クエリを分離しただけの状態で運用しています)。これまでは、この状態でも運用出来ていましたが、データ量が多くなるにつれ、段々動作が重くなってきた為、処理速度改善の為に、以下の二案を検討していますが、どちらの案が効果的なのでしょうか? 【案1】 クライアント用mdbファイルに同じテーブル構成の一時テーブルを作成し、mdbファイル起動時と、「更新」ボタンを別途作成し、「更新」ボタンが押下されたタイミングで、ファイルサーバのデータベースからADOにて一時テーブルに全データを読み込む。更新系の処理は、各クライアントの一時テーブルとファイルサーバのデータベースに対して行う。 【案2】 現状フォームの遷移については、 「DoCmd.OpenForm」関数の引数に検索条件を指定する方法で行っている為、この部分を ・ADOにてデータを取得  ↓ ・遷移後のフォームに値をセット と言った処理に変更する。 また、上記以外の方法で何か良い方法がありましたらご指摘頂ければと思いますので、よろしくお願いします。

  • データのコード化とは?

    Access97でデータベースを構築しているのですが、複数のテーブルで共有するデータをコード化する方法を教えてください。 簡単にいいますと テーブルAで名前と所属を記入(以後名前は選択できるようになり、同時に所属も連結して選択)つまり氏名・所属の登録的役割。 テーブルBはあるフォーム上で名前を選択する (本当はここで所属も自動で選択されるはず)が所属が正しくない。 ちなみに所属はYes/Noで分類してあります。 ここでテーブルBをフォーム上からではなくテーブル自体で選択すると フォーム・レポート上でも正しく認識します。 この問題を解決するためにコード化が必要だとアドバイスいただいたのですが 具体的にどうすればいいのか教えてください。

  • Accessで BテーブルのフィールドをAフールドに書き換えたい。

    初心者ですが宜しくお願い致します。 Aテーブル →[氏名],[名前] Bテーブル →[氏名],[結婚後氏名] (1)上のようなテーブルがあります。クエリで、AテーブルとBテーブルの[氏名]フィールドをキーにしてリレーションを組み、A,Bテーブルのフィールド全てを表示させます。 (2)(1)で抽出されたデータだけ、Aテーブルの[氏名]フィールドをBテーブルの[結婚後氏名]フィールドに書き換えたいのですが・・・・ なにかよい方法はありますでしょうか。 詳しい方、教えてください。 宜しくお願い致します。