質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

9750閲覧

Access 一度の登録処理で、複数のレコード登録がしたい。

Yuyuu

総合スコア12

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/05/22 06:24

前提・実現したいこと

Access初心者です。
VBAコードを用いて、一度の登録ボタンで複数のレコードに分けて登録がしたいです。

フォームでの入力欄は、
日付
伝票番号
商品
関連商品1
関連商品2
関連商品3
のようになっています。

関連商品には、各々番号を振っているため、
登録するテーブルのフィールド名を分けたくない状態です。

登録する際も、商品によって
関連商品が1~3種類とばらつきがあるため、
入力がある場所のみの登録がしたいです。

情報が不足していたら申し訳ございません。

試したこと

.AddNewを使ってみましたが、1件のレコードしか登録できませんでした。

補足情報(FW/ツールのバージョンなど)

環境
Windows10
Access2016
VBA

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/05/22 06:54

そのフォームのレコードソースにテーブルは指定したくないということですか?
Yuyuu

2018/05/22 06:59

レコードソースがよくわかっていないため、答えになっているかわからないですが、後にデータを収集したいため、登録するテーブル内に関連商品のフィールドを複数持ちたくない状態です。現在作っているフィールドは「関連商品_ID」と「関連商品_Name」のようなイメージです。
guest

回答2

0

まずは、テーブル設計をどうしたらよいかを検討しましょう。
データベースでのテーブル設計のキーワードは「正規化」です。
このキーワードでWEB検索して、概要を理解しましょう。

今回の項目をみると、

日付
伝票番号
商品
関連商品1
関連商品2
関連商品3

日付があることから、受注履歴か、売り上げ履歴のようなデータの管理かと思います。

まず、マスターテーブルとトランザクションテーブルに分解しましょう。
一例をあげると、

マスター系
◆商品マスター(※商品CD、商品名、単価、メーカー、・・・・)

トランザクション系
◆受注履歴(※伝票番号、日付、商品CD、・・・)

◆受注関連商品(※受注関連ID(オートナンバー)、伝票番号、商品CD)

あくまで、提示の項目から推測した一例です。

「商品」と「関連商品」は一対多の関係のようですので、テーブルを分けます。
「商品」と「関連商品」は重複する可能性があるとして同じマスターを参照するようにしてます。
まったく別物なら、マスターはそれぞれ別テーブルに分けてもOKです。

一対多の関係のデータの入力フォームはメイン/サブフォーム形式にするといいでしょう。
リレーションシップを設定しておくと、ウィザードで簡単に作成できます。

サブフォームを含むフォーム (一対多のフォーム) を作成する - Access

上記のテーブル設計はあくまで提示されている情報からの推測による一例ですので、
まずは「正規化」についてある程度理解されてから、テーブル設計をしてください。
フォーム設計はテーブル設計がしっかりできてからです。

投稿2018/05/22 08:08

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuyuu

2018/05/22 08:15

「正規化」ありがとうございます! もう少し勉強してみます。
guest

0

ベストアンサー

関連商品の個数分、forループなどで.AddNewすればいいのでは?

もう少し丁寧に説明すると、
例えばテーブル構造
のようなテーブル構造を例示する。
もしも、日付、伝票番号を主キーにしたり、あるいはインデックス:「はい(重複なし)」にしてしまうと、
複数レコードを登録することができなくなる。
レコードをユニークに識別するために、ユーザーに入力させない、
オートナンバー型の例えばIDなるフィールドを設けてやると扱いやすい。
そうしないと、関連商品3個から2個に減らしたい、なんていう操作が大変なことになるから。

オートナンバー型のフィールドは、
.AddNewするときに自動で値を作ってくれるから気にしなくてよい。
.AddNewして、.Fields("~") = Me.テキストボックス1.Valueとかやって、
最後.Updateとか書けばいい。

フォームとテーブル
画像の中でテキスト7って書いてる隣のテキストボックスには、
ちゃんと名前:「関連商品1」「関連商品2」「関連商品3」ってなってる。
サンプルコード

投稿2018/05/22 06:30

編集2018/05/22 07:29
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuyuu

2018/05/22 06:39

またまたご回答いただき、ありがとうございます! for文の使い方がいまいちわかっていないのですが、 .AddNew .Fields("日付") =Me!日付 .Fields("伝票番号") = Me!伝票番号 ... とあったとして、どういう風にループさせていくのでしょうか?
Yuyuu

2018/05/22 07:58

詳しくありがとうございます! ただ、関連商品が2つだった場合に登録するレコードは2つ 関連商品が1つの場合は登録するレコードは1つにしたいのですが、可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2018/05/22 08:05

.AddNew~.Updateを一括りとして、 その直前に対象のテキストボックスに値が入っているかどうかをチェックすればよいです。 If Len(Me.Controls("関連商品" & CStr(i)).Value & "") > 0 Then とか。テストしてないので自信なし。
Yuyuu

2018/05/22 08:12

全然理解できてなくて申し訳ございません。 試してみたところ関連商品0が見つかりませんと7エラーになってしまいました。
退会済みユーザー

退会済みユーザー

2018/05/22 08:17

テキストボックスが0,1,2なら For i = 0 To 2 テキストボックスが1,2,3なら For i = 1 To 3 ってことくらいお察しください。
Yuyuu

2018/05/22 08:22

言葉足らずで申し訳ございません。 m6uさんのご回答のように、関連商品のテキストボックスは1.2.3 でコードを書いて作成しました。 そのコードの中に If Len(Me.Controls("関連商品" & CStr(i)).Value & "") > 0 Then これを入れたところ、関連商品0が見つかりません。 という状況です。
退会済みユーザー

退会済みユーザー

2018/05/22 08:42

iにゼロが入っているからです。 iの値をFor文で作ろうとしていますので、 For i = 1 To 3 としていることをお察しください。
Yuyuu

2018/05/23 00:04

ありがとうございます! エラーも出ず登録できました。 理解できるまでご教授頂き、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問