Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,561 から 4,600 までを表示しています。
1
ニンジャ 2020/10/20 (火) 20:04:04 f1ed8@2b9f5

少し落ち着いて頭が整理できてきました。上書きするときは更新クエリを使えば良いですよね。ちょっと考え直してみます。

6

下記のサンプルような感じのフォームではどうでしょうか。

月単位でデータ入力する場合の日付入力の効率的なUIを考える - hatena chips

年と月を別のコンボボックスにするのは必ずしも使いやすいとか限らないかも。

別のコンボボックスにしたとしても、年月でフィルターをかける、既定値を設定する、などの部分は参考になると思います。

5
ふせん 2020/10/20 (火) 15:51:41 0029a@1c915 >> 4

間違いました…すみません。テーブルのフィールド名はそれぞれのプレフィックスを外した名前になります。

「完了日」は日付/時刻型です。

テーブルの名づけが良くないのですが、月毎にあるわけではありません。
月毎のTODOで、例えば完了日は終わったことを自覚するために入力するためのもので
次の月になったら上書きしていく予定です。

色々説明不足でお手数をおかけします。

4

フィールドは「txtタイトル」「txt担当者」「txtメールテンプレID」「txt完了日」になります。

これはテーブルのフィールド名で間違いないですか。フォーム上のコントロール名のような感じですが。
あと「txt完了日」フィールドのデータ型は日付/時刻型ですか。

月TODOテーブル

名前からテーブルが月ごとにあるような感じの名前ですが、そういうわけではないですよね。

以上、ご回答お願いします。

3
ふせん 2020/10/20 (火) 15:36:06 0029a@1c915

失礼いたしました。
月TODOテーブル
「ID」(主キー)
フィールドは「txtタイトル」「txt担当者」「txtメールテンプレID」「txt完了日」になります。
また「btnメール作成」も設置予定です。

ちなみに主キーについてですが、オートナンバーにすると希望の順番に並ばないので現在は手動でIDを設定しているのですが、今後、慣れないユーザーに使わせる際には意図が伝わらないかと思っています…ID発行について良いアイデアはありませんでしょうか。

2

とりあえず、現状のテーブル設計を提示してください。

テーブル名、フィールド名、主キー設定

1
ふせん 2020/10/20 (火) 14:22:07 0029a@1c915

追記
次月にTODOを持ち越した際、別のTODOが追い越す可能性はないため、年月を変更する際はリセット(リセットボタンを押す)してから変更する予定です。

7
hideki 2020/10/19 (月) 22:37:43 09c37@96514

hatena様

本当にありがとうございました。
感謝いたします。

6

前のクエリでグループだけ表示させるようにして、DISTINCTで重複を排除します。
(デザインビューでは「固有の値」を「はい」に設定する)

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.グループ;
5
hideki 2020/10/19 (月) 21:25:20 09c37@96514

画像1

失礼しました。
以後、気をつけます。

何卒宜しくお願い致します。

4

画像はリンクではなくアップロードして直接表表示させることかできますので、それをご利用ください。
画像1

3
hideki 2020/10/19 (月) 18:18:15 09c37@96514

hatena様

図々しいですが、もう一点、ご教示をお願いします。

https://gyazo.com/1faca64f1d679d0793248befd1696ae8

1位、2位は表示できました。

https://gyazo.com/574acf763874b19bbdf18ce5faf397ec

条件を満たしたグループ全部を表示させたい場合はどのようにするのでしょうか?
教えていただいたコードを自分なりに改良したのですが、クエリが何も表示されなくなります。
本当にお手数かと思いますが、ご教示をお願いします。

2
hideki 2020/10/19 (月) 18:10:45 09c37@96514

できました。
いつも正確な回答ありがとうございます。
本当に感謝します。
ありがとうございました。

1
hatena 2020/10/19 (月) 15:00:06 修正

同一グループ内で順位1、2が同一都道府県のレコードを抽出したいということですよね。

いいかえると、
同一グループかつ同一都道府県のレコード同士を比較して片方が1位もう一方が2位、または片方が2位もう一方が1位のレコードを抽出すればいいということです。
この条件ならサブクエリを使う必要はないです。

「同一グループかつ同一都道府県のレコード同士を比較」の部分はグルーブと都道府県で自己結合すればOKです。

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.順位;
5
ふせん 2020/10/16 (金) 11:04:38 0029a@1c915 >> 4

おっしゃるとおり、フォームを開く段階で抽出条件が設定されており、
外したところうまく行きました。
勉強になりました。ありがとうございます。

4
hiroton 2020/10/16 (金) 08:53:15 修正 5cc13@f966d

「F商品」のレコードソースには何を設定していますか?
クエリの場合はそのSQL文をコピペしてください

回答自体には(今のところ)変わりありません
用途の異なるフォームで抽出しようとしているようなので元データから抽出条件が設定されているか、別な抽出処理で上書きされているんじゃないかと思います

3
ふせん 2020/10/15 (木) 23:28:30 0029a@1c915 >> 2

その後、絞り込みが反映されず通常のF商品が開かれるようになりました。

2
ふせん 2020/10/15 (木) 23:10:57 0029a@1c915

作ってみたのですが、入荷テーブルの内、1件しか表示できませんでした。
ちなみにどういう時に使っているかというと、入荷テーブルに入荷した商品データをインポートするボタンがあり、ボタンを押すとインポートするのですが、同時に今インポートしたデータを商品フォームで開きたいです。

16
どんぐり 2020/10/15 (木) 21:22:12 0029a@1c915 >> 13

コピペしてみたのですが、うまくいきませんでした。私の設定にミスがあるのかもしれません…色々ご検討いただきありがとうございます。

15
どんぐり 2020/10/15 (木) 21:20:16 0029a@1c915 >> 14

こちらに変更した後、数回テストしたところ、うまく動いてくれています。ありがとうございます!

1
hiroton 2020/10/15 (木) 14:57:11 df752@f966d

あんまり聞かない要件ですね

DoCmd.OpenForm "F商品", , , "商品NO In (SELECT 商品NO FROM T_入荷)"

多分こんな感じで動くと思います。が、もう少し前後関係があると違う回答が出るかもしれません(あんまり聞かない要件なので)

14
hiroton 2020/10/15 (木) 11:39:54 df752@f966d

込み入った処理が必要になってしまうなら「最新購入日」の取得方法を変えてしまったほうがいいような気がします

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

DMax()の引数は適切なものに置き換えてください

13

Me.Recalc
Me.Me.最新購入日.Requery
のどちらか、あるいは両方を挿入した場合はどうなりますか。

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
12
どんぐり 2020/10/15 (木) 10:47:53 0029a@1c915 >> 11

ありがとうございます。3000まであげたのですが、やはり動作がうまくいったりいかなかったりします。
もっとあげるべきなのでしょうか。

確かに更新する瞬間、「最新購入日」のテキストボックス内容(2020/10/14)が両方とも一瞬消えるのが気になっていました。
現在でも消えていますが、そのことと関係しますか?

11

おそらく発生するタイミングの問題かなという気がします。

サブフォームのレコードが更新される。
更新後イベントが発生する→VBAで親フォームに最新購入日を代入。
その時点では =Max([購入日]) の計算が終わっていない。

メインフォームに転記するイベントを別のものにしてみる。

例えば、サブフォームコントロールのフォーカス喪失後で転記する。
これだとサブフォームで更新した後、メインフォームへ移動したときに転記されることになります。

他には、サブフォームのタイマー時イベントを利用するというのも考えられます。

タイマー間隔を0に設定しておいて、タイマー時のイベントプロシージャに転記のコードを記述する。

Private Sub Form_Timer()
    Me.TimerInterval = 0 'タイマー停止
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub

更新後処理のイベントプロシージャは下記のように記述。

Private Sub Form_AfterUpdate()
    Me.TimerInterval = 100 '100ミリ秒後にタイマー時イベント発火    
End Sub

いちおう100ミリ秒後に転記するようにしてますが、うまくいかないようなら秒数を増やしてください。

10
どんぐり 2020/10/15 (木) 00:14:52 f1ed8@60098

こうなってから、サブフォームの他のコンボボックスを更新してメインフォームを閉じる(閉じる際にレコードを保存)と、テーブルのデータも2020/10/14になります。

9
どんぐり 2020/10/14 (水) 23:12:25 0029a@1c915 >> 8

お伝えしたようにうまく更新される時もあったり、
できないときもあり、なぜかテーブルのフィールドが「0:00:00」になってしまった
データについて、確認した内容をお伝えさせていただきます。

Private Sub Form_AfterUpdate()
    MsgBox "コードが実行されました"
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    msgbox Me.Parent!最新購入日 &"と" & Me.最新購入日
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub

としたところ、「0:00:00と」と表示されます。


サブフォームのフォームヘッダーかフッターにテキストボックスを配置して下記のように設定しています

名前 最新購入日
コントロールソース =Max([購入日])

※テキストボックスには2020/10/14と表示されている。

メインフォームの最新購入日を表示するテキストボックスは、下記のように設定しています。

名前 txt最新購入日
コントロールソース =[サブフォームコントロール名].Form![最新購入日]

※テキストボックスには2020/10/14と表示されている。

メインフォームのレコードソースのテーブル(商品テーブル)に「最新購入日」フィールドがあります。

※0:00:00と表示されている。

謎です…😯

8
どんぐり 2020/10/14 (水) 22:50:24 0029a@1c915

こちらの問題ですが、「保存する」では解決できなさそうでした。

9
どんぐり 2020/10/14 (水) 22:49:14 0029a@1c915 >> 7

レコードを保存すればよかったのですね。色々とその他の検討事項も今後参考にさせていただきます。ありがとうございました。

8
どんぐり 2020/10/14 (水) 22:48:19 0029a@1c915 >> 6

大変参考になりました。レコードを保存すればよかったのですね。ありがとうございました。

7
どんぐり 2020/10/14 (水) 21:46:49 0029a@1c915 >> 6

もう1つの質問でご回答いただいている、「保存する」をじっくり確認して、試みてみます。

6
どんぐり 2020/10/14 (水) 18:17:41 0029a@1c915 >> 5

(※⑤⑥の更新結果は、コントロールソース(テーブル)への反映の件です)
何度も何度も実験していたら、常に上の動きではありませんでした。
そして時々「1899/12/30」になります。理解ができず…何度もすみません。

5
どんぐり 2020/10/14 (水) 17:13:32 0029a@1c915

こちらの件について、「MsgBox "コードが実行されました"」を試してみました。

Private Sub Form_AfterUpdate()
    MsgBox "コードが実行されました"
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub

①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤「1回前の」更新結果が反映される

①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③サブフォームの別のテキストボックスなどを更新
④フォームを閉じる
⑤「コードが実行されました」とメッセージボックスが表示される
⑥「今回の」更新結果が反映される

4
どんぐり 2020/10/14 (水) 17:00:20 0029a@1c915

こちらの件について、「MsgBox "コードが実行されました"」を試してみました。

①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤一つ前の更新結果が反映される

3
どんぐり 2020/10/14 (水) 15:56:16 0029a@1c915

こちらですが、購入日を更新すると、なぜかコントロールソースの最新購入日が「00:00:00」?に変換されて表記が「1899/12/30」になってしまいます。
コントロールソースではなくて関数でひっぱっている部分は正しい最新購入日になっています。

サブフォームの違う項目を更新すると、正しい表記に更新されます・・・

7

hirotonさんの回答とかぶる部分はあると思いますが、ちょっと解説を。

フォーム上のテキストボックスやコンボボックスでデータを更新してもそれはフォーム上だけでテーブルには反映されません。レコード更新のアクションを起こしたときにはじめてテーブルに更新が反映されます。
レコード更新のアクションは、レコード移動する直前、レコードセレクターをクリックしたとき、Shift+Enter押下、、、他にもいろいろあります。

レコード更新される前に、他のフォームのRefreshをしても当然反映されません。
もし、コンボボックスを更新した直後に他のフォームにその更新を反映させたいなら、
コンボボックスの更新後処理でレコード更新した後、他のフォームのRefresh(あるいはRequery)を実行するという処理を記述することになります。

ただ、これをすると更新するたびにレコード保存されてしまうので、入力ミスをした場合、アンドゥーが効かなくなるなどの弊害があるのでよくよく検討する必要があります。(他のコントロールは更新不可にしてありコンボボックスのみ更新するフォームなら問題ないですが。)

下記で紹介しているような「保存」ボタンを作成しておいて、そのなかで他フォームをRefreshするという方法も考えられます。

レコード入力時に「保存」コマンドボタンでのみレコード保存できるようにする - hatena chips

6
hiroton 2020/10/14 (水) 09:48:47 d400d@f966d

⇒「F契約詳細」は更新されない。(その後色々触っていると更新される)

コードを次のようにした場合、データが反映されてほしいタイミングでメッセージは表示されますか?

Private Sub Form_AfterUpdate()
    Forms!F契約詳細.Refresh
    MsgBox "コードが実行されました"
End Sub

フォームとテキストボックスの更新系イベントの違い(T'sWareさん)

いずれかのコンボボックスで状況を変更したとき

ならば、基本的にはそれぞれのコンボボックス全てで個別にイベントを設定する必要があります

また、時々「データ変更の競合」エラーが出る。

次の例に該当していないですか?
[データの競合]メッセージが表示される(初心者のためのOffice講座さん)

5
どんぐり 2020/10/13 (火) 16:51:54 0029a@1c915

すみません…未だ、更新問題が解決しておらず、質問です。
どうすればうまく更新できるようになりますでしょうか…
色々な点で大事なポイントになりそうなので、教えていただけると助かります。

「F契約管理リスト」(帳票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約管理リスト」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。

「契約詳細」(単票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約詳細」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。

このとき、いずれかのコンボボックスで状況を変更したとき、反映したい。

■やってみたこと

「F契約管理リスト」のモジュールにて下記を記載。

Private Sub Form_AfterUpdate()
    Forms!F契約詳細.Refresh
End Sub

「F契約管理リスト」の契約状況を変更。

■結果
⇒「F契約詳細」は更新されない。(その後色々触っていると更新される)
 また、時々「データ変更の競合」エラーが出る。

7
どんぐり 2020/10/12 (月) 20:12:04 1d451@60098 >> 4

混乱して要らぬ情報まで書き込んでいました。申し訳ありません。