• ベストアンサー

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はあまり理解できている方ではないのですが、いろいろ検索をしたり調べたりしてたどり着いたのが上記です。 日付でリセットされる採番をするにはあと何をすればよいか、もしくは根本からこうしたほうがいいというのがあれば、とも思うのですが 詳しい方に教えていただけないでしょうか?

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

  • ベストアンサー
  • akipapa
  • ベストアンサー率38% (34/89)
回答No.1

フォームの名前を”受付フォーム”、フォーム上のコントロールを”日付”として説明します。 下記DCountの値は、テーブル"TB_受付”の受付日と”日付”の値とが等しいレコード数+1になります。 Me![番号] = DCount("[番号]", "[TB_受付]", "[受付日]=Forms![受付フォーム]![日付]") + 1 フォーム上のコントロールやどのイベントで処理するかなどは、これの応用で考えてください。 (なお、上記プログラムは、ACCESS97で確認しました。)

mianonna
質問者

お礼

早速のご回答をありがとうございます! コース種類の更新後処理に私が書いていたコードの前にこれを書いたら、うまく行きました!目からうろこです。 教えていただくとなるほど!ととても納得いくのですが、どういう条件にしたらいいかなかなか思いつきません。 2週間ほどいろいろ試していましたが、出来上がってうれしいです。(12月中に作りたかったので)本当に助かりました。

その他の回答 (2)

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.3

すみません。 Upする前にも考えてのですが、見落としがありました。 > コントロールの更新→フォームの更新 の部分は、 コントロールの更新→フォームの更新→レコードソースの更新 となります。

mianonna
質問者

お礼

akipapaさま、Dxakさま 私のつたない質問に早速ご回答いただいてどうもありがとうございました。こんなに早く解決するとは感激です。 また(?)よろしくお願い致します。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.2

更新していく順番を考えて見ましょう。 コントロールの更新→フォームの更新 となってます、要するに「コース種類の更新後処理」では、番号はまだ入っていません。 こういえば、「コース種類の更新後処理」で、如何すればよいかなんとなく想像はつくでしょうか? 「日付が変われば・・・」と言うのは、D系の関数で#1さんが記載するように、条件を追加すれば可能です。 但し、フォームのレコードソースに使用している名前と、フォームのコントロールの名前が一致するとどちらを優先的に値を持ってくるでしょう? Controls を使用して明示的に記載するか、名前を違うものかにされた方が、よろしいかと思います。

mianonna
質問者

お礼

根本的なことを教えていただいてありがとうございます! コードは上から順番に動いて更新されるのかなぁと思っていました。 フォームの更新に番号をつけても、コース種類の更新後処理では番号が入らなかったわけなんですね。 フォームの更新前処理に私が書いたコードをANo.1の方にご回答いただいたコードに変更しても番号が入らなかったので、??と思ってました。 いれる場所も大事なんですね。 コントロールの更新→フォームの更新→レコードソースの更新 を覚えておくようにします。どうもありがとうございます。

関連するQ&A

  • access 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 WinXP  access2002 顧客管理のシステムを作っています。 テーブル 顧客テーブル(主キーは顧客番号 テキスト型) 請求テーブル(主キーは請求番号 テキスト型) 明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。 顧客情報を入力するフォームを作りました。 主キーは顧客番号(テキスト型,入力モードON,インデックス いいえ)で 他のテキストボックス(例えば名前)に何かしら文字を入力すると自動で顧客番号を採番してくれます。 例:0001 0002 0003~ そしてそのフォームから請求書作成フォームに飛ぶように 「請求書作成ボタン」を作り、顧客情報も一緒にひっぱっていってくれる 請求書作成フォームを作りました。(入力したばかりの情報も最新の情報で更新してくれます。) ・・請求書作成フォームはサブフォームを使い3つのテーブルからなっています。・・ 親フォーム:顧客テーブルから。 子フォーム:請求テーブルから。 孫フォーム:明細テーブルから。 主キーは請求番号で(テキスト型,入力モードON,インデックス はい(重複なし)) 他のテキストボックス(例えば請求日)に何かしら入力すると自動で請求番号を採番してくれます。 例:A0001 そこで問題なのですが、顧客情報は入力する度、次々自動で採番してくれるんですが、 請求番号は一番最初のレコードの”A0001”だけ採番してくれて、 新しいレコードで請求書を作ろうとテキストボックスに文字を入力すると「型が一致しません」というエラーが出ます。 ○ エラー内容 アクションエラーの実行 条件 true アクション名 値の代入 引数 [請求番号],Format(DMax("請求番号","請求マスタ")+1,"A0001") マクロは・・(参考書を参考にしています、マクロ名:自動採番マクロ) ------------------------------------------------- 条件 : DCount("請求番号","請求テーブル")=0 アクション : 値の代入 アイテム  : [請求番号] 式     :"A0001" ------------------------------------------------- 条件    : ... アクション : マクロの中止 ------------------------------------------------- アクション : 値の代入 アイテム  : [請求番号] 式     : Format(DMax("請求番号","請求テーブル")+1,"A0001") ------------------------------------------------- となっています。 念のため、主キーの入力モードを切り替えたり、式の"A0001"を単純に"1"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • アクセス 項目ごとに自動採番

    講座名ごとに受付番号を自動採番したいのですが、出来るのでしょうか? テーブル名 セミナー受付(講座名、受付番号・・・) 講座名     受付番号 セミナーA   1001、1002、1003のように連番 セミナーB   2001、2002、2003のように連番 他のサイトを見ても解決できなかったので、ご指導をお願いします。

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

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

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

  • 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)出てきません、これは何か違いがあるのでしょうか? 教えてください、宜しくお願いします。

  • 【Access】区分別の採番方法の続き

    前回から質問させてもらっている採番の件です。 テーブルの情報は添付の通りなのですが、 今までの仮テーブルとは状況が少し違うのです、 たとえばA2LA校正という業務案件が1件ありましたら、 FR番号台帳のA2LA_FR_Numberと 校正情報番号台帳のA2LA校正番号の二つの番号を採番したいです。 FRNumberとは案件管理の番号です。 右の校正番号とは各校正業務に割振られる固有の番号で、 A2LA/Standard共に別々で番号を取りたいです。全ての採番の番号は受け付け順に 採番したいです。 すみませんが、よろしくお願いいたします。

  • 自前採番処理について

    Access2013で、自前で採番処理をスル場合 以下のどちらが正しいでしょうか? 1) フォームの保存ボタンで、採番管理テーブルを参照して、現在の主キーのID番号を取得して、それに+1したものを採番管理テーブルに保存し、エラーがなければ、画面にセットして保存。 2) フォームのレコードソースのID番号の最大値を取得して、それに+1加算したものを採番管理テーブルに保存し、エラーがなければ、画面にセットし保存。 1) 2)どちらも、採番管理テーブルに+1した番号を保存する時にエラーが起きたら、画面は Me.Undoする。 よろしくお願いします。

  • Accessで自動採番の方法がわかりません。

    今月より弊社工場で、私が生産管理システムの構築を担当することになりました。 Accessでの構築です。また、Accessは初心者です。 質問は、受注登録時に受注登録フォーム(F_受注登録)で管理番号を自動採番したいのですが、やり方がわかりません。また、管理番号の自動採番実現のためにテーブルの手直し等ありましたらご教授願います。 管理番号の構成 MSSF-10001-1 MSSF→自社番号です。T_自社にMSSFとMSSTを登録しています。 10001→顧客番号と部署番号を結合しています。上3ケタが顧客番号、下2ケタが部署番号です。また、部署番号は顧客の部署になります。 1→枝番号です。1から順にカウントしていきます。例)MSSF-10001-1、MSSF-10001-2、MSSF-10002-1、MSSF-20001-1、MSST-30001-1 質問部分のフローと現在の進捗状況を記載します。 フロー F_受注登録を開く→受注内容を入力→受注内容登録時、管理番号を自動採番し、登録を完了する 現在作成済のテーブル、フォーム T_顧客、T_自社、T_ 受注一覧、T_部署、F_顧客登録、F_受注登録、F_受注一覧 T_顧客→顧客番号、顧客名 T_自社→自社番号、自社名 T_受注一覧→管理番号、顧客名、部署名、担当者、状態、工番、No、品番(図番)、品名、数量、納期、確定納期、出荷日、送り状番号、加工先、材料、材質、備考 T_部署→部署番号、部署名 F_顧客登録→T_顧客へ登録ができます。 F_受注登録→T_受注一覧へ登録ができます。 F_受注一覧→T_受注一覧の閲覧ができます。 ご不明な点等ありましたら、ご連絡ください。 よろしくお願いします。

  • MS Access 入力フォーム:自動採番

    Access2013での自動採番に関して2パターン教えて下さい。 質問(1):"顧客番号"の自動採番 【テーブル名】 顧客情報 【フィールド】 "顧客番号"、"顧客名"、"顧客名かな"、"顧客住所"、"電話番号"、"担当者"、"メール"・・・ <"顧客番号"の採番方法> 顧客名の頭文字を五十音順の「あかさたな」で行ごとに連番をつけて管理している。 例)) 「ABC商事」→エービーシーしょうじ→「あ‐01」 「東京印刷」→とうきょういんさつ→「た-01」 《やりたい事!》 入力フォームに新規で、「東西工業」を入力する際に "顧客名かな"を入力したら、"顧客番号"が自動的に採番されるようにしたい。 顧客名:東西工業 顧客名かな:とうざいこうぎょう 顧客番号:た-02 ←ココを自動採番にしたい ------------------------------------------------ 質問(2)"取引番号"の自動採番 【テーブル名】 取引情報 【フィールド】 "顧客番号"、"取引番号"、"顧客名"、"顧客名かな"、"住所"、"電話番号"、"担当者"、"メール"・・・ <"取引番号"の採番方法> 取引が発生した順で、"顧客番号"ごとに枝番をつけて管理している。 例)) 「ABC商事」→1/10の取引→"顧客番号":あ‐01、"取引番号":01 「ABC商事」→1/31の取引→"顧客番号":あ‐01、"取引番号":02 《やりたい事!》 入力フォームに新規で、「ABC商事」の2/15の取引情報を入力する際に "顧客番号"を入力したら、"取引番号"が自動的に採番されるようにしたい。 顧客名:ABC商事 顧客番号:あ‐01 取引日:2016/02/15 取引番号:03 ←ココを自動採番にしたい 説明がうまくできず、分かりにくいかとは思いますが 何とかお知恵をお借り出来れば助かります。 よろしくお願い致しますm(__)m

  • アクセス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 こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。

専門家に質問してみよう