

Accessは全くの初心者です。
プログラマーさんのサイトや質問サイトを参考に、初めてデータベースを作っているのですが、
どうしても文字+年ごとの自動採番がうまくいきません。
挿入前処理で「営250001」のように漢字1文字+和暦2桁+4桁連番にして、
年が変わるごとに4桁連番を0001に戻したいのです。
今入力してあるコードは以下の通りです。
-----------------------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim vDt As Variant
vDt = DMax("番号", "営テーブル", "番号 Like '" & Format(Date, "ee") & "*'")
If (IsNull(vDt)) Then
番号 = "営" & Format(Date, "ee") & "0001"
Else
番号 = "営" & Left(vDt, 2) & Format(Val(Right(vDt, 4)) + 1, "0000")
End If
End Sub
-----------------------------------------------------------------------------
この状態では、0001のまま採番が進まず、行き詰ってしまいました。
他の質問者さんが(Date,"ee")を(Now,"nn")に置き換えて、分ごとの採番を試していたのを参考に、
「"営"&」を取って、採番が進むところまでは確認できました。
使っているのはAccess2003です。
どうか、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> vDt = DMax("番号", "営テーブル", "番号 Like '" & Format(Date, "ee") & "*'")
これでは、先頭の 「漢字1文字」 が無視されていますね。
vDt = DMax("番号", "営テーブル", "番号 Like '営" & Format(Date, "ee") & "*'")
とか、
vDt = DMax("番号", "営テーブル", "番号 Like '?" & Format(Date, "ee") & "*'")
さらに
> 番号 = "営" & Left(vDt, 2) & Format(Val(Right(vDt, 4)) + 1, "0000")
を
番号 = Left(vDt, 3) & Format(Val(Right(vDt, 4)) + 1, "0000")
上記は
"営テーブル"の "番号"フィールドには , 「営250001」 のように保存されているものとします。
1桁目は"営"固定の場合です。
そうでない場合は、また変わってきます。
できました!
vDtで定義した中にも1桁目の漢字が入らなければいけなかったんですね…
「"番号 Like '"」の部分が理解できていなかったので、
どこに1桁目の漢字を定義していいのかがわかっていませんでした。
教えていただいたとおりに直し、あらためてヘルプ等でLike演算子を調べ、
なんとなくですが、理解できた気がします。
テーブルごとに1桁目の漢字決め、固定して使うので教えていただいたコードで
進めたいと思います。
ありがとうございました。
No.3
- 回答日時:
主キーに複数の意味を持たせるな
http://hatenachips.blog34.fc2.com/blog-entry-201 …
絶対に・・・というわけではないと考えますが
人間にとって分かりやすい ≒ データベースの処理に適切
だと思います。
作成中、いろいろ検索した中で、リンクしていただいたページも見てました。
たしかに、このままでは主キーとしては不安定ですよね。
この自動採番は、以前から使用していた番号の形式を使い、
何かの時にはこの番号で検索もしたいとのことだったので、
この番号以外に、オートナンバーの主キーを設定しています。
教えていただき、ありがとうございました。
No.2
- 回答日時:
以下でどうなりますか
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim vDt As Variant
Dim sS As String
sS = "営" & Format(Date, "ee")
vDt = DMax("番号", "営テーブル", "番号 Like '" & sS & "*'")
If (IsNull(vDt)) Then
番号 = sS & "0001"
Else
番号 = sS & Format(Val(Right(vDt, 4)) + 1, "0000")
End If
End Sub
※ "営25*" で探すので、"事250123" とかあったら、
"営" / "事" それぞれでの採番になると思います。
※ "営25" を作るところは1箇所にします。
ほぼないと思いますが、前後で年を越したら・・・・
もしかして http://oshiete.goo.ne.jp/qa/5749336.html とかを見られました?
そこでは2箇所に記述していましたが・・・
なお、以下のような書き方もあるかも(未検証)
(DMax の戻り値の時に数値にしておく)
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim sS As String
sS = "営" & Format(Date, "ee")
番号 = sS & Format( _
Nz( _
DMax("Val(Right(番号, 4))" _
, "営テーブル" _
, "番号 Like '" & sS & "*'") _
) + 1 _
, "0000")
End Sub
余談)
挿入前処理での採番ですが、更新前処理で採番する事もあると思います。
タイミング的にどちらが良いのか、それは判断してください。
その時には、新規レコードか判別して・・・・以下雰囲気で
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim vDt As Variant
Dim sS As String
If (Me.NewRecord) Then
sS = "営" & Format(Date, "ee")
vDt = DMax("番号", "営テーブル", "番号 Like '" & sS & "*'")
If (IsNull(vDt)) Then
番号 = sS & "0001"
Else
番号 = sS & Format(Val(Right(vDt, 4)) + 1, "0000")
End If
End If
End Sub
不都合あれば修正してください。
そうです!
その質問ページを参考に、今の自動採番を作っていました。
30246kiku様が丁寧に回答されていたので、全くの初心者の私にも
だいぶ理解できるものでした。
私の質問にも回答いただけて、なんかちょっと嬉しい気が…(^^)
本題ですが、
「漢字+年」と「連番」で分けるという方法もあるんですね。
見た目がシンプルで、わかりやすいかも…
肝心の動作確認ですが、実はまだできてません^^;
職場へのデータの持込・持出厳禁なのと、自宅PCにAccessが入っていないのとで、
仕事の合間に作っている現状なのです。
とりあえずなお礼で申し訳ありませんが、この方法の動作確認ができたら、
最初の方法とどちらがいいか、検討したいと思います。
ちなみに、未検証で書いていただいたコードは、
すいません!Nz関数を調べてみても、初心者すぎる私には理解が難しく。。。
処理のタイミングも、どこか入力し始めたら番号が出るようにしたいので、
挿入前処理で進めたいと思います。
たくさんの回答例をいただき、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Recordset.FindFirstについて
-
Accessでのレコード存在チェック
-
最新の日付とその金額をクエリ...
-
vba 直前の操作はキャンセルさ...
-
条件をつけて日付の古い行を抜...
-
ADO VBA 実行時エラー3021
-
Oracleでの文字列連結サイズの上限
-
OracleのSQL*PLUSで、デー...
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
ACCESSの集計クエリで3件ある...
-
使うべきでない文字。
-
postgresql DELETE後commit...
-
Excelでセルの書式設定を使用し...
-
割合(パーセント)を求めるに...
-
沿線コード
-
MERGE文を単体テーブルに対して...
-
抽出したデータを修正して元の...
-
固定値を含む結合と複数テーブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
最新の日付とその金額をクエリ...
-
Accessで日付が変わると番号が...
-
access 自動採番 年が変わる...
-
SELECT * FROM `生徒名簿` INNE...
-
vba 直前の操作はキャンセルさ...
-
accessのテーブルから条件の抽...
-
sqlで質問です。 Aテーブルの登...
-
〜のような結果を出すためのSQL...
-
社員DBを作る
-
条件をつけて日付の古い行を抜...
-
Accessでのレコード存在チェック
-
【アクセスVBA】テーブルにフィ...
-
【SQL】existsでの商演算
-
質問です。 下記のテーブルとデ...
-
主キーの選び方
-
access 自動採番 「10-AA-000...
-
Access 文字+年ごとの自動採番
-
Access VBAで更新履歴を追いたい
-
MySQLで桁あふれを防ぐ方法
おすすめ情報