- ベストアンサー
オートナンバーでの質問
現在在庫管理をアクセスで作成中です。 そこで質問なのですが、 商品IDを「ア000」「イ000」など、頭文字+番号としたいと考えているのですが、新しい商品を付け足すときに、頭文字+「オートナンバー」みたいにできないでしょうか? ソートを使う際に商品IDを使いたいと思っています。 今は、一覧表で何番まで作ったのか確認しての作業となっているので面倒です。。 頭文字といっても、「防水ゴムキャップ」などは、「ボ」ではなく、「ゴ」の部類にしたいと思っていたので、商品名のソートでは不十分です。 何かいい方法はありませんか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
え~と・・・ 何処からお話したら良いものやら (^^ゞ 下準備 >商品IDを「ア000」「イ000」など、頭文字+番号としたいと考えているのですが と考えているテーブル名を『T在庫管理』とします。 これを元に帳票フォームを作成して名前を、F在庫管理 とします。 その、F在庫管理 フォームをデザインビューで開いて (商品ID → 商品ID にしてます) 商品ID のフィールドのプロパティのイベントタブの更新後処理に (▼・・・ の三点リーダみたいな方をクリック) そうすると Private Sub 商品ID_afterUpdate() End Sub てのが現れますので 前述のように Private Sub 商品ID_afterUpdate() Me!商品ID = nextID("商品ID", "T在庫管理", Me!商品ID) End Sub といれておきます。 次に 挿入→標準モジュール と進んで、そこに Function nextID(fld As String, tbl As String, str As String) As String Dim t1 As Variant '変数に色々なタイプを入れるのでVariant型にしてます t1 = DMax(fld, tbl, fld & " like '" & str & "*'") 't1 に 頭文字で始まる最大値を格納 t1 = Mid(t1, 2) + 1 't1 から数値部分(回答例だと3桁)にプラス1 nextID = str & Format(Nz(t1, 1), "000") 't1 が Null だった場合を考えて(最初の○001を求めるためにNZ関数使用) End Function と記述。' で始まる行は解説用のコメントです。 で、エラーが無いかコンパイル。 無ければフォームの商品IDコントロールで例えば ぶ だけ入力してEnterで確定すると(更新後処理イベントが発生)、 順次 ぶ001、ぶ002・・・と増えてゆきます。 提示された連番部分が3桁(例、ぶ001 ~ ぶ999)なので、Format(Nz(t1, 1), "000") としておりますが、ここは5年くらいのスパンで考えて質問者さんで判断してください。 Format(Nz(t1, 1), "000")→Format(Nz(t1, 1), "0000") 4桁確保 オートナンバー的なものを用意する場合に一般的なのは、Dmax 関数を使うのですが 今回の場合は、『頭文字+「オートナンバー」みたい』とのことですので、 ちょっと工夫が必要です。 『「防水ゴムキャップ」などは、「ボ」ではなく、「ゴ」の部類にしたい』という 希望もありますし、また既に稼動しているのでこのような回答になったしだいです。 なんのこっちゃ?さっぱりわからん?なら、下記などでもお勉強してください。 魔法使いの開発工房 http://www.mahoutsukaino.com/ ※WEB上で有志の方が色々と解説されていますが、 それだけでは虫食い状態の知識に留まりがちです。 RDBはAccessに限らず裾野(基本的な知識)が無いと必ず行き詰まります。 本も数冊読んで裾野を広げてくださいまし。
その他の回答 (3)
- layy
- ベストアンサー率23% (292/1222)
【商品マスタ】 商品ID、商品名、採番分類 B0001、防水ゴムキャップ、ゴ B0002、防水ゴムテープ、ゴ C0001、アアアアア、ア D0001、イイイイイ、ゴ 【商品採番マスタ】 採番分類、採番、更新日 ア、0001、9999/99/99 イ、0003、9999/99/99 ウ、0002、9999/99/99 ・・・・ ゴ、0008、9999/99/99 が「一覧表で何番まで作ったのか」と同じようになると 思いましたが・・・。 というより 【商品マスタ】 商品ID、商品名、分類ID B0001、防水ゴムキャップ、ゴ002 B0002、防水ゴムテープ、ゴ001 C0001、アアアアア、ア001 D0001、イイイイイ、ゴxxx ・・・・・・「003」になるようにしたい? 商品IDで並べても最後は「ゴ001」で「ゴ002」でない。 でしょうか。 商品マスタに頭文字の項目はありますか?。 【商品マスタ】 商品ID、商品名、採番分類、分類ID B0001、防水ゴムキャップ、ゴ、ゴ001 B0002、防水ゴムテープ、ゴ、ゴ002 C0001、アアアアア、ア、ア001 D0001、イイイイイ、ゴ、ゴxxx 一覧表がレコードをすべて表示で、 商品ID順としたら、分類したい最大値は求めにくいですから、 頭文字だけの項目を用意して、それで並べ替え、最大値を求める。 頭文字単位マスタテーブルでどこまで使ったか、 か 頭文字単位に集約で最大値を求めるもの、 が必要では?。 999までいったとき001(か000)からになる仕掛けもいるでしょう。
お礼
コメントありがとうございました。 今回は違う方法をとらせていただきますが、この内容も十分に勉強して理解したいと思います。 ありがとうございました。
- nicotinism
- ベストアンサー率70% (1019/1452)
例えば・・標準モジュールにこんなのを作って Function nextID(fld As String, tbl As String, str As String) As String Dim t1 As Variant t1 = DMax(fld, tbl, fld & " like '" & str & "*'") t1 = Mid(t1, 2) + 1 nextID = str & Format(Nz(t1, 1), "000") End Function フォームの、商品IDフィールドの更新後処理に Private Sub 商品ID_afterUpdate() Me!商品ID = nextID("商品ID", "テーブル名", Me!商品ID) End Sub とすれば 商品IDフィールド で 『あ』とだけ入力すれば あ001、あ002 と続きます。 「防水ゴムキャップ」などは、「ボ」ではなく、「ゴ」の部類にしたい ↑この辺は入力者に覚えておいてもらわんと・・ PS. 未検証なので、ご参考までに。エラー処理も入れてませんし・・。
補足
まずモジュールのに上記のものを作成しました。 フォームの更新処理後にプログラムを実行って。。。 どうやってやるんですか? 質問ばかりですみません・・・VBAもう少し勉強しないと会話成立しないですかね。。。ほんとにすいません><
- layy
- ベストアンサー率23% (292/1222)
「一覧表で何番まで作ったか」の一覧そのものをテーブルにすれば、採番マスタです。 商品情報から、そのマスタを見て次に使える番号と何番分がわかれば、使った後に次回使える番号にしておく更新。ソート用キーもこのマスタに保持。 棚卸し後は1からならそういうのも考慮。 採番マスタ作る、が浮かびます。 検索はDLOOKUP関数でもクエリでもよさそう。
補足
それは頭文字ごとにつくるってことですか? ちょっとこの説明だけでどういったものを作ったら良いのかがピンとこないです。。。 設計図がみえてこないのですが・・・ もう少し細かく教えていただけますか??
お礼
すごい!!出来ました!! プロパティに更新後処理なんてものがあるのすら知りませんでした。。。 もう少し自分でもアクセスの勉強が必要なのも痛感しました。 参考のURLで是非勉強させていただきます。 今回は本当にありがとうございました。