[AccessD] storing last item on the page

A.D.TEJPAL adtp at airtelbroadband.in
Sat Nov 10 00:15:29 CST 2007


John,

    That is exactly the point. The requirement in this particular case was "point of time value as per flow of report execution". Hence the need for ensuring a collection of the then value held by the control and not the control object itself.

    Susan's objective was to store page-wise contents of TxtFooterLast (located in page footer) in a collection. With her original code, each element of this collection happened to become a pointer to the text box TxtFooterLast itself, even though Debug.Print statement did show the correct point of time value (as Value happens to be the default property of a text box control).

    For example, on a three page report, where TxtFooterLast displays "A", "B", "C" respectively on the three pages, the actual collection became:

    TxtFooterLast, TxtFooterLast, TxtFooterLast
    (instead of intended   "A", "B", "C"  as per Debug.Print statement)

Best wishes,
A.D.Tejpal
------------

  ----- Original Message ----- 
  From: jwcolby 
  To: 'Access Developers discussion and problem solving' 
  Sent: Friday, November 09, 2007 17:46
  Subject: Re: [AccessD] storing last item on the page


  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.


More information about the AccessD mailing list