Microsoft Access 掲示板

views
4 フォロー
5,901 件中 441 から 480 までを表示しています。
5
勉強中の男 2024/02/02 (金) 09:36:40 ddfe5@72804

色々ありがとうございます。大変参考になりました。シンプルにサブフォームのコンボボックスに”Me!コンボ.Requery”でしまして上手くいきました。
参考にまで教えて欲しいのですが、この場合のフォーカスイベントは取得時の方がいいのでしょうか?取得後でも同じでしょうか? これの使い分けがよく分かってないもので。

18

現時点ではレコード数も20件と少ないので、skさんからご提示して頂いたSQL文は使わず、
一個一個#を削除して、「#[特記詳細事項]#」のようなあるべき姿にしたところです。

そのように修正済みで、[特記詳細事項]の部分がURLということで、テキストボックスが「ハイパーリンクあり」かつ「ハイパーリンクである場合」の設定なら、

"特記事項詳細 = '#" & Replace(Me("txt_詳細リンク" & R).Value, """", "") & "#' "

の部分を

"特記事項詳細 = '" & Me("txt_詳細リンク" & R).Value & "'"

でよさそうです。
あるいは、HyperlinkPart関数でアドレス部分のみ取り出して、

"特記事項詳細 = '#" & HyperlinkPart(Me("txt_詳細リンク" & R).Value, acAddress) & "#' "
17
wazawaza 2024/02/02 (金) 04:09:17

見当違いのコードを送ってしまい、
申し訳ありません。
該当コードは後ほどお送りします。

冒頭3でも書き込みましたが、
連結フォームで作って運用中のものを、
VBAの勉強を目的として取り組んでいる次第です。
その為、非連結となっております。

16

提示いただいたコードは、「T_機械設定」テーブルのデータを読み込んでいます。
質問のコードは、「T_特記事項」「T_クレーム履歴」への書き込みです。
「T_特記事項」「T_クレーム履歴」からの読み込みの部分のコードを提示してもらえますか。

あと、連結フォームでなく非連結フォームで読み込み、書き込みしている理由はなんでしょうか。

15
wazawaza 2024/02/01 (木) 18:21:30

hatenaさん、ありがとうございます!

この「レコードを読み込ませる」とは具体的にどのように読み込ませているのでしょうか。
「非連結」なので、何かしないと何も表示されません。

「btn_読込」に、下記のようなクリック時のイベント(一部抜粋)を設けて、格納させています。

Private Sub btn_読込_Click()
  Call loadForm  '読込を呼び出し
End Sub

Private Sub loadForm()
  If IsNull(Me.txt_口座番号.Value) Then Exit Sub  '「txt_口座番号」が空なら中止
  
  Call initializeForm
   
  On Error GoTo ErrorHandler

  Dim daoDb As DAO.Database
  Set daoDb = CurrentDb  '接続
  Dim daoRs As DAO.Recordset
  Dim strSQL As String

  strSQL = _
    "SELECT 品名, 厚さ, 幅, 長さ, 巻取側の張力, 巻取側のテーパー, 巻戻側の張力, 巻戻側のテーパー, " & _
            " 巻取方向, 巻戻方向, ニップの使用可否, ニップ圧, 巻取速度, サンプル採取, 巻取側の巻芯種別, " & _
            " 巻取側の巻芯内径, 巻取側の巻芯厚さ, 巻取側の巻芯幅, タッチロールの材質, タッチロールの寸法, EPC検出位置切替 " & _
    "FROM T_機械設定 " & _
    "WHERE 口座番号 = '" & Me.txt_口座番号.Value & "';"
    
  Set daoRs = daoDb.OpenRecordset(strSQL)
  
  If daoRs.BOF = True And daoRs.EOF = True Then                 '該当レコードが無かったら
    MsgBox "対象レコードがありません。", vbInformation, "確認"  'メッセージを出力
    GoTo Finally  '接続解除へジャンプ(親レコードが無ければ子レコードが読込できないため)
  End If
  
  Me.txt_品名.Value = daoRs!品名
  Me.txt_厚さ.Value = daoRs!厚さ
  Me.txt_幅.Value = daoRs!幅
  Me.txt_長さ.Value = daoRs!長さ
  Me.txt_巻取張力.Value = daoRs!巻取側の張力
  Me.txt_巻取テーパー.Value = daoRs!巻取側のテーパー
  Me.txt_巻戻張力.Value = daoRs!巻戻側の張力
  Me.txt_巻戻テーパー.Value = daoRs!巻戻側のテーパー
  Me.cmb_巻取方向.Value = daoRs!巻取方向
  Me.cmb_巻戻方向.Value = daoRs!巻戻方向
  Me.cmb_ニップ可否.Value = daoRs!ニップの使用可否
  Me.txt_ニップ圧.Value = daoRs!ニップ圧
  Me.txt_巻取速度.Value = daoRs!巻取速度
  Me.cmb_試験サンプル.Value = daoRs!サンプル採取
  Me.cmb_種別.Value = daoRs!巻取側の巻芯種別
  Me.txt_巻芯内径.Value = daoRs!巻取側の巻芯内径
  Me.txt_巻芯厚さ.Value = daoRs!巻取側の巻芯厚さ
  Me.txt_巻芯幅.Value = daoRs!巻取側の巻芯幅
  Me.cmb_タッチロール材質.Value = daoRs!タッチロールの材質
  Me.txt_タッチロール寸法.Value = daoRs!タッチロールの寸法
  Me.cmb_検出位置.Value = daoRs!EPC検出位置切替
  
  daoRs.Close

「######・・・」というのは、例えば「######https://zawazawa.jp/ms-access/######」というような表示でしょうか。(URL部分は一例)

その通りです。
既存レコードには、更新回数分であろう#が前後に増えていて、
レコードの無いところには、同じく更新回数分であろう#で埋め尽くされていました。

現時点ではレコード数も20件と少ないので、skさんからご提示して頂いたSQL文は使わず、
一個一個#を削除して、「#[特記詳細事項]#」のようなあるべき姿にしたところです。

4
hiroton 2024/02/01 (木) 17:09:54 59551@f966d

悩ましいですねぇ

>> 2のhatenaさん提示の方法でいいと思いますが、個人的にはあまりSetFocusを使いたくないので別解も載せておきます

ACCESS VBA 別フォームのイベントを呼び出す方法(VBAコード公開)(たすけてACCESSさん)

(デフォルトで生成されるあれこれを弄るといろいろと混乱するので、publicなそれ用のプロシージャを作るというのが、「hirotonならこうする」ですかね)


要はこのRequeryをさせたい

の観点からなら

Froms!フォームAメイン.Form!サブフォーム.Form!コンボ.Requery

という方法もあります。が、プログラミング的な観点から同じ処理を別々な場所に記述するのは良くないので、今回の形なら「[tx文字]の更新後イベント」を発生させる方向が良いのでは、と思います


その他の方法として、「コンボボックスのリストが表示されるのはコンボボックスを使うとき」なので、コンボボックスのフォーカス取得時イベントでMe!コンボ.Requeryを行うなんて手法もあります

7
勉強中の男 2024/02/01 (木) 15:53:35 ddfe5@72804

ありがとうございました。その方法で出来ました。
こんな事が出来るとは知りませんでした、便利です。
お世話になりました。

3
勉強中の男 2024/02/01 (木) 14:59:51 ddfe5@72804

色々と説明不足してました(すみません)。フォームAのサブフォームにあるコンボボックスの値集合ソースに Like "" & [Forms]![フォームAメイン]![tx文字] & "" としており絞り込みさせています。
フォームBが開かない場合には[tx文字]の更新後イベントに [サブフォーム].Form![コンボ].Requeryとしています。
要はこのRequeryをさせたいのです(フォームBからVBコードでフォームAメインの[tx文字]に代入)。

2
hatena 2024/02/01 (木) 14:02:14 修正

フォーカスセットをしておくと更新するとネット情報で見たので下記にコード記述しております

正確には、フォーカスをセットしておいて、Textプロパティに代入すると、更新イベントが発生します。

 [Forms]![フォームAMain]![txボックス].SetFocus
 [Forms]![フォームAMain]![txボックス].Text = "所定文字列"
 DoCmd.Close acForm, "フォームB"

下記もご参考に。

値の代入で更新イベントを発生させる - hatena chips


ただし、hirotonさんも指摘されているように、コンボボックスのリストの絞り込みをどのようにしているかによります。
サブフォームが帳票フォームだったりするとさらに複雑な要因がでてきます。

上記の方法でうまくいけばいいですが、そうではない場合は、
絞り込みをどのようにしているのかと、コンボボックスは連結なのか、非連結なのか、サブフォームが帳票フォームなのか、、、などの情報が必要になります。

6

当方でサンプルを作成して確認してみましたが、症状は再現できませんでした。
パーションか環境に依存する症状だとするとこちらから原因を究明するのは難しいですね。

回避策としては、
条件付き書式を使わずに、VBAで背景色を変更するようにしてはどうでしょう。

コード例
詳細セクションのフォーマット時のイベントプロシージャに下記のように記述します。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If Me.区分.Value = "回収" Then
        Me.テキストボックス名.BackColor = vbYellow
    Else
        Me.テキストボックス名.BackColor = vbWhite
    End If
End Sub

上記は"回収"の場合、背景が黄色になります。

他の色を設定したい場合は、下記などを参考に。

Accessでコントロールの色を変える2つの方法|アズビーパートナーズ

1
hiroton 2024/02/01 (木) 13:56:37 59551@f966d

そもそも

コンボボックス絞り込みをメインの非連結テキストボックスに含まれている文字列をLikeで抽出させています。

を、具体的にどのように行っていますか?

コンボボックスはそのコントロールソースに従って表示内容が決定されますが、もう少し具体的には、コントロールソースの内容を読み込むタイミングで決定されます。

そのタイミングの一つは、もちろん、「フォームを開いたとき」です。このタイミングでは特に気にすることなく自動で行われます。逆に言えば、通常これで十分なので、その他のタイミングで更新したい場合は「コントロールソースの読み込み直し処理」を自前で組まなければなりません

なので、上記指摘が「できている」のであれば「同じようにやればいい」です


フォーカスセットをしておくと更新するとネット情報で見た

こんな仕様はhirotonは知らないですね
(今回組んだシステムは)フォーカスセットをしておくと更新する(ように作ったのでフォーカスをセットすればいい)とかなら作れるかもしれません。(よくあると思います)
ならば、重要なのは、フォーカスをセットする方法ではなく、その時にどのような処理が行われるか?の方です。そこに「コントロールソースの読み込み直し処理」があると思います

5
勉強中の男 2024/02/01 (木) 13:15:53 ddfe5@72804

プロパティを比べても相違はありませんでした。その後色々して分かった事があります。レポートに条件付き書式を設定すると、この現象になります。[区分]="回収"の時に塗りつぶし設定にしてます。レポート上のどのフィールドにその設定にすると#name?となります(ウィザードで作成した分も)。問題のあったレポートも条件付き書式を削除すると重複データ非表示になります。⇒条件付き書式と重複データ非表示を一緒に設定することは無理なのでしょうか?

14

取り急ぎ、テキストボックスは「非連結」であり「ハイパーリンクあり」かつ「ハイパーリンクである場合」です。

了解です。回答に必須にな情報でした。

試しに、このテキストボックスを「ハイパーリンクなし」に変換して、消えたレコードを読み込ませると
消えたレコードは「######・・・」と表示されました。

この「レコードを読み込ませる」とは具体的にどのように読み込ませているのでしょうか。
「非連結」なので、何かしないと何も表示されません。

『消えたレコードは「######・・・」と表示されました』ということは、UPDATE で前後に"#"を付加することを繰り返した結果でしょう(すでにskさんの回答で指摘されてます)。
誤った状態で保存されているのでまずはそれを修正する必要がありますね。

「######・・・」というのは、例えば「######https://zawazawa.jp/ms-access/######」というような表示でしょうか。(URL部分は一例)

とりあえずskさんの回答の12のSQLのクエリを作成して、それを開いてテーブルにどのような状態で格納されているか確認する必要があります。

すべたのレコードが「######https://zawazawa.jp/ms-access/######」というような状態(#の数はまちまちだがURLの前後に#)でしょうか。
それ以外の書式のものもありますか。あるなら、それを例示してください。

13
wazawaza 2024/01/31 (水) 20:05:27

遅くなりました。
私の説明不足によりお二方には色々と推測させてしまい誠に申し訳ないです!

取り急ぎ、テキストボックスは「非連結」であり「ハイパーリンクあり」かつ「ハイパーリンクである場合」です。
試しに、このテキストボックスを「ハイパーリンクなし」に変換して、消えたレコードを読み込ませると
消えたレコードは「######・・・」と表示されました。
この該当テーブルのハイパーリンク型のフィールドを覗くと、「######・・・」であろうレコードはブランクでした。

hatenaさんが提示された通りコードを修正してみましたが、結果は「######・・・」となりました。

よろしくお願いします!

12

コードをどのように修正するかはともかくとして、テーブル[T_特記事項]のフィールド[特記事項詳細]、およびテーブル[T_クレーム履歴]のフィールド[クレーム詳細]の値が、現時点においてどのように格納されているのかについても、併せて確認された方がよいでしょう。

既に誤った形式のハイパーリンクが格納されてしまっているでしょうから、それらを修正する必要があります。

SELECT [T_特記事項].[ID], 
       [T_特記事項].[特記事項詳細], 
       PlainText([T_特記事項].[特記事項詳細]) AS [特記事項詳細の内部処理上の値] 
FROM [T_特記事項] 
ORDER BY [T_特記事項].[ID];
SELECT [T_クレーム履歴].[ID], 
       [T_クレーム履歴].[クレーム詳細], 
       PlainText([T_クレーム履歴].[クレーム詳細]) AS [クレーム詳細の内部処理上の値] 
FROM [T_クレーム履歴] 
ORDER BY [T_クレーム履歴].[ID];
11
hatena 2024/01/31 (水) 16:08:24 修正 >> 6

INSERT INTO の方は見落としてました。

どちらにしても、連結なのか、非連結なのか、
非連結ならハイパーリンクの設定がどうなっているのか、
まずはそれを明確にしてもらうのが先決ですね。

10

1から10の連番の付加された10個のテキストボックスである、
SQLでは追加するテーブル側のフィールドは一つである、
ということからこのテキストボックスは非連結コントロールだろうと推測してます。

連結テキストボックスであれ非連結テキストボックスであれ、(ハイパーリンクの構文規則を無視して)無条件で「"#"で区切られた文字列」を更に"#"で囲んだ結果に更新する処理を繰り返し実行すれば、同様の結果がもたらされることは明白です。

もし非連結テキストボックスであるならば、恐らくそれらのテキストボックスの[ハイパーリンクあり]プロパティを「はい」、[ハイパーリンクとして表示]プロパティを「ハイパーリンクである場合」か「常にハイパーリンクにする」に設定されているだと思われますが、そのテキストボックスに"###https://zawazawa.jp/ms-access/###"のような文字列を代入すれば、画面表示上は「何も表示されていない」状態となるでしょう。

9

質問文より

サブフォームにある"T_特記事項"と"T_クレーム履歴"には、それぞれ10個のテキストボックスがあって、
そこにPC上の関連ファイルのパスを入力して、ハイパーリンク型フィールド"特記事項詳細"と"クレーム詳細"に
UPDATEをしたいのですが、

このテキストボックスがハイパーリンク型フィールドとの連結コントロールだとしたらskさんの通りですね。

私としては、
1から10の連番の付加された10個のテキストボックスである、
SQLでは追加するテーブル側のフィールドは一つである、
ということからこのテキストボックスは非連結コントロールだろうと推測してます。

「サブフォームにある"T_特記事項"と"T_クレーム履歴"には」という表現が連結フォームを連想させるのが紛らわしいですが。

8

また、[txt_詳細リンク]および[txt_クレーム詳細リンク]が連結テキストボックスではなく非連結テキストボックスであるならば、INSERT INTO ... VALUES ... 文の実行結果も適切ではない可能性があります。

"#"で区切られていない文字列をそのまま代入しているなら、ハイパーリンクの構文上においては「表示テキストのみが設定されている(ハイパーリンクアドレスが2番目ではなく1番目のセクションに入っている)」状態になっているはず。

4

#name? となるのは、重複データ非表示にしたテキストボックスですか。

ウィザードで作成した簡易なレポートの正常に表示されるテキストボックスと #name? となるテキストボックスのプロパティの設定で異なる部分はないですか。
異なる部分があったら、それを正常な方に合わせたらどうなりますか。

7
  • ハイパーリンク型の実体とは、「ハイパーリンク属性を付与されたメモ型(長いテキスト)」である。

  • ハイパーリンク型の内部処理上の値は、"#" をセクション区切り記号(囲み記号ではない)とした最大4つのセクションで構成された文字列である。

表示テキスト#ハイパーリンクアドレス#サブアドレス#ヒントテキスト

画像1

  • 仮に[txt_詳細リンク]および[txt_クレーム詳細リンク]が共にハイパーリンク型のフィールドをコントロールソースとする連結テキストボックスであるとした場合、そのフィールドの値を"#"で囲む(厳密には「先頭に"#"を挿入する」)という操作は、ハイパーリンクの各セクションを1つ右のセクションにずらすことと同義である。

  • したがって、件の UPDATE 文が繰り返し実行されれば、やがてハイパーリンクの表示テキスト、ハイパーリンクアドレス、サブアドレスが全て空の状態となり、表示上は「パスが消えてしまう」かのように見えてしまうことになる。

3
勉強中の男 2024/01/31 (水) 14:46:14 ddfe5@72804

その後ウィザードで作成した分のページヘッダーのラベルと詳細セクション部を削除して問題あるレポートからそれらをコピーしました⇒やはり重複データ非表示にすると#name?となります(いいえにすると全て表示)
ますます不思議です。

2
勉強中の男 2024/01/31 (水) 14:37:03 ddfe5@72804

ありがとうございます。対象レポートソースの集計クエリの基もクエリ(A)にしてまして、その(A)をソースにしたレポートも同じ状態でした(以前作成)。その(A)を使いウィザードで簡易なレポート作成すると問題なく重複データ非表示は出来ています。不思議です。何かの設定でしょうか?

5
  If IsNull(Me("txt_詳細リンク" & R).Value) Then
    Me("txt_詳細リンク" & R).Value = Nz((Me("txt_詳細リンク" & R).Value), "")
  End If

上記のコードで、詳細リンクがNullの場合、""(空文字列)に変換しています。
下記の次のコードで、

  If Not IsNull(Me("txt_特記ID" & R).Value) Then '「txt_特記ID」が空でなければ
    strSQL = _
      "UPDATE T_特記事項 " & _
      "SET " & _
        "口座番号 = '" & Me.txt_口座番号.Value & "', " & _
        "特記事項 = '" & Me("txt_特記事項" & R).Value & "', " & _
        "特記事項詳細 = '#" & Replace(Me("txt_詳細リンク" & R).Value, """", "") & "#' " & _
      "WHERE ID = " & Me("txt_特記ID" & R).Value & ";"
      sqlList.Add strSQL

IsNullでNullかどうかをチェックしていますが、その前でNullは""に変換されてますので、このSQLは必ず実行されます。
つまり、""に更新されてしまう。これが下記の原因かと思います。

更新の度に直前にUPDATEしたパスが消えてしまう

対策としては、前者のコードは削除して、後者のコードを下記に修正すればどうでしょうか。

  If Nz(Me("txt_特記ID" & R).Value, "") <> "" Then '「txt_特記ID」が空でなければ
    strSQL = _
      "UPDATE T_特記事項 " & _
      "SET " & _
        "口座番号 = '" & Me.txt_口座番号.Value & "', " & _
        "特記事項 = '" & Me("txt_特記事項" & R).Value & "', " & _
        "特記事項詳細 = '#" & Replace(Me("txt_詳細リンク" & R).Value, """", "") & "#' " & _
      "WHERE ID = " & Me("txt_特記ID" & R).Value & ";"
      sqlList.Add strSQL

上記以外の該当部分も同様に修正してください。

5
すずやん 2024/01/31 (水) 12:45:45 >> 3

あと、コスト、ですかね。
案件や状況によりけり、としか言えないのが難しいところですね。
質問内容が「Accessについてどのような意見を持っているか」なので、日頃Accessを選択する場合の理由になることを書いてみました。

やはり小~中の企業でシステム周りにあまりお金をかけたくない、というところは多くそういった場合に提案されることはまだまだ続くと思います。

4
hiroton 2024/01/31 (水) 12:11:59 c8306@f966d

SEから見ればコスト度外視で開発が楽な環境にしてくれとなるでしょう。質問にある指摘はそれだけとは言いませんがその面が大きく出ているように思いますね

企業から見れば、企業の実態に見合ったシステムの要件と、コスト(導入コスト・ランニングコスト)、時間(開発時間や運用に関する時間(これは≒システム要件))が問題です。開発・メンテナンスのしやすさなんてものは評価に値しません
それらは全てひっくるめて結局、できるのか?いつまでに?いくらで?で判断されることです

会社の大小によって、これらの評価の閾値はかわるでしょうが、これらが評価項目であることに変わりはないでしょう

ACCESSは貧弱なのでシステムの要件という大前提のもとNGとなる場合もあります。「要求を十分に満たす」となればコストパフォーマンスは高いと思います
実際、大掛かりなシステムでもフロントエンド(の一部はACCESS)という場合もあります

繰り返しますが、ACCESSは特定の条件に於いて「十分である」という評価をつけることはあります。これは「よい」ではありませんし、なんなら、大規模化を望めないという観点から「よくない」とするのが一般的な評価ではないか?というのがhirotonの考えです

まぁ、「一般的」などという特殊な環境なんてそうそうないとも思ってますが


ACCESSとVBAは切っても切れない関係ですが、同一のものではありません。VBAだけなら覚えなくてもいいんじゃないかなぁとも思います。ACCESSを使うなら覚えないわけにはいかないですが

時代は「クラウド」で「ノーコード」で「RPA」だ、なんで、いままで「office」で「VBA」でなんて言っていたのは今や特別必要というわけでもないのでしょう
ACCESSのような「手軽さ」も特別感のあるものではなくなってきました。ACCESSがいらないのであれば、必然VBAの必要性も無くなります

hirotonのまわりはまだまだサブスクリプションに拒否感を受ける人も多いようで、「スタンドアロン」で「買い切り」で、が決め手になる場合もありますが、システム選定の幅はかなり広がっていると思います。「同等の知識はあるが、ACCESSやVBAは知らない」という人がいてもおかしくない時代じゃないでしょうか


余談
VBAの兄弟分でもあるVBScriptがとうとう非推奨になってしまいました
https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features-resources#vbscript

VBA,VBScriptの手軽さ、便利さはWindowsを使うにあたって有用なものだったんですが、そういう付加価値もなくなってくるとやはり、VBAにも消極的な姿勢にならざるを得ないかなぁと感じています

3
素朴な疑問マン 2024/01/31 (水) 10:40:30 23e8e@44ebd

会社の規模感と開発に携わる人数の問題なんですかね。

4

ハイパーリンク型フィールド"特記事項詳細"と"クレーム詳細"に
UPDATEをしたいのですが、更新の度に直前にUPDATEしたパスが消えてしまう

"特記事項詳細 = '#" & Replace(Me("txt_詳細リンク" & R).Value, """", "") & "#' "
"クレーム詳細 = '#" & Replace(Me("txt_クレーム詳細リンク" & Z).Value, """", "") & "#' "

"#"で囲っているのが余計だからでしょう。

3
wazawaza 2024/01/31 (水) 09:10:27

一度、連結フォームで作成したものを書籍を参考にVBAでチャレンジしています。
2つのハイパーリンク型のフィールド以外は、難なく更新できています。

2
wazawaza 2024/01/31 (水) 09:07:23

複数のSQL実行のためのプロシージャ


 Function tryExecute(sqlList As Collection) As String
 '## 複数のSQLを実行するFunctionプロシージャ(SQLリストをすべて実行してメッセージを受け取る関数)

  'エラーが起きたら「ErrorHandler」へジャンプ
  On Error GoTo ErrorHandler
  
  Dim daoWs As DAO.Workspace
  Set daoWs = DBEngine(0)  'トランザクションをサポートするオブジェクトを作成
  
  Dim daoDb As DAO.Database
  Set daoDb = CurrentDb  '接続
  
  daoWs.BeginTrans  'トランザクション開始
  
  Dim strSQL As Variant
  For Each strSQL In sqlList  'SQL文リストをループ
    daoDb.Execute strSQL  '実行
  Next strSQL
  
  daoWs.CommitTrans  '確定
  
  '成功の場合は空の文字列が入る
  tryExecute = ""
  
  '接続解除へジャンプ
  GoTo Finally
  
'エラー処理
ErrorHandler:
  tryExecute = "Error #: " & Err.Number & vbNewLine & vbNewLine & Err.Description  'エラーの場合はエラーメッセージが入る
  
'接続解除
Finally:
  If Not daoDb Is Nothing Then
    daoDb.Close
    Set daoDb = Nothing
  End If
  If Not daoWs Is Nothing Then  'トランザクション用のオブジェクトを破棄
    daoWs.Close
    Set daoWs = Nothing
  End If
  
End Function


1
wazawaza 2024/01/31 (水) 09:04:24

一部を略しましたが、更新文です。


Private Sub btn_更新_Click()
  Dim sqlList As Collection
  Set sqlList = New Collection  'コレクションを作成
  
  〜省略〜

  Dim R As Long
  For R = 1 To 10
  
  If IsNull(Me("txt_詳細リンク" & R).Value) Then
    Me("txt_詳細リンク" & R).Value = Nz((Me("txt_詳細リンク" & R).Value), "")
  End If
  Debug.Print "1"
  If Not IsNull(Me("txt_特記ID" & R).Value) Then '「txt_特記ID」が空でなければ
    strSQL = _
      "UPDATE T_特記事項 " & _
      "SET " & _
        "口座番号 = '" & Me.txt_口座番号.Value & "', " & _
        "特記事項 = '" & Me("txt_特記事項" & R).Value & "', " & _
        "特記事項詳細 = '#" & Replace(Me("txt_詳細リンク" & R).Value, """", "") & "#' " & _
      "WHERE ID = " & Me("txt_特記ID" & R).Value & ";"
      sqlList.Add strSQL
  ElseIf Not IsNull(Me("txt_特記事項" & R).Value) Then  '「txt_特記事項」が空でなければ
    strSQL = _
      "INSERT INTO T_特記事項 (口座番号, 特記事項, 特記事項詳細) " & _
      "VALUES" & _
        "('" & Me.txt_口座番号.Value & "', " & _
        "'" & Me("txt_特記事項" & R).Value & "', " & _
        "'" & Me("txt_詳細リンク" & R).Value & "');"
      sqlList.Add strSQL
    End If
  Next R
  
  Dim Z As Long
  For Z = 1 To 10
  Debug.Print "2"
  If IsNull(Me("txt_クレーム詳細リンク" & Z).Value) Then
    Me("txt_クレーム詳細リンク" & Z).Value = Nz((Me("txt_クレーム詳細リンク" & Z).Value), "")
  End If
  
  If Not IsNull(Me("txt_クレームID" & Z).Value) Then  '「txt_クレームID」が空でなければ
  '実行
    strSQL = _
      "UPDATE T_クレーム履歴 " & _
      "SET " & _
        "口座番号 = '" & Me.txt_口座番号.Value & "', " & _
        "発生年月 = '" & Me("txt_発生年月" & Z).Value & "', " & _
        "クレーム内容 = '" & Me("txt_クレーム内容" & Z).Value & "', " & _
        "是正処置 = '" & Me("txt_是正処置" & Z).Value & "', " & _
        "クレーム詳細 = '#" & Replace(Me("txt_クレーム詳細リンク" & Z).Value, """", "") & "#' " & _
      "WHERE ID = " & Me("txt_クレームID" & Z).Value & ";"
      sqlList.Add strSQL
    ElseIf Not IsNull(Me("txt_クレーム内容" & Z).Value) Then  '「txt_クレーム内容」が空でなければ
  '実行
    strSQL = _
      "INSERT INTO T_クレーム履歴 (口座番号, 発生年月, クレーム内容, 是正処置, クレーム詳細) " & _
      "VALUES" & _
        "('" & Me.txt_口座番号.Value & "', " & _
        "#" & Me("txt_発生年月" & Z).Value & "#, " & _
        "'" & Me("txt_クレーム内容" & Z).Value & "', " & _
        "'" & Me("txt_是正処置" & Z).Value & "', " & _
        "'" & Me("txt_クレーム詳細リンク" & Z).Value & "');"
      sqlList.Add strSQL
    End If
  Next Z
  
  Dim errMsg As String
  errMsg = tryExecute(sqlList)  'SQLリストを実行してメッセージを受け取る
  
  If errMsg <> "" Then  'メッセージが空ではない(エラーがあった)場合
    MsgBox errMsg, vbCritical, "エラー" '受け取ったメッセージを出力
    Exit Sub  '終了
  End If
  
  Call loadForm  '読込を呼び出す
  MsgBox "更新しました", vbInformation, "完了" 'メッセージを出力
  DoCmd.Close acForm, "F_作業標準入力", acSaveNo
End Sub
1

重複データ非表示はよく使いますが、いままでそのような現象になったことはありません。

同じテーブルから新規にウィザードでレポートを作成しても現象は再現しますか。

2
すずやん 2024/01/30 (火) 14:53:19

個人的には状況によると思います。

例えば30~50人程度の会社の基幹DBで、1~2人の限定された開発人数で構築する場合、コストや開発情報の多さなどを考えるとそれほど悪くないと感じてます。
SQL Serverなどを使うと環境を用意するだけで簡単に200万円以上かかりますし。
またWindows環境の会社でADを主体としたファイル管理を多なっている場合はかなり便利です。

2016のあたりから今と同じように「もう終わる」みたいなことを囁かれていますが、2024年のいまでもまったく普通に使えます。
10年~20年とか基幹システムを使うとどこかでアップグレードしたくなるので、その際にシステムを変える等でもいいかと。

つまりとっかかりのシステム構築を行うと考えた場合はかなり優れたシステムだと言えると思います。

1
hiroton 2024/01/30 (火) 14:32:06 7f3ac@f966d

「よくない」でしょうね

ただまぁ、質問にある指摘は「金で解決できる問題」であるとも思いますが

11
ヒトシ 2024/01/30 (火) 12:28:18 ddfe5@72804

度々ありがとうございました。イベントの説明も大変参考になりました。個々のレコード移動時イベントにコード記述して対応してみます。お世話になりました。

10

3で提示したコードの条件にレコード件数が0もつけ加えるといいでしょう。

Private Sub Form_Unload(Cancel As Integer)
    If Me.埋め込み1.Form.Recordset.RecordCount = 0 Or Me.埋め込み1.Form!SumF2.Value <> Me.埋め込み1.Form!SumF4.Value Then
        Cancel = True
        Me.埋め込み1.SetFocus
    End If
End Sub

Private Sub 埋め込み1_Exit(Cancel As Integer)

    Me.埋め込み1.Form.Requery 'レコード保存
     If Me.埋め込み1.Form.Recordset.RecordCount = 0 Then
        Cancel = True
        MsgBox "明細データを1件以上入力してください"
    ElseIf Me.埋め込み1.Form!SumF2.Value <> Me.埋め込み1.Form!SumF4.Value Then
        Cancel = True
        MsgBox "F2とF4の合計が合っていません!"
    End If
End Sub

これでサブフォームのレコード件数が0のときはフォームを閉じれなくなります。

ただし、これだけではメインレコード移動は規制できません。
レコード移動時イベントでは、レコード移動した後に発生するしキャンセルできないので。

いろいろ考えてみましたが、難しそうですね。
レコード移動時イベントで、サブのレコード件数が0のメインのレコードがないかチェックして、あればそこにレコード移動するという感じでするとか、ぐらいかな。
ちょっと面倒そうですね。

9
ヒトシ 2024/01/29 (月) 13:20:37 ddfe5@72804

重ね重ねすみません、記述位置をミスしてました。埋め込み1_Exit***のコードをメインに記述してました。失礼しました。
これで移動も規制できました。
このフォームでメインにだけ入力してサブにはレコードが1件もない状態を回避したい場合、どうすると効果的でしょうか?(閉じたり、メインレコード移動時にメッセージを出したい)

8
ヒトシ 2024/01/29 (月) 13:00:29 ddfe5@72804

ありがとうございます。メインにコード記述したらいけました。落ち着いて考えたら分かることなのに、すみませんでした。
イベントの説明もお手数かけました。フォーム閉じる時はこれでカバーできたのですが、メインに配置してますレコード移動ボタンに対してはどう対処したらいいでしょうか? 合計が合致してない場合、移動も出来なくなる様にしたいのです。

7

Private Sub Form_Unload(Cancel As Integer)
はメインフォームのモジュールに記述してますか。
サブフォームのモジュールに記述しているのなら、メインフォームの方へ移動させてください。