プロが教えるわが家の防犯対策術!

Access2002 レコード入力時に更新/追加を判別できないでしょうか?

わかりにくくてすみません。

現在、簡単な従業員データベースを作っています。
テーブルは2つだけです。

T_基本データ
・従業員番号=主キー
・氏名
・カナ
T_付属データ
・従業員番号=主キー
・職位

だけです。

本来ならば、1つのテーブルでいいのですが、T_基本データのみ、他部署からMDBで送られてくるため、そのMDBの内容、構成は変更できない(頻繁に送られてくるため、いちいち弊部署にマッチした構造に変換する暇が無い)ため、リンクテーブルにしており、弊部署で必要な付属データを別テーブルにし、従業員番号でリンクしている状態です。

フォームは2つ作っており、1つはT_基本データと、T_付属データを一まとめにして表示できるようになっています。付属データが存在しない場合は、該当項目のテキストボックスは空白です。また、従業員番号や氏名で検索(フィルタ)できるようにしています。単票形式です。

そのフォームに「付属情報入力フォーム」を呼び出すコマンドボタンを用意し、そのフォームを呼び出すようにしています。こちらも単票形式です。ちなみに、プロパティで「入力用=はい」にしています。こうしないと、T_付属データの1レコード目が変更されるだけで、追加してくれないためです。

1つ目のフォームで付属情報入力用フォームの呼び出しボタンをクリックすると、フォームが現れ、従業員番号と氏名のテキストボックス(表示済み)と付属情報を選択するコンボボックスが表示されます。

ここで、コンボボックスから適当な項目を選択し、保存を押すと、そのフォームが消え、1つ目のフォームがリクエリーされて、選択した付属情報がテキストボックスに表示されます。

ここまではすんなり作成できたのですが、問題は、一度入力した付属データを更新できないのです。(消すことはできますので、ユーザがめんどくさがっても、一度消去→再入力、は可能です。が。。。美しくない気がします)
一度付属データを入力した社員を1つ目のフォームで表示させ、付属データ入力用のフォームを表示させると、すでに入力してある付属データが表示されますが、これを変更して終了ボタンを押すと、主キーが重複・・・というメッセージが出て保存できません。

当たり前といえば当たり前なのですが。。。


私の頭の中では、2つ目のフォームで、
1.コンボボックスで職位を選択
2.終了をクリック
3.T_付属情報で従業員番号を検索し、あればそのレコードを更新、なければ新規レコードを追加
というシナリオがあるのですが、どう実現していいのかがわからない状態です。

お詳しい方、ご教授くださいませ。


また、「この程度なら1つのフォーム(とサブフォーム)でできるじゃん」という気もするのですが・・・そういう解決策もあればお教え願えれば幸いです。



長文になりましたが、何卒よろしくお願いします。

A 回答 (3件)

何をお悩みなのか良く分からないのですが


単純にT_基本データを元とする単票フォームがあるのですから
この中に同じくサブフォームを単票で入れ込んで
両方の従業員番号で親子のリンクとすればおしまいと思えるのですが?
※サブフォームのレコードセレクタは消します。
ついでに親フォームのレコードセットをスナップショットにしておけば
某所から来る基本データを誤って変更するなどが防げます。
※子フォーム(T_付属データ)は変更OKです。

勘違いならゴメン。
    • good
    • 0
この回答へのお礼

お答えありがとうございます。

サブフォームは盲点でした。

親子リンクでうまく行きました。

どうもありがとうございました。

お礼日時:2010/10/14 11:23

それならば、



T_基本データ
・従業員番号=主キー
・氏名
・カナ
T_付属データ
・ID(オートナンバー型)<=追加して主キーにする
・従業員番号(データ型のインデックスプロパティを はい(重複なし)にする
・職位

にして、T_基本データテーブルとT_付属データテーブルの従業員番号フィールドをリレーションシップ張るクエリ作成して、フォームの元データはこのクエリを使用して作成すれば新規でも更新でも対応できるでしょ

T_付属データテーブルの職位の部分に入れるデータの為にもう一個、テーブル作った方が管理しやすいかも
    • good
    • 0
この回答へのお礼

お返事遅れました。
ご回答ありがとうございます。

早速、テーブルをご教授いただいたとおりに変更し、クエリも従業員コードで連結するようにしました。(連結は、基本:付属=1:0以上にしてあります。付属データは従業員を網羅していますが、付属テーブルには必ずしも全ての従業員コードが入っていないので)

早速実行しましたが、
1.新規に付属データを入力・・・テーブルに格納OK
2.その従業員の付属データを変更、保存・・・テーブルに上書きOK

と、ここまでは順調でしたが、

3.他の従業員の付属データを入力、保存・・・1.で入力したレコードに上書きされてしまい、1.の従業員情報を表示させると、付則データの箇所は空白(テーブルの中身は、何度やっても1レコードのみ)

となってしまいます。

ちなみに、付属情報を入力するフォームのプロパティで、「データ入力用=いいえ」としています。

そこで、上記プロパティを「データ入力用=はい」にしてみました。

上記、2.では、やはり、インデックスの重複エラー。
3.ではきちんと新しいレコードが作製されています。


どちらにしろ、帯に短したすきに長し、なのです。

なにかヒントはございますか?

お手数をおかけし、申し訳ありません。

お礼日時:2010/10/14 09:29

テーブルの構造が変です



T_基本データ
・従業員番号=主キー
・氏名
・カナ
・職位ID <=これを追加
T_付属データ
・職位ID=主キー
・職位

上記のようなテーブル構造に変更し、T_基本データの職位IDとT_付属データの職位IDとをリレーションシップで結びます

T_基本データテーブルを元にフォームを作成し、職位ID部分をコンボBOXにします
コンボBOXにて格納されるデータはT_付属データの職位IDの値を入力する事になりますが、コンボBOXの属性を指定する事によってフォームには入力した職位IDに該当するT_付属データテーブルの職位フィールドの値が表示されるように出来ますので、実際には表示させたい たとえば係長・部長など職位で表示させる事が出来ます

コンボBOXにカーソルが来た時に選択出来る項目が一覧表示されるようにdropdownさせても良いですし、camo-tech さんがやっているように一旦別フォームを表示させて入力した値を、取り込むでもOKです

>いちいち弊部署にマッチした構造に変換する暇が無い

Excelをやっている人がAccessを触るとよく勘違いされるようですが、データベースは元データと取り込むデータの順番がバラバラだろうと関係ありません

取り込むデータのこのフィールドの値を、このテーブルのこのフィールドに取り込めというようにクエリー作ればいいだけなので、まったく気にする必要はありません

T_基本データテーブルに 職位ID 持たせてやるだけで、新規だろうが、変更だろうが好きなように出来ますよ
    • good
    • 0
この回答へのお礼

早速のご回答、痛み入ります。

が、質問でも書いたとおり、T_基本は、外部DBですので、デザインが変更できないため、苦し紛れに別テーブルを作り、従業員番号でリンクさせているのです。

説明不足で申し訳ないです。

また、よろしくお願いします。

お礼日時:2010/10/13 16:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す