こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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_受注一覧の閲覧ができます。

ご不明な点等ありましたら、ご連絡ください。
よろしくお願いします。

投稿日時 - 2018-03-14 10:36:05

QNo.9477830

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.11

説明の流れがそれますので、こちらにしました。
反応早くなりましたね
Accessはナビ機能が良いのでやりやすいです。
もう少し後でと思っていましたが、自分が参考にしているサイトです。
簡単な使用例があり、コピペも可能なのでありがたいです。
サイトは
http://www.geocities.jp/cbc_vbnet/top/nyumon.html

投稿日時 - 2018-03-21 22:54:03

ANo.10

1.ACCESSファイルの新規作成
 【ACCESSのアイコンをダブルクリック】→【空のデータベース】
 →【ファイル名入力】→【保管フォルダ選択】→【作成】
以上でシステムのファイルの出来上がりです。
この中にテーブル等を定義していきます。
プロフィールという言葉をご存知ですか
ここではシステム内で共通して参照する項目とご理解ください。
テーブル1の定義画面になっていますね せっかくですから
プロフィールの項目を作成してみましょう
→【クリックして追加】→【短いテキスト】→【システム名と入力】
→【クリックして追加】→【短いテキスト】→【〒と入力】
→【クリックして追加】→【短いテキスト】→【会社名と入力】
→【クリックして追加】→【短いテキスト】→【住所と入力】
→【クリックして追加】→【短いテキスト】→【電話番号と入力】
→【クリックして追加】→【数値】→【期初月と入力】
→【テーブル1の右上角の✖】→【はい】→【プロフィールと入力】→【OK】
以上でこの章はは終わりですが、プロフィールの細部はテーブルの章で触れます

投稿日時 - 2018-03-19 23:55:02

ANo.9

承知しました。
自分は2000年(平成12年)に定年退職し、以降年金生活に入りました。
本も何冊か買いましたが、学習は長続きしませんでしたので我流になります。
よろしければお手伝いさせていただきます。
予定は次のように考えております。
1.ACCESSファイルの新規作成
2.テーブル
3.クエリー
4.フォーム
5.レポート
教材はこのQのシステム構築にします。
このシステムの名前を決めて下さい
また お使いのACCESSのヴァージョンを教えてください。
長期になりますので、これだけの内容を一つのQでOKWAVEの事務局で許してもらえません。
途中何回か新規のQを立ち上げて頂くことになります。

では ACCESSファイルの新規作成についてのQを新規に立ち上げて下さい。

投稿日時 - 2018-03-19 18:22:19

お礼

回答ありがとうございます。
また、ご教示いただけるということで本当に感謝しております。

新規に質問を立ち上げましたので、どうぞよそしくお願いいたしますm(_ _)m

投稿日時 - 2018-03-19 22:48:45

ANo.8

質問された管理番号を質問内容に沿って取得するようにしてみました。
少し、T_受注一覧のありように疑問の点がいくつかあったり、ほかにも
いくつかありますが、それはさておいて以下の設定で確認してみてください。

新規でフォームを用意します。F_受注登録というものがあるようですが
どのような構造のフォームなのかわからないので、ここでは一応管理番号の取得の仕方についての説明としています。

コードの内容はコード中にコメントしてあります。

(1)
フォームに、T_自社、T_部署、T_顧客をもとにコンボボックスを設定します。
以下はそれぞれ三つのコンボボックスの主なプロパティの内容です。列幅
については適当にその幅を調整してください。
なお、コンボボックスの値集合ソースに設定するテーブルのフィールドの
並びは、最初に自社番号、部署番号、顧客番号がそれぞれのテーブルの
最初にくるものとします。理由はコード中にMe!cob自社.Column(0)のように
コンボボックスに設定しいるデータを取り出すのに最初のフィールドの
データを取得するためです。(わかりにくいかもしれませんが)

名前      cob自社
値集合ソース  T_自社
列数      2
列幅      1cm;4cm
連結列     2

名前      cob部署
値集合ソース  T_部署
列数      2
列幅      1cm;4cm
連結列     2

名前      cob顧客
値集合ソース  T_顧客
列数      2
列幅      1cm;4cm
連結列     2


(2)
フォームにテキストボックスを一つ設定します。管理番号を表示するので
幅は適当にとってください。

名前      tx管理番号

ラベルは管理番号とでもしておいてください。
なお、F_受注登録に管理番号を入れるテキストボックスが
あると思いますが、この回答はそのままテキストボックスの
名前を変えれば管理番号が設定できます。


(3)
フォームにボタンを一つ設定します。

名前     cmd管理番号設定
標題     管理番号設定

としておきます。


(4)
標準モジュールに以下を貼り付け保存してください。

Function funcReturnKey(ByVal strTarget As String) As String
funcReturnKey = Left(strTarget, Len(strTarget) - Len(Split(strTarget, "-")(2)))
End Function


Function funcReturnEdaban(ByVal strTarget As String) As String
funcReturnEdaban = Mid(strTarget, InStrRev(strTarget, "-") + 1)
End Function



(5)
フォームのボタンのクリック時のイベントで以下を設定します。
なお、DAOを使いますのでコード表のツール、参照設定から
DAOを参照するために
   Microsoft DAO XXXObject Library
にチェックが入っているか確認してください。XXXは数値でそれぞれの
Accessのバージョンによって違いますが。これにチェックが入っていないと
エラーが生じます。チェックをいれたらOKボタンを押してください。


Private Sub cmd管理番号設定_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strKanri As String
Dim strNum As String

If IsNull(Me!cob自社) Then
MsgBox "自社の選択がされていません"
Exit Sub
End If

If IsNull(Me!cob部署) Then
MsgBox "部署の選択がされていません"
Exit Sub
End If

If IsNull(Me!cob顧客) Then
MsgBox "顧客の選択がされていません"
Exit Sub
End If

'フォームのコンボボックスで選択されたものをつなげています。
'strKanriは"MSSF-10001-"のようなかたちの文字列になります。枝番のみの除いたようなかたちです。
strKanri = Me!cob自社.Column(0) & "-" & Me!cob顧客.Column(0) & Me!cob部署.Column(0) & "-"
''少し面倒ですが、枝番のみを取り出しその最大値を取得するという方法。
strSQL = "SELECT Max(funcReturnEdaban([管理番号])) AS 最大枝番 FROM [T_ 受注一覧] WHERE (([T_ 受注一覧].[管理番号]) Like '" & funcReturnKey(strKanri) & "*');"

Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)

If rs.RecordCount > 0 Then
If Not IsNull(rs!最大枝番) Then
Me!tx管理番号 = strKanri & CStr(CLng(rs!最大枝番) + 1)
Else
Me!tx管理番号 = strKanri & "1"
End If
Else
Me!tx管理番号 = strKanri & "1"
End If

rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub




わからないことがあれば補足してください。

投稿日時 - 2018-03-19 11:06:38

補足

質問内容に沿って、丁寧なご回答本当にありがとうございます。
Access初心者のため、また理解力不足もあり、頭の中がぐちゃぐちゃになってしまい、何から手を付けていいのかわからなくなってしまいました。Accessでのシステム作りは本当に難しいです。心が折れそうです・・・

ご無礼を承知で一から、システムの構築をご教示いただけませんか(;O;)

投稿日時 - 2018-03-19 16:04:43

ANo.7

回答No.6のテーブル構成で
T_顧客をレコードソースとして顧客登録 フォーム
T_部署をレコードソースとして顧客登録部署サブ フォーム
T_お客様をレコードソースとして顧客登録お客サブ フォーム
を作成し、2段のサブフォーム持つフォームを作成しました。
いかがですか?
・顧客名は読み順になっています
・ID及び○○IDが画面に見つかりません。
 IDのデータ型をオートナンバーにし、リレーションシップ定義で
 No.の管理から解放されました。 

投稿日時 - 2018-03-19 00:31:37

補足

回答ありがとうございます。

テーブル構成や顧客登録フォームの作成本当にありがとうございます。
他の回答者様のご意見等も一通り読ませていただきましたが、理解力不足もあり、頭の中がぐちゃぐちゃになってしまい、何から手を付けていいのかわからなくなってしまいました。Accessでのシステム作りは本当に難しいです。心が折れそうです・・・

ご無礼を承知で一から、システムの構築をご教示いただけませんか(;O;)

投稿日時 - 2018-03-19 16:02:48

ANo.6

Qの内容を参考にしてテーブル構成のモデルを作成しました。
図で各テーブルに主キーのIDがついています。
・テーブル作成時にACCESSから提言されるものです。
 これを「はい」で受け入れます
 リレーションの主になる項目です
・各テーブルに○○IDがありますがこれはリレーションの副になる項目です
 データ型を主キーと同じ数値型にします
 必ず主テーブルをフィールドの第2プロパティーのルックアップでコンポボックスにします
 流れは
【○○ID】→【ルックアップ】→【表示コントロールの右端】
→【コンポボックス】→【値集合ソースの右端】→【○○】→【列数を2】
→【表示幅を0】→【リスト行数任意】
・各テーブルのフリガナはコンポボックスのプルダウンリストを
 読み順にするための用意です。
 テーブルデザイン時にフリガナの右端クリックで作成します
・このテーブル構成でお客様が確定すると顧客部署、顧客のフィールドを
 芋づる式に参照出来ます
 -----------------------------------------------------------------------------------
T_自社の自社名のMSSFとMSSTは製造ラインのことですか

投稿日時 - 2018-03-18 22:41:00

ANo.5

【追加補足】今のテーブル設計ではシステムは開発不能。

テーブルですが、3つのグループに分けて設計します。

グループ1、システム・テーブル。
グループ2、マスター・テーブル。
グループ3、データ・テーブル。

で、マスターテーブルですが、現状では、ほとんど未完ですね。

【顧客台帳】

ID・・・・・01(主キー)
区分・・・・・01
名前・・・・・鈴木 一郎
読み・・・・・すずき いちろう
備考・・・・・顧客番号等

※区分名は、システム・テーブルを参照
※顧客番号で【顧客台帳】を検索・参照する仕組みは不要。
 【顧客台帳】の検索・参照は、[読み]で行う。


【社員】

ID・・・・・01(主キー)
昇順・・・・・01
社員コード・・01
名前・・・・・田中 健一
読み・・・・・たなか けんいち

※社員コードではなく主キーでリレーション
※列[ID]ではなくて列[昇順]で昇順表示する

 質問者の設計には、【顧客台帳】【社員】のマスターテーブルにはリレーションシップを実現するための主キー列[ID]がありません。Accessは、リレーショナル・データベースでのので、この不具合は致命的ですよ。

【受注台帳】(主表)

ID・・・・・・・・01(主キー)
受注日・・・・・・・2018/01/01
顧客台帳_ID・・・01←顧客名は【顧客台帳】参照
社員_ID・・・・・01←社員コードではなく【社員】.[ID]

【受注明細】(従表)

ID・・・・・・・・01(主キー)
受注台帳_ID・・・01
行番号・・・・・・・01←サブフォームの表示順を制御する列
明細データ1
明細データ2
・・・・・

 データ・テーブルも未完ですよ。通常は、このように主表と従表とで設計します。また、そこには[顧客名]とか[担当者]とかの列はありません。その代わり[顧客台帳_ID][社員_ID]とかが存在します。

《【受注台帳】と顧客情報の入力要領》

  顧客名:[01][鈴木 一郎]

 こういう入力フォームを仮定すると。[01]が未入力あるいは消去されると《顧客入力フォーム》を開きます。そして、顧客の読みを入力して【顧客台帳】より[ID]を入手。確定ボタンを押すと受注入力フォームの[顧客台帳_ID]を更新します。受注入力フォームは、顧客名表示欄に[顧客台帳.名前]を参照・表示します。

と、つらつら書きましたが、これで木で鼻を括ったような自動採番に関する答えの意味をご理解下さい。つまり、管理番号云々という発想は、そもそも必要ないということです。

 まあ、IT業界とは無縁のド素人の意見。適当に流し読みされて下さい。

投稿日時 - 2018-03-18 00:48:11

補足

回答ありがとうございます。

ご指摘の通り、管理番号自動付番という発想に難があるのかもしれませんね・・・

数日間、皆さんの回答と睨めっこしましたが、理解力不足で、さらに頭の中がぐちゃぐちゃになってしまいました。Accessでのシステム作りは本当に難しいです。心が折れそうです・・・

ご無礼を承知で一から、システムの構築をご教示いただけませんか(;O;)

投稿日時 - 2018-03-19 15:58:41

ANo.4

受注一覧の管理番号を MSS区分、顧客番号、部署番号、枝番と分解して
クエリーで管理番号を定義することは出来ますが
枝番の管理が「MSS区分、顧客番号、部署番号」のグループ毎にしなければならず
これを自動にするにはグループ毎の枝番の最大値を計算する仕組みが必要になります
手作業で管理するにはMSS区分、顧客、部署、のグループの管理シートが必要です

クエリーに管理番号を次のように追加します
管理番号: [MSS区分] & "-" & [顧客番号] & [部署番号] & "-" & [枝番]
添付図参照

管理番号の目的は何ですか
他の人が仰る通り不要と思います
テーブルの組立を1から見直す必要が有ります
例えば、T_受注一覧はT_受注履歴とT_受注履歴明細に分離して、
この二つのテーブルをリレーションシップで関連付けます。

エクセルで作成した仕組みをACCESSに摘要されたのでしょうが
リレーションシップとテーブルデザインで、ルックアップをご理解ください

投稿日時 - 2018-03-17 20:10:34

ANo.3

【補足】採番テーブルのフィールドは?

採番.テーブル名_ID

こんな感じです。

投稿日時 - 2018-03-15 09:20:04

ANo.2

管理番号は「MSSF-10001-1」で1項目としてテーブルに列をつくるのですか?

できれば管理番号-自社番号、管理番号-顧客番号、管理番号-部署番号、管理番号-枝番というように分けたほうがいいかもしれません。
そして、枝番を自動付番したいということですよね?
だとしたら、Accessの機能で自動付番をしてしまうと、顧客ごとの枝番を区別することはできなくなるので、管理単位ごとの枝番を管理する自動付番管理テーブルを別途用意したほうがいいかもしれません。
その場合、モジュールでプログラムを作成しないとダメでしょうね。

F_受注登録に枝番を含む管理番号を表示させる。その時管理番号(4項目を連結して表示)、枝番は管理テーブルから現在の値のMAX値+1を表示させる。
そして、受注登録するときにモジュールで自動付番化管理テーブルに顧客番号をキーとして枝番の最新をUPDATEで更新する。

と、私ならそうします。


クエリとかフォームにテーブル/クエリーをリンクさせて各テキストボックスに列を割り当てた作り方だと複雑なことは出来ません。
自動付番というのはGROUP BYごとに別管理ではなくTABLE単位での付番となってしまうはずです。
だから、管理上の区分ごとに1からインクリメントさせたい場合はプログラムを組むしかないはずです。

テーブル設計が雑すぎると後々管理項目が増えたときにものすごく苦労することになります。
最悪イチから作り直しで、今まで入力したデータが使い物にならない可能性もあるのでよ~く考えてください。
一度失敗して作り直す羽目にならないとそのへんは理解しづらいところでもあるんですけどね(笑)
で、そのへんのことは有料の講習会とかに参加しても手ほどきしてもらえない部分です。
講習会というのは考え方を学ぶだけと思いましょう。
設計に関するところを教えて貰うくらいなら素直に外部に委託したほうがいいです。

投稿日時 - 2018-03-14 12:58:46

補足

回答ありがとうございます。

>>管理番号は「MSSF-10001-1」で1項目としてテーブルに列をつくるのですか?
そうです。

>>そして、枝番を自動付番したいということですよね?
そうです。

>>F_受注登録に枝番を含む管理番号を表示させる。その時管理番号(4項目を連結して表示)、枝番は管理テーブルから現在の値のMAX値+1を表示させる。
管理テーブルのフィールドは、どのようなものになりますか。また、MAX値+1を表示させるにはどうすればよいですか。

>>そして、受注登録するときにモジュールで自動付番化管理テーブルに顧客番号をキーとして枝番の最新をUPDATEで更新する。
どのようなプログラムを組めばよいですか。

よろしくお願いいたします。

投稿日時 - 2018-03-14 13:45:21

ANo.1

Q、自動採番の方法?
A、私的には、採番テーブルを利用します。

が、

MSSF-10001-1
MSSF-10001-2

などという管理番号を自動採番することはないと思いますよ。また、かかる管理番号を生成し利用するって発想そのものに疑義ありですね。

投稿日時 - 2018-03-14 10:53:50

補足

回答ありがとうございます。

>>A、私的には、採番テーブルを利用します。
採番テーブルのフィールドは、今回の質問に当てはめるとどうなりますか。

投稿日時 - 2018-03-14 13:35:58