レコードソースプロパティにクエリ名「Q_Transaction」を設定してあります。(このクエリを基にフォームウィザードで作りました)
このフォームの名前が「sbf1」ということですか。
sbf1のプロパティーシートのDefault ViewをContinuous Formsにしています。フォーム"F_Display_Transaction"にサブフォーム"sbf1"を作って表示しています。
ひょっとしてお使いのAccessは英語版ですか。 日本語版なら「既定のビュー」プロパティが「帳票フォーム」に設定してあるということですね。
フォーム"F_Display_Transaction"上にサブフォームコントロールを配置して、そのコントロール名も「sbf1」ということでしょうか。
ちなみに、サブフォームコントロールとサブフォーム本体とは別ものですのでこの点はご留意ください。(下記リンク参照)
サブフォームとサブフォームコントロールの違いとは? - hatena chips
sbf1のプロパティーシートのDefault ViewをContinuous Formsにしています。フォーム"F_Display_Transaction"にサブフォーム"sbf1"を作って表示しています。 で、このサブフォームコントロールの「ソースオブジェクト」プロパティに「sbf1」とサブフォーム名を設定しているということでしょうか。
この場合は、サブフォームコントロール名とサブフォーム名がたまたま同じということになりますね。
この状態で、
Me.sbf1.SourceObject = "Query.Q_Transaction"
を実行したら、ソースオブジェクトは「sbf1」フォームから「Q_Transaction」クエリに置き換わります。クエリはデータシートビュー表示しかできませんので、当然データシートビュー表示に切り替わります。
やろうとしていることは T_Transactionのデータ(付随するマスターテーブルデータがある)について、T_Time(IN/Outの時刻)とM_ID(原料ID)で、期間内の各原料の取引のデータを帳票形式データで表示させること。
SourceObject は変更せずに(フォームのままで)、そのフォームに対して抽出条件を設定すればいいでしょう。
方法は、hirotonさんの回答を参照ください。
フォームにはWhere句だけを後から設定・変更できるプロパティ(意訳)がありますよ
Me.sbf1.Form.filter = "(Where句に該当する文字列)" Me.sbf1.Form.filterOn = True
SQLだけでサブフォームを作って表示させようとするとエラーが出てしまった(エラー内容は忘れました)ので
Error2467 The expression you entered refers to an object that is closed or doesn't exist でした
ご回答ありがとうございます
「サブフォーム1」という名前のフォームのレコードソースプロパティにクエリ名「Q_Transaction」を設定してあるということでしょうか。それとも「サブフォーム1」というサブフォームコントロールの「ソースオブジェクト」プロパティに「Query.Q_Transaction」とクエリを設定しているということでしょうか。
その帳票フォームの名前はなんでしょうか。その帳票フォームはどこで使用してますか。
sbf1のプロパティーシートのDefault ViewをContinuous Formsにしています。フォーム"F_Display_Transaction"にサブフォーム"sbf1"を作って表示しています。 このフォームに検索用のテキストボックスなどがあり、これを基にしたstrSQLで動的に表示しなおしています。 SQLだけでサブフォームを作って表示させようとするとエラーが出てしまった(エラー内容は忘れました)ので、もとになるWHERE句のないクエリでサブフォームを作ってから、再度SQLで代入するような形で対処しました。
やろうとしていることは T_Transactionのデータ(付随するマスターテーブルデータがある)について、T_Time(IN/Outの時刻)とM_ID(原料ID)で、期間内の各原料の取引のデータを帳票形式データで表示させること。その後、そのデータを修正、削除できるようにすることです。
用語の使い方が間違っているようなので、正確に状況が伝わりません。
サブフォーム1をQuery.Q_Transactionをコントロールにして作ってあります。
「サブフォーム1」という名前のフォームのレコードソースプロパティにクエリ名「Q_Transaction」を設定してあるということでしょうか。 それとも「サブフォーム1」というサブフォームコントロールの「ソースオブジェクト」プロパティに「Query.Q_Transaction」とクエリを設定しているということでしょうか。
Me.sbf1.SourceObject = "Query.Q_Transaction" Me.sbf1.Form.RecourSource = strSQL
これはVBAで「sbf1」というサブフォームコントロールの「ソースオブジェクト」プロパティに「Query.Q_Transaction」とクエリを設定して、さらにレコードソースのSQLを書き換えてますね。
デフォルトは帳票フォームをデフォルトビューとしているのですが、検索後も帳票フォームの形で出すのはどうすればいいのでしょうか。
正確の用語を使って、状況を説明してください。
お返事が遅くなっていてスミマセン。このようなアイデアがあるとは大変勉強になりました。ご回答ありがとうございます。
ありがごうございます! 複数選択して右クリックの条件付き書式で探してました。 複数選択してリボンからいけばできました!
式についても教えていただいた通りに記入してやりたいようにできました。 大変勉強になりました。 質問のクローズはどこでするのかわからないのでこちらで解決とさせていただきます!😄
hatenaさんありがとうございます。 ブログ記事拝見しました。 InStrでもバイナリ比較できるんですね。 勉強になりました。
自己解決できてよかったですね。 関連するブログ記事を紹介しておきます。
【Access】クエリで大文字/小文字、全角/半角、ひらがな/カタカナを区別して文字列比較したい | hatena chips
ごめんなさい。先頭のNOTは不要です。 スレを汚してすみません。。。
一応、自己解決しましたので報告します。 INのカッコの中はSELECT文になってまして、
試験値 IN(SELECT 候補値 FROM テーブル)
という式になっていました。そこで、
NOT EXISTS(SELECT 0 FROM テーブル WHERE StrComp(試験値,候補値,0)=0)
とすることでしのぎました。 どうもお騒がせ致しました。
テキストボックスを2つ以上選択すると、条件付き書式が指定できないようですが、やり方がありますか?
デザインビューでShiftキーを押しながら該当テキストボックスをクリックすると複数選択できます。 そのうえで、リボンの「書式」-「条件付き書式」をクリックすればできると思います。
また、年月日のそれぞれどれかが1つでも今日の年月日とマッチするようなら1レコード分の書式を変更したいです。
今日(2020/07/01)の場合、 「年」が「2020」だったら、「月」が 「03」「日」が「05」でも変更するということですか。 「日」が「01」だったら、「年」が「2019」「月」が「05」でも変更するということですか。
ならば、式を下記のようにすればいいでしょう。
[年]=Year(Date()) OR [月]=Month(Date()) OR [日]=Day(Date())
上記は 年、月、日 フィールドが数値型の場合です。テキスト型で月と日か2桁表示なら、
[年]=Format(Date(),"yyyy") OR [月]=Format(Date(),"mm") OR [日]=Format(Date(),"dd")
ありがとうございます。 テキストボックスを2つ以上選択すると、条件付き書式が指定できないようですが、やり方がありますか? また、年月日のそれぞれどれかが1つでも今日の年月日とマッチするようなら1レコード分の書式を変更したいです。 よろしくお願い致します。😣
条件が不明確ですか、年 月 日 を合成した日付が今日の日付と同じならば背景色を赤にする、ということなら、
他のテキストボックスをすべて選択した状態で条件付き書式を下記のように設定すればいいでしょう。
式は、
DateSerial([年],[月],[日])=Date()
これで、メインフォームがM1テーブル、サブフォームがM2テーブルの帳票フォームを作れば、例えばM1テーブルの氏名に紐づいたM2テーブルのID1のAさんの資格情報は見れるようになりました。
これで本当に各人物の資格情報を見れますか。見れないと思います。 メインもサブもマスターテーブルですので、それぞれのマスターテーブルのデータが表示されるだけです。
しかし、このフォームでAさん資格情報を編集することができません。 なのに、メインフォーム上のAさんの名前を変更すると、M1のマスタテーブルは書き換わってしまいます。
マスターテーブルと連結したフォームですので当然そうなります。 この場合、マスターテーブルは書き換えてはいけないので、フォームの設定で更新できないようにしておきます。 例えば、「レコードセット」プロパティを「スナップショット」に設定しておきます。
どの人物がどの資格を持っているかを格納しているテーブルはRテーブルですので、サブフォームのレコードソースはRテーブルにします。サブフォームのM2IDはコンボボックスにして、資格名を表示させるようにしておきます。 あるいは、下記の紹介した方法でIDと資格名の両方から選択できるようにしてもいいでしょう。
コードでも名称でも入力できるコンボボックス - hatena chips
サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」をM1のIDに設定すればご希望のメイン/サブフォームになります。
人物はメインフォームでレコード移動して切り替えます。あるいは、検索で目的の人物に移動してもいいでしょう。
別の方法として、メインフォームは非連結(レコードソースは空欄)にしておいて、M1を値集合ソースとするコンボボックスまたは、リストボックスを配置して、このコントロール名を「リンク親フィールド」に設定します。 これで、このコンボボックスかリストボックスで人物を選択するとその資格情報がサブフォームに表示されます。 非連結なので、マスターテーブルが更新されることはありません。
例えば、下記で紹介しているようなフォームです。人物の人数が多くても、トグルボタンで50音で絞り込めるので目的の人物に簡単にたどり着けます。
名簿管理フォームの設計 - hatena chips
ありがとうございます! 条件付き書式とても便利ですね!やりたいようにできました。 年、月、日をそれぞれ指定してその連結テキストボックスの書式をかえることができましたが、 同じレコードにある連結テキストボックスの項目もすべて同じ条件で同じ書式に変更したいのですが、 たとえば「内容」などの連結テキストボックスも条件付き書式でいけますか? 「内容」について、式でif(年=format(date()"yyyy"))といれてみたのですが これだとだめですか? よろしくお願い致します。
ありがとうございました! 思った通りにできました☺
フォーカスを別の場所に移動しない限り カレンダーアイコンが表示され続ける
標準機能は融通が利かないのも仕方なしですねぇ いろいろ試してみましたがアイコンが表示される部分に強制的に描画処理を起こさせるのが一番楽そうでした
(なんでもいいんですが)アイコンが表示される位置、サイズで透明なボタンを非表示で置いておきます
Private Sub 日付_Change() Me.日付.ShowDatePicker = 0 Me.ボタン.Visible = True Me.ボタン.Visible = False End Sub Private Sub 日付_Enter() Me.日付.ShowDatePicker = 1 End Sub
すみません。原因がわかりました… テーブルのルックアップでコンボボックスを作成&選択肢を記載していて、フォームに値集合ソースに何も記載していないものが、そうなっていました。 フォームの値集合ソースにも記載したところ解決しました。(テーブルはそのままにしても問題なさそう?でしたが削除しました) お騒がせしました。
コンボボックスを重ねているとか、特別なことをしていないのに、そうなるのでしょうか。 イベントプロシージャとか設定していませんか。
そのような現象がでるのは特定のコンボボックスでしょうか。 それともすべてのコンボボックスでしょうか。
特定のコンボボックスなら、症状の発生しないコンボボックスとのプロパティ設定の違いを確認してみてください。
cerophanさんが回答されてるように条件付き書式でやるのが簡単だと思います。
連結テキストボックスが、年、月、日 と3つあるのだとすると、
「年」テキストボックスは下記のよう設定します。
月、日 も同様に設定すればOKです。
テキストボックスのプロパティシート>データ>コントロールソースに下記の式を入れれば、それぞれ表示されます。 =Format(Date(),"y") =Format(Date(),"m") =Format(Date(),"d")
帳票ぎゅうぎゅう詰めのアイデアについて、hatena様の参考ページを見つけることができました。参考にさせていただきます。ありがとうございます。
https://hatenachips.blog.fc2.com/blog-entry-242.html
条件付き書式ではできませんでしょうか?的外れであれば申し訳ありません。
やはりそうですよね。 >フィールドをNullにするようします なるほど、そういったことも必要になるのですね。勉強になりました!ありがとうございます。
なるほど、こんなことができるのですね。勉強になりました!ありがとうございます。
>Private Sub cmd降順_Click()
すみません、このコードについては記述しなくても望み通りの動きをしてくれたのですが、「 フィルターや並べ替えを変更すると、レコードセットの共有がレセットされます」とはどういうタイミングになりますでしょうか。
望み通りのものを作成することができました!コードについても勉強になりました。とても助かりました。ありがとうございました。
ご回答ありがとうございます!参考にさせていただきます。
VBAが必須かどうかは要件によりますが、入力フォームやレポートでの見やすい出力を考えたら、クエリ(SQL)だけでは解決できないと思います。 メイン/サブフォーム形式、レポートのグループ化機能などを使う必要が出てくると思います。
こんばんわ、ろでますです。 ご返信ありがとうございます。 となると、VBAに足を突っ込まないといかないかもということですか。 エクセルのはそこそこ使ったことあるんですが・・・ Accsessとなってくると、初めてになります。
SQL構文覚えないと><
>※F1、F2 は M_Category の外部キー これはK1、K2の誤記ですか?(揚げ足を取るとかそんなんではなく、純粋に)
あっ、誤記です。すみません。回答の方も修正しておきます。
M_Category (カテゴリーマスター) でK1・K2は2つで複合キーになっていると思うのですが、その後ろの T_Question (質問テーブル) の説明書きに >※K1 は M_Category の外部キー とあります。
そうですね。これは外部キーにはなりませんね。 脳内だけで構成を考えていたのでこのへんはちょっとおかしいですね。
これはリンクせずに、入力フォームを作成するときの抽出条件に使うという感じの設計になるのかな。
各人物の回答用の入力フォームは、メイン/サブフォーム形式のものになるので、 メインで回答者を選択するコンボボックスの値集合リストの抽出条件に使うといいかも。
これもあくまで脳内シミュレーションでの構成ですので、実際につくると修正が必要になるかも知れません。
こんばんわ、ろでますです。 すいません、私の知識不足で、上から読み解いていくうちにわからないことが出てきたので、教えていただけませんか。
あと、 M_Category (カテゴリーマスター) でK1・K2は2つで複合キーになっていると思うのですが、その後ろの T_Question (質問テーブル) の説明書きに >※K1 は M_Category の外部キー とあります。
なぜ、複合主キー内のK1のみを主キーとしてT_Question (質問テーブル)のK1を外部キーとして扱うことができるのかがわかり間ませんでした。(おっしゃりたい意味は大体理解できます)
ためしに、M_Category (カテゴリーマスター)テーブルのK1キーとT_Question (質問テーブル)のK1キーをリレーショナルすると、「未定義となりました」
すいません、ここがわからなかったのでこれ以上先に進めていません><
よろしければご教授願います。
いろいろ考えられますが、 一つの解決策としては下記のようなテーブル構成にするのが自由度か高いかな、と思います。
M_Category (カテゴリーマスター)
K1, K2 複合PK
M_Person (人物マスター)
※F1、F2 は M_Category の外部キー
T_Question (質問テーブル)
※K1 は M_Category の外部キー
T_Choice (選択肢)
CID, QID 複合PK QID は T_Question の外部キー
T_Person_Choice (人物がどの選択肢を選択したか)
テーブル名とかは出された情報から推測で適当につけてますので、参考程度に。
これはあくまで一例ですので、別の方法もあるかと思います。
ご回答どうもありがとうございます!
確かにおっしゃる通りの方法でうまくいきました。
すいませんが、この後実は色々難所があり、それもお伺いしてもよろしいでしょうか。
このテーブル構成で、
FK 山田さん 1 1 加藤さん 1 3 佐藤さん 1 1 田中さん 2 1 伊藤さん 2 3
となっているときに、FKの左側が1の方に質問があったとします。(山田さん・加藤さん・佐藤さん) その問いが別のテーブルにあり、10個(01~10)の回答から複数選択しなさいという物いです。 同様にFKの左側が2の方に質問があったとします(田中さん・伊藤さん) その問いが別のテーブルにあり、15個(01~15)の回答から複数選択しなさいという物いです。
この場合、どういったテーブルを作って、何処のテーブルと結合していいかが全く考え付きません。
よろしければご教授願えませんでしょうか・・・。
質問の設定だと、それぞれのテーブルが M1(一) →(多)M2 M1(一) →(多)M3 のような一対多関係になります。
一つのクエリで上記の結合をしてしまうと、M2とM3が多対多の関係になるので、ユニークに決まらない場合で出てくるので整合性エラーになります。
例えば、下記のような場合、
M1 1 1 A 1 2 B 1 3 C
M3 1 1 X 2 1 E 2 2 F
M2 の FK が 1 1 のとき、A か X か決まりませんよね。
M1 と M3 を分けずに一つににまとめれば、このような重複は許可されないので整合性の保証されたデータになり、エラーはでなくなります。
PK 1 1 A 1 2 B 1 3 C 1 4 D 2 1 E 2 2 F 2 3 G
M1 と M3 を分けたまま、2つのテーブル間で上記のようなユニーク属性を制定するのはできません。
やるとしたら、上記のように一つに纏めておいて、必要に応じて、選択クエリで分割することになると思います。
ちなみに整合性チェックを入れなければ動操作して、クエリでもデータを取得できるのですが、きちんとした動作ではないですよね・・・。
整合性が保障されないので、整合性に反したデータの入力が可能になってしまいますので、入力、更新するたびに自前で整合性をチェックする(VBAなどで)ことになります。
わざわざそのような面倒かつ不確実なこともぜすとも上記のように必要に応じて選択クエリに分ける設計にすれば問題奈と思います。
追加するデータは下記 1 メロン 2 オレンジ 3 マンゴー
追加するデータは下記
1 メロン 2 オレンジ 3 マンゴー
このデータはどこにどのような形であるのですか。 テーブルなら、これから追加クエリを作成して、SQLビューにすればいいでしょう。
テーブルでないなら、どのように追加するデータを指定するか明示してください。
hatena さん
レポートの事です。失礼しました。 困っていたことは、解決しそうです。
ご回答ありがとうございました。
レポートの話ですよね。
用紙の最下部にグループフッターを表示したいということでしょうか。
下記の方法が参考になると思います。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
「F案件」と「F案件詳細」のレコードソースは同じテーブルですか。 同じという前提が回答します。
あと、全角英数字を名前に使用するとトラブルの元なので、半角に修正しておくことを推奨します。 「F案件」、「F案件詳細」とFは半角として回答します。
「F_案件」フォーム上にコマンドボタン「cmd案件詳細」があり、そのクリックで「F案件詳細」を開くとします。 このcmd案件詳細のクリック時のイベントプロシージャを下記のように記述します。
Private Sub cmd案件詳細_Click() DoCmd.OpenForm "F案件詳細" Set Forms!F案件詳細.Recordset = Me.Recordset End Sub
これで、「F案件」と「F案件詳細」は同じレコードセットを共有することになりますので、並び順は同じなりレコード移動も完全同期します。片方のフォームでレコード移動するともう一方のレコードも追随して同じなります。
レコード移動のボタンに関しては、コントロールウィザードをオンにしておいてコマンドボタンは配置すると、「レコードの移動」で「前のレコードに移動」「次のレコードに移動」をそれぞれ選択すると自動で作成できます。
あと、フィルターや並べ替えを変更すると、レコードセットの共有がレセットされますので、並べ替えを変更したあとにもレコードセット共有処理を実行するようにします。
例えば下記のような感じです。
Private Sub cmd降順_Click() Me.OrderBy = "フィールド名 DESC" Me.OrderByOn = True Set Forms!F_社員詳細.Recordset = Me.Recordset End Sub
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
このフォームの名前が「sbf1」ということですか。
ひょっとしてお使いのAccessは英語版ですか。
日本語版なら「既定のビュー」プロパティが「帳票フォーム」に設定してあるということですね。
フォーム"F_Display_Transaction"上にサブフォームコントロールを配置して、そのコントロール名も「sbf1」ということでしょうか。
ちなみに、サブフォームコントロールとサブフォーム本体とは別ものですのでこの点はご留意ください。(下記リンク参照)
サブフォームとサブフォームコントロールの違いとは? - hatena chips
この場合は、サブフォームコントロール名とサブフォーム名がたまたま同じということになりますね。
この状態で、
を実行したら、ソースオブジェクトは「sbf1」フォームから「Q_Transaction」クエリに置き換わります。クエリはデータシートビュー表示しかできませんので、当然データシートビュー表示に切り替わります。
SourceObject は変更せずに(フォームのままで)、そのフォームに対して抽出条件を設定すればいいでしょう。
方法は、hirotonさんの回答を参照ください。
フォームにはWhere句だけを後から設定・変更できるプロパティ(意訳)がありますよ
Error2467 The expression you entered refers to an object that is closed or doesn't exist
でした
ご回答ありがとうございます
レコードソースプロパティにクエリ名「Q_Transaction」を設定してあります。(このクエリを基にフォームウィザードで作りました)
sbf1のプロパティーシートのDefault ViewをContinuous Formsにしています。フォーム"F_Display_Transaction"にサブフォーム"sbf1"を作って表示しています。
このフォームに検索用のテキストボックスなどがあり、これを基にしたstrSQLで動的に表示しなおしています。
SQLだけでサブフォームを作って表示させようとするとエラーが出てしまった(エラー内容は忘れました)ので、もとになるWHERE句のないクエリでサブフォームを作ってから、再度SQLで代入するような形で対処しました。
やろうとしていることは
T_Transactionのデータ(付随するマスターテーブルデータがある)について、T_Time(IN/Outの時刻)とM_ID(原料ID)で、期間内の各原料の取引のデータを帳票形式データで表示させること。その後、そのデータを修正、削除できるようにすることです。
用語の使い方が間違っているようなので、正確に状況が伝わりません。
「サブフォーム1」という名前のフォームのレコードソースプロパティにクエリ名「Q_Transaction」を設定してあるということでしょうか。
それとも「サブフォーム1」というサブフォームコントロールの「ソースオブジェクト」プロパティに「Query.Q_Transaction」とクエリを設定しているということでしょうか。
これはVBAで「sbf1」というサブフォームコントロールの「ソースオブジェクト」プロパティに「Query.Q_Transaction」とクエリを設定して、さらにレコードソースのSQLを書き換えてますね。
その帳票フォームの名前はなんでしょうか。その帳票フォームはどこで使用してますか。
正確の用語を使って、状況を説明してください。
お返事が遅くなっていてスミマセン。このようなアイデアがあるとは大変勉強になりました。ご回答ありがとうございます。
ありがごうございます!
複数選択して右クリックの条件付き書式で探してました。
複数選択してリボンからいけばできました!
式についても教えていただいた通りに記入してやりたいようにできました。
大変勉強になりました。
質問のクローズはどこでするのかわからないのでこちらで解決とさせていただきます!😄
hatenaさんありがとうございます。
ブログ記事拝見しました。
InStrでもバイナリ比較できるんですね。
勉強になりました。
自己解決できてよかったですね。
関連するブログ記事を紹介しておきます。
【Access】クエリで大文字/小文字、全角/半角、ひらがな/カタカナを区別して文字列比較したい | hatena chips
ごめんなさい。先頭のNOTは不要です。
スレを汚してすみません。。。
一応、自己解決しましたので報告します。
INのカッコの中はSELECT文になってまして、
試験値 IN(SELECT 候補値 FROM テーブル)
という式になっていました。そこで、
NOT EXISTS(SELECT 0 FROM テーブル WHERE StrComp(試験値,候補値,0)=0)
とすることでしのぎました。
どうもお騒がせ致しました。
デザインビューでShiftキーを押しながら該当テキストボックスをクリックすると複数選択できます。
そのうえで、リボンの「書式」-「条件付き書式」をクリックすればできると思います。
今日(2020/07/01)の場合、
「年」が「2020」だったら、「月」が 「03」「日」が「05」でも変更するということですか。
「日」が「01」だったら、「年」が「2019」「月」が「05」でも変更するということですか。
ならば、式を下記のようにすればいいでしょう。
上記は 年、月、日 フィールドが数値型の場合です。テキスト型で月と日か2桁表示なら、
ありがとうございます。
テキストボックスを2つ以上選択すると、条件付き書式が指定できないようですが、やり方がありますか?
また、年月日のそれぞれどれかが1つでも今日の年月日とマッチするようなら1レコード分の書式を変更したいです。
よろしくお願い致します。😣
条件が不明確ですか、年 月 日 を合成した日付が今日の日付と同じならば背景色を赤にする、ということなら、
他のテキストボックスをすべて選択した状態で条件付き書式を下記のように設定すればいいでしょう。
式は、
これで本当に各人物の資格情報を見れますか。見れないと思います。
メインもサブもマスターテーブルですので、それぞれのマスターテーブルのデータが表示されるだけです。
マスターテーブルと連結したフォームですので当然そうなります。
この場合、マスターテーブルは書き換えてはいけないので、フォームの設定で更新できないようにしておきます。
例えば、「レコードセット」プロパティを「スナップショット」に設定しておきます。
どの人物がどの資格を持っているかを格納しているテーブルはRテーブルですので、サブフォームのレコードソースはRテーブルにします。サブフォームのM2IDはコンボボックスにして、資格名を表示させるようにしておきます。
あるいは、下記の紹介した方法でIDと資格名の両方から選択できるようにしてもいいでしょう。
コードでも名称でも入力できるコンボボックス - hatena chips
サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」をM1のIDに設定すればご希望のメイン/サブフォームになります。
人物はメインフォームでレコード移動して切り替えます。あるいは、検索で目的の人物に移動してもいいでしょう。
別の方法として、メインフォームは非連結(レコードソースは空欄)にしておいて、M1を値集合ソースとするコンボボックスまたは、リストボックスを配置して、このコントロール名を「リンク親フィールド」に設定します。
これで、このコンボボックスかリストボックスで人物を選択するとその資格情報がサブフォームに表示されます。
非連結なので、マスターテーブルが更新されることはありません。
例えば、下記で紹介しているようなフォームです。人物の人数が多くても、トグルボタンで50音で絞り込めるので目的の人物に簡単にたどり着けます。
名簿管理フォームの設計 - hatena chips
ありがとうございます!
条件付き書式とても便利ですね!やりたいようにできました。
年、月、日をそれぞれ指定してその連結テキストボックスの書式をかえることができましたが、
同じレコードにある連結テキストボックスの項目もすべて同じ条件で同じ書式に変更したいのですが、
たとえば「内容」などの連結テキストボックスも条件付き書式でいけますか?
「内容」について、式でif(年=format(date()"yyyy"))といれてみたのですが
これだとだめですか?
よろしくお願い致します。
ありがとうございました!
思った通りにできました☺
標準機能は融通が利かないのも仕方なしですねぇ
いろいろ試してみましたがアイコンが表示される部分に強制的に描画処理を起こさせるのが一番楽そうでした
(なんでもいいんですが)アイコンが表示される位置、サイズで透明なボタンを非表示で置いておきます
すみません。原因がわかりました…
テーブルのルックアップでコンボボックスを作成&選択肢を記載していて、フォームに値集合ソースに何も記載していないものが、そうなっていました。
フォームの値集合ソースにも記載したところ解決しました。(テーブルはそのままにしても問題なさそう?でしたが削除しました)
お騒がせしました。
コンボボックスを重ねているとか、特別なことをしていないのに、そうなるのでしょうか。
イベントプロシージャとか設定していませんか。
そのような現象がでるのは特定のコンボボックスでしょうか。
それともすべてのコンボボックスでしょうか。
特定のコンボボックスなら、症状の発生しないコンボボックスとのプロパティ設定の違いを確認してみてください。
cerophanさんが回答されてるように条件付き書式でやるのが簡単だと思います。
連結テキストボックスが、年、月、日 と3つあるのだとすると、
「年」テキストボックスは下記のよう設定します。
月、日 も同様に設定すればOKです。
テキストボックスのプロパティシート>データ>コントロールソースに下記の式を入れれば、それぞれ表示されます。
=Format(Date(),"y")
=Format(Date(),"m")
=Format(Date(),"d")
帳票ぎゅうぎゅう詰めのアイデアについて、hatena様の参考ページを見つけることができました。参考にさせていただきます。ありがとうございます。
https://hatenachips.blog.fc2.com/blog-entry-242.html
条件付き書式ではできませんでしょうか?的外れであれば申し訳ありません。
やはりそうですよね。
>フィールドをNullにするようします
なるほど、そういったことも必要になるのですね。勉強になりました!ありがとうございます。
なるほど、こんなことができるのですね。勉強になりました!ありがとうございます。
>Private Sub cmd降順_Click()
すみません、このコードについては記述しなくても望み通りの動きをしてくれたのですが、「
フィルターや並べ替えを変更すると、レコードセットの共有がレセットされます」とはどういうタイミングになりますでしょうか。
望み通りのものを作成することができました!コードについても勉強になりました。とても助かりました。ありがとうございました。
ご回答ありがとうございます!参考にさせていただきます。
VBAが必須かどうかは要件によりますが、入力フォームやレポートでの見やすい出力を考えたら、クエリ(SQL)だけでは解決できないと思います。
メイン/サブフォーム形式、レポートのグループ化機能などを使う必要が出てくると思います。
こんばんわ、ろでますです。
ご返信ありがとうございます。
となると、VBAに足を突っ込まないといかないかもということですか。
エクセルのはそこそこ使ったことあるんですが・・・
Accsessとなってくると、初めてになります。
SQL構文覚えないと><
あっ、誤記です。すみません。回答の方も修正しておきます。
そうですね。これは外部キーにはなりませんね。
脳内だけで構成を考えていたのでこのへんはちょっとおかしいですね。
これはリンクせずに、入力フォームを作成するときの抽出条件に使うという感じの設計になるのかな。
各人物の回答用の入力フォームは、メイン/サブフォーム形式のものになるので、
メインで回答者を選択するコンボボックスの値集合リストの抽出条件に使うといいかも。
これもあくまで脳内シミュレーションでの構成ですので、実際につくると修正が必要になるかも知れません。
こんばんわ、ろでますです。
すいません、私の知識不足で、上から読み解いていくうちにわからないことが出てきたので、教えていただけませんか。
>※F1、F2 は M_Category の外部キー
これはK1、K2の誤記ですか?(揚げ足を取るとかそんなんではなく、純粋に)
あと、
M_Category (カテゴリーマスター)
でK1・K2は2つで複合キーになっていると思うのですが、その後ろの
T_Question (質問テーブル)
の説明書きに
>※K1 は M_Category の外部キー
とあります。
なぜ、複合主キー内のK1のみを主キーとしてT_Question (質問テーブル)のK1を外部キーとして扱うことができるのかがわかり間ませんでした。(おっしゃりたい意味は大体理解できます)
ためしに、M_Category (カテゴリーマスター)テーブルのK1キーとT_Question (質問テーブル)のK1キーをリレーショナルすると、「未定義となりました」
すいません、ここがわからなかったのでこれ以上先に進めていません><
よろしければご教授願います。
いろいろ考えられますが、
一つの解決策としては下記のようなテーブル構成にするのが自由度か高いかな、と思います。
M_Category (カテゴリーマスター)
K1, K2 複合PK
M_Person (人物マスター)
※F1、F2 は M_Category の外部キー
T_Question (質問テーブル)
※K1 は M_Category の外部キー
T_Choice (選択肢)
CID, QID 複合PK
QID は T_Question の外部キー
T_Person_Choice (人物がどの選択肢を選択したか)
テーブル名とかは出された情報から推測で適当につけてますので、参考程度に。
これはあくまで一例ですので、別の方法もあるかと思います。
ご回答どうもありがとうございます!
確かにおっしゃる通りの方法でうまくいきました。
すいませんが、この後実は色々難所があり、それもお伺いしてもよろしいでしょうか。
このテーブル構成で、
FK
山田さん 1 1
加藤さん 1 3
佐藤さん 1 1
田中さん 2 1
伊藤さん 2 3
となっているときに、FKの左側が1の方に質問があったとします。(山田さん・加藤さん・佐藤さん)
その問いが別のテーブルにあり、10個(01~10)の回答から複数選択しなさいという物いです。
同様にFKの左側が2の方に質問があったとします(田中さん・伊藤さん)
その問いが別のテーブルにあり、15個(01~15)の回答から複数選択しなさいという物いです。
この場合、どういったテーブルを作って、何処のテーブルと結合していいかが全く考え付きません。
よろしければご教授願えませんでしょうか・・・。
質問の設定だと、それぞれのテーブルが
M1(一) →(多)M2
M1(一) →(多)M3
のような一対多関係になります。
一つのクエリで上記の結合をしてしまうと、M2とM3が多対多の関係になるので、ユニークに決まらない場合で出てくるので整合性エラーになります。
例えば、下記のような場合、
M1
1 1 A
1 2 B
1 3 C
M3
1 1 X
2 1 E
2 2 F
M2 の FK が 1 1 のとき、A か X か決まりませんよね。
M1 と M3 を分けずに一つににまとめれば、このような重複は許可されないので整合性の保証されたデータになり、エラーはでなくなります。
PK
1 1 A
1 2 B
1 3 C
1 4 D
2 1 E
2 2 F
2 3 G
M1 と M3 を分けたまま、2つのテーブル間で上記のようなユニーク属性を制定するのはできません。
やるとしたら、上記のように一つに纏めておいて、必要に応じて、選択クエリで分割することになると思います。
整合性が保障されないので、整合性に反したデータの入力が可能になってしまいますので、入力、更新するたびに自前で整合性をチェックする(VBAなどで)ことになります。
わざわざそのような面倒かつ不確実なこともぜすとも上記のように必要に応じて選択クエリに分ける設計にすれば問題奈と思います。
このデータはどこにどのような形であるのですか。
テーブルなら、これから追加クエリを作成して、SQLビューにすればいいでしょう。
テーブルでないなら、どのように追加するデータを指定するか明示してください。
hatena さん
レポートの事です。失礼しました。
困っていたことは、解決しそうです。
ご回答ありがとうございました。
レポートの話ですよね。
用紙の最下部にグループフッターを表示したいということでしょうか。
下記の方法が参考になると思います。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
「F案件」と「F案件詳細」のレコードソースは同じテーブルですか。
同じという前提が回答します。
あと、全角英数字を名前に使用するとトラブルの元なので、半角に修正しておくことを推奨します。
「F案件」、「F案件詳細」とFは半角として回答します。
「F_案件」フォーム上にコマンドボタン「cmd案件詳細」があり、そのクリックで「F案件詳細」を開くとします。
このcmd案件詳細のクリック時のイベントプロシージャを下記のように記述します。
これで、「F案件」と「F案件詳細」は同じレコードセットを共有することになりますので、並び順は同じなりレコード移動も完全同期します。片方のフォームでレコード移動するともう一方のレコードも追随して同じなります。
レコード移動のボタンに関しては、コントロールウィザードをオンにしておいてコマンドボタンは配置すると、「レコードの移動」で「前のレコードに移動」「次のレコードに移動」をそれぞれ選択すると自動で作成できます。
あと、フィルターや並べ替えを変更すると、レコードセットの共有がレセットされますので、並べ替えを変更したあとにもレコードセット共有処理を実行するようにします。
例えば下記のような感じです。