Solved

Count records in a recordset (VBA)

Posted on 2001-09-03
9
671 Views
Last Modified: 2012-09-13
I have a recordset called rsMerge in my code and I want to get the number of records in that recordset so that I can do a test.

If the number of records is 1 the program flow will be different, and if more than 1 then the flow will be different.

I have tried using .MoveLast and .RecordCount but this is extremely slow, and I have 300,000 records to process.

I need something much faster! Please can anyone help?
0
Comment
Question by:naqayya
9 Comments
 
LVL 12

Expert Comment

by:Paurths
ID: 6450942
hi nagayya,

have u tried to only use rsMerge.Movenext ? (should work)


or else u could use the DCount-function:
var = DCount("SomeField","YourTable","SomeField = Criteria")

hope this helps,
Ricky
0
 

Author Comment

by:naqayya
ID: 6450995
thanks Ricky,

sorry, i don't understand how to use rsMerge.Movenext to count the number of records in rsMerge. Could you please explain?

Thanks.
0
 

Author Comment

by:naqayya
ID: 6451053
Ricky,

the DCount function does not work with recordsets, only tables or queries.

Here is the code i am using:

With rsMerge
                .MoveLast
               
                If .RecordCount = 1 Then
                    CurrentDb.Execute "INSERT INTO tblDonationAllocations_New VALUES (" & !DonationID & ",'" & !DonationType & "','" & !DonationDetails & "'," & !Amount & ",'" & !PayMethod & "','" & !AppealCode & "','" & !OnBehalfOf & "');"
                    CurrentDb.Execute "INSERT INTO tblDonationAllocations_Done VALUES (" & !Serial & ");"
                   
                ElseIf .RecordCount > 1 Then
                    .MoveFirst
                    SumAmount = 0
                    Do While Not .EOF
                        CurrentDb.Execute "INSERT INTO tblDonationAllocations_Done VALUES (" & !Serial & ");"
                        SumAmount = SumAmount + !Amount
                        .MoveNext
                    Loop
                    CurrentDb.Execute "INSERT INTO tblDonationAllocations_New VALUES (" & myDonationID & ",'" & myDonationType & "','" & myDonationDetails & "'," & SumAmount & ",'" & rsAllDonAlloc!PayMethod & "','" & rsAllDonAlloc!AppealCode & "','" & myOnBehalfOf & "');"
                End If
                .Close
            End With


Any more suggestions? Thanks.
0
Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

 
LVL 12

Accepted Solution

by:
Paurths earned 100 total points
ID: 6451067
hi ngayya,

yes, the dcount only works with tables and queries.
That is what i meant.

on the other hand, concerning the movenext:
replace :
.MoveLast
by
.MoveNext



With rsMerge
               .MoveNext
               
               If .RecordCount = 1 Then
                   CurrentDb.Execute "INSERT INTO tblDonationAllocations_New VALUES (" & !DonationID
& ",'" & !DonationType & "','" & !DonationDetails & "'," & !Amount & ",'" & !PayMethod & "','" & !AppealCode
& "','" & !OnBehalfOf & "');"
                   CurrentDb.Execute "INSERT INTO tblDonationAllocations_Done VALUES (" & !Serial & 
");"
                   
               ElseIf .RecordCount > 1 Then
                   .MoveFirst
                   SumAmount = 0
                   Do While Not .EOF
                       CurrentDb.Execute "INSERT INTO tblDonationAllocations_Done VALUES (" & !Serial
& ");"
                       SumAmount = SumAmount + !Amount
                       .MoveNext
                   Loop
                   CurrentDb.Execute "INSERT INTO tblDonationAllocations_New VALUES (" & myDonationID
& ",'" & myDonationType & "','" & myDonationDetails & "'," & SumAmount & ",'" & rsAllDonAlloc!PayMethod
& "','" & rsAllDonAlloc!AppealCode & "','" & myOnBehalfOf & "');"
               End If
               .Close
           End With


0
 
LVL 12

Expert Comment

by:Paurths
ID: 6451077
example for the DCount:

assuming the sql-statement for the rsMerge is like this:

set rsMerge= db.openrecordset("Select Field1, Field2 from YourTable where Field3 = 'YourCriteria';")


then u can use the dcount like this:

var = DCount("Field1","YourTable","Field3 = 'YourCriteria'")

var will now hold the value of the amount of records found.
0
 
LVL 9

Expert Comment

by:perove
ID: 6451087
..or you could check if there is on ore more record by
1 Go to first record
2.Go on record forward and siee if EOF=true




Function testing()
Dim rs As Recordset
Dim db As Database

Set db = CurrentDb
Set rs = db.OpenRecordset("table1")

If rs.BOF Then 'check if no records
    MsgBox "no records at all"
    Exit Function
End If

rs.MoveFirst 'go to frist
rs.MoveNext 'go to second
  If rs.EOF Then  'check if one record
     MsgBox "1 records only in this recordset"
     Exit Function

End If
 


End Function
0
 
LVL 54

Expert Comment

by:nico5038
ID: 6451152
Hi all,

Just miss in the Q and comments the "empty" situation or no records at all.
I guess the code for filling the recordset is also like:
set rsMatch = dbcurrent.openrecordset("SELECT ... FROM ... WHERE X=" & intX & ";")

To speed thing up you are better off with defining a query like:
"SELECT ... FROM ... WHERE X= [parameter];"
This query can be "compiled" by access on forehand and will thus execute faster. You will need to specify the parameter in the code..

perove's .movenext is also faster as a movelast, but when the number can be one, then the total won't be that enormous too, that's why the slow response looks odd.
I guess the .movelast won't differ much as the prime selection will be the most time consuming. Jusrt use the single step mode to execute your code and you get a first impression where the time is consumed....

And check for EOF & BOF to make sure records are there.

Nic;o)
0
 
LVL 12

Expert Comment

by:Paurths
ID: 6451174
yep,

movenext is faster than movelast,
as i commented in the first post

:-)
Ricky
0
 

Author Comment

by:naqayya
ID: 6451340
Solved the problem using .MoveNext and (mainly) setting indexes on the main table.

Thanks.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction When developing Access applications, often we need to know whether an object exists.  This article presents a quick and reliable routine to determine if an object exists without that object being opened. If you wanted to inspect/ite…
Overview: This article:       (a) explains one principle method to cross-reference invoice items in Quickbooks®       (b) explores the reasons one might need to cross-reference invoice items       (c) provides a sample process for creating a M…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…
Using Microsoft Access, learn some simple rules for how to construct tables in a relational database. Split up all multi-value fields into single values: Split up fields that belong to other things into separate tables: Make sure that all record…

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question