Microsoft Access 掲示板

サブフォームのレコードを更新する際に起こるエラーについて / 6

13 コメント
views
4 フォロー
6
だいふくもち 2021/07/19 (月) 15:37:07

>hirotonさん
で、できました…!!希望通りの処理ができました!!
先週からずっーと悩んでいていたのでとてもすっきりしました…!!
本当にありがとうございます…!!思わず目頭が熱くなりました…!!

恐らく初歩的な内容であるにも関わらず、なぜレコードセットをcloseで閉じる必要があるかを
丁寧にご説明いただきありがとうございます。
テーブルを開きっぱなしと言われると、恐ろしさが重々理解できました…
また、コードの訂正に関してもありがとうございます…!

処理が早くなるかなと思って入れたIf .RecordCount = 0 Thenでしたが、
今試してみたら全く変わらない上に可読性も落ちていましたね…ご指摘ありがとうございます!

RecordsetCloneはこのような場合に使えるのですね!
存在自体は薄々知っていましたが、どう使いこなすべきかよくわからないプロパティでしたので
今回の件で大変勉強になりました。

見返してみると、recordsetの中でもう一度recordsetを開いていたことが複雑化する原因のようでした。
これからはシンプルな作りを心がけます!この度は助けていただき本当にありがとうございました…!
心からの感謝を申し上げます…!

通報 ...
  • 7
    hiroton 2021/07/19 (月) 16:40:04 77018@f966d >> 6

    高速化を考えるなら

    フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは?(hatena chipsさん)

    データの操作・更新とともにフォームの表示も一緒にやるかどうかでかなり速度が変わります

    If .RecordCount = 0 Thenを使うなら「ループ自体を2パターンにする」ですね

    If .RecordCount = 0 Then
        For i = 0 To monthNum Step s
            '全部新規登録
        Next
    Else
        For i = 0 To monthNum Step s
            .FindFirst "入金月 = " & "#" & DateAdd("m", i, startDate) & "#"
            '(省略)
        Next
    End If
    

    新規契約(.RecordCount = 0)の割合が高ければ効果的ですが、正直あまり使う形じゃないかなぁと。もう少し条件を変えて「startDate以上の[入金月]が無ければ」でレコード数チェック(Dcount)するなら実行頻度もあがるかも?


    もう一つは、チェックするデータがなくなったら残り全てを登録するという手法もありますが、「チェックしなくていいデータ」(チェックの終えたデータ)をどう表現するかということになるのでちょっと難易度が上がります

    まぁ、今回の件だとデータ数はかなり少ないでしょうからチェック手法での差はほとんど出ないと思います。まずは冒頭の「フォームの更新が同時に起こる操作」に注目してみてください

    10
    だいふくもち 2021/07/20 (火) 10:24:52 >> 7

    >hirotonさん
    参考資料をありがとうございます!とても分かりやすかったです!
    そもそもRecordsetChoneとRecordset.Cloneの2種類があることをはじめて知りました!
    千件単位のデータを処理すると、処理時間にはっきりと差が出るのですね…
    これからはこの差を念頭に置いて、どの処理を使用すべきかを考えたいと思いました。

    確かにForループを2つに分けた方がごちゃごちゃせず見やすいです!
    そして、「実行頻度の高さから処理方法を考える」という視点を持っていなかったので、肝に銘じました…
    だいたいひとつくらいしか処理するアイデアが浮かばないので
    もっとこうできないかな?と発想を広げられるよう頑張ります!