Access VBA質問箱 IV

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

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


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

【12247】重複する値があるため主キーとして設定できない 13/1/22(火) 16:06 質問[未読]
【12248】Re:重複する値があるため主キーとして設定... かるびの 13/1/23(水) 3:31 回答[未読]
【12249】Re:重複する値があるため主キーとして設定... 13/1/23(水) 16:34 回答[未読]
【12250】Re:重複する値があるため主キーとして設定... かるびの 13/1/24(木) 1:56 回答[未読]
【12252】Re:重複する値があるため主キーとして設定... 13/1/24(木) 16:37 質問[未読]
【12254】Re:重複する値があるため主キーとして設定... かるびの 13/1/25(金) 1:43 回答[未読]
【12257】Re:重複する値があるため主キーとして設定... 13/1/25(金) 12:18 質問[未読]
【12259】Re:重複する値があるため主キーとして設定... かるびの 13/1/26(土) 0:54 回答[未読]
【12265】Re:重複する値があるため主キーとして設定... 13/1/28(月) 10:20 質問[未読]
【12268】Re:重複する値があるため主キーとして設定... かるびの 13/1/29(火) 0:03 回答[未読]
【12272】Re:重複する値があるため主キーとして設定... 13/1/30(水) 15:50 お礼[未読]

【12247】重複する値があるため主キーとして設定で...
質問    - 13/1/22(火) 16:06 -

引用なし
パスワード
   こんにちは、いつもお世話になってすみません
基本的な質問ですがよろしくお願いします

テーブルA
コード テキスト型・・・・主キー
日にち 日付/時刻型
部署コード 数値型
記事 メモ型

テーブルB
ID オートナンバー型・・・・主キー
コード テキスト型
日にち 日付/時刻型
部署コード 数値型
商品コード 数値型
数量 数値型
備考 メモ型

テーブルA(一)テーブルB(多)
でリレーションシップされていて
参照整合性とフィールドの連鎖更新にチェックが入っています

メインフォームのレコードソースが テーブルA
サブフォームのレコードソースが テーブルB
サブフォームのリンク親フィールド子フィールドはコード

メインフォームのコードフィールドに1を入力し、その後サブフォームにデータを入力すると
サブフォームに入力したデータのコードフィールドには自動的に1が入力されます
これはテーブルAの主キーとテーブルBの主キーではないフィールドがリレーションされているため
という認識であっていますでしょうか?

とても便利なフォームなので使ってみたいと思ったのですが、
私がいま使っているファイルは年度初めにコードがリセットされ1に戻るため
同じコードが重複するため主キーに設定できないため使えません。(これも認識正しいでしょうか?)

ほかに
テーブルAにもIDフィールドを作ってみてこれをつないだらどうか?と思ったのですが1レコード1IDの為使えませんでした。

何か良い方法はないでしょうか?

【12248】Re:重複する値があるため主キーとして設...
回答  かるびの  - 13/1/23(水) 3:31 -

引用なし
パスワード
   >メインフォームのコードフィールドに1を入力し、その後サブフォームにデータを入力すると
>サブフォームに入力したデータのコードフィールドには自動的に1が入力されます
>これはテーブルAの主キーとテーブルBの主キーではないフィールドがリレーションされているため
>という認識であっていますでしょうか?

 私も素人なので、正確な知識がありません。そういう前提で読んでください。

 厳密に言うと、そのような認識は間違っていると思います。
 上記のようになるのは、リレーションシップを設定しているからではなく、
メイン/サブフォームだからそうなるのです。
 リレーションシップを外してしまっても、同じように動くはずですから、
リレーションシップとは関係ありません。
 つまり、「リレーションされている」という言葉を使った点で
間違っていると思います。


>同じコードが重複するため主キーに設定できないため使えません。(これも認識正しいでしょうか?)
 これは、まさにそのとおりです。
 主キーの値は、他のレコードと同じ値を持つことはできません。


>何か良い方法はないでしょうか?
 普通に両テーブルを結合させるフィールドを設けるだけです。

 まず、テーブルAに主キーを設ける必要があります。
 テーブルAの「コード」フィールドが主キーになれないことは、
巻さんの仰るとおりです。
 そこで、例えば、オートナンバー型の「A_ID」フィールドを設け、
これを主キーにします。
「A_ID」というのはテーブルAのIDという意味です。
テーブルBの「ID」フィールドと混同しないようにするため、
フィールド名をちょっと変えます。

 次にテーブルBに「A_ID」フィールドを設けます。こちらは長整数型にします。

 リンク親フィールドとリンク子フィールドには「A_ID」フィールドを指定します。


 蛇足ですが、テーブルAの主キー「A_ID」フィールドを設けた場合、
テーブルBには、「コード」フィールド、「日にち」フィールド、
「部署」フィールドを設ける必要がなくなりますね。

【12249】Re:重複する値があるため主キーとして設...
回答    - 13/1/23(水) 16:34 -

引用なし
パスワード
   かるびの様

早速のご回答ありがとうございます

やってみたのですが、サブフォームに何も表示されなくなってしまいました。
テーブルBのA_IDに何も値が入っていないのですが、それが原因でしょうか?

【12250】Re:重複する値があるため主キーとして設...
回答  かるびの  - 13/1/24(木) 1:56 -

引用なし
パスワード
   >やってみたのですが、サブフォームに何も表示されなくなってしまいました。
>テーブルBのA_IDに何も値が入っていないのですが、それが原因でしょうか?

 たぶんそのとおりだと思います。

 テーブルBの「A_ID」フィールドには、
対応するテーブルAの「A_ID」フィールドの値を格納してください。

【12252】Re:重複する値があるため主キーとして設...
質問    - 13/1/24(木) 16:37 -

引用なし
パスワード
   ▼かるびの さん:
こんにちは、いつもありがとうございます

テーブルBにテーブルAと同じA_IDを入力しましたところ、ちゃんと表示されるようになりました。
フォームで新しくデータを入力したらちゃんとテーブルBのA_IDに自動的に値が入ります

ですが、テーブルA(メインフォーム)に入力したコードをテーブルB(サブフォーム)のコードフィールドにに自動入力させるのは無理でしょうか?
関係ないとは思いましたがコード同志をリレーションしたり、いろいろやってみたのですけどできませんでした。
更新クエリの更新のところに、forms!サブフォーム!コード(コントロール名)とか書いてみたり。

フォームのコードのテキストボックスにはDLOOKUPで格納できますが、肝心要のテーブルBには値が入りません。
もう私の頭に負えないのでどうかお力をお貸しください。

【12254】Re:重複する値があるため主キーとして設...
回答  かるびの  - 13/1/25(金) 1:43 -

引用なし
パスワード
   >ですが、テーブルA(メインフォーム)に入力したコードをテーブルB(サブフォーム)のコードフィールドにに自動入力させるのは無理でしょうか?

 「コード」フィールドは、メインフォームとサブフォームをリンクさせるのには使わない
という前提ですよね。
 そうだとすると、一般機能に限定すると、ちょっと方法が思いつきません。


 VBAを使うならば、次のような方法はどうでしょうか。

 メインフォームの「コード」のテキストボックス(txtCodeMain)が更新されたときに、
サブフォームの「コード」のテキストボックス(txtCodeSub)の既定値プロパティに
txtCodeMainのValueプロパティの値を指定する。

【12257】Re:重複する値があるため主キーとして設...
質問    - 13/1/25(金) 12:18 -

引用なし
パスワード
   かるびの さん:
いつもありがとうございます

> メインフォームの「コード」のテキストボックス(txtCodeMain)が更新されたときに、
>サブフォームの「コード」のテキストボックス(txtCodeSub)の既定値プロパティに
>txtCodeMainのValueプロパティの値を指定する。

とのことでやってみたんですが、
メインフォームのテキストボックスの更新後イベントに書いてみたんですが、
サブフォームが見つからないとかなんとか言われてうまくいかなかったので、

更新クエリを作り、それを
サブフォームの商品コードの更新後クエリに
DoCmd.OpenQuery "更新クエリ"
と書きました。

これで動くことは動くのですが、サブフォームの最後の行を入れるときにだけ
何も入らず(サブフォームは複数行の入力が可能)
もう一度商品コードを入れると他のユーザーによって変更が加えられましたとか
なんとかいうメッセージが出て、他のユーザーの変更を反映するというボタンを
押すとやっとのことでコードに値が入ります

一行しかない場合、一行目からそうなります

難しいですね。何が駄目なのでしょうか

※更新クエリのSQLです

UPDATE テーブルB SET テーブルB.コード = [Forms]![フォームA]![コード]
WHERE (((テーブルB.A_ID)=[Forms]![フォームA]![A_ID]));

【12259】Re:重複する値があるため主キーとして設...
回答  かるびの  - 13/1/26(土) 0:54 -

引用なし
パスワード
   >これで動くことは動くのですが、サブフォームの最後の行を入れるときにだけ
>何も入らず(サブフォームは複数行の入力が可能)

 サブフォームの最後の行の場合に更新されないのは、
当該レコードがまだテーブルに保存されていないからだと思います。

 そのレコードをテーブルに保存してから更新クエリを実行すれば、
きちんと更新クエリが効くと思います。
 テーブルの保存は、
   DoCmd.RunCommand acCmdSaveRecord
というコードで行います。

 ただ、テキストボックスに値を代入すれば足りるところを、更新クエリを使うのは、
大がかり過ぎており、あまり一般的な方法ではないと思います。


>もう一度商品コードを入れると他のユーザーによって変更が加えられましたとか
>なんとかいうメッセージが出て、他のユーザーの変更を反映するというボタンを
>押すとやっとのことでコードに値が入ります

 このエラーメッセージには私もときどき遭遇します。
 原因は私もよくわからないのですが、
フォームで編集中のレコードを、テーブルのレベルでも内容を書き替えたりすると、
このエラーメッセージが出るようです。
 つまり、レコードが二重に編集されているということなのだと思います。

 回避策としては、フォームでレコードを編集中に更新クエリを実行するのはやめる
ということになると思います。


 そうすると、最初の、VBAで値の代入ということに戻ってきます。

>メインフォームのテキストボックスの更新後イベントに書いてみたんですが、
>サブフォームが見つからないとかなんとか言われてうまくいかなかったので、

 どんなコードを書いたんですか。
 特に、メインフォームのプロシージャにおいて、
サブフォームのコントロールをどのように書くかというところは、
初心者がつまづきやすいところなので、それをどのように書いたのか気になります。

【12265】Re:重複する値があるため主キーとして設...
質問    - 13/1/28(月) 10:20 -

引用なし
パスワード
   ▼かるびの さん:
こんにちは、いつもお世話になります

> どんなコードを書いたんですか。
> 特に、メインフォームのプロシージャにおいて、
>サブフォームのコントロールをどのように書くかというところは、
>初心者がつまづきやすいところなので、それをどのように書いたのか気になります。

書いたコードは下記のとおりです

Private Sub コード_AfterUpdate()
[Forms]![サブフォーム]![コード].DefaultValue = [Forms]![フォームA]![コード]
End Sub

そしたら、'サブフォーム’フォームが見つかりません。とエラーが出ます。
よろしくお願いします

【12268】Re:重複する値があるため主キーとして設...
回答  かるびの  - 13/1/29(火) 0:03 -

引用なし
パスワード
   >Private Sub コード_AfterUpdate()
>[Forms]![サブフォーム]![コード].DefaultValue = [Forms]![フォームA]![コード]
>End Sub

 想像していたとおりのコードですね。

 Formsコレクションには、開かれているフォームだけが含まれます。
 メインフォームが開かれていても、サブフォームに使われているフォームは
フォームとして開かれているわけではありません。
 サブフォームがフォームとして開かれているならば、
アクセスのウィンドウ内に標題がサブフォーム名となっているウィンドウがあるはずですが、
メインフォームを開いているときにそんなウィンドウはありませんよね。
 したがって、サブフォームに使われているフォームはFormsコレクションに含まれず、
'サブフォーム’フォームが見つかりません。
というエラーになります。


 サブフォームを参照、取得するには、
   Forms!メインフォーム名!サブフォームコントロール名.Form
とします。
 サブフォーム上のコントロールを参照又は取得するには、例えば、
   Forms!メインフォーム名!サブフォームコントロール名.Form!コンボボックス名
のようにします。

 サブフォームコントロール名というのは、
メインフォームのデザインビューでプロパティシートを表示させたとき、
プロパティシートの標題に「サブフォーム/サブレポート:××××」と表示される
「××××」の部分のことです。

【12272】Re:重複する値があるため主キーとして設...
お礼    - 13/1/30(水) 15:50 -

引用なし
パスワード
   ▼かるびの さん:
いつもお世話になります。
教えていただいた通りやってみましたらうまくいきました。
このフォームを使って今までのaccessファイルを作り直したいと思います。
ありがとうございました。

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