Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2249 / 2272 ツリー ←次へ | 前へ→

【3218】テーブルへのレコード自動追加 ごろ 04/8/14(土) 14:31 質問[未読]
【3222】Re:テーブルへのレコード自動追加 こもれび 04/8/14(土) 21:22 発言[未読]
【3224】Re:テーブルへのレコード自動追加 ごろ 04/8/15(日) 1:25 質問[未読]
【3228】Re:テーブルへのレコード自動追加 こもれび 04/8/15(日) 10:30 発言[未読]
【3234】Re:テーブルへのレコード自動追加 ごろ 04/8/15(日) 15:26 質問[未読]
【3236】Re:テーブルへのレコード自動追加 こもれび 04/8/15(日) 23:21 回答[未読]
【3238】Re:テーブルへのレコード自動追加 ごろ 04/8/16(月) 1:08 質問[未読]
【3240】Re:テーブルへのレコード自動追加 こもれび 04/8/16(月) 13:12 回答[未読]

【3218】テーブルへのレコード自動追加
質問  ごろ  - 04/8/14(土) 14:31 -

引用なし
パスワード
   初めて投稿させていただきます。ACCESS超初心者です。
独学で進めておりますが、行き詰まってしまいました。
表現不足が多々あるかと思いますが、ご教授よろしくお願いします。

Aマスターに新規レコードが追加された際、(主キー:オートナンバー)
Bテーブルの主キーフィールドにAマスターに新たに追加された主キーと同じ番号の
レコードを自動で追加する方法はございますでしょうか?

具体的には会社マスターと契約テーブルがあり、
■会社マスター
会社ID オートナンバー(主キー)
会社名 テキスト型
 ・
 ・
 ・

■契約テーブル
会社ID テキスト型(主キー)
X契約 Yes/No型
Y契約 Yes/No型
 ・
 ・
 ・

と言った感じになります。会社マスターは参照のみ可能なDBであるため、
会社マスターと契約テーブルでクエリを作り、契約の有無を管理していきたいと
考え、作成を進めております。
会社マスターに新たに追加があった際に、契約テーブルの会社IDに同じIDで
新レコードが自動追加されるようにしたいです。

(リアルタイムの必要は無く、例えば、契約テーブル更新用フォームを開いた時や、
 会社マスター参照フォーム内に契約状況確認ボタン等を作成して、クリック時に
 レコードのチェックが入り、自動追加がおこなわれれば問題ありません。)

ご教授、よろしくお願いします。

【3222】Re:テーブルへのレコード自動追加
発言  こもれび  - 04/8/14(土) 21:22 -

引用なし
パスワード
   >Aマスターに新規レコードが追加された際、(主キー:オートナンバー)
>Bテーブルの主キーフィールドにAマスターに新たに追加された主キーと同じ番号の
>レコードを自動で追加する方法はございますでしょうか?

顧客マスターと契約履歴というデータベースを考えられている
と思いますが、一つ例をあげてみます。

・顧客マスター
顧客ID   顧客名
 1  トマト株式会社
 2  タマネギ株式会社
 3  株式会社なす
 4  じゃがいも有限会社
 5  きゅうり商店

・契約履歴
契約ID  契約日   顧客  契約X  契約Y
 1   2004/8/10   1   yes   no
 2   2004/8/11   3   no    yes
 3   2004/8/11   1   no    yes
 4   2004/8/12   2   yes   yes

ご質問の内容ですが、キーを同一にするということは
顧客固有のデータということになります。
上にあげた例のように契約日などの変化するデータや
繰り返し発生するデータなどはないのでしょうか?
これは、データベースの「正規化」という重要なポイント
なのですが、これを誤ると使いにくいものが出来上がってしまいます。

さて、「同じ番号でレコードを追加する」ことはできます。
顧客の情報を呼んでおいて、書き込みのときに
「契約テーブル」のIDフィールドに書き込めばOKです。

ただし、契約テーブルのIDフィールドは「数値」にしましょう。
マスターに使用した「オートナンバー」はテキストではなく
数値です。

【3224】Re:テーブルへのレコード自動追加
質問  ごろ  - 04/8/15(日) 1:25 -

引用なし
パスワード
   こもれびさん、返信ありがとうございます。

>ご質問の内容ですが、キーを同一にするということは
>顧客固有のデータということになります。
>上にあげた例のように契約日などの変化するデータや
>繰り返し発生するデータなどはないのでしょうか?
>これは、データベースの「正規化」という重要なポイント
>なのですが、これを誤ると使いにくいものが出来上がってしまいます。

説明不足でした、すみません。

ご指摘の通り、キーを同一にすることは顧客固有のデータと言うことになります。
顧客マスターに契約テーブルの項目を入れない理由は、
顧客マスターは既に別のDBに存在しているものを参照のみで利用します。
そのDB自体もMBDからは更新できない(社内ルール)DBである為の苦肉の策として
今回のような形で考えてみました。

契約テーブルの「@契約」の項目は商品の性質上、Yes/Noの変更が繰り返し
発生します。また、他にも「@契約_更新日」など変化するデータもあるため、
別テーブルとして作成し、リレーションを持たせて、
契約テーブルに関する部分のみ、更新を行えるようにしたいのですが、
確かに、自分で書いていても使いにくそうなDBですね。。。

>さて、「同じ番号でレコードを追加する」ことはできます。
>顧客の情報を呼んでおいて、書き込みのときに
>「契約テーブル」のIDフィールドに書き込めばOKです。

「やるべきこと」は理解できました。が、私が使用している本に
具体的な手法を見つけることが出来ませんでした。。。
使用する関数(?)など、ヒントで良いので情報をいただけないでしょうか?
申し訳ありません。

>ただし、契約テーブルのIDフィールドは「数値」にしましょう。
>マスターに使用した「オートナンバー」はテキストではなく
>数値です。

ありがとうございます。
さっそくさっそく変更しておきました。

ご教授よろしくお願いいたします。

【3228】Re:テーブルへのレコード自動追加
発言  こもれび  - 04/8/15(日) 10:30 -

引用なし
パスワード
   なるほど、φ(..)メモメモ 「いじっちゃダメ」データベースを参照されているわけですね。
確認したいことがあります

その1
使用されている(作るデータベース)のAccessのVersionは2000以上ですか?

その2
>契約テーブルの「@契約」の項目は商品の性質上、Yes/Noの変更が繰り返し
>発生します。また、他にも「@契約_更新日」など変化するデータもあるため、
>別テーブルとして作成し、リレーションを持たせて、
>契約テーブルに関する部分のみ、更新を行えるようにしたいのですが、

一つの顧客で例えば3カ月おきに更新されるというようなイメージなのでしょうか。
・正規化前のデータ(例)

 顧客名     契約日   更新日   商品X  商品Y
トマト株式会社 2004/5/10  2004/5/10   yes   no
トマト株式会社 2004/5/10  2004/6/10   no    yes
トマト株式会社 2004/5/10  2004/7/15   yes   yes

※ 上の例では契約日を一つの顧客との取引開始契約としています。

各商品ごとに契約日を付けなければならない場合はまた違ってきます。
もう少し、ごろ様の考えられているデータベースがわかると
作り方のお手伝いが出来そうなのですが…

【3234】Re:テーブルへのレコード自動追加
質問  ごろ  - 04/8/15(日) 15:26 -

引用なし
パスワード
   たびたびのご教授ありがとうございます。

>その1
>使用されている(作るデータベース)のAccessのVersionは2000以上ですか?

ACCESS 2000で作成しております。
いじっちゃダメDB(会社マスタ)はOracleです。

>一つの顧客で例えば3カ月おきに更新されるというようなイメージなのでしょうか。
>・正規化前のデータ(例)
>
> 顧客名     契約日   更新日   商品X  商品Y
>トマト株式会社 2004/5/10  2004/5/10   yes   no
>トマト株式会社 2004/5/10  2004/6/10   no    yes
>トマト株式会社 2004/5/10  2004/7/15   yes   yes
>
>※ 上の例では契約日を一つの顧客との取引開始契約としています。

えぇっとですね、あくまで私が今、考えている形としては、

会社ID  契約X  契約X_更新日 契約Y  契約Y_更新日 ・・・
1     Yes   2004/5/10   Yes    2004/6/10
2     no    2004/08/10   yes    2004/7/20

といったような感じで、各契約ごとに更新日、及び、Yes/Noを持っており、 
更新の際はレコードを新たに追加して過去の履歴として保存していくと言うよりは、
レコードを上書きしてしまって行く形になります。
(フォームを作成して、チェックボックスで操作します。)
ですので、契約テーブルに新レコードが追加されるのは、
新たな取引先の発生(会社マスターに追加があった場合)になります。

ちなみに、契約テーブルの存在意味としては、例えば、
契約XのフラグのNoの一覧をレポートし、今後、営業していくですとか、
各商品ごとに契約期間が決まっているので、契約X_更新日を
2004/5/10以前と言う様な形でレポートすることによって、
契約がもうすぐ切れる会社を知ることが出来ると言った
使い方になります。

そう言う意味では、このテーブルに関してはDBと言うよりは、
レポートの為、チェックの為のフラグとして使う形になります。

確かに、会社マスターに契約がらみの項目も追加できれば
まったく問題ないのですが、あくまで、マスターをいじれないと言う
制約があるため、強引に2つに分けたような形をとり、
クエリの方で完全にこちらの要求を満たしてくれる形になる予定です。

会社の追加はそうそうあることでは無いのですが、発生の際は
手作業ではなく、自動で、契約テーブルの方にも新たに追加された
会社用のフラグのレコードも作成されて欲しいのです。。。
(↑ここが今の形での一番のネックになっております。。。)

初心者の意味不明な説明になってしまい、すみません。
こもれび様のお時間を割いていただき申し訳ありませんが、
ご教授、よろしくお願いいたします。

【3236】Re:テーブルへのレコード自動追加
回答  こもれび  - 04/8/15(日) 23:21 -

引用なし
パスワード
   >ACCESS 2000で作成しております。
>いじっちゃダメDB(会社マスタ)はOracleです。

なるほど… 〆(..)メモメモ
OracleのテーブルをAccessにリンクしていると見ればよろしいのでしょうか?
参照する会社マスタテーブルには会社名を50音順に並べられる「ふりがな」
やそれに相当する別のコードはありますか?
また、出来上がったアプリケーションを利用するユーザーは何人で、
その方々はすぐに移動することのない人なのか、それともパート・アルバイト
の可能性もあるのか、そのあたりはいかがでしょうか。

なぜそのようなことを聞くのかと申しますと、基本的にアプリケーションは
ユーザーが「何も考えずに使える」ものが理想的なもので、「何かを考えさせる」
ことは極力避けるようにすることが必要だからです。

例えばユーザーさんが「△△△株式会社はID番号5」と考えさせてから
アプリケーションが使えるというのでは困ってしまいます。
また、数ある顧客をリストボックスから選ぶのに何の規則もなく表示されたら
まず一生懸命顧客名(例えば漢字表示)を探すことからはじまってしまいますが、
50音順に表示してくれれば手間は少しでも解消します。

今私の頭の中で考えているイメージは、「修正用フォーム」を立ち上げると
顧客名を表示するリストボックスと顧客選択決定入力用のコマンドボタン、
そして選択された顧客の契約状況を表示するチェックボックスと日付を
表示するテキストボックスが契約X,Y…の数分配置してあり、右隅あたりに
「修正確定」と「キャンセル」ボタンが設けられているというものです。

操作フローは次のようなものです

1. 顧客を選択
2. 選択決定ボタンのクリック(リストボックスで選択してenterキーを押す操作も可とする)
-------- ここで契約状況表示をVBAが行う ---------
3. 表示された契約状況を確認し、修正入力を行う。(チェックボックスのみ)
4. 修正確定ボタンのクリック
-------- ここで確認のメッセージボックスが表示される -------
メッセージボックスタイトル:修正確認
メッセージ本文:
         次の内容を[日付]で確定してよいですか?
          [顧客名] [契約X]:[yes/no]
                .
                .
                .
            OK(ボタン) Cancel(ボタン)
5. OKボタンのクリックにより、契約テーブルを更新する。
5’.キャンセルボタンのクリックではなにもしない。

>会社の追加はそうそうあることでは無いのですが、発生の際は
>手作業ではなく、自動で、契約テーブルの方にも新たに追加された
>会社用のフラグのレコードも作成されて欲しいのです。。。
>(↑ここが今の形での一番のネックになっております。。。)

ここの部分はマスタと契約テーブルをSQLで「契約テーブルにない顧客」
を抜き出して、契約テーブルに追加するということで解決すると思います。

例)
    マスタ    契約
    トマト    トマト
    なす     なす
    ジャガイモ  (null)
    きゅうり   (null)
    レンコン   (null)
この例では契約テーブルにジャガイモときゅうりとレンコンがありませんから
この3つを契約テーブルに追加すればよいことになります。

マスタテーブルに新規顧客が入った場合は文書や口頭で連絡があるのでしょうか。
それとも全く連絡がないのでしょうか?
全く連絡がないのであれば、「新規チェックフォーム」を用意しておいて
「確認開始」ぼたんをクリックすると契約テーブルに追加すべき顧客を
表示して「追加」ボタンをクリックすると追加される。
というのはいかがでしょうか。

【3238】Re:テーブルへのレコード自動追加
質問  ごろ  - 04/8/16(月) 1:08 -

引用なし
パスワード
   たくさんのご助言、ありがとうございます。

>OracleのテーブルをAccessにリンクしていると見ればよろしいのでしょうか?

その通りです。

>例えばユーザーさんが「△△△株式会社はID番号5」と考えさせてから
>アプリケーションが使えるというのでは困ってしまいます。
>また、数ある顧客をリストボックスから選ぶのに何の規則もなく表示されたら
>まず一生懸命顧客名(例えば漢字表示)を探すことからはじまってしまいますが、
>50音順に表示してくれれば手間は少しでも解消します。

ここについては大丈夫です。既にクリアしております。
フォームでの表示はIDベースではなく、テキストベースであり、
並び方も営業サイド(このアプリを利用するのは営業)の要望を満たしております。

>今私の頭の中で考えているイメージは、「修正用フォーム」を立ち上げると
>顧客名を表示するリストボックスと顧客選択決定入力用のコマンドボタン、
>そして選択された顧客の契約状況を表示するチェックボックスと日付を
>表示するテキストボックスが契約X,Y…の数分配置してあり、右隅あたりに
>「修正確定」と「キャンセル」ボタンが設けられているというものです。

私のイメージとほぼ一致しております!!
ただ、ここでリストされる顧客もこの前段階で絞込みも出来るように
するつもりです。
(例えば、【契約Xが無い会社】【契約Yがない会社】など)

>-------- ここで確認のメッセージボックスが表示される -------
>メッセージボックスタイトル:修正確認
>メッセージ本文:
>         次の内容を[日付]で確定してよいですか?
>          [顧客名] [契約X]:[yes/no]
>                .
>                .
>                .
>            OK(ボタン) Cancel(ボタン)
>5. OKボタンのクリックにより、契約テーブルを更新する。
>5’.キャンセルボタンのクリックではなにもしない。

確認メッセージを出すことについてはノーマークでした。。。
参考にさせて頂きます。


>ここの部分はマスタと契約テーブルをSQLで「契約テーブルにない顧客」
>を抜き出して、契約テーブルに追加するということで解決すると思います。
>
>例)
>    マスタ    契約
>    トマト    トマト
>    なす     なす
>    ジャガイモ  (null)
>    きゅうり   (null)
>    レンコン   (null)
>この例では契約テーブルにジャガイモときゅうりとレンコンがありませんから
>この3つを契約テーブルに追加すればよいことになります。

そうです!まさにこれがやりたかったのです!!
私の現状の場合、【会社マスターの会社ID】と【契約テーブルの会社ID】を
比較して、前者にしかないIDを後者に新レコードとして自動で追加
されるようにしたいのです。

具体的には、【修正用フォーム】が開かれた時、もしくは、その前段階で
別画面をはさみ、そのフォーム上でボタンが押された時などに、イベントとして
この新レコードの追加が行われるようにしたいです。
この技術的(?)な記述の仕方を調べたのですが、ヘタレな私には
見つけられなかったのです・・・。
Clickイベント時、もしくは、OpenFormsイベント時の記述に
どのように記述したら良いのでしょうか???

>マスタテーブルに新規顧客が入った場合は文書や口頭で連絡があるのでしょうか。
>それとも全く連絡がないのでしょうか?

連絡はあります。と言うよりも、新規顧客の登録は同部署で行うので、
知っていると言った方が良いかもしれません。
会社テーブルへの追加はもちろん、今回作成中のものとは
別のアプリからになりますが。。。


>全く連絡がないのであれば、「新規チェックフォーム」を用意しておいて
>「確認開始」ぼたんをクリックすると契約テーブルに追加すべき顧客を
>表示して「追加」ボタンをクリックすると追加される。
>というのはいかがでしょうか。

新規登録があったと言う情報は担当者に入っているので、
私が今、考えている理想としては、フォームや確認ボタンのクリックで
契約テーブルへのレコードの追加が行われるよりは、
こもれび様がイメージされている【修正用フォーム】等が開かれた時点で、
ユーザーに契約テーブルへの追加が裏で自動的に終わっている形にしたいのです。

大変親身になっていただき、本当にありがとうございます。

【3240】Re:テーブルへのレコード自動追加
回答  こもれび E-MAIL  - 04/8/16(月) 13:12 -

引用なし
パスワード
   ごろ様 こんにちは

今回の問題解決に関して一案があります。
ここの質問箱はあるひとつのポイントについて不明点などを
解決するものがほとんどです。
ですから、レスポンスツリーもそれほど深くなりません。
今回に関してはひとつのアプリケーション作製ということなので、
このままですと、まだまだツリーが深くなってしまう可能性があります。

そこで、私のメールアドレスをこの投稿については「表示」としますので
私宛にメールをお送りください。
私の一案をメールで返信したいと思います。(^^)/

>Clickイベント時、もしくは、OpenFormsイベント時の記述に

このあたりに関しても「一案」で詳しくお教えします。

>大変親身になっていただき、本当にありがとうございます。

どういたしまして。

2249 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078325
(SS)C-BOARD v3.8 is Free