Microsoft Office全般(Excel/Word/PowerPoint/Access/Outlook/OneNote)の使用方法を解説。

www.wanichan.com

PC > Access > FAQ

アクセスのリレーションシュップが分かりません

Microsoft Office Users Forum過去ログ

■1083 / inTopicNo.1) アクセスのリレーションシュップが分かりません

□投稿者/ コモ 一般人(1回)-(2005/09/14(Wed) 20:36:39)


記事内容:[Access] 

アクセスに挑戦中ですが、入力画面(フォーム)を作りテーブルにデーターが入ります。次にクエリーを作る時点で思ったようになりません。リレーションは必要ですか? どのように関係付けるのですか?
インデックス、主キー、またはリレーションシップで値が重複しているので更新できませんとなります。この場合の対処法を教えて下さい。
または

■1087 / inTopicNo.2) Re[1]: アクセスのリレーションシュップが分かりません

□投稿者/ wanichan 大御所(353回)-(2005/09/14(Wed) 23:12:41)

Accessはリレーショナルデータベースソフトです。
リレーションシップ(関連付け)がちゃんとなされていないといけません。

マスターとなるテーブルと、データテーブルはどのように分けていますか?
重複データが入る可能性があるものは、別にそのリストを参照するためのマスターテーブルがあればいいですね。

クエリを作る前にリレーションシップで関連付けることをオススメします。

まずは、どのようなデータベースを構築中なのか教えてください。

■1088 / inTopicNo.3) Re[1]: アクセスのリレーションシュップが分かりません

□投稿者/ シムリー 一般人(35回)-(2005/09/14(Wed) 23:41:18)

> アクセスに挑戦中ですが、入力画面(フォーム)を作りテーブルにデーターが入ります。
> 次にクエリーを作る時点で思ったようになりません。
> リレーションは必要ですか? どのように関係付けるのですか?

リレーションシップウィンドウからおこなうリレーションシップは
テーブルにデータを登録する際の制約を決めるもので
クエリのデザインビューに登場するリレーションシップは、
データを抽出する際の条件のようなもので、この2つは別物です。
文意からクエリでの話と思いますが、必要かどうかは何を取り出したいかによって決まります。

> インデックス、主キー、またはリレーションシップで値が重複しているので更新できませんとなります。
> この場合の対処法を教えて下さい。

主キーの意味は分かりますか?
具体的なテーブルやフィールドの構成、およびフォームのベースとなっているクエリが分からないので、
よく分かりませんが、主キーの値を既にある別の値に変更しようとしているようです。
テーブル、クエリの具体的な構造を示して頂ければ、対処法も具体的になるでしょう。

参考書籍やネットで、「主キー」や「正規化」という言葉をもう少し調べてからトライされても
決して損な回り道にはならないと思います。

■1103 / inTopicNo.4) Re[2]: アクセスのリレーションシュップが分かりません

□投稿者/ コモ 一般人(3回)-(2005/09/17(Sat) 09:55:48)

■No1087に返信(wanichanさんの記事)
> >
> クエリを作る前にリレーションシップで関連付けることをオススメします。
>
> まずは、どのようなデータベースを構築中なのか教えてください。

商品テーブル  仕入先テーブル 顧客情報 実績ファイル 職員マスター 職員月別実績 職制テーブル 年月テーブル 事業所テーブル を作り関連付けでクエリーえを作ってレポートへ持っていきます。
 
実績管理を目的としたものです。

ご教示願います。


■1110 / inTopicNo.5) Re[3]: アクセスのリレーションシュップが分かりません

□投稿者/ シムリー 一般人(37回)-(2005/09/18(Sun) 17:30:48)

■No1103に返信(コモさんの記事)

テーブルの名前だけ示しても、どこに問題があるかの手がかりになりません。
エラーを起こす問題の、入力フォームの基となるクエリ、レポートの基となるクエリには、どのテーブルのどのフィールドが入っているのでしょう?
また、各テーブルの主キーはどれですか?

一般的に、誰が何を誰に売ったか記録する場合、社員テーブルや商品テーブルや顧客テーブルがあり、それぞれはコード番号で管理されています。
売り上げの記録を残す場合、11番の社員が22番の商品を33番の顧客に売った、と記録します。
この場合は、売り上げテーブルは伝票番号のようなものを主キーとし、社員番号、商品番号、顧客番号、日付等のデータを登録します。
記録された番号が何かを、画面上や印刷物に表示させる必要があるので
売り上げテーブルの社員番号は、社員テーブルの社員番号と
売り上げテーブルの商品番号は、商品テーブルの商品番号と
売り上げテーブルの顧客番号は、顧客テーブルの顧客番号と
リレーションさせるべきなのです。

気をつけなければならないのは、主キーはテーブル内に同じ番号があってはいけない唯一の番号として管理されており、空白のままでも登録できないルールがあります。
11番の社員、と記録したときに該当する社員が複数存在しているようなことがあったり、
あるいは、売り上げの登録画面で主キーとなる伝票番号がオートナンバーでなく、かつ入力するテキストボックスが無い、ということがあると当然エラーが発生します。
この辺りもよく確認してください。

■1144 / inTopicNo.6) Re[2]: アクセスのリレーションシュップが分かりません

□投稿者/ コモ 一般人(5回)-(2005/09/23(Fri) 09:24:52)

'*--------------------------------------------------------------------------------------*
'* 集計組織推進データ作成 *
'*--------------------------------------------------------------------------------------*

Set db = CurrentDb()

mySQL = "delete from [職員・月別実績];"
db.Execute mySQL

Set rs = db.OpenRecordset("実績ファイル", dbOpenTable)
Set rst = db.OpenRecordset("職員・月別実績", dbOpenTable)

If rs.EOF Then
Else
rs.MoveFirst
End If

Do Until rs.EOF

If (rs![供給日] >= Me![抽出開始日]) And (rs![供給日] <= Me![抽出終了日]) Then
Set rs1 = db.OpenRecordset("職員マスター", dbOpenDynaset)
rs1.FindFirst "[職員コード]=" & rs!職員コード

rst.AddNew

rst!職員コード = rs!職員コード
rst!分類コード = rs!分類コード
rst!年 = rs!供給年
rst!月 = rs!供給月
rst!実績 = rs!実績
Select Case rs!供給月
Case 1
rst!目標 = rs1![1月目標]
Case 2
rst!目標 = rs1![2月目標]
Case 3
rst!目標 = rs1![3月目標]
Case 4
rst!目標 = rs1![4月目標]
Case 5
rst!目標 = rs1![5月目標]
Case 6
rst!目標 = rs1![6月目標]
Case 7
rst!目標 = rs1![7月目標]
Case 8
rst!目標 = rs1![8月目標]
Case 9
rst!目標 = rs1![9月目標]
Case 10
rst!目標 = rs1![10月目標]
Case 11
rst!目標 = rs1![11月目標]
Case 12
rst!目標 = rs1![12月目標]
End Select

rst.Update

End If

rs.MoveNext

Loop

rs.Close
rst.Close



こんな具合にデータ集計しますが、updateのところでエラーになります。

どうしてでしょう
   どこが悪いのでしょうか?

■1147 / inTopicNo.7) Re[3]: アクセスのリレーションシュップが分かりません

□投稿者/ シムリー 一般人(38回)-(2005/09/23(Fri) 18:54:04)

DAOですか....
はじめにDAOの宣言が必要なんじゃないかな。
それからDAOの参照設定はしたんでしょうか?

コードがやたら冗長な感じがします。
3種類のレコードセットが独立してコードの中に紛れ込んでますが、何でこんなことになるんでしょう??
これって、グループ化を使ったクエリで、シンプルに処理できるんじゃないでしょうか?

元テーマから随分ジャンプしてますが、どうなってるんでしょうか?
論理的に正しいVBAが書けたとしても、テーブルの設定やリレーションシップに問題があるままでは、
トラブルは解決できませんよ。

■1152 / inTopicNo.8) Re[4]: アクセスのリレーションシュップが分かりません

□投稿者/ コモ 一般人(6回)-(2005/09/26(Mon) 20:48:37)

■No1147に返信(シムリーさんの記事)
> >
> 元テーマから随分ジャンプしてますが、どうなってるんでしょうか?
> 論理的に正しいVBAが書けたとしても、テーブルの設定やリレーションシップに問題があるままでは、
> トラブルは解決できませんよ。



色々やってわかんないから聞いてるの

原因が、リレーションなのかVBAなのかそれとも別のなにかが・・。

だから 、教えてよ

■1153 / inTopicNo.9) Re[5]: アクセスのリレーションシュップが分かりません

□投稿者/ シムリー 一般人(39回)-(2005/09/26(Mon) 21:19:57)

ですから、同じことを何度も書きますがテーブルの名前だけ示されても、コメントが難しいのです。
それは、プログラムコードを示さずに、どこが悪いのか聞くのと同じことです。
業務の推理はできても、それ以上のことは何もわかりません。

1.関連のあるフィールドを示す
2.主キーはどのフィールドか示す
3.エラーが起こっているフォーム、レポートの元となるクエリ
 (レコードソース)そしてリレーションシップを詳細に示す
などなどのことが必要です。

今までの話の流れからすると、原因はリレーションシップでの参照制約じゃないかと思います。
先に示した一般論でたとえると、
1.商品テーブルに同じ商品番号を持つデータが存在している
2.売り上げテーブルに登録しようとしている商品番号が、商品テーブルにはないコード番号である
などの場合は、データベースの参照制約からデータの登録や変更ができません。
データの点検も必要ではないかと思います。

■1157 / inTopicNo.10) Re[3]: アクセスのリレーションシュップが分かりません

□投稿者/ みゃみゅ玉子 一般人(5回)-(2005/09/26(Mon) 23:27:43)
http://www.hiemalis.org/~koyama_wk/

みゃみゅ玉子です。

■No1144に返信(コモさんの記事)
> こんな具合にデータ集計しますが、updateのところでエラーになります。
>
> どうしてでしょう
>    どこが悪いのでしょうか?

エラーメッセージが
「インデックス、主キー、またはリレーションシップで値が重複しているので更新できません」
ということならば、おそらくキーの列の値が重複してしまい更新できないということでしょう。
つまりは、シムリーさんが書かれているように
> 1.商品テーブルに同じ商品番号を持つデータが存在している
というようなことが起きているのです。

そう予想して、まず、rst.AddNewの後、rstに何を入れているのかを調べましょう。

rst.AddNew
↑この行に、ブレークポイントを置いてください。

で、実行してみてください。
おそらく、ブレークポイントの1回目はそのまま通り、2回目に止まった後でエラーが出ると思います。
# 完全な推測なので、もっと複雑かもしれませんが。

もし、2回目で本当にエラーが発生していたら、また実行して、今度はブレークポイントから1行1行進めていきます。
↓ここで、それぞれ何を入れているのかを覚えておいてください。
> rst!職員コード = rs!職員コード
> rst!分類コード = rs!分類コード
> rst!年 = rs!供給年
> rst!月 = rs!供給月
> rst!実績 = rs!実績

1回目と2回目で同じ値が何処まで入っているのかを見てください。

おそらく、職員コード、分類コード、年までは一緒でしょう。
ここまではきっと問題ないのです。

たぶんキーにしているのは、月までだと思って話を進めます。
ここでrst!月に入れている値から、2つの原因が推測されます。

(1) もし、1回目と2回目で違う値が入っている場合。
  職員・月別実績テーブルの主キーの設定を疑ってください。
  たぶん、年までしかキーにしていません。確認してください。

(2) もし、1回目と2回目で同じ値が入っている場合。
  プログラムを疑ってください。
  実績ファイルテーブルには、同じ年月のデータが入ってもいいようになってます。
  この、同じ年月のデータを集計するのか、そもそも同じ年月は入ってはいけないのか。
  そのあたりでまたプログラムが変わってきますよね。


僕の完全な推測で話を進めてしまっていますが、原因を調べるうえでの参考にしてください。
# 予想では、(1)。
# なぜなら、昔、やってしまった記憶が・・・(汗)

(1)が原因だと疑う場合、テーブルに直接データを打ち込んでみるのもいいかもしれませんね。

スポンサーリンク
INDEX
  • このエントリーをはてなブックマークに追加

コメント

※技術的な質問はMicrosoftコミュニティで聞いてください!

▲このページのトップへ