Access文字+年ごとの自動採番がうまくいかない

このQ&Aのポイント
  • 質問者はAccessを初めて使っており、文字+年ごとの自動採番がうまくいかない問題に直面しています。
  • 質問者は挿入前処理で営250001のように漢字1文字+和暦2桁+4桁の連番を作り、年が変わるごとに連番を0001にリセットしたいと考えています。
  • 質問者は現在使っているコードがうまく動作しておらず、0001のまま採番が進まない問題に苦しんでいます。
回答を見る
  • ベストアンサー

Access 文字+年ごとの自動採番

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です。 どうか、よろしくお願いします。

  • j826
  • お礼率100% (3/3)

質問者が選んだベストアンサー

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (295/459)
回答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桁目は"営"固定の場合です。 そうでない場合は、また変わってきます。

j826
質問者

お礼

できました! vDtで定義した中にも1桁目の漢字が入らなければいけなかったんですね… 「"番号 Like '"」の部分が理解できていなかったので、 どこに1桁目の漢字を定義していいのかがわかっていませんでした。 教えていただいたとおりに直し、あらためてヘルプ等でLike演算子を調べ、 なんとなくですが、理解できた気がします。 テーブルごとに1桁目の漢字決め、固定して使うので教えていただいたコードで 進めたいと思います。 ありがとうございました。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

主キーに複数の意味を持たせるな http://hatenachips.blog34.fc2.com/blog-entry-201.html 絶対に・・・というわけではないと考えますが 人間にとって分かりやすい ≒ データベースの処理に適切 だと思います。

j826
質問者

お礼

作成中、いろいろ検索した中で、リンクしていただいたページも見てました。 たしかに、このままでは主キーとしては不安定ですよね。 この自動採番は、以前から使用していた番号の形式を使い、 何かの時にはこの番号で検索もしたいとのことだったので、 この番号以外に、オートナンバーの主キーを設定しています。 教えていただき、ありがとうございました。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答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://okwave.jp/qa/q5749336.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 不都合あれば修正してください。

j826
質問者

お礼

そうです! その質問ページを参考に、今の自動採番を作っていました。 30246kiku様が丁寧に回答されていたので、全くの初心者の私にも だいぶ理解できるものでした。 私の質問にも回答いただけて、なんかちょっと嬉しい気が…(^^) 本題ですが、 「漢字+年」と「連番」で分けるという方法もあるんですね。 見た目がシンプルで、わかりやすいかも… 肝心の動作確認ですが、実はまだできてません^^; 職場へのデータの持込・持出厳禁なのと、自宅PCにAccessが入っていないのとで、 仕事の合間に作っている現状なのです。 とりあえずなお礼で申し訳ありませんが、この方法の動作確認ができたら、 最初の方法とどちらがいいか、検討したいと思います。 ちなみに、未検証で書いていただいたコードは、 すいません!Nz関数を調べてみても、初心者すぎる私には理解が難しく。。。 処理のタイミングも、どこか入力し始めたら番号が出るようにしたいので、 挿入前処理で進めたいと思います。 たくさんの回答例をいただき、ありがとうございました。

関連するQ&A

  • access 自動採番 年が変わるごとに0001に戻る仕組み。

    宜しくお願いします。 使用環境:access(2002-2007) 前回の続きでもありますが、自動で番号を採番する仕組みを作りました。 (一応、前回分も・・)http://oshiete1.goo.ne.jp/qa5742518.html 「10AA0001」から始まり、あとは後ろの数字が0002,0003~と増えていく仕様で出来ました。 最初の「10」というのは2010年のうしろ二桁の「10」です。(date関数) (相談) これを2011年になったら、後ろの数字を0001に自動的にセットし直す仕様にしたいのです、 そこから0002,0003~と増えるようにして、また年が変わるごとに0001にセットされるような仕組みにしたいです。 検索サイトで調べるとやり方が出てくるのですが、 まだVBAの理解力がないので、まったくもってわかりません。 たぶんIfで示されるDcount関数に関係があるのかなー、という気はします。 (前置きの部分なので) 僕にはちょっとレベルが高いかも知れませんが、理解できるよう努力します。 以下に、構文を書きます。 また来年になるまで「実際、変わるか検証ができない」というのもアレなので、 テスト環境ではnow関数を使い「hhnn」でやってます。 「分」が変わるごとに0001に戻れば自分なりにOKだと思っています。 (now関数で連番動作することは確認できました) ・・・・・・・・・ '------------------------------------------------------------ ' Form_BeforeInsert ' '------------------------------------------------------------ Private Sub Form_BeforeInsert(Cancel As Integer) On Error GoTo Form_BeforeInsert_Err If (DCount("見積り番号", "案件") = 0) Then 見積り番号 = "00AA0001" Exit Sub End If 見積り番号 = Right(Format(Date, "yyyy", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000") Form_BeforeInsert_Exit: Exit Sub Form_BeforeInsert_Err: MsgBox Error$ Resume Form_BeforeInsert_Exit End Sub ・・・・・・・・・ ○ now関数の場合 ※一文のみ抜粋 ・・・・・ 見積り番号 = Right(Format(Now, "hhnn", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000") ・・・・・ 教えてください、宜しくお願いします。

  • アクセス2000で番号をふりたいです。

    アクセス2000の質問です。よろしくお願いします。 VBAが初めてなので、本を見ながらやってるんですけど なかなか理解できずに困ってます。 今、フォームで番号をふりたいんですけど、連番で 2007001でもH19001でもいいんですが、年&3桁の番号にしたいです。 現状はテーブルが「sheet5」、フォームの番号を出すテキストボックス の所が「連番」にしてあります。ボタン式にしました。 んで自分で考えて打ち込んだのが Private Sub コマンド77_Click() If "連番" / 1000 Is Date Then Me!連番 = DMax("連番", "sheet5") + 1 Else Me!連番 = Format(Date * 1000, "yyyy" & "001") End If End Sub こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。

  • 伝票番号の自動採番について

    伝票番号の採番で、西暦+5桁という仕様です。 これを、年が変わってから入力する際に 新しい年(度)+00001 としたいのですが、どのようにプログラムを組んだらいいのか分かりません。 ちなみに今までのプログラムでは Format関数や、DMax関数を使って自動採番していました。 Access2000での開発です。 どうぞよろしくお願いします。

  • 文字を含むIDの自動採番

    Access2013を使っています。 IDはテキスト型で、 A00000000 っていう書式なんですが、 新規レコード作成時のイベントで、ID自動採番(連番をふる)をしたいのですが、下記だと最初の1レコード(A00000001)以降がエラーになってしまいます。 Format(Nz(DMax("ID", "T_テーブル名"), 0) + 1, "\A00000000" ) もちろん、すでにあるIDがA00000001なので、DMaxが使えないんですが、どうやって分けてやったら良いのかわかりません。 やりたい結果は、新規レコード作成時に、IDが"A"&"8ケタの最大値+1"が自動に振られて、テーブルのIDフィールドにA00000001、A00000002・・・とデータ保持したいのです。 説明が判り辛くて恐縮ですが、ご教示お願いします。

  • Accessで日付が変わると番号がリセットされる自動採番がしたい

    Microsoft Accessで下記のようなデータベースを作っています。 テーブル名:TB_受付 テーブルデザイン 受付番号:テキスト型 受付日:日付/時刻型(yyyy/mm/dd) 番号:数値型 コース種類:テキスト型 備考:テキスト型 テーブルイメージ 受付番号    受付日    番号  コース種類  備考 ------------------------------------------------------------ 20051201受付1   2005/12/01   1 20051201受付2   2005/12/01    2 20051201受付3   2005/12/01    3 ・     ・ ・                   ・ 20051202受付1    2005/12/02 というように、受付日が変わると番号が1に戻るような採番をしたいのです。 上記テーブルを元に作成したフォームで、 受付日にはDate関数でその日の日付が入るようにしています。 フォームの更新前処理に下記のコードをいれています。 Private Sub Form_BeforeInsert(Cancel As Integer) If DCount("番号", "TB_受付") = 0 Then Me![番号] = "1" Else Me![番号] = Format(DMax("番号", "TB_受付") + 1) End If End Sub さらにコース種類の更新後処理に Me![受付番号]=Format("受付日,"TB_受付")&"受付"&Format("番号","TB_受付") というコードを書いて日付&番号が、[受付番号]のところに表示されるようにいろいろやっているのですが、日付が変わると番号をリセットさせることがなかなかできません。 VBAはあまり理解できている方ではないのですが、いろいろ検索をしたり調べたりしてたどり着いたのが上記です。 日付でリセットされる採番をするにはあと何をすればよいか、もしくは根本からこうしたほうがいいというのがあれば、とも思うのですが 詳しい方に教えていただけないでしょうか?

  • access 自動採番 「10-AA-0001」にするには。

    宜しくお願いします。 仕様環境:access(2002-2007) 自動で番号を割り振る機能を作っています。 (以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m) ・・・ まずテストDBなので、テーブルは「案件」一つだけです。 フォームも簡易的な単票形式で簡単なものです。 番号は他のテキストボックスに何か挿入する前の 「挿入前」のイベントを遣っています。 そこで、ご相談です、 まず自動採番で「AA-0001」というものが作れました。 また別フォームに移動し、他のテキストボックスを入力しようとすると 「AA-0002」になりました、以降も~0003、~0004となり成功しました。 そこで更に付け加えたいと思っています。 それは、 「2010-AA-0001」にしたいと思っています。 ご覧の通り、「2010」は「年」です。 更には完成系として「10-AA-0001」と言う風に「年」にあたる、2010の「10」だけ、 抜き出したいと思っており、来年には自動的に2011の「11」にしたいと思っております。 date関数なのかなー、とは何となく思っているのですが、いろいろ工夫してみたのですが、 うまくいきません。 これはマクロでは無理でしょうか? フォームをVBAに変換したものとマクロを記載させて頂きます。 よろしくお願いします。 '------------------------------------------------------------ ' Form_BeforeInsert ' '------------------------------------------------------------ Private Sub Form_BeforeInsert(Cancel As Integer) On Error GoTo Form_BeforeInsert_Err If (DCount("見積り番号", "案件") = 0) Then 見積り番号 = "AA-0001" Exit Sub End If 見積り番号 = Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA-" & "0000") Form_BeforeInsert_Exit: Exit Sub Form_BeforeInsert_Err: MsgBox Error$ Resume Form_BeforeInsert_Exit End Sub ・・・・ マクロの場合     条件                     アクション ---------------------------------------------------------- 1行目 DCount("見積り番号","案件")=0   値の代入    アイテム: [見積り番号]    式:    "AA-0001" ---------------------------------------------------------- 2行目 ...                      マクロの中止 ---------------------------------------------------------- 3行目                       値の代入    アイテム: [見積り番号]     式:    Format(DMax("Right(見積り番号,4)","案件")+1,"AA-" & "0000") ---------------------------------------------------------- ・・・・    こんな感じです、 (単体のテーブルを作り、他のテーブルと組み合わせるつもりです) また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、 調べても(google)出てきません、これは何か違いがあるのでしょうか? 教えてください、宜しくお願いします。

  • 自動採番

    エクセルで申請があったものに対して、フォーマットのある 箇所に採番をしなければいけませんが、毎回打ち込むのは 大変です。 「○○○-070724○」「三桁の数字-yymmdd○(連番)」 (最初の三桁の数字のものに対して連番/ex”123″のものが 070724に3件発生した時に123-0707241→123-0707242→ 123-0707243となるように採番したいですが、いい方法は ないものでしょうか?○○○の部分はジャンルで、多数 存在します。 せめて「○○○-yymmdd○」の「-yymmdd○」の部分だけ でも出るようになれば楽になります。CONCATENATE関数で 「CONCATENATE("-",TODAY(),・・・」で出来ないものかと 試していますが、TODAY関数5桁数字が出てきてしまいます。 自動採番のやり方もわかりません。 自動採番出来るスタンプみたいな事はエクセルで出来ませんか? わかる方がいらっしゃいましたら、教えてください。 よろしくお願いします。   

  • Accessで指示書番号の自動採番

    入力フォームで指示書番号が自動採番され、テーブルにも保存されるようにするための方法を教えていただけないでしょうか。 テーブル:T_指示書 フィールド:指示書番号 フィールドはテキスト型で、番号の構成は8桁の番号で "年(二桁)" + "月(二桁)" +"部署番号(一桁、固定の数字)"+ "連番(三桁)" (例:09091001) という感じで、 年月が変われば、連番が001になるようにしたいです。 どなたか、ご教授いただければありがたいです。 よろしくおねがいします。 Access2002 winXP

  • 自動採番について

    初心者です。 Access2000で銀行管理DBを作っています。 (1)テーブルを入金用と出金用それぞれに作成 (2)データ入力用フォームもそれぞれに作成します。 入力にあたって入力番号を自動採番にしたいと考えてますが、番号の構成は数値10桁で、"年" + "月" + "連番"の組み合わせにしたいのです。例:2003070001 入金用と出金用それぞれ別に入力番号をつけます。 これを実現するために「採番テーブル」を別に作成しなければいけないようですが、 (1)採番テーブルの定義の方法 (2)入力フォームで自動採番するためのVBA記述の方法 についてアドバイスいただけないでしょうか? よろしくお願いします。

  • ACCESSで、DMax関数の条件の書き方

    ACCESS2002を使用しています。 自動的に連番を採番するコードを書きましたが、DMax関数でうまく最大値を取得できません。 条件式がうまく書けていないと思うのですが、どうぞお知恵をお貸しください。 テーブル[t_受注]にあるフィールド[受注コード]は、「yyyymm000」のように9桁表示です。 「yyyymm」の部分は現在の年月から取得し、「000」の部分は年月ごとに001~連番を採番しています。 しかし年月が変わるとうまく最大値を取得できず、次のように連番が採番されてしまいました。 [受注コード] 200705001 200705002 200705003 200705004 200706001 200706005(本当は200706002と自動採番したいのです) 最大値(MaxID)取得するコードはこのように書いております。 よろしくお願いします。 ------------------------------------------------------------------------------------------- Dim NowYearMonth As String Dim MaxYearMonth As String Dim MaxID As String NowYearMonth = Format(Date, "yyyymm") MaxYearMonth = Nz(DMax("Mid$([受注コード],1,6)", "t_受注"), "") MaxID = Nz(DMax("Mid$([受注コード],7,3)", "t_受注"), "NowYearMonth=MaxYearMonth") -------------------------------------------------------------------------------------------