Create Sequential Line numbers Query

I am creating invoices on a Main Form, and Invoice Items on a SUB-FORM.
The user has the ability to add as many line items as they wish, and they have the ability to go back and delete certain lines they have created.  So for example they may have originally added 8 items in the Invoice Detail (8 records), but then went back and deleted the 3rd and 7th items.

The user clicks a button on the main form and the VBA code clears out a TEMP table, then appends this invoice data to that TEMP table (I'm using a temp table so I can get the field names exactly like I want them).   Then it creates an EXPORT CSV file from the TEMP table.

I'm exporting the data to be imported by PeachTree.... PeachTree has several mandatory fields...  one of which is a challenge.

*** Each line item must have a unique sequential number starting at "1"

If I make the field in the TEMP table an AUTONUMBER it doesn't go back to "1" until you compress the file.

Using something like the following works when the records are created on the FORM, in BEFORE UPDATE...;
                   DMax("lineNumber", "tblItemTable", "InvID = xx") +1
But they can become "un-sequential" if the user deletes lines.

Wish there were something as simple as "RECORD COUNT" or "RECORD NUMBER" that I could put in the QUERY.... but assuming there isn't based on my unproductive googling.

Thanks for any help in advance.
Who is Participating?
Helen FeddemaConnect With a Mentor Commented:
You could update the sequential number field in the table, after creating the table for export.  Start with saving 1 to the first record, then incrementing the number by 1 for each subsequent record.

Public Sub SeqNos()

   Dim rst As DAO.Recordset
   Dim lngCounter As Long
   lngCounter = 1
   Set rst = CurrentDb.OpenRecordset("tblTest")
   Do While Not rst.EOF
      rst![SeqNo] = lngCounter
      lngCounter = lngCounter + 1
End Sub

Open in new window

Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:
Somewhat along the lines of what Helen suggested, but:

1. Declare a global long variable.
2. Before executing your query, set that variable to 0.
3. In the query, call a function that takes a field name as an argument.  Increase the count by one and return the value.

   RowCount: GetLineCounter([MyField])

 Doesn't matter which field nor will you do anything with it.  Just needs to be there so the query engine calls the function for each row.

This works best when appending records.   If tied to a form and you move back and forth through the recordset, the numbers will be goofed up.

Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:
I should also add that you can do this with straight SQL assuming each row has a unique value from low to high (you can get a count of all rows prior to the one your on with a subquery), but I find the other technique far faster.

TechGuiseAuthor Commented:
Just got through implementing Helen's suggestion, it worked great.

May try other method Jim when the pain of messing with this for several hours wears off.

Thank You Both!!!
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.