今回は、A列の要素は、すべて文字列だったので、
Dim n as string
n = .Cells(i, 1).value
flArray.Add n, .Cells(i, 2).Value
で逃げ切りましたが、もやもやさま~ずです。
そもそも、データ型が混在している要素が混在してたら逃げ切れないし。
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つ追加してそれぞれと結合されせればいいでしょう。
T_トレード履歴_エントリー根拠・T_トレード履歴_クローズ根拠のテーブル作成、リレーションシップの設定をしてみましたが、こんな感じでよいのでしょうか?
フォームの入力確定時に保存用テーブル(T_トレード履歴・T_トレード履歴_エントリー―根拠・T_トレード履歴_クローズ根拠)にレコードの書込みを行いたいので、tmpとしています。
M_●●はマスターテーブルです。
画像修正しました。
ありがとうございます。Hatenaさん、Hirotonさんに提案されている正規化をやってみたいと思います。
心理状態(エントリー時)、心理状態(クローズ時)も同じマスターテーブル(M_心理状態)から値を拾うのですが、エントリー根拠のように別テーブルにする必要はありますか?
いまさら気づいたけど>> 2のテーブル例ミスってます
IDの列は単に連番のつもりでした「T_ひらがな表示」の主キー想定です
この3つのうち前の2つは現状のままでもいいですが、
勝率の高い取引根拠 を出したいなら、
すでに私やhirotonさんから提案されいてる形(正規形)にした方がいいでしょう。
正規化のやり方は、検索すれば解説ページが多数見つかるのでその中で、分かりやすそうなページを参考にやればいいでしょう。
例えばエントリ根拠に関していえば、
T_トレード履歴 から、エントリ根拠1~5 フィールドを削除して、
T_トレード履歴_エントリ根拠 テーブル作成して
下記のようなフィールド構成にします。
トレード履歴ID (T_トレード履歴の外部キー)
根拠ID (M_根拠_エントリーのの外部キー)
トレード履歴ID と 根拠ID で複数フィールド主キーに設定。
フォームは、
F_トレード履歴 に T_トレード履歴_エントリ根拠 から作成した帳票フォームをサブフォームとして埋め込めばいいでしょう。
マスタテーブルを作った理由は?マスタデータを参照してトレード履歴を登録する、そのためにリレーションシップを設定する、という事じゃないの。
主キーや正規化云々以前に、リレーションシップを設定する必要性が無いのであれば、MsAccessの話が始まらないでしょう。
あ、T_取引履歴はIDが主キーです。
つけ忘れておりました。
リレーション?は今のところ何も設定していません。
正規化云々以前に、もし主キーの設定漏れがある場合、きちんと設定ないと話が始まりませんよ。リレーションシップの設定画面をスクリーンショットを添えて、新しい質問を作りませんか?
hirotonさん、Hatenaさん、回答ありがとうございます。
Accessの勉強を兼ねて作成していますので、入力したデータは集計・分析に活用したいと考えております。
例えば
・トータル勝率
・買い取引時の勝率
・勝率の高い取引根拠
等です。
入力情報を格納するテーブルの構成を変えて正規化?をするにはどうすればよいでしょうか?
現在の取引履歴を保存するテーブルの校正は画像2・3枚目の通りで、4枚目のようなマスターテーブル(M_●●)があります。
xECELシートからの読込なので、データの混在はあります。
データの保存先は、ACCESSになります。
A列には、フィールド名と紐づく要素。
B列には、保存するデータが並びます。
なので、B列の要素は、データ型はバラバラになるのが普通です。
.textで値だけ取ってきて、’yや#を使い分ければよいわけですね。
これなら、inputでテキストファイルを読み込むのと、同じ要領で処理できます。
.textって、便利ですね。
ありがとうございました。
蛇足ですが、テキストファイルをADOで読み込むのは、データ型の問題で使い物になりませんでした。
本当に助かりました。
XECELシートを使うのは、誰でも簡単に入力できるからです。
リストから選択するようにしておけば、間違いも減ります。
しかし、内容は自分で決められないので、
連想配列に取り込んで、吐き出させるのが無難です。
処理速度は求めないし、データの大きさも知れたものだし、
いつ変更されるかも分からないので、専用画面など作りたくはないのです。
どの程度を求めるか?ですが、「あまりよくはない」「そうはしないほうが無難」ですかね
困る状況(データベース的におかしい使い方)として、「根拠に〇〇が含まれているトレードを拾い出したい」みたいな要求に応えにくくなります
正規化されていれば、「根拠」フィールドだけを対象にフィルタを掛ければいいですが、横並びで1,2,3としてしまうと、その3つのフィールド全てに対して条件(それぞれのパターンで矛盾しないような)を設定する必要が出てきます。このような運用はデータベース的にNGです
なので、「仕事のシステム」ならそうはしません。「個人使用」ならまぁACCESSでちょっと作っただけだしこんなんでもいいかとしてもいいとは思います(何かやろうとすると間違いなく苦労することになりますが)
質問は実際のDBを簡略化したものです。
FXのトレード日記をAccessで作成しておりまして、
M_取引根拠
このマスターテーブルを値集合ソースにした3つのコンボボックス(連結列:1、名前:cmb_取引根拠1、cmb_取引根拠2、cmb_取引根拠3)の値をT_トレード日記(例でいうT_ひらがな表示)の取引根拠1、取引根拠2、取引根拠3フィールドに格納します。
このT_トレード日記とM_取引根拠を結合したクエリをレコードソースにして、レポート上で、「割安感」「割高感」といった風に表示したいという感じです。
実現の方法は、自己解決の方法で問題ないということでしょうか?
テーブル設計が正規化されていないのでそうなるのは仕方ないですね。
T_ひらがな表示テーブルを正規化するすると、下記のようになります。
これなら、クロス集計クエリで可能です。
T_ひらがな表示
質問の具体例に相当する実際のシステムの具体例が思い浮かびませんが、そっくりそのままやりたいことがそれならそういうものですよ
ただし、
のような、「フィールドの数が変動するようなデータ」は通常想定しません。データベース設計としてはNGです
設計段階で「最大個数としてn個ある」のような場合は、その仕様によっては連番で管理されるようなフィールド構造を取る場合もあります
同様の内容が増えていくようなデータの場合は、そのデータ分だけレコード(行)が増えるような形にします
T_ひらがな表示
質問中の「T_ひらがな表示」内の「ID」が、ここで提示した「管理ID」に相当します。「管理ID」が同じレコードを一つのグループとみなす形になります
このように生成したデータを、実際の表示の際に「『管理ID』が同じものを一つのレコードとして扱いたい」場合には、クエリでそのように整形します。手法はいくつかありますが、クロス集計クエリを使うのが一般的でしょう
下記で文字列として読み込んだらどうでしょう。
ここはAccessに関する掲示板なので、データベース観点からいれば、
そもそも、テーブルの列にデータ型が混在しているデータはありえないと思います。
ありがとうございました。
.Valueを入れないと、セルの枠を指定することになって、中身が入らないようですね。
あと、.Valueを付ければ取り込めるのですが、
要素がバリアント型として取り込まれているため、
flArray("ほげほげ")では、呼び出せません。
今回は、A列の要素は、すべて文字列だったので、
Dim n as string
n = .Cells(i, 1).value
flArray.Add n, .Cells(i, 2).Value
で逃げ切りましたが、もやもやさま~ずです。
そもそも、データ型が混在している要素が混在してたら逃げ切れないし。
かといって、matchで行数調べて、要素を取り出すのは面倒極まりないわけで。
なにか、良い方法は、ありますでしょうか?
テーブルの表示でM_ひらがなマスターを2つ表示することでレポート用のクエリを作ることが出来ました。
でもこれだと、例えばひらがな3、ひらがな4、、、と増えていくと、その分だけM_ひらがなマスターのテーブルの表示を増やさないといけないですよね?
何か根本的に間違えているような気がするのですが、スマートな実現方法や、間違い等を指摘して頂きたいです。
その後、気がついたのですがそのフォームをフォームビューで開いてからデザインビューにした時にエラーメッセージがでます。そうせずに直接デザインビューで開く時はエラーメッセージはでません。何かコードに問題?
TimeValue 関数
その計算式でなぜうまくいくのかhirotonには理解できません
hirotonは段階を追って処理を提示していますが、どの部分でエラーになりますか?
クエリで各段階をそれぞれフィールドにして確認してみてください。解説の都合で
[月終時]
、[月始時]
と適当に名前を作っていますのでうまいこと解釈していただくか、分からなければ質問してくださいフォームのレコードソース、表示させようとしているコントロールの種類(テキストボックスやコンボボックスなど)、そのコントロールのコントロールソースを確認してください
レコードソースに指定されているソースに
[Q実労働時間クエリ]![月時]
という名前のフィールドは含まれていますか?普通はこのような名前のフィールドはないと思いますおっしゃる通りなんだと思います。
ただ、スタートがきちんと構築しよう!という取り組みではなく
頻々に入れ替わるパートさんの雇用契約書の作成を従業員リストから出来ないかなぁ~というところから始まったので
こんなふうに計算することも考えずにテキストを追加して、今になって「あ~計算も出来たら楽だ」と思った次第です。
なかなかじっくり取り組む時間が取れず、やっつけで作っては相談している、というのが現状です。
ただ、このような問題点が発生することはわかりましたので、次回このようなものを作るときは
今後どんな風に利用する可能性があるか、というのをしっかり考えて作らないと、と思いました。
わかりやすく解説していただいてありがとうございます。上記でエラーが出てしまったので
上記の式をチャットGPTに貼って相談したところ、
月時: IIf(TimeValue([月終])>TimeValue([月始]),((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))-[月休],((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))+IIf(TimeValue([月終])>TimeValue([月始]),0,24*60)-[月休])/60
こんなふうにすることで時間を表示させることが出来ました。
ところが、別の質問になってしまいますが、この結果をフォームに表示させようとすると
[Q実労働時間クエリ]![月時]
Name?というエラーになってしまいます。
何か考えられる原因等ありますでしょうか。
hirotonさま:ありがとうございます。初歩的なミスをしてました。確かにそうですね、修正したら機能しました。フォームの入力内容とクエリ値がごっちゃになってました。
hatenaさま:ありがとうございました。なるほどです。ちょっとした事ですが中々思いつかないアイデアです。参考にします。
とすると、セルの値ではなく、キーとアイテムにセルオブジェクトがセットされてしまいます。
下記のようにValueを明示的に指定するようにしましょう。
ただし、.Cells(i, 1).Value に重複がないことが前提です。
重複があるとエラーになります。
サブフォームのリンク親フィールド、リンク子フィールドに「メインID」が設定されている状態でしょうか。
サブフォームのフォームヘッダーかフォームフッターにテキストボックスを配置して
下記のように設定します。
名前 サブチェック
コントロールソース =Sum([F1]=90+[F2]=90)<>0
Falseは0、Tureは-1なので、90の-件数になることを利用しています。
このようなことを使うのはちょっとという場合は、
コントロールソース =Sum(IIf([F1]=90,1,0)+IIf([F2]=90,1,0))<>0
きちんと「クエリ1」に存在するフィールドを指定するだけでは?
質問文の状態では、「クエリ1」とは無関係の内容を抽出条件にしているので、「『クエリ1』とは無関係な内容の真偽によって、『クエリ1』の全件数または0どちらかの数値を得る」という計算になっています
これのそれぞれの意味は、
月始 → 月曜日の開始時刻
月終 → 月曜日の終了時刻
月休 → 月曜日の休憩時間(分)
ということですよね。
それが、月曜から日曜まである。
このようなテーブル設計ではデータベースとしては使い物になりません。
テーブル設計の見直しから始めましょう。
とりあえず勤怠管理のテーブル設計のサンプルは下記などを参考に作成してみてください。
Access:勤怠管理のテーブル|社員マスターとクエリを作成
ただ、これを見ても、おそらく
なぜそのような設計のなるのか、
これをどのように使うのか、
さっぱりわからないかと思います。
その場合は、まずは入門書、入門サイトなどでAccessの基本から学習しなおした方が速いかもしれません。
ある程度のところまでできたら、その時点でわからない部分を再質問されるのがいいかと思います。
数値に見えるテキストを計算させると数値として扱ってくれるのでそこは問題ないでしょう。ただし、時分をそのまま並べているのでそのまま数値計算させるわけにはいきません
入力不備を考慮して4桁(以上)に合わせる
時分を分け、分を時にする
[月終]が0時を超えてしまうようなときは24を超えた入力をするようにすればいいんですが(25時00分など)簡易的に計算するのであれば
で、できます。
Mod
演算子は余りを求める演算子で、負の値にならないよう24を加算しておいて、24をオーバーした分はMod
演算子で捨てるようにしています※簡易計算なので1日の労働時間が24時間以上になる場合は正確な数値になりません
これらを組み合わせると、
で計算できます
ありがとうございます、通常のCtrl+C・Vだと上手くいかず困っていました。
タブコントロールを選択してから貼り付けると上手く配置できました、ありがとうございました。
(フォームをデザインビューで開いている状態で)任意のテキストボックスを選択する。
Ctrl + X キーなどの操作により切り取る。
任意のタブコントロール上の任意のページコントロールを選択する。
Ctrl + V キーなどの操作により貼り付ける。
皆様ありがとうございます。
設定の仕方が悪かったのかコンボボックスに数字が出たりテーブルに商品名が格納されたりして頭がこんがらがってしまっていました。
頂いたリンク等を参考に勉強したいと思います。
>ACCESSのクエリでFOR XML PATH ('')は使えない
そうでしたか・・・失礼しました!😱
詳細は、hirotonさんのリンク先から学習してもらうとして、とりあえず下記のように設定すればいいでしょう。
かなり基本的なことなので、まずは自分で調べてみましょう
https://www.google.com/search?q=ACCESS コンボボックス 使い方
※ヒント
コントロールソース、連結列、列数、列幅
コンボボックスの選択行を決定したら、フォームのレコードソースのカレントレコードの該当フィールドに(コンボボックスの)値が代入されるように、作ればいいんじゃない?
みなさまアドバイスありがとうございます。
結局、その集計した値を色々なところで使いたいので、INSERT INTO 文を使い、テーブルに出力しました。
そのテーブルとリレーションしましたので、製品の項目を編集できるようになりました。
処理待ちに原因があったのかな?
ありがとうございます!