0

ユーザーがそのフォームに入力した内容を送信するたびに、契約番号を生成するフォームがあります。これは例の番号です:

00001/ABC/DEF/01/2013

シーケンス番号は「00001」で示されます。これは、同じ年にそれを提出した次のユーザーが次の番号「00002」を取得することを意味します。これを処理するために、送信ボタンで次のコードを使用します。

Dim strSQL As String, cNumber As Integer
strSQL = "SELECT TOP 1 Contract_No FROM T_Report WHERE Year=2013 ORDER BY Contract_No DESC "
Set rs = Db.OpenRecordset(strSQL)

If rs.RecordCount > 0 Then
    cNumber = Left(rs!Contract_No, 5) + 1
Else
    cNumber = 1
End If

ユーザーが別の時間に送信すると、正常に機能します。この問題は、2 人以上のユーザーが同時に生成した場合に発生します。たとえば、userA と userB が一緒にボタンをクリックすると、'00001' と '00001' が返されます。私が望むのは、別のユーザーが「00002」、「00003」などを取得することです。誰でも私を助けてもらえますか?

4

1 に答える 1

0

ここでやろうとしているのは、「契約番号」フィールドに「意味」を格納することです。これは一般的に悪い考えであると考えられています。あなたの最善の策は、自動番号フィールドを主キー フィールドとして使用することです。上記のスキームを使用することを主張する場合、基本的に 2 つのオプションがあります (私が考えることができます)。

最初の最良のオプションは、フォームの BeforeUpdate イベントで契約番号を割り当てることです。このようにして、レコードが実際に保存/コミットされたときに割り当てられます。

2 番目のオプションは、契約番号を生成した直後に DoCmd.RunCommand acCmdSaveRecord を実行することです。通常、これはうまく機能しません。これは、設定した検証規則に合格しないフィールドまたはコントロールがある可能性があるためです。

于 2013-08-13T19:29:13.983 に答える