Problems w/ Report using ADODB.Recordset as Source

O

Oko

I'm currently developing an MS Access Data Project (.adp) in MS
Access
2002.

One of the reports within the DB uses data that is Dynamic and cannot
be stored on the SQL Server. To resolve this, I have created an
ADODB.Recordset in the reports OPEN event, built the necessary
records
inside of it, and then bound the report to this newly created
recordset.


Here's the rub:


It seems that no matter what, it iterates through all of the records
but each record displays the value of the last record. So assuming
one
field named rptName (which is my setup) where there are 4 records
that
say "Oscar", "Dennis", "John", and "Terrance" respectively the report
would return:


Terrance
Terrance
Terrance
Terrance


Obviously this is sub-optimal.


Anyone have any idea what I'm missing and how I can resolve this?


TIA


-j
 
O

Oko

This IS possible. The problem can be solved using the FormatCount
parameter in the report's Detail_Format() event, combined with a
value
stored somewhere to say if you're on the first record or not. When
FormatCount = 1 you should advance the ADODB.Recordset via code
(unless you're on the first record). This will force the report to
iterate through your recordset - giving you the results you need.

To be complete:

The ADODB.Recordset is first created in the Report_Open() event as a
New ADODB.Recordset. This is a temporary recordset residing in local
memory - and not on the SQL Server. The code for the structure is:

Dim rstAttachments As ADODB.Recordset

Set rstAttachments = New ADODB.Recordset
With rstAttachments
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.Fields.Append "rptName", adVarChar, 255
.Fields.Append "delete", adBoolean
.Fields.Append "recNo", adInteger
.Fields.Refresh
.Open
End With

The recordset is then populated - in this case using information in a
series of checkboxes in a user form - and then once populated is
assigned to the report's Recordset property. The original recordset -
rstAttachments - is then set to NOTHING, and the report's recordset
is
moved to the first record (just to be safe).

Set Me.Recordset = rstAttachments
Set rstAttachments = Nothing

Me.Recordset.MoveFirst

In the ReportHeader_Format() Event the Reports Tag Property is set to
0. This allows me to know when I'm in the Detail_Format() event if
I'm
viewing the very first record or not. This is important because I
don't want to advance the cursor if I'm on the first record - only
for
the later records do I want to advance it.

Me.Tag = 0

The final bit is in Detail_Format(). Taking my cue from the value of
FormatCount, I move the record pointer ahead one when FormatCount = 1
- EXCEPT when Me.Tag = 0. When Me.Tag = 0 I ignore the record pointer
and set Me.Tag to 1 so that the next time FormatCount = 1 the routine
will work.

If FormatCount = 1 Then
Select Case Me.Tag
Case 0
Me.Tag = 1
Case Else
With Me.Recordset
.Fields("delete") = True
.MoveFirst
.Find ("delete = False")
End With
End Select
End If


Note that in the above routine I used a slightly paranoid approach. I
marked records off as they were formatted and then traveled back to
the first record and searched for the first, unformatted record. I
have no reason to believe a simple .movenext is insufficient - I'm
just paranoid like that. Also, this may not be the best way to go for
a large recordset.

On a final note, I simply close the recordset once I'm done with it
via the Report_Close() event.

With Me.Recordset
.Close
End With
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top