Microsoft Access 掲示板

6,622 件中 4,921 から 4,960 までを表示しています。
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

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

6
どんぐり 2020/10/12 (月) 17:49:24 f1ed8@f8526 >> 5

なるほど!解決しそうです!
混乱して要らぬ情報まで書いていたようです。
ありがとうございました!

5
hiroton 2020/10/12 (月) 16:35:20 9d757@f966d

基本的には「契約満期日」順に並べたいが、「契約中」でないものは下に回したくない、という状況です。

考え方自体は「[契約状況]<>"契約中"」という並べ替え用の式(フィールド)を作って「最新契約満期日」よりも前に指定してあげればいいです

並べ替えの設定はフォームの並べ替えプロパティでやっているのかな?
ならばそのまま次の形で

[契約状況]<>"契約中", 最新契約満期日
4

契約リストフォームは帳票です。

帳票フォームの詳細セクションにサブフォームは配置できないはずですが。
言葉での説明が難しいなら、現状のフォームのスクリーンショットを提示できませんか。

あと、「契約フォーム」の並び順についてで、クエリで並び順を設定しているなら、そのフォームのレコードソースのクエリのSQL文を提示してください。

3
どんぐり 2020/10/12 (月) 15:58:51 0029a@1c915 >> 2

>「契約リストフォーム」の中で「契約フォーム」のレコードが並んでおり

契約リストフォームは帳票です。

2
どんぐり 2020/10/12 (月) 14:57:36 0029a@1c915

わかりづらくてごめんなさい。
「契約リストフォーム」の中で「契約フォーム」のレコードが並んでおり
「契約フォーム」の中に「サブ契約フォーム」が並んでいます。
今回悩んでいるのは「契約リストフォーム」の中の「契約フォーム」の並び順です。
現状の並び替えは「最新契約満期日」のみとしており、特にSQLは利用していません。

1

「契約リストフォーム」というのは、契約フォームの中のサブフォームということですか。

そのサブフォームのレコードを並び替えたいということですか。

現状、並べ替えはレコードソースのクエリに設定していますか。
もし、そうなら、そのクエリをSQLビューにして表示されるSQL文をコピーして貼り付けてもらえますか。

2
どんぐり 2020/10/09 (金) 14:08:08 0029a@1c915 >> 1

うまくいきました。ありがとうございます。

8
ニンジャ 2020/10/09 (金) 14:01:47 0029a@1c915

やはりそこでしたか…助かりました。ありがとうございました。

7
hiroton 2020/10/09 (金) 13:49:18 414c4@f966d

とりあえず

区分NO(短いテキスト)で検索したい。

ならSQLでも文字列が指定されている必要があります

区分NO = " & Me.txt区分NO & ")"

区分NO = '" & Me.txt区分NO & "')"

6
ニンジャ 2020/10/09 (金) 13:28:49 0029a@1c915 >> 5

ちなみに「btn物件」を配置しているフォームは、また全然別のフォームです。

5
ニンジャ 2020/10/09 (金) 13:26:16 0029a@1c915 >> 4

すみません、間違って投稿してしまいました…
下記のコードを作りましたがうまく作動しません。

Private Sub btn物件_Click()
    If Not IsNull([txt物件ID]) Then
    DoCmd.OpenForm "F_物件管理", acNormal, "", "物件管理ID In (SELECT 物件管理ID FROM Q_サブ物件 WHERE 区分NO = " & Me.txt区分NO & ")", , acDialog
    Else
    DoCmd.OpenForm "F_物件管理", acNormal, , , acFormAdd
    End If

メインフォームのレコードソースのテーブル名(orクエリ名)Q_物件管理
それの主キーと主なフィールド名、 物件管理ID(主キー)、オーナー情報など
サブフォームのレコードソースのテーブル名(prクエリ名) Q_サブ物件
それの主キーと主なフィールド名 物件ID(主キー)、区分NO、住所など
また、サブフォームコントロールのリンク親フィールド、リンク子フィールドの設定 物件管理ID
区分NO(短いテキスト)で検索したい。

何が間違っているのか、教えていただけると助かります。

4
ニンジャ 2020/10/09 (金) 13:11:03 0029a@1c915

少し前の質問になりますが、うまくいかないため改めて質問です。

13

ちなみにもう1か所Mtxtboxのままになっている部分があるようです

あっ(汗)、修正しておきました。

12
シソンヌ 2020/10/09 (金) 10:59:31 0029a@1c915 >> 10

うまくいきました。(ちなみにもう1か所Mtxtboxのままになっている部分があるようです)
大変勉強になりました。応用して、他でも色々作れそうです。ありがとうございました。

11

=[=Titlepath]([名前],"名前")

Titlepath は Titleph に修正済みとして、その前の全角の を半角の = に変更してください。
(前の私の回答も全角になってましたので修正しておきました。)

=Titleph([名前],"名前")

10

色々試してみたこととしては、「Mtxtboxをtxtboxに変える」

タイプミスでした。txtboxが正しいです。回答も修正ておきます。

テキストボックスのコントロールソースの設定は下記です。
[名前]の[]内はテキストボックスの名前、"名前"の部分はうっすらと表示させたいテキストです。

=Titleph([名前],"名前")
9
シソンヌ 2020/10/09 (金) 10:12:16 0029a@1c915 >> 7

コントロールソースが間違って「Titlepath」になっていたことに気づきました…「Titleph」に変更したところ、エラーが「#Type!」になりました。度々すみません。

8
シソンヌ 2020/10/09 (金) 09:58:49 0029a@1c915 >> 7

失礼しました。コントロールソースの自動変換後は下記になります。

=[=Titlepath]([名前],"名前")
7
シソンヌ 2020/10/09 (金) 09:57:48 0029a@1c915 >> 6

早速ありがとうございました。
上記VBAをコピーして、コントロールソースは「名前」の部分だけ変えて実装してみましたが
「#Name?」と表示されます。
色々試してみたこととしては、「Mtxtboxをtxtboxに変える」(宣言での変数と文中での変数が異なっていていいのかわからず??)「標準モジュールにおいたり、該当のフォームのモジュールにおいたり」です。
ちなみに、コントロールソースは自動で下記のように[]がついておりました。
==Titlepath

何か勘違いしておりますでしょうか?

6
hatena 2020/10/09 (金) 09:30:20 修正

汎用関数は、

Public Function Titleph(txtbox As control, placeHolder As String)

    If txtbox.Value <> "" Then
       Titleph = txtbox.Value
    Else
       Titleph = placeHolder 
    End If
    
End Function

テキストボックスのコントロールソースに、下記のように設定することになります。

=Titleph([名前],"名前")

5
シソンヌ 2020/10/09 (金) 08:35:39 0029a@1c915 >> 4

ちなみに下記のような形ではうまく行きませんでした
初心者で恐れ入ります。

Public Function Titleph(phTitle)

    If Me.phTitle <> "" Then
    phTitle
    End If
    
End Function