Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsFormsForms ProgrammingQueriesModules / DAO / VBAReports / PrintingMacrosDatabase DesignSecurityConversionImporting / LinkingSQL Server / ADPMultiuser / NetworkingReplicationSetup / ConfigurationDeveloper ToolkitsActiveX ControlsNew UsersGeneral 1General 2
Access DirectoryToolsTutorialsUser Groups
Related Topics
SQL ServerOther DB ProductsMS OfficeMore Topics ...

MS Access Forum / Modules / DAO / VBA / November 2006

Tip: Looking for answers? Try searching our database.

find X sequential values in a table

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
gewern - 09 Nov 2006 21:11 GMT
I have very minimal VBA skills...  Given a table of about 50,00 records, I am
trying to identify whenever at least x (in this case, at least 5) sequential
values in the field (check_number) occur in the existing table and whenever
these values are identified, write these values to another/new table in the
same database.   The check_number field is always a unique value & the table
is sorted asending by check_number.  Any help would be appreciated...
SteveS - 13 Nov 2006 07:43 GMT
What is the name of the table with 50,000 records?
Is the field name [check_number]?

What is the name of the other table?
Is the field name [check_number]?

Is the [check_number] field type Text or Numeric (long integer)?

Signature

Steve S
--------------------------------
"Veni, Vidi, Velcro"
(I came; I saw; I stuck around.)

> I have very minimal VBA skills...  Given a table of about 50,00 records, I am
> trying to identify whenever at least x (in this case, at least 5) sequential
> values in the field (check_number) occur in the existing table and whenever
> these values are identified, write these values to another/new table in the
> same database.   The check_number field is always a unique value & the table
> is sorted asending by check_number.  Any help would be appreciated...
SteveS - 20 Nov 2006 18:51 GMT
I see that you have a solution using a query (SQL), but since I wrote code to
do the same thing, I will go a head and post it.

I have the code in a standard module... but you could put a button on a form
and paste the code in the click event.

In the code, you must change the table names to your table names. Look for
comment lines like this

  '#######################################

The table that has the check numbers I named "tblChecks". There is one place
to change it.

> these values are identified, write these values to another/new table in the

The another/new table I named "tblSequences". Change it in two places. This
table's records are deleted each time the code runs

These two tables must have a field named  "check_number" of type Number -
Long Integer.

I also created a third table, "tblSeries", that has the starting number,
ending number and length of the series. It is a little easier to see the
series.

Table "tblSeries" has fields:

ID  -  autonumber
lngSeqStart - number - long
lngSeqEnd - number - long
lngSeqLen - number - long

The records in table "tblSeries" also are deleted and recreated each time
the code  runs.

To change the length of the series to look for (ie 7 instead of 5), look for
these lines:

  '******************
  'set this to min numbers that must be in sequence
  MinSequence = 5
  '******************

And you must have a reference set to MS DAO 3.6 Object Library.

I tested this a little on a small mdb I made. Note - there is minimal error
checking.

Here is the code:
(Watch for line wrap!!)

'------beg code----------
Public Sub ChkSequence()
  On Error GoTo MyBad

  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim rs1 As DAO.Recordset

  Dim strSQL As String

  Dim MinSequence As Integer

  Dim i As Long
  Dim k As Long

  Dim lngNum1 As Long
  Dim lngNum2 As Long
  Dim lngSequencesFound As Long
  Dim lngSequenceStart As Long

  '******************
  'set this to min numbers that must be in sequence
  MinSequence = 5
  '******************

  lngSequencesFound = 0
  k = 0
  i = 0

  Set db = CurrentDb

  '##############################################
  '  Change tables names after 'FROM' to your table names
  '  1 place  tblChecks
  '  2 places tblSequences
  '
  'these tables must have a field names 'check_number'
  '
  '##############################################

  'clear dup table
  db.Execute "Delete FROM tblSequences", dbFailOnError

  db.Execute "Delete FROM tblSeries", dbFailOnError

  'open source table
  Set rs = db.OpenRecordset("Select [check_number] FROM tblChecks Order By
[check_number]")
  'open copy to table
  Set rs1 = db.OpenRecordset("Select [check_number] FROM tblSequences Order
By [check_number]")

  '##############################################
  '##############################################

  rs.MoveFirst

  lngNum1 = rs.Fields(0)
  lngSequenceStart = lngNum1
  rs.MoveNext

  Do While Not rs.EOF
     lngNum2 = rs.Fields(0)
     If lngNum2 = lngNum1 + 1 Then
        'number is in sequence
        k = k + 1
        lngNum1 = lngNum2
     Else
        'break in sequence
        If k >= MinSequence Then
           For i = 0 To k - 1
              rs1.AddNew
              rs1!check_number = lngSequenceStart + i
              rs1.Update
           Next i
           strSQL = "Insert Into tblSeries (lngSeqStart, lngSeqEnd,
lngSeqLen)"
           strSQL = strSQL & " Values (" & lngSequenceStart & ", "
           strSQL = strSQL & lngSequenceStart + k - 1 & ", "
           strSQL = strSQL & k & ")"
           db.Execute (strSQL)
           lngSequencesFound = lngSequencesFound + 1
        End If
        lngNum1 = lngNum2
        lngSequenceStart = lngNum1
        k = 1
     End If

     rs.MoveNext

  Loop

  If k >= 5 Then
     For i = 0 To k - 1
        rs1.AddNew
        rs1!check_number = lngSequenceStart + i
        rs1.Update
     Next i
     strSQL = "Insert Into tblSeries (lngSeqStart, lngSeqEnd, lngSeqLen)"
     strSQL = strSQL & " Values (" & lngSequenceStart & ", "
     strSQL = strSQL & lngSequenceStart + k - 1 & ", "
     strSQL = strSQL & k & ")"
     db.Execute (strSQL)

     lngSequencesFound = lngSequencesFound + 1
  End If

MyBad:
  If Err.Number > 0 Then
     MsgBox Err.Number & "  " & Err.Description
  End If

  rs.Close
  rs1.Close

  Set rs = Nothing
  Set rs1 = Nothing

  MsgBox lngSequencesFound & " sequences found."

End Sub
'------end code----------

HTH
Signature

Steve S
--------------------------------
"Veni, Vidi, Velcro"
(I came; I saw; I stuck around.)

> I have very minimal VBA skills...  Given a table of about 50,00 records, I am
> trying to identify whenever at least x (in this case, at least 5) sequential
> values in the field (check_number) occur in the existing table and whenever
> these values are identified, write these values to another/new table in the
> same database.   The check_number field is always a unique value & the table
> is sorted asending by check_number.  Any help would be appreciated...
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.