お世話になっております。
M_ひらがなマスター
T_ひらがな表示
以上のようなテーブルがあるとします。
レポートのレコードソースに、2つのテーブルを結合したクエリを使い、 レポートのtxb_ひらがな1に「あ」、txb_ひらがな2に「い」と表示したいのですが、どのような構成のクエリにすればよいでしょうか?
SELECT T_ひらがな表示.ID, M_ひらがなマスター.[ひらがな], M_ひらがなマスター_1.[ひらがな] FROM (M_ひらがなマスター RIGHT JOIN T_ひらがな表示 ON M_ひらがなマスター.[ひらがなID] = T_ひらがな表示.[ひらがなID]) LEFT JOIN M_ひらがなマスター AS M_ひらがなマスター_1 ON T_ひらがな表示.[ひらがなID2] = M_ひらがなマスター_1.[ひらがなID];
テーブルの表示でM_ひらがなマスターを2つ表示することでレポート用のクエリを作ることが出来ました。 でもこれだと、例えばひらがな3、ひらがな4、、、と増えていくと、その分だけM_ひらがなマスターのテーブルの表示を増やさないといけないですよね? 何か根本的に間違えているような気がするのですが、スマートな実現方法や、間違い等を指摘して頂きたいです。
質問の具体例に相当する実際のシステムの具体例が思い浮かびませんが、そっくりそのままやりたいことがそれならそういうものですよ
ただし、
例えばひらがな3、ひらがな4、、、と増えていくと、
のような、「フィールドの数が変動するようなデータ」は通常想定しません。データベース設計としてはNGです 設計段階で「最大個数としてn個ある」のような場合は、その仕様によっては連番で管理されるようなフィールド構造を取る場合もあります
同様の内容が増えていくようなデータの場合は、そのデータ分だけレコード(行)が増えるような形にします
質問中の「T_ひらがな表示」内の「ID」が、ここで提示した「管理ID」に相当します。「管理ID」が同じレコードを一つのグループとみなす形になります
このように生成したデータを、実際の表示の際に「『管理ID』が同じものを一つのレコードとして扱いたい」場合には、クエリでそのように整形します。手法はいくつかありますが、クロス集計クエリを使うのが一般的でしょう
質問は実際のDBを簡略化したものです。 FXのトレード日記をAccessで作成しておりまして、
M_取引根拠
このマスターテーブルを値集合ソースにした3つのコンボボックス(連結列:1、名前:cmb_取引根拠1、cmb_取引根拠2、cmb_取引根拠3)の値をT_トレード日記(例でいうT_ひらがな表示)の取引根拠1、取引根拠2、取引根拠3フィールドに格納します。
このT_トレード日記とM_取引根拠を結合したクエリをレコードソースにして、レポート上で、「割安感」「割高感」といった風に表示したいという感じです。
実現の方法は、自己解決の方法で問題ないということでしょうか?
どの程度を求めるか?ですが、「あまりよくはない」「そうはしないほうが無難」ですかね
困る状況(データベース的におかしい使い方)として、「根拠に〇〇が含まれているトレードを拾い出したい」みたいな要求に応えにくくなります
正規化されていれば、「根拠」フィールドだけを対象にフィルタを掛ければいいですが、横並びで1,2,3としてしまうと、その3つのフィールド全てに対して条件(それぞれのパターンで矛盾しないような)を設定する必要が出てきます。このような運用はデータベース的にNGです
なので、「仕事のシステム」ならそうはしません。「個人使用」ならまぁACCESSでちょっと作っただけだしこんなんでもいいかとしてもいいとは思います(何かやろうとすると間違いなく苦労することになりますが)
いまさら気づいたけど>> 2のテーブル例ミスってます IDの列は単に連番のつもりでした「T_ひらがな表示」の主キー想定です
テーブル設計が正規化されていないのでそうなるのは仕方ないですね。
T_ひらがな表示テーブルを正規化するすると、下記のようになります。 これなら、クロス集計クエリで可能です。
hirotonさん、Hatenaさん、回答ありがとうございます。
Accessの勉強を兼ねて作成していますので、入力したデータは集計・分析に活用したいと考えております。 例えば ・トータル勝率 ・買い取引時の勝率 ・勝率の高い取引根拠 等です。
入力情報を格納するテーブルの構成を変えて正規化?をするにはどうすればよいでしょうか? 現在の取引履歴を保存するテーブルの校正は画像2・3枚目の通りで、4枚目のようなマスターテーブル(M_●●)があります。
正規化云々以前に、もし主キーの設定漏れがある場合、きちんと設定ないと話が始まりませんよ。リレーションシップの設定画面をスクリーンショットを添えて、新しい質問を作りませんか?
あ、T_取引履歴はIDが主キーです。 つけ忘れておりました。
リレーション?は今のところ何も設定していません。
マスタテーブルを作った理由は?マスタデータを参照してトレード履歴を登録する、そのためにリレーションシップを設定する、という事じゃないの。 主キーや正規化云々以前に、リレーションシップを設定する必要性が無いのであれば、MsAccessの話が始まらないでしょう。
この3つのうち前の2つは現状のままでもいいですが、 勝率の高い取引根拠 を出したいなら、 すでに私やhirotonさんから提案されいてる形(正規形)にした方がいいでしょう。
正規化のやり方は、検索すれば解説ページが多数見つかるのでその中で、分かりやすそうなページを参考にやればいいでしょう。
例えばエントリ根拠に関していえば、 T_トレード履歴 から、エントリ根拠1~5 フィールドを削除して、 T_トレード履歴_エントリ根拠 テーブル作成して 下記のようなフィールド構成にします。
トレード履歴ID (T_トレード履歴の外部キー) 根拠ID (M_根拠_エントリーのの外部キー)
トレード履歴ID と 根拠ID で複数フィールド主キーに設定。
フォームは、 F_トレード履歴 に T_トレード履歴_エントリ根拠 から作成した帳票フォームをサブフォームとして埋め込めばいいでしょう。
ありがとうございます。Hatenaさん、Hirotonさんに提案されている正規化をやってみたいと思います。
心理状態(エントリー時)、心理状態(クローズ時)も同じマスターテーブル(M_心理状態)から値を拾うのですが、エントリー根拠のように別テーブルにする必要はありますか?
データが同じなら、別テーブルにする必要はないです。 リレーションシップを設定するときに、マスターテーブル(M_心理状態)を2つ追加してそれぞれと結合されせればいいでしょう。
T_トレード履歴_エントリー根拠・T_トレード履歴_クローズ根拠のテーブル作成、リレーションシップの設定をしてみましたが、こんな感じでよいのでしょうか? フォームの入力確定時に保存用テーブル(T_トレード履歴・T_トレード履歴_エントリー―根拠・T_トレード履歴_クローズ根拠)にレコードの書込みを行いたいので、tmpとしています。
M_●●はマスターテーブルです。
画像修正しました。
画像を見た限りでは特に問題はなさそうです。
ありがとうございます、作成を進めてみます! Hatenaさん、Hirotonさん、いつも的確なアドバイス・回答をありがとうございます。
お世話になります。 リレーションシップを設定したところ、マスターテーブルの下に+が表示されるようになり、クリックすると別のテーブルのレコードがでてくるのですが、これは問題ないでしょうか?
サブデータシートですね。 リレーションシップを設定すると自動で設定されます。 詳細は下記を参照。
サブデータシートはテーブルプロパティで手動設定できる | Access 2019 | 初心者のためのOffice講座
表示させたくなければ、テーブルプロパティで非表示に設定できます。これも上記のリンク先で説明されてます。
なるほど、このような機能があるのですね。
サブデータシートをうっかりさわってレコードを変更してしまわないように非表示にしておきます。
不適切なコンテンツとして通報するには以下の「送信」ボタンを押して下さい。 現在このグループでは通報を匿名で受け付けていません。 管理者グループにはあなたが誰であるかがわかります。
どのように不適切か説明したい場合、メッセージをご記入下さい。空白のままでも通報は送信されます。
通報履歴 で、あなたの通報と対応時のメッセージを確認できます。
トピックをWIKIWIKIに埋め込む
次のコードをWIKIWIKIのページに埋め込むと最新のコメントがその場に表示されます。
// generating...
プレビュー
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
ここまでがあなたのコンテンツ
ここからもあなたのコンテンツ
テーブルの表示でM_ひらがなマスターを2つ表示することでレポート用のクエリを作ることが出来ました。
でもこれだと、例えばひらがな3、ひらがな4、、、と増えていくと、その分だけM_ひらがなマスターのテーブルの表示を増やさないといけないですよね?
何か根本的に間違えているような気がするのですが、スマートな実現方法や、間違い等を指摘して頂きたいです。
質問の具体例に相当する実際のシステムの具体例が思い浮かびませんが、そっくりそのままやりたいことがそれならそういうものですよ
ただし、
のような、「フィールドの数が変動するようなデータ」は通常想定しません。データベース設計としてはNGです
設計段階で「最大個数としてn個ある」のような場合は、その仕様によっては連番で管理されるようなフィールド構造を取る場合もあります
同様の内容が増えていくようなデータの場合は、そのデータ分だけレコード(行)が増えるような形にします
T_ひらがな表示
質問中の「T_ひらがな表示」内の「ID」が、ここで提示した「管理ID」に相当します。「管理ID」が同じレコードを一つのグループとみなす形になります
このように生成したデータを、実際の表示の際に「『管理ID』が同じものを一つのレコードとして扱いたい」場合には、クエリでそのように整形します。手法はいくつかありますが、クロス集計クエリを使うのが一般的でしょう
質問は実際のDBを簡略化したものです。
FXのトレード日記をAccessで作成しておりまして、
M_取引根拠
このマスターテーブルを値集合ソースにした3つのコンボボックス(連結列:1、名前:cmb_取引根拠1、cmb_取引根拠2、cmb_取引根拠3)の値をT_トレード日記(例でいうT_ひらがな表示)の取引根拠1、取引根拠2、取引根拠3フィールドに格納します。
このT_トレード日記とM_取引根拠を結合したクエリをレコードソースにして、レポート上で、「割安感」「割高感」といった風に表示したいという感じです。
実現の方法は、自己解決の方法で問題ないということでしょうか?
どの程度を求めるか?ですが、「あまりよくはない」「そうはしないほうが無難」ですかね
困る状況(データベース的におかしい使い方)として、「根拠に〇〇が含まれているトレードを拾い出したい」みたいな要求に応えにくくなります
正規化されていれば、「根拠」フィールドだけを対象にフィルタを掛ければいいですが、横並びで1,2,3としてしまうと、その3つのフィールド全てに対して条件(それぞれのパターンで矛盾しないような)を設定する必要が出てきます。このような運用はデータベース的にNGです
なので、「仕事のシステム」ならそうはしません。「個人使用」ならまぁACCESSでちょっと作っただけだしこんなんでもいいかとしてもいいとは思います(何かやろうとすると間違いなく苦労することになりますが)
いまさら気づいたけど>> 2のテーブル例ミスってます
IDの列は単に連番のつもりでした「T_ひらがな表示」の主キー想定です
テーブル設計が正規化されていないのでそうなるのは仕方ないですね。
T_ひらがな表示テーブルを正規化するすると、下記のようになります。
これなら、クロス集計クエリで可能です。
T_ひらがな表示
hirotonさん、Hatenaさん、回答ありがとうございます。
Accessの勉強を兼ねて作成していますので、入力したデータは集計・分析に活用したいと考えております。
例えば
・トータル勝率
・買い取引時の勝率
・勝率の高い取引根拠
等です。
入力情報を格納するテーブルの構成を変えて正規化?をするにはどうすればよいでしょうか?
現在の取引履歴を保存するテーブルの校正は画像2・3枚目の通りで、4枚目のようなマスターテーブル(M_●●)があります。
正規化云々以前に、もし主キーの設定漏れがある場合、きちんと設定ないと話が始まりませんよ。リレーションシップの設定画面をスクリーンショットを添えて、新しい質問を作りませんか?
あ、T_取引履歴はIDが主キーです。
つけ忘れておりました。
リレーション?は今のところ何も設定していません。
マスタテーブルを作った理由は?マスタデータを参照してトレード履歴を登録する、そのためにリレーションシップを設定する、という事じゃないの。
主キーや正規化云々以前に、リレーションシップを設定する必要性が無いのであれば、MsAccessの話が始まらないでしょう。
この3つのうち前の2つは現状のままでもいいですが、
勝率の高い取引根拠 を出したいなら、
すでに私やhirotonさんから提案されいてる形(正規形)にした方がいいでしょう。
正規化のやり方は、検索すれば解説ページが多数見つかるのでその中で、分かりやすそうなページを参考にやればいいでしょう。
例えばエントリ根拠に関していえば、
T_トレード履歴 から、エントリ根拠1~5 フィールドを削除して、
T_トレード履歴_エントリ根拠 テーブル作成して
下記のようなフィールド構成にします。
トレード履歴ID (T_トレード履歴の外部キー)
根拠ID (M_根拠_エントリーのの外部キー)
トレード履歴ID と 根拠ID で複数フィールド主キーに設定。
フォームは、
F_トレード履歴 に T_トレード履歴_エントリ根拠 から作成した帳票フォームをサブフォームとして埋め込めばいいでしょう。
ありがとうございます。Hatenaさん、Hirotonさんに提案されている正規化をやってみたいと思います。
心理状態(エントリー時)、心理状態(クローズ時)も同じマスターテーブル(M_心理状態)から値を拾うのですが、エントリー根拠のように別テーブルにする必要はありますか?
データが同じなら、別テーブルにする必要はないです。
リレーションシップを設定するときに、マスターテーブル(M_心理状態)を2つ追加してそれぞれと結合されせればいいでしょう。
T_トレード履歴_エントリー根拠・T_トレード履歴_クローズ根拠のテーブル作成、リレーションシップの設定をしてみましたが、こんな感じでよいのでしょうか?
フォームの入力確定時に保存用テーブル(T_トレード履歴・T_トレード履歴_エントリー―根拠・T_トレード履歴_クローズ根拠)にレコードの書込みを行いたいので、tmpとしています。
M_●●はマスターテーブルです。
画像修正しました。
画像を見た限りでは特に問題はなさそうです。
ありがとうございます、作成を進めてみます!
Hatenaさん、Hirotonさん、いつも的確なアドバイス・回答をありがとうございます。
お世話になります。
リレーションシップを設定したところ、マスターテーブルの下に+が表示されるようになり、クリックすると別のテーブルのレコードがでてくるのですが、これは問題ないでしょうか?
サブデータシートですね。
リレーションシップを設定すると自動で設定されます。
詳細は下記を参照。
サブデータシートはテーブルプロパティで手動設定できる | Access 2019 | 初心者のためのOffice講座
表示させたくなければ、テーブルプロパティで非表示に設定できます。これも上記のリンク先で説明されてます。
なるほど、このような機能があるのですね。
サブデータシートをうっかりさわってレコードを変更してしまわないように非表示にしておきます。