Microsoft Access 掲示板

views
4 フォロー
6,283 件中 5,201 から 5,240 までを表示しています。
5

レコードソースプロパティにクエリ名「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さんの回答を参照ください。

4
hiroton 2020/07/02 (木) 14:32:28 076a1@f966d

フォームにはWhere句だけを後から設定・変更できるプロパティ(意訳)がありますよ

Me.sbf1.Form.filter = "(Where句に該当する文字列)"
Me.sbf1.Form.filterOn = True
3
nokonoko 2020/07/02 (木) 13:44:50 653a6@54883

SQLだけでサブフォームを作って表示させようとするとエラーが出てしまった(エラー内容は忘れました)ので

Error2467 The expression you entered refers to an object that is closed or doesn't exist
でした

2
nokonoko 2020/07/02 (木) 13:32:41 653a6@54883

ご回答ありがとうございます

「サブフォーム1」という名前のフォームのレコードソースプロパティにクエリ名「Q_Transaction」を設定してあるということでしょうか。それとも「サブフォーム1」というサブフォームコントロールの「ソースオブジェクト」プロパティに「Query.Q_Transaction」とクエリを設定しているということでしょうか。

レコードソースプロパティにクエリ名「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

用語の使い方が間違っているようなので、正確に状況が伝わりません。

サブフォーム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を書き換えてますね。

デフォルトは帳票フォームをデフォルトビューとしているのですが、検索後も帳票フォームの形で出すのはどうすればいいのでしょうか。

その帳票フォームの名前はなんでしょうか。その帳票フォームはどこで使用してますか。

正確の用語を使って、状況を説明してください。

3
cerophan 2020/07/02 (木) 07:45:29 f1ed8@4625c

お返事が遅くなっていてスミマセン。このようなアイデアがあるとは大変勉強になりました。ご回答ありがとうございます。

7

ありがごうございます!
複数選択して右クリックの条件付き書式で探してました。
複数選択してリボンからいけばできました!

式についても教えていただいた通りに記入してやりたいようにできました。
大変勉強になりました。
質問のクローズはどこでするのかわからないのでこちらで解決とさせていただきます!😄

4
kitasue 2020/07/01 (水) 20:21:01 ce705@a68b2

hatenaさんありがとうございます。
ブログ記事拝見しました。
InStrでもバイナリ比較できるんですね。
勉強になりました。

2
kitasue 2020/07/01 (水) 18:42:54 ce705@a68b2

ごめんなさい。先頭のNOTは不要です。
スレを汚してすみません。。。

1
kitasue 2020/07/01 (水) 18:37:30 ce705@a68b2

一応、自己解決しましたので報告します。
INのカッコの中はSELECT文になってまして、

試験値 IN(SELECT 候補値 FROM テーブル)

という式になっていました。そこで、

NOT EXISTS(SELECT 0 FROM テーブル WHERE StrComp(試験値,候補値,0)=0)

とすることでしのぎました。
どうもお騒がせ致しました。

6
hatena 2020/07/01 (水) 16:17:00 修正

テキストボックスを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")
5

ありがとうございます。
テキストボックスを2つ以上選択すると、条件付き書式が指定できないようですが、やり方がありますか?
また、年月日のそれぞれどれかが1つでも今日の年月日とマッチするようなら1レコード分の書式を変更したいです。
よろしくお願い致します。😣

4

条件が不明確ですか、年 月 日 を合成した日付が今日の日付と同じならば背景色を赤にする、ということなら、

他のテキストボックスをすべて選択した状態で条件付き書式を下記のように設定すればいいでしょう。

画像1

式は、

DateSerial([年],[月],[日])=Date()
1

これで、メインフォームがM1テーブル、サブフォームがM2テーブルの帳票フォームを作れば、例えばM1テーブルの氏名に紐づいたM2テーブルのID1のAさんの資格情報は見れるようになりました。

これで本当に各人物の資格情報を見れますか。見れないと思います。
メインもサブもマスターテーブルですので、それぞれのマスターテーブルのデータが表示されるだけです。

しかし、このフォームでAさん資格情報を編集することができません。
なのに、メインフォーム上のAさんの名前を変更すると、M1のマスタテーブルは書き換わってしまいます。

マスターテーブルと連結したフォームですので当然そうなります。
この場合、マスターテーブルは書き換えてはいけないので、フォームの設定で更新できないようにしておきます。
例えば、「レコードセット」プロパティを「スナップショット」に設定しておきます。

どの人物がどの資格を持っているかを格納しているテーブルはRテーブルですので、サブフォームのレコードソースはRテーブルにします。サブフォームのM2IDはコンボボックスにして、資格名を表示させるようにしておきます。
あるいは、下記の紹介した方法でIDと資格名の両方から選択できるようにしてもいいでしょう。

コードでも名称でも入力できるコンボボックス - hatena chips

サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」をM1のIDに設定すればご希望のメイン/サブフォームになります。

人物はメインフォームでレコード移動して切り替えます。あるいは、検索で目的の人物に移動してもいいでしょう。


別の方法として、メインフォームは非連結(レコードソースは空欄)にしておいて、M1を値集合ソースとするコンボボックスまたは、リストボックスを配置して、このコントロール名を「リンク親フィールド」に設定します。
これで、このコンボボックスかリストボックスで人物を選択するとその資格情報がサブフォームに表示されます。
非連結なので、マスターテーブルが更新されることはありません。

例えば、下記で紹介しているようなフォームです。人物の人数が多くても、トグルボタンで50音で絞り込めるので目的の人物に簡単にたどり着けます。

名簿管理フォームの設計 - hatena chips

3

ありがとうございます!
条件付き書式とても便利ですね!やりたいようにできました。
年、月、日をそれぞれ指定してその連結テキストボックスの書式をかえることができましたが、
同じレコードにある連結テキストボックスの項目もすべて同じ条件で同じ書式に変更したいのですが、
たとえば「内容」などの連結テキストボックスも条件付き書式でいけますか?
「内容」について、式でif(年=format(date()"yyyy"))といれてみたのですが
これだとだめですか?
よろしくお願い致します。

2

ありがとうございました!
思った通りにできました

2
hiroton 2020/06/30 (火) 15:43:06 afc66@f966d

フォーカスを別の場所に移動しない限り
カレンダーアイコンが表示され続ける

標準機能は融通が利かないのも仕方なしですねぇ
いろいろ試してみましたがアイコンが表示される部分に強制的に描画処理を起こさせるのが一番楽そうでした

(なんでもいいんですが)アイコンが表示される位置、サイズで透明なボタンを非表示で置いておきます

Private Sub 日付_Change()
    Me.日付.ShowDatePicker = 0
    Me.ボタン.Visible = True
    Me.ボタン.Visible = False
End Sub

Private Sub 日付_Enter()
    Me.日付.ShowDatePicker = 1
End Sub
2
cerophan 2020/06/30 (火) 12:38:51 0029a@1c915

すみません。原因がわかりました…
テーブルのルックアップでコンボボックスを作成&選択肢を記載していて、フォームに値集合ソースに何も記載していないものが、そうなっていました。
フォームの値集合ソースにも記載したところ解決しました。(テーブルはそのままにしても問題なさそう?でしたが削除しました)
お騒がせしました。

1

コンボボックスを重ねているとか、特別なことをしていないのに、そうなるのでしょうか。
イベントプロシージャとか設定していませんか。

そのような現象がでるのは特定のコンボボックスでしょうか。
それともすべてのコンボボックスでしょうか。

特定のコンボボックスなら、症状の発生しないコンボボックスとのプロパティ設定の違いを確認してみてください。

2

cerophanさんが回答されてるように条件付き書式でやるのが簡単だと思います。

連結テキストボックスが、年、月、日 と3つあるのだとすると、

「年」テキストボックスは下記のよう設定します。

画像1

月、日 も同様に設定すればOKです。

1
cerophan 2020/06/30 (火) 08:33:43 a6218@1c915

テキストボックスのプロパティシート>データ>コントロールソースに下記の式を入れれば、それぞれ表示されます。
=Format(Date(),"y")
=Format(Date(),"m")
=Format(Date(),"d")

1
cerophan 2020/06/30 (火) 08:07:15 f1ed8@4625c

帳票ぎゅうぎゅう詰めのアイデアについて、hatena様の参考ページを見つけることができました。参考にさせていただきます。ありがとうございます。

https://hatenachips.blog.fc2.com/blog-entry-242.html

1
cerophan 2020/06/30 (火) 08:00:12 f1ed8@4625c

条件付き書式ではできませんでしょうか?的外れであれば申し訳ありません。

4
cerophan 2020/06/29 (月) 13:25:01 0029a@1c915

やはりそうですよね。
>フィールドをNullにするようします
なるほど、そういったことも必要になるのですね。勉強になりました!ありがとうございます。

3
cerophan 2020/06/29 (月) 13:22:18 0029a@1c915 >> 1

なるほど、こんなことができるのですね。勉強になりました!ありがとうございます。

5
cerophan 2020/06/29 (月) 13:20:21 0029a@1c915

>Private Sub cmd降順_Click()

すみません、このコードについては記述しなくても望み通りの動きをしてくれたのですが、「
フィルターや並べ替えを変更すると、レコードセットの共有がレセットされます」とはどういうタイミングになりますでしょうか。

4
cerophan 2020/06/29 (月) 13:10:45 0029a@1c915

望み通りのものを作成することができました!コードについても勉強になりました。とても助かりました。ありがとうございました。

3
cerophan 2020/06/29 (月) 12:31:08 0029a@1c915 >> 1

ご回答ありがとうございます!参考にさせていただきます。

7

VBAが必須かどうかは要件によりますが、入力フォームやレポートでの見やすい出力を考えたら、クエリ(SQL)だけでは解決できないと思います。
メイン/サブフォーム形式、レポートのグループ化機能などを使う必要が出てくると思います。

6
ろでます 2020/06/28 (日) 22:38:17 61da2@be317

こんばんわ、ろでますです。
ご返信ありがとうございます。
となると、VBAに足を突っ込まないといかないかもということですか。
エクセルのはそこそこ使ったことあるんですが・・・
Accsessとなってくると、初めてになります。

SQL構文覚えないと><

5

>※F1、F2 は M_Category の外部キー
これはK1、K2の誤記ですか?(揚げ足を取るとかそんなんではなく、純粋に)

あっ、誤記です。すみません。回答の方も修正しておきます。

M_Category (カテゴリーマスター)
でK1・K2は2つで複合キーになっていると思うのですが、その後ろの
T_Question (質問テーブル)
の説明書きに
>※K1 は M_Category の外部キー
とあります。

そうですね。これは外部キーにはなりませんね。
脳内だけで構成を考えていたのでこのへんはちょっとおかしいですね。

これはリンクせずに、入力フォームを作成するときの抽出条件に使うという感じの設計になるのかな。

各人物の回答用の入力フォームは、メイン/サブフォーム形式のものになるので、
メインで回答者を選択するコンボボックスの値集合リストの抽出条件に使うといいかも。

これもあくまで脳内シミュレーションでの構成ですので、実際につくると修正が必要になるかも知れません。

4
ろでます 2020/06/28 (日) 20:49:37 61da2@be317

こんばんわ、ろでますです。
すいません、私の知識不足で、上から読み解いていくうちにわからないことが出てきたので、教えていただけませんか。

>※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キーをリレーショナルすると、「未定義となりました」

すいません、ここがわからなかったのでこれ以上先に進めていません><

よろしければご教授願います。

3

いろいろ考えられますが、
一つの解決策としては下記のようなテーブル構成にするのが自由度か高いかな、と思います。

M_Category (カテゴリーマスター)

K1K2Cat
11A
12B
13C
14D
21E
22F
23G

K1, K2 複合PK

M_Person (人物マスター)

PIDNameK1K2
1山田さん11
2加藤さん13
3佐藤さん11
4田中さん21
5伊藤さん23

※F1、F2 は M_Category の外部キー

T_Question (質問テーブル)

QIDK1Question
11aaaa?
22bbbb?

※K1 は M_Category の外部キー

T_Choice (選択肢)

QIDCIDChoice
11
12
13
21
22
23
24
25

CID, QID 複合PK
QID は T_Question の外部キー

T_Person_Choice (人物がどの選択肢を選択したか)

PIDQIDCID
111
113
212
313
421
423
425
522
524

テーブル名とかは出された情報から推測で適当につけてますので、参考程度に。

これはあくまで一例ですので、別の方法もあるかと思います。

2
ろでます 2020/06/28 (日) 14:40:59 61da2@be317

ご回答どうもありがとうございます!

確かにおっしゃる通りの方法でうまくいきました。

すいませんが、この後実は色々難所があり、それもお伺いしてもよろしいでしょうか。

このテーブル構成で、

      FK 
山田さん 1 1 
加藤さん 1 3
佐藤さん 1 1
田中さん 2 1
伊藤さん 2 3

となっているときに、FKの左側が1の方に質問があったとします。(山田さん・加藤さん・佐藤さん)
その問いが別のテーブルにあり、10個(01~10)の回答から複数選択しなさいという物いです。
同様にFKの左側が2の方に質問があったとします(田中さん・伊藤さん)
その問いが別のテーブルにあり、15個(01~15)の回答から複数選択しなさいという物いです。

この場合、どういったテーブルを作って、何処のテーブルと結合していいかが全く考え付きません。

よろしければご教授願えませんでしょうか・・・。

1

質問の設定だと、それぞれのテーブルが
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

追加するデータは下記

1 メロン
2 オレンジ
3 マンゴー

このデータはどこにどのような形であるのですか。
テーブルなら、これから追加クエリを作成して、SQLビューにすればいいでしょう。

テーブルでないなら、どのように追加するデータを指定するか明示してください。

2
なす 2020/06/27 (土) 21:10:49 8216a@0fd0b

hatena さん

レポートの事です。失礼しました。
困っていたことは、解決しそうです。

ご回答ありがとうございました。

1

レポートの話ですよね。

用紙の最下部にグループフッターを表示したいということでしょうか。

下記の方法が参考になると思います。

レコードがない場合も用紙の最後まで罫線を出力する - hatena chips

2

「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