Microsoft Access 掲示板

レコードにカウンターのようなものをつけたい

8 コメント
views
4 フォロー

日付フィールドと数値フィールド、自動連番フィールドがあるとします

レコードの日付フィールドに日付を入力すると
数値フィールドに、「その直近の日付があるレコードの、数値フィールド+1」を入力する仕組みをつくると、
全レコードを対象として日付の比較を行い、その後加算をするので、レコードが増えると激重になりますか?

1日に数十レコード入力して、同じ日付には同じ数値を入力、その数値が10になると、また1からはじまるようにしたいです
1月1日 1
1月2日 2
(日付がとんでも無視)
1月4日 3
としていきこれが10になると
1月12日 1
1月13日 2
と、また1からはじめたいです

日付ごとに最大10でループするカウンターをつくりたい、ということになるかと思います
最初のレコードには手入力で1をいれておこうと思います

よろしくお願いします

ぴぽ
作成: 2021/05/31 (月) 00:52:51
通報 ...
1

この連番は最終的にはどのような目的で使用するものでしょうか。

もし、最終目的が印刷出力なら、レポートの設定で簡単に可能です。

クエリで実現しようとすると、かなり複雑なものになりますし、レコード数が増えるにしたがって指数関数的に重くなりますので、レコード件数が多いときは避けたいですね。

テーブルに「自動連番フィールド」があるなら、VBAで連番を入力しておく方法が比較的シンプルでパフォーマンス的にもお勧めです。

まずは、連番の最終的に使用目的を教えてもらえませんか。

2
ぴぽ 2021/05/31 (月) 18:07:09 58219@b36b8

最終的に印刷されればいいですが、印刷のたびに変わると困ります
別紙に1~10までの通し番号がついた安全のための機械の点検項目がかかれたものがあり、
毎日違ったものをやった、という書類をつくるのが目的です
内部監査のようなもので印刷した書類のチェックがあり、一応毎日違ったところを
順繰り点検しました、といった感じです

自動連番フィールド、はACCESS標準機能のオートナンバーです
数値フィールドというところに日が変わるごとに+1した数値を入れていき、
10でリセットといった具合です。伝え方が悪くてすみません

手段はどのようなものでもよいので

| 日付  |数値 |オートナンバー|
|05/31 | 10  |1
|06/01 | 1  |2
|06/02 | 2  |3

と、レコードを追加するたびに自動で”数値フィールド”に数値が入力されればよいです
(上記以外にも手入力するフィールドは多数あります)

3

と、レコードを追加するたびに自動で”数値フィールド”に数値が入力されればよいです

そういうことなら、フォームの挿入前処理か更新前処理でVBAで連番数値フィールドで連番を入力していくのがよさそうです。

ただし、入力は日付順に入力するという制限が付きますが、それは大丈夫ですか。
例えば、6/1を入力してから、5/29を入力するというようなことがあると面倒です。

4

上記の制限に沿っているとして、下記のような感じでしょうか。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim maxDate As Date, Num As Long

    If Me.NewRecord Then
        maxDate = DMax("日付", "テーブル名")
        Num = DLookup("数値", "テーブル名", "日付=#" & maxDate & "#")
        If Me.日付 = maxDate Then
           Me.数値 = Num
        ElseIf Me.日付 > maxDate Then
           Num = Num + 1
           If Num > 10 Then Num = 1
           Me.数値 = Num
        End If
    End If
End Sub
5
ぴぽ 2021/06/01 (火) 01:46:52 2a30e@98864

教えて頂いたコードであれば指数関数的に重くなるということもないですか?
全レコードを対象に日付を比較することになりますよねん

6
ぴぽ 2021/06/01 (火) 01:47:34 2a30e@98864

すみません
スマホなのでタイプミスしました
比較することになりますよね?
です

7
l2105 2021/06/01 (火) 08:03:59 e1234@179c9

日付にインデックスを張る(フルスキャンを避ける)
テーブルのレコードは適当なタイミングで削除(アーカイブへ移動、最適化)する

あたりでどうでしょうか

8
hatena 2021/06/01 (火) 09:38:21 修正

教えて頂いたコードであれば指数関数的に重くなるということもないですか?

ないです。
クエリで連番を取得しようとすると、レコード毎に集計が発生するので指数関数的に重くなりますが、
提示のコードで新規レコードの連番数値フィールドに代入するだけですので、
DMaxやDLookupでの集計、検索は1回だけです。

日付フィールドにインデックスを設定しておくのは、今回の1回だけの集計、検索にも有効ですが、体感できる差はでないでしょう。
ただし、日付フィールドに対して、並べ替え、グループ化、抽出、、、などのデータ操作が発生する場面は多いと思われますので、インデックスを設定しておいた方がいいでしょう。