SELECT y.部品ID
FROM T製品一覧 x
INNER JOIN T製品別部品構成 y
ON x.製品ID = y.製品ID
WHERE x.check
GROUP BY y.部品ID
HAVING Count(1) = (
SELECT Count(1) FROM T製品一覧 WHERE check
)
;
Private Sub cb注番選択_GotFocus()
Const conSQL = _
"SELECT DISTINCT [注番] " & _
"FROM [Q製品出荷履歴1Form用RS] " & _
"WHERE 【Where】 " & _
"ORDER BY [注番];"
Dim varID As Variant, varYear As Variant, varMonth As Variant
varID = Me.[製品ID]
varYear = Me.[cb出荷の年]
varMonth = Me.[cb出荷の月]
If IsNull(varID) Then
MsgBox "製品IDを入力してください。"
Me.[製品ID].SetFocus
Exit Sub
End If
If IsNull(varYear) And Not IsNull(varMonth) Then
MsgBox "出荷年を選択してください。"
Me.[cb出荷の年].SetFocus
Exit Sub
End If
Dim strWhere As String
strWhere = "[製品ID]=" & varID
If Not IsNull(varYear) Then
strWhere = strWhere & " AND Year([出荷日付])=" & varYear
End If
If Not IsNull(varYear) Then
strWhere = strWhere & " AND Month([出荷日付])=" & varMonth
End If
Me.[cb注番選択].RowSource = Replace(conSQL, "【Where】", strWhere)
End Sub
主キーの設定を、外しても、同じ結果になります。
mayuさん ありがとうございます。連絡遅くなりすみませんでした。
確かに、グループ後の部品IDのカウントでいけますね。”製品ID + 部品ID でユニークになっている”の様にデータの分析ができてませんでした。勉強になりました。お世話になりました。
※ T製品別部品構成 は 製品ID + 部品ID でユニークになっていると仮定します
hatena 様
原因が判明致しました。
色々とお手数お掛けして申し訳ありませんでした。
原因:セキュリティのソフトの「McAfee」をアンインストールしたら
通常速度の起動、終了時間に戻りました。
(同症状のパソコン3台からもアンインストールしたら普通に戻りました)
前から「McAfee」は入っていたらしいのですが今回のアップデートから
このような状態になってしまいました。
当方はWin10の環境を持っていないのでファイルを送ってもらってもWin11とWin10での動作速度の違いを検証はできません。
また、Win11の環境の人で同じ現象にあった方がいればいいのですが、上記で紹介したMicrosoft コミュニティでは不具合があるとわりと報告される場合が多いようですが、そのような報告も現在出てないようです。
とりあえず、
「Win 11 の 8 月末のアップデート」を取り消して前のものに戻す方法がありますので、それを試してみて症状が解消するかどうか検証してみては。
FMV Q&A - [Windows 11] 以前のバージョン・ビルドに戻す方法を教えてください。 - FMVサポート : 富士通パソコン
hatena 様
ありがとうございます。
コミュニティで問い合わせさせていただきました。
ファイルのアップロードができるのであればアップロードさせて
いただきますが起動、終了を試していただきご意見いただけないでしょうか?
下記のMS公式の掲示板で質問してみたらどうでしょう。
Microsoft 365 および Officeの結果 - Microsoft コミュニティ
最近の更新がらみの不具合は下記のスレッドがあります。
Access365更新後の不具合 - Microsoft コミュニティ
ただ、Accessファイルを閉じてもロックファイルが残り、次回起動できないという不具合なのでこの質問の症状とは違います。
こんな質問は駄目なんですね!
有償でも結構なのでどこか相談できる会社等の
アドバイスいただければ幸いです!
すいません。ソートの条件に、直近3ヶ月を加えたことで、できました。
申し訳ありません。
解決しました。
hatena様
ご返答ありがとうございます。
今回ばかりは、コードをストップする手立てはないんじゃないかと思っていました。
ダイアログにすれば止まる、というのは驚きました。
それと、別フォームを非表示にしたら、元フォームのテキストボックスがアクティブコントロールになること、
また、Screen.という使い方も知りませんでした。
今回も助かりました。
ありがとうございました。
早速、やってみます!
DoCmd.OpenFormでフォームを開くときに、ダイアログモードを指定すればフォームを閉じる(あるいは非表示になる)まで次のコードにすみません。また、開いている間はユーザーはこのフォーム以外を操作できません。それを利用するといいでしょう。
具体的には、WindowMode引数にacDialogを設定します。
DoCmd.OpenForm メソッド (Access) | Microsoft Learn
コード例
「正規化」だからといって特別の方法はないと思います
データベースの入門書を買って学習する
「正規化」をキーワードにWEB検索して、解説サイトで学習する
そのうえで、現状の扱いたいデータを正規化してみる
上記で正しく正規化できているか分からない場合は、
扱いたいデータのデータ例と、現状のテーブル構成を提示して、ここや技術系の掲示板で質問してみる
ではとりあえず、次の2点について明記されることをお奨めします。
作成された更新クエリの SQL ビューの内容
更新クエリに設定されている抽出条件において、[cmb_送付先]および[txb_送付期限]との比較対象となっている各フィールドのデータ型
Dcount関数の使い方を紹介しているページとか見ましたが、フォームで入力した抽出条件をどのように式に書くのかがよくわかりませんでした。
ソート(並べ替え)ではなくフィルタリング(レコードの抽出)のことをおっしゃっているとして、
例えば、その更新クエリに設定されているのと同じ抽出条件に該当する[T_注文]のレコードの件数を DCount 関数によって求めればよろしいのではないかと。
hatenaさん ありがとうございます。
なるほどそういう事ですね。色々素晴らしい回答を頂き感謝します。大変勉強になります。
お世話になりました。
""で囲まれた文字列内なので問題ありません。
また、最終的にはReplace関数で条件式に置換してますので、RpwSourceに設定するときには消えています。
hatenaさん ありがとうございます。
Constは使った事がなかったので勉強になりました。条件変数に条件を随時追加はFilterの様にSQLでも出来るとは知りませんでした。確かにこれは便利です! 一つだけ参考にまで教えて頂きたいのですが【Where】の様にコード内に【 の様な記号を使うことは特に問題ないでしょうか? この場合ならOKでしょうか?
私がよくやるのは、定数でSQLを宣言しておいて、変更がある部分(今回はWHERE句)はマークを付けたワードにしておく。
WHERE句のみ生成して、Repalceでマークワードを生成した条件式で置換する。
条件式の生成は、今回のように3条件ぐらいなら、ElseIf で分岐していっても何とかなるが、条件が多くなると収拾がつかなくなるので、条件変数に条件を随時追加していくようにする。
あと、提示のコードをみると 製品ID は入力必須、出荷月のみの入力はNGのようなので、そのチェックを追加しておいたほうがいいでしょう。
コード例
ちょっと表現が分かりにくいですが、
テキストボックスのコントロールソースに式が設定してある。
このフォームやレポートを開くときに、式が評価(実行)されて結果がテキストボックスに表示される。
ということを指しているのでしょうか。
もちろん、この場合、VBAコードが実行されるわけではないので、VBAデバッグはできません。
ただ、この場合、エラーになったときは、テキストボックスに #Size!、#Type! などというように表示されますので、どこでエラーがでているかは判断できます。
で式内の値を確認すればだいたい原因は分かります。
例えば、テキストボックスを追加して、そこに=Sum([明細金額]) 、=[消費税] とすれば値を確認できます。#Type!エラーなら数値であるべきなのに文字列がはいっているとか、Nullだとか。
=Sum([明細金額])+[消費税]
というような集計処理はコントロールソースを使うのが一般的だと思いますし、私は多用しますが、
このような場合、「コントロールを全てVBAの中で実施」するのは、どのようなコードにしていますか。
ご参考までにサンプルを教えてもらえると幸甚です。
「コントロールソースからの実行」とは、テキストボックスなどのプロパティにある「コントロールソース」の内容を実行することを指します。
「VBAの実行」とはイベント発生時に「イベントプロシージャ」からVBAを実行することを指します。
「VBAの実行」ではデバッガの機能が使えますので、1行毎にどのような変化が発生したか、などを追うことができます。「コントロールソースからの実行」ではそれができない、ということを指しています。
(「金額部分のコントロールソースには =(Sum([明細金額]))+[消費税] の式が設定されています」の部分ですね)
例えばテキストボックスの内容のコントロールを全てVBAの中で実施している場合、デバッガで追えますが、コントロールソースで行うとその内容は追えない、ということになります。
お世話になります。ありがとうございました!
チャレンジしてみます。
本当にここのサイトは勉強になります。
ご回答いただきありがとうございます。
そうですか。。。リストボックスとボタンを組み合わせて作成します。
ありがとうございました。
PCがスリープに入ってしまうとCPUへの給電も止まるので、プログラムは止まってしまいます。
ですので、スリープに入る直前に発生するイベントがあればいいのですが、VBAにはないですね。APIならあるかも知れませんが、ちょっと検索してみた限りでは情報は見つかりませんでした。
Accessデータベースを立ち上げた放置するということはままあることなので、私は下記のような対策をしています。
各フォームのキーボードイベント、マウス移動イベントで、ユーザー操作を検知したら、その時刻をグロバール変数に格納する。
常に表示させてあるフォームのタイマーイベントで定期的にグロバール変数の時刻と現在時刻の時間差を求めて、その時間が設定した時間より長ければファイルを強制終了する。
強制終了する時間をスリープ待機時間より短く設定しておけば、スリープへ入る前に終了させることができます。
すみません。コントロールソースからの実行という意味がわかっておりません。
上記コードは、フォーム上に設置したコマンドボタンのクリック時に実行しています。可能であれば、違いを教えていただけますと有難いです。
ないと思います。
どうしても必要なら、テキストボックス、コマンドボタン、リストボックスを組み合わせて、コンボボックスと同様の機能をもったものを自作するということになると思います。
失礼しました。コントロールソースからの実行の場合、このデバッグ方法は使えません。
逆にデバッグで追えるのはVBAからの実行だけです(知る限りでは)
コントロールソースからの実行はとても便利ですが、文字検索の対象にならないことやデバッグができない(と思っている)ので、個人的にはあまり使わないようにしています。
すずやんさんの紹介しいるリンク先のデバッグ方法は、VBAの実行時エラーの確認方法です。
今回の場合は、テキストボックスのコントロールソースに設定している式でのエラーですので、この方法は使えません。
ありがとうございます。解決しました。
コメントいただいたことを色々試していたところ、レポートのソース(クエリー)に、抽出条件が設定されていたことが原因だったことがわかりました。(クエリーは確認していたはずなのですが、大変申し訳ございません。)
たまたま抽出条件に合わない請求書を試し印刷をしていて、原因に気づけず、お騒がせしました。
デバッグの方法の件、
以下のコードの2行目にカーソルを置き、F8を押しましたが、何の反応もありません。上部メニューのデバッグ(ステップイン)からも、反応がありません。
本来なら、請求書番号を求めるポップアップなどが表示されるのでしょうか。よろしければ今後のためにご教示いただけますと有難いです。宜しくお願い致します。
Private Sub 請求書印刷_Click()
DoCmd.OpenReport "請求書", acViewPreview, , "[請求書番号] = " & Me.請求書番号 & ""
End Sub
お騒がせしました。循環参照は、解決しました。
参考までに、まったくの素人ですが、hatena様のコードを、ネットで調べて変更しました。
hatena様のコードも作動しました。
参考のコードの解説もありがとうございました。
大変参考になりました
このコードでも循環参照が発生していますとなります。
Q_直近3ケ月 のコピーのもとは、MT_検索テーブルから作成しています
hatena様
参考のコードありがとうございます。
そのまま投稿しようとおもったのですが、改行は、50行までと言われました。
私が、2番目に投稿した、SQL文ですが、作成時は、上手く表示されますが、一旦保存すると、Q_直近3ケ月 のコピーで、循環参照が発生していますとなります。
hatena様の参考コードを利用しました。
'''spl
Nz(Choose(DateDiff("m", [直近3ヶ月], DateSerial(Year(Date()), Month(Date()),1)+1,3,2,1),4) AS [並べ順]
'''
この部分で、演算子がありませんとなりました。
改善方法はありますか?
お手すきのときに、回答いただけたら幸いです。
解決したのですね。よかったです。
ちなみに、質問のSQLですが、
サブクエリと親クエリのSQLが演算フィールド以外は同じなのに、わざわざサブクエリにしたということは、ORDER BY句に演算式を重複して記述するのを避けたいという意図でしょうか。
だとしたらORDER BY句にはフィールド名ではなくフィールド番号(何番目のフィールドか)を指定することもできます。それを利用すればサブクエリを使う必要はなくなります。
あと、演算フィールドの式もChoose, DateDiff関数を使えばもう少し簡略化できます。
御参考までにコード例を置いておきます。
[Q_直近3ケ月 のコピー]を、再度作成しましたら、作動しました。
お騒がせしました。
hatena様、sk様、回答ありがとうございました。
sk様
返信ありがとうございます。
確認しまsたが、フィールドは存在します
これが画像です
こんな感じで、フィールドは存在します
hatena様
同様に全てにおいて、パラメータクエリの表示がされます。
フィールドは、Q_直近3ケ月 のコピーには、すべてあります
[Q_直近3ケ月 のコピー]が選択クエリであるならば、
とりあえずそのクエリのデザイン( SQL )を
再度確認されることをお奨めします。
パラメータダイアログが出るということは、FROM句のテーブルやクエリにその名前のフィールドがないとういことになります。
()や半角空白を含むフィールド名は[]でくくらないと認識できないので、前者のSQLがエラーになるのは当然ですが、後者のSQLでもパラメータが出るということは、[Q_直近3ケ月 のコピー] にその名前のフィールド名がないということになります。[Q_直近3ケ月 のコピー] のフィールド名とSQL内のフィールド名に相違がないのは確実ですか。
下記のサブクエリのSQLのみ実行した場合はどうなりますか。