Create A Sequential Number In A SubForm For Each New Header Record
Occasionall you will need to provide a number from 1 to "n", where "n" is the number of detail lines in a sub-form. For example, if you have an application that has a header record for an order, and the subform detail contains each line item ordered, you may want to number the detail lines sequentially starting at 1 for each new order.
Surprisingly, this requires a little code to accomplish this.
To summarize the steps:
(1) If the user inserts a new line, the line number becomes the number of existing sub-form records + 1
(2) If the user edits an existing line, don't change the line number
(3) If the user deletes a line, then renumber the associated records in the source table sequentially and refresh the form.
(4)
There are only two events that need to be processed to accomplish the above goals
Here is a code example behind a sub-form to accomplish this goal:
Program Code
Private Sub Form_AfterDelConfirm(Status As Integer) ' ********************************************************* ' If the user deletes a subform line, renumber all records ' in the source table starting at 1 so there will not ' be any missing sequence numbers ' ********************************************************* Dim db As Database Dim recIn As Recordset Dim strSQL As String Dim intLineNumber As Integer intLineNumber = 0 strSQL = "SELECT tblKilnDetail.KilnDetailID, tblKilnDetail.KilnHeaderID, tblKilnDetail.BatchLineNumber" & _ " FROM tblKilnDetail WHERE tblKilnDetail.KilnHeaderID=" & Me.KilnHeaderID & _ " ORDER BY tblKilnDetail.KilnDetailID;" If Status <> acDeleteOK Then Exit Sub End If Set db = CurrentDb() Set recIn = db.OpenRecordset(strSQL) If recIn.EOF Then Exit Sub End If Do intLineNumber = intLineNumber + 1 recIn.Edit recIn!BatchLineNumber = intLineNumber recIn.Update recIn.MoveNext Loop Until recIn.EOF recIn.Close Set recIn = Nothing Set db = Nothing Me.Requery End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) ' ********************************************************* ' If the user inserts a new detail line, assign the next ' sequential number. If the user was updating an ' existing line item, don't change the sequence number ' ********************************************************* Dim recIn As Recordset Dim lngHighestBatchNumberOnDetail As Long If Not Me.NewRecord Then Exit Sub End If lngHighestBatchNumberOnDetail = 0 Set recIn = Me.Recordset lngHighestBatchNumberOnDetail = recIn.RecordCount + 1 Me.Line = lngHighestBatchNumberOnDetail Set recIn = Nothing End Sub