こちらACCESS2013ですが「リスト項目の編集」で既定値を設定すると「規定値」プロパティにちゃんと反映されるようでした。仕様ってことはなさそうです
「複数の担当者が関わっている」とのことですが、最大何人ぐらいの担当者になりますか。
テーブルに担当者1、担当者2、担当者3 というようにフィールドがあるのなら、そのフィールド数分のコンボボックスを作成して、それに重なるようにコンボボックス(またはテキストボックス)を配置して、各コントロールを以前の回答にように設定すればいいかと思いますが、どのあたりがうまくいきませんか。
一定期間でデータをシステムから抽出しています。
システムとはどこにあるどのようなデータですか。 それをどのように抽出してますか。
前回と今回のデータで、変更があったレコードと、新たに追加されたレコードを抽出したいです。
前回のデータと今回のデータとは具体的にどのようなものですか。 前回のテーブルと今回のテーブルの2つのテーブルがあるのですか。
もしそうなら、それぞれのテーブルの名前、フィールド名、主キー設定を提示してください。
新たに追加されたレコードは、IDが連番でついており、正しく入力されているかの確認の為。
以前のレコードと新たに追加されたレコードの区別はどのようにつけるのですか。 今回のテーブルで前回のテーブルにないレコードが新たに追加されたレコードということですか。
変更があったレコードは、変更された情報が正しいのかを確認のために抽出したいです。
具体的にどのような形で表示したいのですか。 前回のデータと今回のデータの両方を表示しますか。
上記の点を含めてもう少し具体的に情報を提供してください。 そのうえで現状はどこまでできていて、どの辺で躓いているか具体的に説明してください。
送付していただいたファイルを改良しました。 下記のリンクからダウンロードできます。
定形外宛名ラベル作成.zip
いろいろ変更しましたので、自身のファイルと比べてどこが変更されたか確認してください。
主な変更点は、 レポートは、 レコードソースのクエリの結合を変更してます(前回の回答の内容)。
テキストボックスの名前がフィールド名と同じものになっていたので、それが原因でエラーとなってましたので、 テキストボックスの名前を変更してます。
フォームでは、VBAを変更しました。 最初の回答の cb受取人ID のフォーカス取得時のイベントプロシージャで再クエリする方法だと、一回のクリックでリストが開かないので、 レコード移動時と、cb発注者IDの更新後処理で再クエリするようにしました。
御親切にありがとうございます。ファイルを送信しました。よろしくおねがいします
いろいろ間違いでご迷惑をおかけしました。 修正部分はそれで問題ないと思います。
レポートのレコードソース用のクエリの結合が間違ってます。 T_発注者 と T_発注者の顧客 は結合しませんのて、結合線を削除してください。 T_受注.受取人ID と T_発注者の顧客.発注者の顧客ID を結合してください。 結合線をダブルクリックして、結合プロパティを表示させて、「T_受注のすべてのレコードと・・・・」というオプションを選択します。結合線が T_受注.受取人ID → T_発注者の顧客.発注者の顧客ID という向きの矢印になります。
同様に、T_受注とT_発注者の結合線も 同じ向きに矢印になるように設定してください。
全体としては結構複雑なものになりますので、もし、差支えなければ右カラムの「ファイル送信フォーム」から現状のファイルを送信してもらえると、ファイルを見ながら具体的におかしいところを指摘できるとおもいます。
細かく説明していただきありがとうございました レポートがうまくいかなかったので見ていただけませんでしょうか ただし誤植と思われる個所◆は以下のように変更しています
T_発注者の顧客 発注者の顧客ID 主キー 発注者ID 発注者の顧客 ◆削除 発注者の顧客氏名 発注者の顧客 ◆削除 発注者の顧客住所
T_受注 受注ID 主キー オートナンバー型 受注日 ◆削除 発注者ID (T_発注者 の外部キー) 歳暮用 Yes/No型 受取人欄ID (T_発注者の顧客 の外部キー) ◆欄を削除
受取人選択用のコンボボックス 名前 cb受取人ID コントロールソース 受取人ID 値集合ソース SELECT * FROM T_発注者の顧客 WHERE 発注者ID=cb発注者ID; 列数 3 ◆変更 列幅 0cm;0cm;1cm ◆変更
差出人欄(受取人欄の誤植ですよね)の氏名テキストボックスのコントロールソースを =IIf([歳暮用]=True,[発注者の顧客氏名],[発注者氏名]) 住所テキストボックスは、 =IIf([歳暮用]=True,[[発注者の顧客住所],[発注者住所]) ◆[が多い
ありがとうございます。難しそうですがチャレンジしてみます
Accessで入力フォームを作成することをお勧めします。
いろいろ方法はありますが、とりあえず2つの方法を提案しておきます。
見た目は、エクセルと似たものになります。 日付はVBAでフォームの更新前処理で、既定値を入力値に設定すれば、新規レコードへ移動したときに前に入力した日付が既定値として表示されます。 上書きすれば,次からその値が規定値になります。
Private Sub Form_BeforeUpdate(Cancel As Integer) Me.日付テキストボックス.DefaultValue = 日付テキストボックス.Value End Sub
非連結のメインフォームに日付入力用のテキストボックスを配置して、 テーブルと連結した帳票フォームをサブフォームとして埋め込みます。
サブフォームコントロールのプロパティを下記のように設定すれば、メインフォームの日付テキストボックスに入力した値がサブフォームに表示され、新規レコードもその日付が規定値となります。
リンク親フィールド 日付テキストボックス名 リンク子フィールド 日付フィールド名
この場合、親フォームで日付を入力するとその日付の入力済みのデータがサブフォームに表示されますので入力済みの日付のデータ修正なども楽になります。
以下、蛇足ですが、Accessはデータベースですので、Excelと同じような発想でテーブルを設計するとたいていうまくいきません。データベースのテーブル設計の原則として「正規化」というものがあります。 テーブル設計をする前に「データベース 正規化」をキーワードにWEB検索して、設計の基本を簡単に理解しておくことをお勧めます。
バグなんですかね? プロパティに直接書き込みます ありがとうございました
レポートの設定は下記のようになります。
まず、レコードソース用のクエリを作成します。 クエリで、T_受注、T_発注者、T_発注者の顧客 を追加して、 T_受注の外部キーと他のテーブルの主キーとを結合します。 レポートに必要なフィールドを追加します。 これをレポートのレコードソースにします。
レポート上の差出人欄の氏名テキストボックスのコントロールソースを下記のように設定します。
=IIf([歳暮用]=True,[発注者氏名],"当店の名前")
住所テキストボックスは、
=IIf([歳暮用]=True,[発注者住所],"当店の住所")
差出人欄の氏名テキストボックスのコントロールソースを
=IIf([歳暮用]=True,[発注者の顧客氏名],[発注者氏名])
=IIf([歳暮用]=True,[[発注者の顧客住所],[発注者住所])
以上です。
下記のような感じのテーブル設計になると思います。(一例です)
T_発注者 発注者ID 主キー 発注者氏名 発注者住所
T_発注者の顧客 発注者の顧客ID 主キー 発注者ID 発注者の顧客 発注者の顧客氏名 発注者の顧客 発注者の顧客住所
T_受注 受注ID 主キー オートナンバー型 受注日 発注者ID (T_発注者 の外部キー) 歳暮用 Yes/No型 受取人欄ID (T_発注者の顧客 の外部キー)
入力フォームは T_受注 をレコードソースとして作成します。
発注者選択用のコンボボックスを下記のように設定します。
名前 cb発注者ID コントロールソース 発注者ID 値集合ソース T_発注者 列数 2 列幅 0
これで 氏名 で選択できます。 ちなみに下記の方法を使えば、ID でも 氏名 でも選択できるようにできます。
コードでも名称でも入力できるコンボボックス - hatena chips
「歳暮用」フィールドを配置すると自動でチェックボックスになります。
歳暮用の場合は、「歳暮用」にチェックをいれて、受取人選択用のコンボボックスで受取人を選択します。
受取人選択用のコンボボックスの設定は下記のようにします。
名前 cb受取人ID コントロールソース 受取人ID 値集合ソース SELECT * FROM T_発注者の顧客 WHERE 発注者ID=cb発注者ID; 列数 2 列幅 0
これも氏名での選択でので、IDでも入力したい場合は上記のリンクを参考にしてください。
cb受取人ID のフォーカス取得時のイベントプロシージャを下記のように記述します。
Private Sub cb受取人ID_Enter() Me.cb受取人ID.Requery End Sub
以上が入力フォームです。
こちらの機能、複数ののフォームで利用しています。よく使う機能なので、教えてもらい本当に助かりました。ちなみに今、1つのレコード(帳票)で上記のコンボボックスを複数配置したいのですがどうしたら良いでしょうか…1つの案件に担当者を複数配置したくて、コンボボックスを複数配置したいのですが方法がわからず苦しんでいます
アドバイス、ありがとうございます!正規化、なかなか難しいですね。日々実践しながら勉強の日々です。
サブフォームのデザインビューで詳細セクションにコマンドボタンを配置して、そのクリック時のイベントプロシージャを下記のように記述すればいいでしょう。(コマンド1 は実際のコマンドボタン名に変更)
Private Sub コマンド1_Click() DoCmd.RunCommand acCmdDeleteRecord End Sub
「削除しますか?」の確認メッセージを出したくないときは、
Private Sub コマンド1_Click() DoCmd.SetWarnings False DoCmd.RunCommand acCmdDeleteRecord DoCmd.SetWarnings True End Sub
レポート側でも同じように非連結フィールドを作成して 配置する必要があるのでしょうか?
そういうことになります。
あるいは、フォームのレコードソースをクエリにして、クエリの演算フィールドに「単価*個数」というような式を設定します。フォームのコントロールソースにはその演算フィールド名を設定します。
レポートのレコードソースも同じクエリにすれば、同様に演算フィールド名をコントロールソースに設定できます。
確認してみましたが「リスト項目の編集」で既定値を設定しても反映されないみたいですね。 仕様なのか、バグなのか?
「標準」タグの方の「規定値」プロパティに「"有"」と設定してください。
●できるだけテーブル同士でフィールドが被らないようにする。(被るのはそれぞれのテーブルの主キーのみとなる)
おおむね、その理解でいいと思います。 具体的には「正規化」をキーワードでWEB検索してみてください。 厳密な設計方の解説がいろいろ見つかると思います。例えば下記のサイト。
正規化 カテゴリーの記事一覧 - もう一度学ぶMS-Access
完全に理解するのは簡単ではないですが、ざっと読んで雰囲気をつかんでおくいいでしょう。
●被らせないということは、残りはクエリでカバーする。
クエリとフォームとレポートですね。 集計、抽出、データ分析などはクエリ、 データの入力、閲覧はフォーム、 データの出力、印刷はレポート、 というように使い分けます。 もちろんそれぞれを組み合わせより使いやすいものにすることも必要になります。
●クエリもごちゃついてくるため、SQLを埋め込んだほうが良い。 ●VBAとSQLの使い分け…?
まずはクエリ、フォーム、レポートの機能を理解することが先決ですね。 それで不足する部分を改善したい、より高度の機能を追加したいというときにVBAとSQLを使用するという感じでしょうか。
フォームでと、コンボボックス、リストボックス、サブフォームの機能を理解して利用するとVBAなくてもかなり高度なことができます。 レポートはグループ化の機能を理解すると、見やすいレイアウトの出力が可能になります。
ご教示ありがとうございました。おかげで助かりました。 また、よろしくお願いいたします。
レコードソースプロパティにクエリ名「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と資格名の両方から選択できるようにしてもいいでしょう。
サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」を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です。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
こちらACCESS2013ですが「リスト項目の編集」で既定値を設定すると「規定値」プロパティにちゃんと反映されるようでした。仕様ってことはなさそうです
「複数の担当者が関わっている」とのことですが、最大何人ぐらいの担当者になりますか。
テーブルに担当者1、担当者2、担当者3 というようにフィールドがあるのなら、そのフィールド数分のコンボボックスを作成して、それに重なるようにコンボボックス(またはテキストボックス)を配置して、各コントロールを以前の回答にように設定すればいいかと思いますが、どのあたりがうまくいきませんか。
システムとはどこにあるどのようなデータですか。
それをどのように抽出してますか。
前回のデータと今回のデータとは具体的にどのようなものですか。
前回のテーブルと今回のテーブルの2つのテーブルがあるのですか。
もしそうなら、それぞれのテーブルの名前、フィールド名、主キー設定を提示してください。
以前のレコードと新たに追加されたレコードの区別はどのようにつけるのですか。
今回のテーブルで前回のテーブルにないレコードが新たに追加されたレコードということですか。
具体的にどのような形で表示したいのですか。
前回のデータと今回のデータの両方を表示しますか。
上記の点を含めてもう少し具体的に情報を提供してください。
そのうえで現状はどこまでできていて、どの辺で躓いているか具体的に説明してください。
送付していただいたファイルを改良しました。
下記のリンクからダウンロードできます。
定形外宛名ラベル作成.zip
いろいろ変更しましたので、自身のファイルと比べてどこが変更されたか確認してください。
主な変更点は、
レポートは、
レコードソースのクエリの結合を変更してます(前回の回答の内容)。
テキストボックスの名前がフィールド名と同じものになっていたので、それが原因でエラーとなってましたので、
テキストボックスの名前を変更してます。
フォームでは、VBAを変更しました。
最初の回答の cb受取人ID のフォーカス取得時のイベントプロシージャで再クエリする方法だと、一回のクリックでリストが開かないので、
レコード移動時と、cb発注者IDの更新後処理で再クエリするようにしました。
御親切にありがとうございます。ファイルを送信しました。よろしくおねがいします
いろいろ間違いでご迷惑をおかけしました。
修正部分はそれで問題ないと思います。
レポートのレコードソース用のクエリの結合が間違ってます。
T_発注者 と T_発注者の顧客 は結合しませんのて、結合線を削除してください。
T_受注.受取人ID と T_発注者の顧客.発注者の顧客ID を結合してください。
結合線をダブルクリックして、結合プロパティを表示させて、「T_受注のすべてのレコードと・・・・」というオプションを選択します。結合線が T_受注.受取人ID → T_発注者の顧客.発注者の顧客ID という向きの矢印になります。
同様に、T_受注とT_発注者の結合線も 同じ向きに矢印になるように設定してください。
全体としては結構複雑なものになりますので、もし、差支えなければ右カラムの「ファイル送信フォーム」から現状のファイルを送信してもらえると、ファイルを見ながら具体的におかしいところを指摘できるとおもいます。
細かく説明していただきありがとうございました
レポートがうまくいかなかったので見ていただけませんでしょうか
ただし誤植と思われる個所◆は以下のように変更しています
T_発注者の顧客
発注者の顧客ID 主キー
発注者ID
発注者の顧客 ◆削除
発注者の顧客氏名
発注者の顧客 ◆削除
発注者の顧客住所
T_受注
受注ID 主キー オートナンバー型
受注日 ◆削除
発注者ID (T_発注者 の外部キー)
歳暮用 Yes/No型
受取人欄ID (T_発注者の顧客 の外部キー) ◆欄を削除
受取人選択用のコンボボックス
名前 cb受取人ID
コントロールソース 受取人ID
値集合ソース SELECT * FROM T_発注者の顧客 WHERE 発注者ID=cb発注者ID;
列数 3 ◆変更
列幅 0cm;0cm;1cm ◆変更
差出人欄(受取人欄の誤植ですよね)の氏名テキストボックスのコントロールソースを
=IIf([歳暮用]=True,[発注者の顧客氏名],[発注者氏名])
住所テキストボックスは、
=IIf([歳暮用]=True,[[発注者の顧客住所],[発注者住所]) ◆[が多い
ありがとうございます。難しそうですがチャレンジしてみます
Accessで入力フォームを作成することをお勧めします。
いろいろ方法はありますが、とりあえず2つの方法を提案しておきます。
案1 帳票フォームまたはデータシートフォームで入力する。
見た目は、エクセルと似たものになります。
日付はVBAでフォームの更新前処理で、既定値を入力値に設定すれば、新規レコードへ移動したときに前に入力した日付が既定値として表示されます。
上書きすれば,次からその値が規定値になります。
案2 メイン/サブフォーム形式の入力フォームを使う
非連結のメインフォームに日付入力用のテキストボックスを配置して、
テーブルと連結した帳票フォームをサブフォームとして埋め込みます。
サブフォームコントロールのプロパティを下記のように設定すれば、メインフォームの日付テキストボックスに入力した値がサブフォームに表示され、新規レコードもその日付が規定値となります。
リンク親フィールド 日付テキストボックス名
リンク子フィールド 日付フィールド名
この場合、親フォームで日付を入力するとその日付の入力済みのデータがサブフォームに表示されますので入力済みの日付のデータ修正なども楽になります。
以下、蛇足ですが、Accessはデータベースですので、Excelと同じような発想でテーブルを設計するとたいていうまくいきません。データベースのテーブル設計の原則として「正規化」というものがあります。
テーブル設計をする前に「データベース 正規化」をキーワードにWEB検索して、設計の基本を簡単に理解しておくことをお勧めます。
バグなんですかね?
プロパティに直接書き込みます
ありがとうございました
レポートの設定は下記のようになります。
まず、レコードソース用のクエリを作成します。
クエリで、T_受注、T_発注者、T_発注者の顧客 を追加して、
T_受注の外部キーと他のテーブルの主キーとを結合します。
レポートに必要なフィールドを追加します。
これをレポートのレコードソースにします。
レポート上の差出人欄の氏名テキストボックスのコントロールソースを下記のように設定します。
=IIf([歳暮用]=True,[発注者氏名],"当店の名前")
住所テキストボックスは、
=IIf([歳暮用]=True,[発注者住所],"当店の住所")
差出人欄の氏名テキストボックスのコントロールソースを
=IIf([歳暮用]=True,[発注者の顧客氏名],[発注者氏名])
住所テキストボックスは、
=IIf([歳暮用]=True,[[発注者の顧客住所],[発注者住所])
以上です。
下記のような感じのテーブル設計になると思います。(一例です)
T_発注者
発注者ID 主キー
発注者氏名
発注者住所
T_発注者の顧客
発注者の顧客ID 主キー
発注者ID
発注者の顧客
発注者の顧客氏名
発注者の顧客
発注者の顧客住所
T_受注
受注ID 主キー オートナンバー型
受注日
発注者ID (T_発注者 の外部キー)
歳暮用 Yes/No型
受取人欄ID (T_発注者の顧客 の外部キー)
入力フォームは T_受注 をレコードソースとして作成します。
発注者選択用のコンボボックスを下記のように設定します。
名前 cb発注者ID
コントロールソース 発注者ID
値集合ソース T_発注者
列数 2
列幅 0
これで 氏名 で選択できます。
ちなみに下記の方法を使えば、ID でも 氏名 でも選択できるようにできます。
コードでも名称でも入力できるコンボボックス - hatena chips
「歳暮用」フィールドを配置すると自動でチェックボックスになります。
歳暮用の場合は、「歳暮用」にチェックをいれて、受取人選択用のコンボボックスで受取人を選択します。
受取人選択用のコンボボックスの設定は下記のようにします。
名前 cb受取人ID
コントロールソース 受取人ID
値集合ソース SELECT * FROM T_発注者の顧客 WHERE 発注者ID=cb発注者ID;
列数 2
列幅 0
これも氏名での選択でので、IDでも入力したい場合は上記のリンクを参考にしてください。
cb受取人ID のフォーカス取得時のイベントプロシージャを下記のように記述します。
以上が入力フォームです。
こちらの機能、複数ののフォームで利用しています。よく使う機能なので、教えてもらい本当に助かりました。ちなみに今、1つのレコード(帳票)で上記のコンボボックスを複数配置したいのですがどうしたら良いでしょうか…1つの案件に担当者を複数配置したくて、コンボボックスを複数配置したいのですが方法がわからず苦しんでいます
アドバイス、ありがとうございます!正規化、なかなか難しいですね。日々実践しながら勉強の日々です。
サブフォームのデザインビューで詳細セクションにコマンドボタンを配置して、そのクリック時のイベントプロシージャを下記のように記述すればいいでしょう。(コマンド1 は実際のコマンドボタン名に変更)
「削除しますか?」の確認メッセージを出したくないときは、
そういうことになります。
あるいは、フォームのレコードソースをクエリにして、クエリの演算フィールドに「単価*個数」というような式を設定します。フォームのコントロールソースにはその演算フィールド名を設定します。
レポートのレコードソースも同じクエリにすれば、同様に演算フィールド名をコントロールソースに設定できます。
確認してみましたが「リスト項目の編集」で既定値を設定しても反映されないみたいですね。
仕様なのか、バグなのか?
「標準」タグの方の「規定値」プロパティに「"有"」と設定してください。
おおむね、その理解でいいと思います。
具体的には「正規化」をキーワードでWEB検索してみてください。
厳密な設計方の解説がいろいろ見つかると思います。例えば下記のサイト。
正規化 カテゴリーの記事一覧 - もう一度学ぶMS-Access
完全に理解するのは簡単ではないですが、ざっと読んで雰囲気をつかんでおくいいでしょう。
クエリとフォームとレポートですね。
集計、抽出、データ分析などはクエリ、
データの入力、閲覧はフォーム、
データの出力、印刷はレポート、
というように使い分けます。
もちろんそれぞれを組み合わせより使いやすいものにすることも必要になります。
まずはクエリ、フォーム、レポートの機能を理解することが先決ですね。
それで不足する部分を改善したい、より高度の機能を追加したいというときにVBAとSQLを使用するという感じでしょうか。
フォームでと、コンボボックス、リストボックス、サブフォームの機能を理解して利用するとVBAなくてもかなり高度なことができます。
レポートはグループ化の機能を理解すると、見やすいレイアウトの出力が可能になります。
ご教示ありがとうございました。おかげで助かりました。
また、よろしくお願いいたします。
このフォームの名前が「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です。