Microsoft Access 掲示板

日付が変わる毎の自動連番

6 コメント
views
4 フォロー

win10pro64
microsoft365access

お世話になります。
データ入力用のフォームの「受注コード」というコントロールにyyyy/mm/ddの後に日が変わるごとに001,002,003という風に自動に最大数を連番入力させたいです。
今現在のフォームのレコード移動時のイベントプロシージャに以下のコードを書いています。

Private Sub Form_Current()
 If Me.NewRecord = False Then Exit Sub
 Dim AutoID As String
 Dim MaxID As Variant
 AutoID = Format(Date, "yyyymmdd")
 MaxID = DMax("受注コード", "T_受注", "Left(受注コード,4)=" & AutoID)
 If IsNull(MaxID) Then
    Me.受注コード.DefaultValue = AutoID & "001"
 Else
    Me.受注コード.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
 End If
End Sub

これで、20210830001のようにレコードは入るのですが、次のレコードも001のままで002になってくれません。
日が変わるごとに自動的に年月日+最大数宇が入力できる方法を教えてください。

涼子
作成: 2021/08/30 (月) 15:49:54
通報 ...
1
hiroton 2021/08/30 (月) 16:42:34 e0e58@f966d

AutoID = Format(Date, "yyyymmdd")→8桁(文字)
Left(受注コード,4)→4桁(文字)

"Left(受注コード,4)=" & AutoIDは常に一致するものが存在しないのでMaxIDは常にNullです

2

hiroton様
ご回答ありがとうございます。

ただ、すみません・・・。
当方のレベルでまだご回答頂いた内容が理解できていません・・・。
申し訳ございません・・・、つまりどういう事でしょうか?

宜しくお願い致します。

3
hiroton 2021/08/30 (月) 17:07:52 e0e58@f966d >> 1

検索条件「"Left(受注コード,4)=" & AutoID」は絶対に一致するものがないので
DMax("受注コード", "T_受注", "Left(受注コード,4)=" & AutoID)はどんな場合でもNullになります

 MaxID = DMax("受注コード", "T_受注", "Left(受注コード,4)=" & AutoID)
'//MaxIDは常にNull

 If IsNull(MaxID) Then
    '//必ずここを通る
    Me.受注コード.DefaultValue = AutoID & "001"
 Else
    '//MaxIDは常にNullなのでプログラムがここを通ることはない
    Me.受注コード.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
 End If

なので、いくらレコードが追加されても「受注コード」は「AutoID & "001"」にしかなりません

4

ありがとうございます。

そういう事なんですね。
ご指摘を受けて、コードを触ってはみるのですがどうもうまく動きません。
どうすれば下3桁を自動連番にできますか?
教えて頂けませんか?

宜しくお願い致します。

5
hiroton 2021/08/31 (火) 08:43:03 e217d@f966d

続きの処理(If IsNull(MaxID) Then以下)自体は問題ないです。最初に指摘した通り、「目的の範囲」が正しく設定されていないのが問題です

具体例を見てみましょう

受注コード
20210829001
20210829002
20210830001
20210831001
20210831002

今日が2021/8/31ならばAutoID20210831です
Left(受注コード,4)はそれぞれ次の通りでAutoIDと比較すると

受注コードLeft(受注コード,4)AutoID比較
20210829001202120210831不一致
20210829002202120210831不一致
20210830001202120210831不一致
20210831001202120210831不一致
20210831002202120210831不一致

です(Left 関数

AutoIDは必ず8文字ですが、Left(受注コード,4)は最大でも4文字にしかなりません。4桁の文字と8桁の文字を比較したら絶対に一致することはありません

処理の前後や、実際に使っているデータがどうこうということは関係なく、>> 1の指摘だけでこのプログラムは正常ではないということがわかるわけです


目的の結果を得る方法はいくつかありますが、コードを流用するなら次のような比較を考えればいいです

受注コードLeft(受注コード,8)AutoID比較
202108290012021082920210831不一致
202108290022021082920210831不一致
202108300012021083020210831不一致
202108310012021083120210831一致
202108310022021083120210831一致
6

【解決】
hiroton様

ありがとうございます!
動きました!!
なるほど!そういう意味だったのですね。
このコード自体ネットで調べて拾ってきたものなので意味が分かっていませんでした。
ご指摘を受けてコードの意味が理解出来ました。
とても勉強になりました。

ありがとうございました!