• ベストアンサー

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

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

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

#3です コンボボックス「セミナー名」のクリック時イベントに以下を記述してみてください。 Private Sub セミナー名_Click()   Dim iNumS As Long   Dim vTmp As Variant   If (IsNull(Me.セミナー名)) Then     Me.受付番号 = Null     Exit Sub   End If   Select Case Me.セミナー名     Case "セミナーA": iNumS = 1000     Case "セミナーB": iNumS = 2000     Case "セミナーC": iNumS = 3000   End Select   Me.受付番号 = Nz(DMax("受付番号", "セミナー受付", "セミナー名 ='" & Me.セミナー名 & "'"), iNumS) + 1 End Sub ※  選択したセミナー名の採番初期値を設定しておきます。 セミナー受付テーブルから、登録されているセミナー名の受付番号最大値を求めます。 なかったら、採番初期値+1を、あったら、最大値+1を受付番号に設定します。 ※ この書き方になるとセミナー名が変わったとか・・・で修正が必要になります。 そこでコンボボックスに非表示で採番初期値を設定しておきます。 テーブル「T講座一覧」 講座ID 講座名  採番初期値 1   セミナーA  1000 2   セミナーB  2000 3   セミナーC  3000 コンボボックスの値集合ソースは、 SELECT 講座名, 採番初期値 FROM T講座一覧 ORDER BY 講座名; として、 連結列: 1 列数: 2 列幅: 4cm;0cm (2列目を表示しないように0に:4部分は適当に) としておけば、   Select Case Me.セミナー名     Case "セミナーA": iNumS = 1000     Case "セミナーB": iNumS = 2000     Case "セミナーC": iNumS = 3000   End Select 部分は、   iNumS = Me.セミナー名.Column(1) で、後々修正が要らなくなります。 (テーブルの内容を書き換えるだけの修正になります)

kaigojin
質問者

お礼

ありがとうございます!! 出来ました! また宜しくお願いします。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

追加です。セミナー数が増えれば、 初期設定を セミナーA 1000 セミナーB 2000 ・・・ ・・・ セミナーP 15000 のように初期番号を増加しておけば 簡単に対応できます。 あるいは、人数が1万人くらいに なるのであれば、 セミナーA 100000 のように桁を最初から上げておけば 済みます。以上です。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

> 講座名ごとに受付番号を自動採番 この辺りのテーブル構成、各テーブル間の結び付きはどのようになっているのでしょうか。 各セミナーは、何回も開催するものでしょうか。 その開催回数に関係なく割り振ってもいいのでしょうか。 回数ごとに重複したものを使ってもいいのでしょうか。 (例えば、回数(何回目)が変われば、1からの採番で構わないとか) 講座名ごとに割り振った番号を使いきった時とかは、どのように? 講座数は9つまででしょうか。 すみませんが、もう少し具体的な環境が提示されればと思います。 ご質問の内容だけであれば セミナーAの次の受講番号を求めるには、、 Int(受付番号 / 1000) が 1 の最大受付番号を求め、それに+1すればよいと思います。 新受付番号 = Nz(DMax("受付番号","セミナー受付","Int(受付番号 / 1000) = 1"),1000) + 1 フォームで単票形式なら、= 以降を既定値に設定しておけばよいと思います。 セミナーAの時は、 =Nz(DMax("受付番号","セミナー受付","Int(受付番号 / 1000) = 1"),1000) + 1 セミナーBの場合は、Int(受付番号 / 1000) が 2 を・・・ ※フォームを使っていはいけない??? 講座部分に特化したテーブル構成を考えてみましたが、どうでしょうか。 テーブル「T講座一覧」 講座ID 講座名  採番開始値 1   セミナーA  1000 2   セミナーB  2000 テーブル「T講座開催」 講座開催ID  講座ID  採番開始値  開催日    開催場所 1        1      1000     2010/03/16 テーブル「T講座受講一覧」 an 講座開催ID 受講番号 氏名 備考 1   1       1001    AAAA 講座開催登録時の採番開始値は既定値としてT講座一覧から拾ってきますが、修正が可能なようにします。 (修正が不要であれば、項目自体要りませんが) T講座受講一覧での受講番号の既定値は、講座開催IDの採番開始値+1を初期値として使用します。 (講座開催IDは、一意にするためのものなので、オートナンバーでも) 特に問題がなければ、採番開始値は1で十分で、講座開始ID毎に重複しても問題は発生しないと思います。 (採番開始値自体要らないと思います) 別に、講座開催部分に、何回目、の項目を増やしても良いと思います。 また、氏名部分は、氏名ID の様に他を参照する形でも良いと思います。 ※ 対外的に出す番号としては、クエリとかで、 [講座ID] & Format([開催日],"yymm") & Format([受講番号],"000") とかの8桁以上を使うとか・・・

kaigojin
質問者

補足

早速の回答ありがとうございます! 言葉足らずですみません。補足をします。 受講者テーブル(受講者ID、名前、住所・・・) セミナー受付テーブル(受付ID、受講者ID、受付日、セミナー名、受付番号・・・) となっていて、受講者IDでリレーションを組んで、受付フォームを作っています。 受付フォームで新規登録する際、セミナー名をプルダウンで選ぶと、受付番号が採番される形を作りたいです。 セミナーの個数は最大で3つで、セミナーが終わると、そのセミナーの受付テーブルの情報は削除します。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

少し訂正。 >MsgBox ("講座がありません") をコメントアウトするか削除してください。 変なところにおいてしまいました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

いろいろ方法はあります。 DLookup関数を使う方法もありますが、 一つの案として関数を作ってみました。 テーブルを一つ用意します。 テーブルの名前を受付番号管理とします。 フィールドは、講座名(テキスト型)、 受付番号(数値型)とします。 使用前はテーブルに、 セミナーA 1000 セミナーB 2000 セミナーC 3000 セミナーD 4000 などのように初期設定しておきます。 次に以下の関数を標準モジュールに 貼り付けます。DAOなので参照設定 でDAOにチェックをいれてください。 Function func番号発行(strSemi As String) As Long Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("受付番号管理", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF If rs!講座名 = strSemi Then '関数に更新した番号を返す func番号発行 = rs!受付番号 + 1 'テーブルの番号を更新しておく rs.Edit rs!受付番号 = rs!受付番号 + 1 rs.Update Exit Do End If rs.MoveNext Loop MsgBox ("講座がありません") rs.Close Set rs = Nothing db.Close Set db = Nothing End Function 関数の説明をします。 Function func番号発行(strSemi As String) As Long は関数の引数に講座名を指定します。strSemiの部分です。 この講座名を受付管理番号から探し、あれば 同じレコードの受付番号の番号に1を加えた ものを関数に返します。 この帰ってきた番号をプログラムの中で 使用します。 たとえば、フォームやクエリなどで使う 場合はこの関数を少しアレンジする 必要がでてくるかもしれません。 どの場面で使用するのかわかれば 簡単にアレンジできるのですが。

kaigojin
質問者

補足

早速の回答ありがとうございます! 言葉足らずで申し訳ございません。 補足をします。 受講者テーブル(受講者ID、名前、住所・・・) セミナー受付テーブル(受付ID、受講者ID、受付日、セミナー名、受付番号・・・) となっていて、受講者IDでリレーションを組んで、受付フォームを作っています。 受付フォームでセミナー名をプルダウンで選んで、新規登録すると、受付番号が採番される形を作りたいです。 セミナーの個数は最大で3つです。

関連するQ&A

  • 自動採番について

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

  • 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

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

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

  • 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 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 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"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • MySQL + PHP での自動採番

    PHP + MySQL で自動採番 複数テーブルから文字列を抽出して番号を振りたいと思っております。 具体的には以下のような形を考えているのですが、どのように記述をしてよいのか教えていただけますでしょうか? table1: +-------------+------+------+-- | ID | col1 | col2 | +-------------+------+------+-- | KW0807-0001 | A | 3323 | | KX0807-0002 | B | 1122 | | KY0807-0003 | C | 4441 | | KW0807-0004 | A | 1256 | +-------------+------+------+-- table2: +-----+------+------+-- | ID | col3 | col4 | +-----+------+------+-- | 1 | A | W | | 2 | B | X | | 3 | C | Y | | 4 | D | Z | +-----+------+------+-- table1 の「ID」 -> [K(規定値)] + [col1で入力した値よりcol4を抽出] + 入力した年 (08) + 入力した月 (07) + 0000から始まる4桁の連番 と、したく思います。 ご回答にあたって足りない情報があればご指摘下さい。 よろしくお願い致します。

    • 締切済み
    • PHP
  • 文字を含む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】区分別の採番方法

    A、B、C区分別の採番方法について なるべくシンプルな方法で出来る方法がありましたらお教えください。 何度かACCESSも作成していますが、初心者に近いので、簡単な方法だと ありがたいです。 今業務管理テーブルと区分マスタテーブルと二つのテーブルがあります。 業務管理テーブルには 【業務管理番号】【A受注番号】【B受注番号】【C受注番号】【区分】【機器名】 【001】【19000】【-】【-】【A】【SIMULATOR】 【002】【-】【-】【19000】【C】【GENERATOR】 【003】【-】【-】【19001】【C】【SIMULATOR】 【004】【19001】【-】【-】【A】【SIMULATOR】 【005】【-】【19000】【-】【B】【AMPLIFIER】 【006】【-】【19001】【-】【B】【AMPLIFIER】 区分テーブルには 【区分コード】【区分名称】 【A】【簡易点検】 【B】【精密点検】 【C】【修理】 業務管理番号は1業務ごと連番で番号を採っています。 A/B/C受注番号は各区分ごとに番号を採ります。 区分はA/B/Cのどれかです。 機器名は点検・修理の対象となる機器名が入ります。 上段の業務管理テーブルを元に入力フォームを作成し、そのフォームから区分Aを入力して登録した時に業務管理テーブルのA受注番号に1が足されるようにしたいです。区分は一つのみしか選択しません。 よろしくお願い致します。

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

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