SELECT
DISTINCT a.グループ
FROM
MT_成績 AS a INNER JOIN MT_成績 AS b
ON a.都道府県 = b.都道府県
AND a.グループ = b.グループ
WHERE
a.順位 = 1 AND b.順位 = 2
OR
a.順位 = 2 AND b.順位 = 1;
このクエリ(Q_成績)と元の MT_成績 をグループで結合したクエリを作成します。
SELECT
a.*
FROM
MT_成績 AS a INNER JOIN Q_成績 AS b
ON a.グループ = b.グループ;
サブクエリで一つにまとめるなら、下記になります。
SELECT
a.*
FROM
MT_成績 AS a INNER JOIN
(
SELECT
DISTINCT a.グループ
FROM
MT_成績 AS a INNER JOIN MT_成績 AS b
ON a.都道府県 = b.都道府県
AND a.グループ = b.グループ
WHERE
a.順位 = 1 AND b.順位 = 2
OR
a.順位 = 2 AND b.順位 = 1
) AS b
ON a.グループ = b.グループ;
SELECT
a.*
FROM
MT_成績 AS a INNER JOIN MT_成績 AS b
ON a.都道府県 = b.都道府県
AND a.グループ = b.グループ
WHERE
a.順位 = 1 AND b.順位 = 2
OR
a.順位 = 2 AND b.順位 = 1
ORDER BY a.グループ, a.順位;
Private Sub Form_AfterUpdate()
Dim maxDate
maxDate = DMax("購入日","T_案件","商品NO=" & Me!txt商品NO)
If Me.Parent!最新購入日 = maxDate Then
Else
Me.Parent!最新購入日 = maxDate
End If
End Sub
Private Sub Form_Timer()
Me.Recalc
Me.Me.最新購入日.Requery
Me.TimerInterval = 0 'タイマー停止
If Me.Parent!最新購入日 = Me.最新購入日 Then
Else
Me.Parent!最新購入日 = Me.最新購入日
End If
End Sub
Private Sub Form_AfterUpdate()
MsgBox "コードが実行されました"
If Me.Parent!最新購入日 = Me.最新購入日 Then
msgbox Me.Parent!最新購入日 &"と" & Me.最新購入日
Else
Me.Parent!最新購入日 = Me.最新購入日
End If
End Sub
少し落ち着いて頭が整理できてきました。上書きするときは更新クエリを使えば良いですよね。ちょっと考え直してみます。
下記のサンプルような感じのフォームではどうでしょうか。
月単位でデータ入力する場合の日付入力の効率的なUIを考える - hatena chips
年と月を別のコンボボックスにするのは必ずしも使いやすいとか限らないかも。
別のコンボボックスにしたとしても、年月でフィルターをかける、既定値を設定する、などの部分は参考になると思います。
間違いました…すみません。テーブルのフィールド名はそれぞれのプレフィックスを外した名前になります。
「完了日」は日付/時刻型です。
テーブルの名づけが良くないのですが、月毎にあるわけではありません。
月毎のTODOで、例えば完了日は終わったことを自覚するために入力するためのもので
次の月になったら上書きしていく予定です。
色々説明不足でお手数をおかけします。
これはテーブルのフィールド名で間違いないですか。フォーム上のコントロール名のような感じですが。
あと「txt完了日」フィールドのデータ型は日付/時刻型ですか。
名前からテーブルが月ごとにあるような感じの名前ですが、そういうわけではないですよね。
以上、ご回答お願いします。
失礼いたしました。
月TODOテーブル
「ID」(主キー)
フィールドは「txtタイトル」「txt担当者」「txtメールテンプレID」「txt完了日」になります。
また「btnメール作成」も設置予定です。
ちなみに主キーについてですが、オートナンバーにすると希望の順番に並ばないので現在は手動でIDを設定しているのですが、今後、慣れないユーザーに使わせる際には意図が伝わらないかと思っています…ID発行について良いアイデアはありませんでしょうか。
とりあえず、現状のテーブル設計を提示してください。
テーブル名、フィールド名、主キー設定
追記
次月にTODOを持ち越した際、別のTODOが追い越す可能性はないため、年月を変更する際はリセット(リセットボタンを押す)してから変更する予定です。
やったことはないですか、下記に方法が紹介されてます。
■T'sWare Access Tips #112 ~エクスプローラ風のファイルコピー~
hatena様
本当にありがとうございました。
感謝いたします。
前のクエリでグループだけ表示させるようにして、DISTINCTで重複を排除します。
(デザインビューでは「固有の値」を「はい」に設定する)
このクエリ(Q_成績)と元の MT_成績 をグループで結合したクエリを作成します。
サブクエリで一つにまとめるなら、下記になります。
失礼しました。
以後、気をつけます。
何卒宜しくお願い致します。
画像はリンクではなくアップロードして直接表表示させることかできますので、それをご利用ください。
hatena様
図々しいですが、もう一点、ご教示をお願いします。
https://gyazo.com/1faca64f1d679d0793248befd1696ae8
1位、2位は表示できました。
https://gyazo.com/574acf763874b19bbdf18ce5faf397ec
条件を満たしたグループ全部を表示させたい場合はどのようにするのでしょうか?
教えていただいたコードを自分なりに改良したのですが、クエリが何も表示されなくなります。
本当にお手数かと思いますが、ご教示をお願いします。
できました。
いつも正確な回答ありがとうございます。
本当に感謝します。
ありがとうございました。
同一グループ内で順位1、2が同一都道府県のレコードを抽出したいということですよね。
いいかえると、
同一グループかつ同一都道府県のレコード同士を比較して片方が1位もう一方が2位、または片方が2位もう一方が1位のレコードを抽出すればいいということです。
この条件ならサブクエリを使う必要はないです。
「同一グループかつ同一都道府県のレコード同士を比較」の部分はグルーブと都道府県で自己結合すればOKです。
おっしゃるとおり、フォームを開く段階で抽出条件が設定されており、
外したところうまく行きました。
勉強になりました。ありがとうございます。
「F商品」のレコードソースには何を設定していますか?
クエリの場合はそのSQL文をコピペしてください
回答自体には(今のところ)変わりありません
用途の異なるフォームで抽出しようとしているようなので元データから抽出条件が設定されているか、別な抽出処理で上書きされているんじゃないかと思います
その後、絞り込みが反映されず通常のF商品が開かれるようになりました。
作ってみたのですが、入荷テーブルの内、1件しか表示できませんでした。
ちなみにどういう時に使っているかというと、入荷テーブルに入荷した商品データをインポートするボタンがあり、ボタンを押すとインポートするのですが、同時に今インポートしたデータを商品フォームで開きたいです。
コピペしてみたのですが、うまくいきませんでした。私の設定にミスがあるのかもしれません…色々ご検討いただきありがとうございます。
こちらに変更した後、数回テストしたところ、うまく動いてくれています。ありがとうございます!
あんまり聞かない要件ですね
多分こんな感じで動くと思います。が、もう少し前後関係があると違う回答が出るかもしれません(あんまり聞かない要件なので)
込み入った処理が必要になってしまうなら「最新購入日」の取得方法を変えてしまったほうがいいような気がします
DMax()の引数は適切なものに置き換えてください
Me.Recalc
Me.Me.最新購入日.Requery
のどちらか、あるいは両方を挿入した場合はどうなりますか。
ありがとうございます。3000まであげたのですが、やはり動作がうまくいったりいかなかったりします。
もっとあげるべきなのでしょうか。
確かに更新する瞬間、「最新購入日」のテキストボックス内容(2020/10/14)が両方とも一瞬消えるのが気になっていました。
現在でも消えていますが、そのことと関係しますか?
おそらく発生するタイミングの問題かなという気がします。
サブフォームのレコードが更新される。
更新後イベントが発生する→VBAで親フォームに最新購入日を代入。
その時点では =Max([購入日]) の計算が終わっていない。
メインフォームに転記するイベントを別のものにしてみる。
例えば、サブフォームコントロールのフォーカス喪失後で転記する。
これだとサブフォームで更新した後、メインフォームへ移動したときに転記されることになります。
他には、サブフォームのタイマー時イベントを利用するというのも考えられます。
タイマー間隔を0に設定しておいて、タイマー時のイベントプロシージャに転記のコードを記述する。
更新後処理のイベントプロシージャは下記のように記述。
いちおう100ミリ秒後に転記するようにしてますが、うまくいかないようなら秒数を増やしてください。
こうなってから、サブフォームの他のコンボボックスを更新してメインフォームを閉じる(閉じる際にレコードを保存)と、テーブルのデータも2020/10/14になります。
お伝えしたようにうまく更新される時もあったり、
できないときもあり、なぜかテーブルのフィールドが「0:00:00」になってしまった
データについて、確認した内容をお伝えさせていただきます。
としたところ、「0:00:00と」と表示されます。
サブフォームのフォームヘッダーかフッターにテキストボックスを配置して下記のように設定しています
名前 最新購入日
コントロールソース =Max([購入日])
※テキストボックスには2020/10/14と表示されている。
メインフォームの最新購入日を表示するテキストボックスは、下記のように設定しています。
名前 txt最新購入日
コントロールソース =[サブフォームコントロール名].Form![最新購入日]
※テキストボックスには2020/10/14と表示されている。
メインフォームのレコードソースのテーブル(商品テーブル)に「最新購入日」フィールドがあります。
※0:00:00と表示されている。
謎です…😯
こちらの問題ですが、「保存する」では解決できなさそうでした。
レコードを保存すればよかったのですね。色々とその他の検討事項も今後参考にさせていただきます。ありがとうございました。
大変参考になりました。レコードを保存すればよかったのですね。ありがとうございました。
もう1つの質問でご回答いただいている、「保存する」をじっくり確認して、試みてみます。
(※⑤⑥の更新結果は、コントロールソース(テーブル)への反映の件です)
何度も何度も実験していたら、常に上の動きではありませんでした。
そして時々「1899/12/30」になります。理解ができず…何度もすみません。
こちらの件について、「MsgBox "コードが実行されました"」を試してみました。
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤「1回前の」更新結果が反映される
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③サブフォームの別のテキストボックスなどを更新
④フォームを閉じる
⑤「コードが実行されました」とメッセージボックスが表示される
⑥「今回の」更新結果が反映される
こちらの件について、「MsgBox "コードが実行されました"」を試してみました。
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤一つ前の更新結果が反映される
こちらですが、購入日を更新すると、なぜかコントロールソースの最新購入日が「00:00:00」?に変換されて表記が「1899/12/30」になってしまいます。
コントロールソースではなくて関数でひっぱっている部分は正しい最新購入日になっています。
サブフォームの違う項目を更新すると、正しい表記に更新されます・・・
hirotonさんの回答とかぶる部分はあると思いますが、ちょっと解説を。
フォーム上のテキストボックスやコンボボックスでデータを更新してもそれはフォーム上だけでテーブルには反映されません。レコード更新のアクションを起こしたときにはじめてテーブルに更新が反映されます。
レコード更新のアクションは、レコード移動する直前、レコードセレクターをクリックしたとき、Shift+Enter押下、、、他にもいろいろあります。
レコード更新される前に、他のフォームのRefreshをしても当然反映されません。
もし、コンボボックスを更新した直後に他のフォームにその更新を反映させたいなら、
コンボボックスの更新後処理でレコード更新した後、他のフォームのRefresh(あるいはRequery)を実行するという処理を記述することになります。
ただ、これをすると更新するたびにレコード保存されてしまうので、入力ミスをした場合、アンドゥーが効かなくなるなどの弊害があるのでよくよく検討する必要があります。(他のコントロールは更新不可にしてありコンボボックスのみ更新するフォームなら問題ないですが。)
下記で紹介しているような「保存」ボタンを作成しておいて、そのなかで他フォームをRefreshするという方法も考えられます。
レコード入力時に「保存」コマンドボタンでのみレコード保存できるようにする - hatena chips
コードを次のようにした場合、データが反映されてほしいタイミングでメッセージは表示されますか?
フォームとテキストボックスの更新系イベントの違い(T'sWareさん)
ならば、基本的にはそれぞれのコンボボックス全てで個別にイベントを設定する必要があります
次の例に該当していないですか?
[データの競合]メッセージが表示される(初心者のためのOffice講座さん)
すみません…未だ、更新問題が解決しておらず、質問です。
どうすればうまく更新できるようになりますでしょうか…
色々な点で大事なポイントになりそうなので、教えていただけると助かります。
「F契約管理リスト」(帳票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約管理リスト」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。
「契約詳細」(単票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約詳細」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。
このとき、いずれかのコンボボックスで状況を変更したとき、反映したい。
■やってみたこと
「F契約管理リスト」のモジュールにて下記を記載。
「F契約管理リスト」の契約状況を変更。
■結果
⇒「F契約詳細」は更新されない。(その後色々触っていると更新される)
また、時々「データ変更の競合」エラーが出る。
混乱して要らぬ情報まで書き込んでいました。申し訳ありません。