Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsFormsForms ProgrammingQueriesModules / DAO / VBAReports / PrintingMacrosDatabase DesignSecurityConversionImporting / LinkingSQL Server / ADPMultiuser / NetworkingReplicationSetup / ConfigurationDeveloper ToolkitsActiveX ControlsNew UsersGeneral 1General 2
Access DirectoryToolsTutorialsUser Groups
Related Topics
SQL ServerOther DB ProductsMS OfficeMore Topics ...

MS Access Forum / Forms Programming / November 2005

Tip: Looking for answers? Try searching our database.

How to select subform records?

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Amit - 04 Nov 2005 20:27 GMT
MS Access 2K, Windows XP
====================
Hi,

I have a main form with a subform on it. This subform is bound and is in
Datasheet format/view showing selected records that link to the Parent ID on
the main form.

I'd like to select one or more records on the subform and perform some
action (eg. send email, print out etc.) on the selected records.

I've tried adding a check box to the subform, but when I check it on one
record, all the records get checked.

Is there a way to accomplish this while still maintaining the current set-up
of form-subform? Will appreciate some ideas/pointers here.

Thanks.

-Amit
tina - 04 Nov 2005 21:54 GMT
when i want to select multiple specific records in a form, to manipulate
them in the current session only, i usually do the following:
1. set up a "fake" table with two fields, the "real" table's primary key
field and a Yes/No field. the "fake" table has a one-to-one relationship
with the "real" table, between the identical primary key fields.
2. build a query using the two tables, with a LEFT JOIN from the "real"
table to the "fake" table.
3. base the form (or subform) on the query, and add a checkbox control to
the form, bound to the Yes/No field.
4. now each record in the subform contains a bound checkbox control, and you
can select individual records. base your action (email, print, whatever) on
the Yes/No field = True, or = False, whichever is appropriate for the
action.
5. since the action you're taking is only applicable to the current session,
run a Delete query, on the form's Close event, to delete all the records
from the *fake* table (NOT from the real table!!!).

hth

> MS Access 2K, Windows XP
> ====================
[quoted text clipped - 16 lines]
>
> -Amit
'69 Camaro - 05 Nov 2005 09:15 GMT
Hi, Amit.

> Is there a way to accomplish this while still maintaining the current set-up
> of form-subform?

Most people would use a list box in order to be able to easily select items
and be able to determine which items were selected.  However, if you want to
use a subform, then you have a couple of problems to overcome:

1.)  Determine which records were selected.
2.)  Pass that info from the subform control to the main form after the
subform loses focus.

When selecting multiple records in a datasheet or continuous form, the
form's SelHeight Property can be used to determine how many records were
selected.  However, there's no direct way to tell what any of the fields'
values are in anything but the very first record selected, because it's the
"current record" in the datasheet or continuous form.  If there's a primary
key, then that record can be identified, but not the other records since they
aren't the current record.

One solution to this first problem is to walk through the selected records
one by one and grab the values from the fields (namely the primary key) in
the current record, then move to the next record and get the values from the
fields in that record, and so on.

The second problem is that the main form can't read the subform control's
SelHeight Property as soon as focus is lost from the subform control.  This
property becomes zero, so there's no way to walk through zero records to grab
the primary key any record beyond the first of these multiple records
selected.  One solution to this second problem is to save the SelHeight
Property as a public form property that can be read by external objects.  
This may be done in the form's OnClick( ) event.

The first thing to do is to copy and paste the following code into your
subform's code module:

' * * * * Start code * * * *

Private m_nHt As Long

Public Property Let DSSelHeight(nHt As Long)
   m_nHt = nHt
End Property

Public Property Get DSSelHeight() As Long
   DSSelHeight = m_nHt
End Property

Private Sub Form_Click()

   On Error GoTo ErrHandler
   
   m_nHt = Me.SelHeight
   
   Exit Sub
   
ErrHandler:
   
   MsgBox "Error in Form_Click( ) in" & vbCrLf & _
       Me.Name & " form." & vbCrLf & vbCrLf & _
       "Error #" & Err.Number & vbCrLf & vbCrLf & Err.Description
   Err.Clear

End Sub

' * * * * End code * * * *

Here's an example of how to read the selected records on the subform from
the main form (requires setting a reference to the DAO library):

' * * * * Start code * * * *

Private Sub SelRecsBtn_Click()
   
   On Error GoTo ErrHandler
   
   Dim recSet As DAO.Recordset
   Dim sList As String  
   Dim numRecs As Long
   Dim fOpenedRecSet As Boolean
   Dim idx As Long

   numRecs = Me!subFrmCtrl.Form.DSSelHeight    
   Set recSet = Me!subFrmCtrl.Form.RecordsetClone
   fOpenedRecSet = True
   
   '--------------------------------------------------------------------
   '  Walk through each selected record to retrieve
   ' the primary key.
   '--------------------------------------------------------------------
   
   For idx = 1 To numRecs
       sList = sList & Me!subFrmCtrl.Form.txtID.Value & vbCrLf
       recSet.Bookmark = Me!subFrmCtrl.Form.Bookmark
       recSet.MoveNext
       
       If (Not (recSet.EOF)) Then
           Me!subFrmCtrl.Form.Bookmark = recSet.Bookmark
       End If
   Next idx
   
   MsgBox sList
   
CleanUp:
   
   If (fOpenedRecSet) Then
       recSet.Close
       fOpenedRecSet = False
   End If
   
   Set recSet = Nothing
   
   Exit Sub
   
ErrHandler:
   
   MsgBox "Error in SelRecsBtn_Click( ) in" & vbCrLf & _
       Me.Name & " form." & vbCrLf & vbCrLf & _
       "Error #" & Err.Number & vbCrLf & vbCrLf & Err.Description
   Err.Clear
   GoTo CleanUp

End Sub     '  SelRecsBtn_Click( )

' * * * * End code * * * *

. . . where subFrmCtrl is the name of the subform control, and txtID is the
name of the text box on the subform that displays the primary key of the
current record.  Please note that because the Recordset is walked through
with "MoveNext" and not "MovePrevious," if the user selects the records from
the bottom to the top, then the first "current record" will be the bottom row
selected, not the top row selected, and the next record after the current
record will be the very first record _after_ the actual group of records
selected -- which will result in an erroroneous list of records selected.

The bottom line is that the user _must_ select from the top to the bottom of
the records, not from the bottom to the top.  If you want to accommodate this
quirk, then I leave it to you to modify the algorithm above to determine when
the user has selected from the bottom to the top of the records, and
accommodate this with recSet.MovePrevious.

> I'd like to select one or more records on the subform and perform some
> action (eg. send email, print out etc.) on the selected records.

Once you have the primary keys of each of these records, you may use this
primary key to send E-mail for each of these records, or print these records
in a report, et cetera.

HTH.
Gunny

See http://www.QBuilt.com for all your database needs.
See http://www.Access.QBuilt.com for Microsoft Access tips.

(Please remove ZERO_SPAM from my reply E-mail address so that a message will
be forwarded to me.)
- - -
If my answer has helped you, please sign in and answer yes to the question
"Did this post answer your question?" at the bottom of the message, which
adds your question and the answers to the database of answers.  Remember that
questions answered the quickest are often from those who have a history of
rewarding the contributors who have taken the time to answer questions
correctly.

> MS Access 2K, Windows XP
> ====================
[quoted text clipped - 16 lines]
>
> -Amit
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.