William Hindman
dejpolsys at hotmail.com
Sat Jan 8 17:06:53 CST 2005
..mucho gracias mi compadre ...necesito digerir esto, eh :)
William Hindman
----- Original Message -----
From: "John W. Colby" <jwcolby at colbyconsulting.com>
To: "'Access Developers discussion and problem solving'"
<accessd at databaseadvisors.com>
Sent: Saturday, January 08, 2005 10:54 AM
Subject: [AccessD] Filters - was filtered reports
> William,
>
> The class approach adds a level of indirection and so I do not recommend
> it
> unless you specifically need it.
>
> The class approach simply embeds the collection, the Boolean and the
> function in a class. That really all there is to it. Because the whole
> thing is encapsulated you can now create an instance of filters for
> purpose
> a, an instance for purpose b etc. Perhaps you have a module, with related
> forms that need to be able to pass parameters back and forth. The typical
> method of doing this is to start adding global variables, add a new
> variable
> every time you need to pass some other thing. With a class you create an
> instance and all the objects of that functional area can pass stuff back
> and
> forth using the class instance that is dedicated to their use.
>
> The class would then look something like:
>
> '###########################################################################
> ##
> Option Compare Database
> Option Explicit
> '
> 'The collection to hold the filter values
> '
> Private mcolFilter As Collection
> '
> 'Set up the collection
> '
> Private Sub Class_Initialize()
> Set mcolFilter = New Collection
> End Sub
> '
> 'Tear down the collection
> '
> Private Sub Class_Terminate()
> Set mcolFilter = Nothing
> End Sub
> '
> 'Get a pointer to the collection
> '
> Public Property Get pcolFilter() As Collection
> Set pcolFilter = mcolFilter
> End Property
> '
> 'The actual filter function
> '
> Public Function Fltr(lstrName As String, Optional lvarValue As Variant) As
> Variant
> On Error GoTo Err_Fltr
> If IsMissing(lvarValue) Then
> On Error Resume Next
> Fltr = mcolFilter(lstrName)
> If Err <> 0 Then
> Fltr = Null
> End If
> Else
> On Error Resume Next
> mcolFilter.Remove lstrName
> mcolFilter.Add lvarValue, lstrName
> Fltr = lvarValue
> End If
> Exit_Fltr:
> Exit Function
> Err_Fltr:
> MsgBox Err.Description, , "Error in Function clsFltr.Fltr"
> Resume Exit_Fltr
> Resume 0 '.FOR TROUBLESHOOTING
> End Function
> '###########################################################################
> ##
> The class is pretty simple, an Initialize function that sets the
> collection,
> a Terminate function that cleans up, a property to return the entire
> collection, and the Fltr function already explained in the previous email.
> No surprises here.
>
>
> A module to test it:
>
> '###########################################################################
> ##
> Option Compare Database
> Option Explicit
>
> Private mclsFltrSet1 As clsFltr
> '
> 'Method One for using Filter classes
> '
> Function cFS1() As clsFltr
> Dim intCnt As Integer
> On Error Resume Next
> '
> 'This line is used to test if the class is initialized yet
> 'You will get an error if the class is not initialized
> '
> intCnt = mclsFltrSet1.pcolFilter.Count
> If Err <> 0 Then
> '
> 'If you get an error, then initialize the class
> '
> Set mclsFltrSet1 = New clsFltr
> End If
> '
> 'Nolw we know that we have a valid class, get the pointer to it
> '
> Set cFS1 = mclsFltrSet1
> End Function
>
> Function testMethod1()
> cFS1.Fltr "MyName", "John W. Colby"
> Debug.Print cFS1.Fltr("MyName")
> End Function
>
> '
> 'Method Two for using filter classes
> '
> Function FltrWrapper(lstrName As String, Optional lvarValue As Variant) As
> Variant
> '
> 'If the lvarValue is missing we are retrieving a previously set filter
> '
> If IsMissing(lvarValue) Then
> FltrWrapper = cFS1.Fltr(lstrName)
> Else
> 'Else we are setting a filter value
> cFS1.Fltr lstrName, lvarValue
> End If
> End Function
> '###########################################################################
> ##
>
> This module sets up a private variable to hold a pointer to the class.
> What
> we are going to do is create a function that tests for a class instance
> and
> instantiates the class if it hasn't already done so (the first time). We
> test for a valid instance by trying to get the count of the collection
> inside the class. If that fails then the collection is not initialized,
> and
> by inference the class itself is not instantiated.
>
> Once we know the class is instantiated we simply return a pointer to the
> class. TestMethod1 then calls the cfs1.filter method, passing in the name
> of the filter we want to set up, and the value. At a later time we then
> call the same method passing in just the name of the filter and retrieve
> the
> value.
>
> For many purposes that is enough. Unfortunately Access queries cannot
> reference properties of a class so you must wrap a call to one of the
> class
> instances in a function which a query can then use in a where clause,
> aliased field etc. FltrWrapper does exactly that. Notice that the
> function
> takes exactly the same parameters as the core filter function buried down
> in
> the fltr class. This function must determine whether we are setting a
> value
> or retrieving a value and act appropriately.
>
> Unfortunately the whole concept of a class is to have multiple instances,
> and this method of dimming an explicit variable for each class instance
> soon
> becomes an issue since you now need a function to return a pointer to each
> class instance. The next conceptual level is a class (I call them
> "supervisor" classes) that contains a collection of the filter classes.
> Doing it this way allows us to set up a single supervisor class, and then
> it
> can hold as many filter classes as desired. Essentially you take
> everything
> in this test module and throw it in a class just like we took the filter
> module and threw it in a class. The supervisor then needs a simple module
> to initialize it's single variable, and a method to return a pointer to
> that
> class instance. I will put all of that in another email so that the
> discussion doesn't get too long.
>
> John W. Colby
> www.ColbyConsulting.com
>
> Contribute your unused CPU cycles to a good cause:
> http://folding.stanford.edu/
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of William Hindman
> Sent: Saturday, January 08, 2005 3:02 AM
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Send Filtered Report
>
>
> "I have also migrated this to a class so that I can set up "sets" of
> filters,
> each set in a class instance - but that is a subject for another day." JC
>
> ..oh no you don't ...you tease, you please, eh :)
>
> ..I'd really like to see the class ...I've always used the hidden form
> myself and I'm impressed by the simplicity of this approach ...so fess up
> already ...if I'm going to implement this I'd rather go whole hog.
>
> William Hindman
>
>
>
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>