• ベストアンサー

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

講座名ごとに受付番号を自動採番したいのですが、出来るのでしょうか? テーブル名 セミナー受付(講座名、受付番号・・・) 講座名     受付番号 セミナー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