[AccessD] storing last item on the page

jwcolby jwcolby at colbyconsulting.com
Fri Nov 9 06:16:02 CST 2007


A.D.

An array can store a control just as easily.  And yes, you need to be aware
of what you are storing, since if you store a control a number of things can
occur that can be confusing.  For example, if you store a control, the value
of the control can change between when you stored that control and when you
use it, and in fact can continue to change as long as the collection is
stored.  OTOH, if you store the control's VALUE then that value is captured
in time, and while the control may continue to change, it's value back when
it was stored will still be available.  It really depends on what you need
to do, but you definitely need to keep this in mind.


John W. Colby
Colby Consulting
www.ColbyConsulting.com 
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of A.D.TEJPAL
Sent: Friday, November 09, 2007 2:49 AM
To: Access Developers discussion and problem solving
Cc: A.D.TEJPAL
Subject: Re: [AccessD] storing last item on the page

    You have not given any reason as to why you wish to avoid array based
solution. Apparently, you are keen to implement collection based solution as
an alternative.

    In your second post, describing the unsuccessful attempt to work out
collection based solution, you stated  "I'm clueless -- I have no idea
what's happening here." It is observed that the following factors are
contributing to the problem:

    1 - You have landed into an interesting pitfall typical of collections.
Whenever a collection's Add method is used, you have to be careful as to
what exactly is being added. If you use the syntax  col.Add Me.MyControl, it
becomes a collection of control objects. For making it a collection of
control contents, you have to use Value property of the control.

    2 - Page Footer is the appropriate place to grab a value from last
record of detail section and add it to the collection. You are wrongly using
Page Header for this purpose.

    3 - You are using Page Footer to assign a value (from collection) to
txtHeaderLast. In view of the nature of forward time flow during report
execution, the effect of such assignment materializes only on the next page.
This defeats the very purpose of building a collection of last values in
forced first pass of formatting. The proper place for making such an
assignment is Page Header (preferably its print event, as by then, building
up of collection during prior formatting pass, is complete).

    Sample code in report's module, as given below, demonstrates collection
based solution. All the four controls (TxtHeaderFirst, TxtHeaderLast,
TxtFooterFirst, TxtFooterLast) are unbound. In the sample code, "Title" is
the name of control in detail section whose first and last values are
required to be displayed in page header as well as footer. You can
substitute the name of actual control in your report, suitably.

A.D.Tejpal
------------

Code in report's module
'==================================
' Declarations section
Private col As New Collection
'---------------------------------------------------

Private Sub PageFooterSection_Format(Cancel _
                    As Integer, FormatCount As Integer)
    
    Me.TxtFooterLast = Me.Title
    
    If Me.Pages = 0 Then
        col.Add Me.Title.Value, CStr(Me.Page)   ' (A)
    End If
    
    ' Caution - There is a potential pitfall here.
    '                In statement (A), while adding items to
    '                collection, Value property of the control
    '                in question MUST be used. Otherwise,
    '                it will become a collection of control
    '                objects (not the contents as intended),
    '                leading to weird results.
End Sub
'---------------------------------------------------

Private Sub PageHeaderSection_Format(Cancel _
                    As Integer, FormatCount As Integer)
    Me.TxtHeaderFirst = Me.Title
    Me.TxtFooterFirst = Me.Title
End Sub
'---------------------------------------------------

Private Sub PageHeaderSection_Print(Cancel _
                        As Integer, PrintCount As Integer)
    Me.TxtHeaderLast = col(CStr(Me.Page)) End Sub
'---------------------------------------------------

Private Sub Report_Close()
    Set col = Nothing
End Sub
'==================================

  ----- Original Message -----
  From: Susan Harkins
  To: Access Developers discussion and problem solving
  Sent: Wednesday, November 07, 2007 18:11
  Subject: Re: [AccessD] storing last item on the page


  I'm not convinced an array is necessary -- I've seen that solution. Have
you
  seen the collection solution I tried and posted late last night?

  Susan H.
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com




More information about the AccessD mailing list