お世話になっております。
T_履歴というテーブルに、「機種_A」から「機種_Z」までの26種類のフィールドがあるとします。 いずれのフィールドもYesNo型で、既定値はNoです。 T_履歴をレコードソースとした「F_詳細」というフォームに「txb_機種」というテキストボックスを配置しています。 レコードの「機種_A」「機種_B」「機種_C」「機種_Z」がYesでその他はNoの時、txb_機種に「A・B・C・Z」と表示させるにはどうすればよいでしょうか?
Excelで申し訳ありませんが、イメージです
T_履歴というテーブルに、「機種_A」から「機種_Z」までの26種類のフィールドがあるとします。
発想がデータベース的ではないですね。 データベースではデータを横方向に展開する(フィールドが増える)ような設計はしません。 このような設計ではデータベースとして使い物になりません。
そのような設計にしたいのならエクセルで作成することをお勧めします。
提示されている情報だけではテーブルデータの全体像が分かりませんので、具体的にどのようなテーブル設計にすべきかは提示できません。 とりあえず、「テーブル 正規化」をキーワードにWEB検索してみて、データベースの基本を学習されることをお勧めします。
機種マスタ
こんな感じのマスターテーブルを作って、T_履歴には機種フィールドにマスタの機種IDをいれればいいのでしょうか?でもそれだと機種を複数選択できません。
今のT_履歴のテーブル構成は、詳細省いてますがこんな感じです。
①T_入力という上記フィールド(受注№以外)を持つテーブルをレコードソースにした、F_入力というフォームで入力を行う(T_履歴には登録ボタンを押して、確定した情報しかレコードして残したくないため) ②F_入力の登録ボタンを押すと、T_入力の内容を追加クエリでT_履歴に追加(この際に受注№を取得) ③F_前回受注№入力というフォームのtxb_受注№(非連結)というテキストボックスに受注№を入力して反映ボタンを押すと、追加クエリでF_入力にその受注№のレコードを追加し、前回入力した内容がF_入力に反映された状態で入力を開始できる
以上のようなことをやりたいのです。 フィールドを横並びにしておけば、追加クエリとかが少なくて済むかなと思ってこのようなテーブルにしました。
きちんと正規化するとT_履歴_機種、T_履歴_加工とかのテーブルも作らないといけないですよね?
正規化調べましたが、T_入力をどうしたらいいかわかりません。 ここからどのようにすればよいでしょうか。
まず、目的をはっきりさせましょう。提示されなければ質問者以外にはわかりません どのような作業(仕事)をするためのシステム(ツール・道具)を作りたいんでしょうか?
それとも、ACCESS(データベース)を学習すること自体が目的のサンプルシステムなんでしょうか?
>> 3にある①②③は手段ですね 目的(どのような結果が欲しいのか)が不明なので、どのような手法を勧めるべきかに至っていません。当然、具体的な手段の話にもなりません。どのようなテーブルを用意すべきか?も具体的な検討に至れません
ご認識の通り正規化するど、T_履歴_機種、T_履歴_加工のテーブルも必要になりますね。 データの集計や検索などのデータ操作を効率よく行うには必須の設計になります。
T_履歴 と T_履歴_機種、T_履歴_加工 の関係は「一対多の関係」といいますが、このような場合、入力フォームの設計はAccessではメイン/サブフォーム形式のフォームを使用するのが一般的です。 検索すればサンプルが多数見つかりので、参照してみてください。
①T_入力という上記フィールド(受注№以外)を持つテーブルをレコードソースにした、F_入力というフォームで入力を行う(T_履歴には登録ボタンを押して、確定した情報しかレコードして残したくないため)
このようなことを実現するには、下記の2つの方法が考えられます。
T_履歴、T_履歴_機種、T_履歴_加工 と同じフィールド構成の一時テーブルを作成して、それをソースとするメイン/サブフォームを作成して、入力フォームとする。
あるいは、現状の入力フォームを非連結にして、登録ボタンでVBAで T_履歴、T_履歴_機種、T_履歴_加工 にデータ追記する。 コントロール名を規則的なものにしておけば、ループ処理でシンプルなコードで実現できると思います。
コントロール名(チェックボックス)が 「機種_1」「機種_2」「機種_3」・・「機種_26」として下記のような感じです。
Dim rs_履歴_機種 As DAO.Recordset Set rs_履歴_機種 = CurrentDB.OpenRecordset("T_履歴_機種") Dim i As Long For i = 1 to 26 If Me.Controls("機種_" & 1).Value = True Then rs_履歴_機種.AddNew rs_履歴_機種!機種ID = Me.受注№.Value rs_履歴_機種!機種ID = i rs_履歴_機種s.Update End If Next
T_履歴_機種 に登録する部分のコードの考え方です。これを参考にコード作成してみてください。 ほかの部分も同様にできると思います。 登録する順番は先にメインテーブル(T_履歴)のほうからしてください。
不適切なコンテンツとして通報するには以下の「送信」ボタンを押して下さい。 現在このグループでは通報を匿名で受け付けていません。 管理者グループにはあなたが誰であるかがわかります。
どのように不適切か説明したい場合、メッセージをご記入下さい。空白のままでも通報は送信されます。
通報履歴 で、あなたの通報と対応時のメッセージを確認できます。
トピックをWIKIWIKIに埋め込む
次のコードをWIKIWIKIのページに埋め込むと最新のコメントがその場に表示されます。
// generating...
プレビュー
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
掲示板で必要なサンプルファイルは下記のフォームから送信してください。
Microsoft Access 掲示板用ファイル送信
ここまでがあなたのコンテンツ
ここからもあなたのコンテンツ
Excelで申し訳ありませんが、イメージです
発想がデータベース的ではないですね。
データベースではデータを横方向に展開する(フィールドが増える)ような設計はしません。
このような設計ではデータベースとして使い物になりません。
そのような設計にしたいのならエクセルで作成することをお勧めします。
提示されている情報だけではテーブルデータの全体像が分かりませんので、具体的にどのようなテーブル設計にすべきかは提示できません。
とりあえず、「テーブル 正規化」をキーワードにWEB検索してみて、データベースの基本を学習されることをお勧めします。
機種マスタ
こんな感じのマスターテーブルを作って、T_履歴には機種フィールドにマスタの機種IDをいれればいいのでしょうか?でもそれだと機種を複数選択できません。
今のT_履歴のテーブル構成は、詳細省いてますがこんな感じです。
①T_入力という上記フィールド(受注№以外)を持つテーブルをレコードソースにした、F_入力というフォームで入力を行う(T_履歴には登録ボタンを押して、確定した情報しかレコードして残したくないため)
②F_入力の登録ボタンを押すと、T_入力の内容を追加クエリでT_履歴に追加(この際に受注№を取得)
③F_前回受注№入力というフォームのtxb_受注№(非連結)というテキストボックスに受注№を入力して反映ボタンを押すと、追加クエリでF_入力にその受注№のレコードを追加し、前回入力した内容がF_入力に反映された状態で入力を開始できる
以上のようなことをやりたいのです。
フィールドを横並びにしておけば、追加クエリとかが少なくて済むかなと思ってこのようなテーブルにしました。
きちんと正規化するとT_履歴_機種、T_履歴_加工とかのテーブルも作らないといけないですよね?
正規化調べましたが、T_入力をどうしたらいいかわかりません。
ここからどのようにすればよいでしょうか。
まず、目的をはっきりさせましょう。提示されなければ質問者以外にはわかりません
どのような作業(仕事)をするためのシステム(ツール・道具)を作りたいんでしょうか?
それとも、ACCESS(データベース)を学習すること自体が目的のサンプルシステムなんでしょうか?
>> 3にある①②③は手段ですね
目的(どのような結果が欲しいのか)が不明なので、どのような手法を勧めるべきかに至っていません。当然、具体的な手段の話にもなりません。どのようなテーブルを用意すべきか?も具体的な検討に至れません
ご認識の通り正規化するど、T_履歴_機種、T_履歴_加工のテーブルも必要になりますね。
データの集計や検索などのデータ操作を効率よく行うには必須の設計になります。
T_履歴 と T_履歴_機種、T_履歴_加工 の関係は「一対多の関係」といいますが、このような場合、入力フォームの設計はAccessではメイン/サブフォーム形式のフォームを使用するのが一般的です。
検索すればサンプルが多数見つかりので、参照してみてください。
このようなことを実現するには、下記の2つの方法が考えられます。
T_履歴、T_履歴_機種、T_履歴_加工 と同じフィールド構成の一時テーブルを作成して、それをソースとするメイン/サブフォームを作成して、入力フォームとする。
あるいは、現状の入力フォームを非連結にして、登録ボタンでVBAで T_履歴、T_履歴_機種、T_履歴_加工 にデータ追記する。
コントロール名を規則的なものにしておけば、ループ処理でシンプルなコードで実現できると思います。
コントロール名(チェックボックス)が 「機種_1」「機種_2」「機種_3」・・「機種_26」として下記のような感じです。
T_履歴_機種 に登録する部分のコードの考え方です。これを参考にコード作成してみてください。
ほかの部分も同様にできると思います。
登録する順番は先にメインテーブル(T_履歴)のほうからしてください。