2016-10-31 7 views
0

私はMS Accessで新しくなっています。現在私はシリアル番号、サブオートナンバーを持つオートナンバーペアを作成する必要があります。 M1-1、M1-2、M1-3、... M2-1、M2-2、M2-3、... M3-1、M3-2、...のようなものです。番号は一意でなければなりません。 M1、M2、M3などのメイン実行番号のテーブルを作成しました。一意にするためのインデックスを作成します。次に、サブナンバー1,2,3,4、...の後に別のテーブルを作成した後、MainNumの外部キー(リレーションシップ)と別のインデックスを使用して一意にします。 しかし、問題は2番目のテーブルです。それはそれ自体が繰り返される可能性があるため、オートナンバー/ランニングナンバーにする方法がわかりません。MS Access - サブオートナンバーでオートナンバーを生成する方法

現在のところ、考えられない場合は、何か助けが必要です。

答えて

0

テーブルのプライマリ/外部キーとしてシリアル番号を使用しないことをお勧めします。これには、プライマリの自動番号と外部の番号の数値フィールドを使用します。より速く自動的に動作します。

シリアル番号を生成するには、引数に応じて次の値またはオプションで現在の値を返すpublic関数を作成します。シリアル番号の第1部と第2部の現在の値はテーブルに格納され、新しい番号を生成するときにロックされ、マルチユーザ環境でも次のユニークな番号が保証されます。また、生成されたすべての数値を両方の数値に複合一意索引を使用してテーブルに格納することもできます。

+0

最初のテーブルにはプライマリオートナンバーと外人用の番号があります。 pubilc関数でシリアル番号を生成する方法を2番目のテーブルですか?あなたは "それをロックする"と言います、どのように正確に番号をロックする? – KokJoo89

0

あなたのPKを自動番号にして、それを関係に使用します。シリアル番号には、2つのロング整数フィールド(SN1、SN2)を使用します。あなたのフォームのbefore_updateイベントでは、新しいレコードのために、新しい 'シリアル番号'を生成するpublic関数を呼び出します。

Private Sub Form_BeforeUpdate(Cancel As Integer) 
Dim lngSN1 AS Long 
Dim lngSN2 as Long 
If Me.NewRecord Then 
'if SN1 is not to be incremented, set it here to whatever you want 
If GetSerials(SN1, SN2) Then 
Me!SN1 = lngSN1 
Me!SN2 = lngSN2 
Else 
Cancel = True 
End If 
End If 
End Sub 

Public Function GetSerials(ByRef SN1 as Long, ByRef SN2 as Long) AS Boolean 
If SN1 = 0 Then 
SN1 = Nz(DMax("SN1","<yourTable>"), 0) + 1 
SN2 = 1 
Else 
SN2 = DMax("SN2", "<yourtable>","SN1=" & SN1) + 1 
End IF 
GetSerials = True 
End Function 

計算されたフィールドを使用してクエリを作成し、複合 'SerialNumber'を作成します。

SELECT *, "M" & SN1 & "-" & SN2 as SerialNumber FROM <yourtable> 

このクエリは、SerialNumberを表示する場所で使用します。

関連する問題