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 >