Re: use a list with checkboxes to select categories

From: Dirk Goldgar (dg_at_NOdataSPAMgnostics.com)
Date: 03/16/05


Date: Wed, 16 Mar 2005 12:29:54 -0500


"JimBartlett" <JimBartlett@discussions.microsoft.com> wrote in message
news:EF32D30A-D3CD-4AE0-A698-A32D19BD74C0@microsoft.com
> Thanks for your help. I had pretty much decided that I would need an
> "In between" table but haven't figued out how to make it work the way
> I want it to. I am not necessarily married to the checkbox idea,
> highlighting would be OK and would be even better if the selected
> items were at the top of the list when the vendor record was reopened.
>
> Thanks again.
> Jim
>
> "Dirk Goldgar" wrote:
>
>> "Jim Bartlett" <Jim.Bartlett@sbcglobal.net> wrote in message
>> news:0e5701c51d1f$8c41a070$a501280a@phx.gbl
>>> I am writing a db for jewelry vendors. I want to
>>> categorize the vendors by the type of items they sell.
>>> Ex:
>>> Bobs Jewelry - Watches
>>> Franks Jewelry - Gold, Chains, Wedding Bands
>>> Marys Jewelry - Diamonds, Rubies, Sapphires
>>>
>>> I have the vendor table and a Vendor Type table. The
>>> Vendor type table has KEY, YES/NO, Type fields with the
>>> data Watches,Gold,Chains,Wedding
>>> Bands,Diamonds,Rubies,Sapphires etc.
>>>
>>> 1. I want to select the items by checkbox
>>> 2. save them to the vendor record
>>> 3. when I open the vendor record, I want all types to
>>> show with the saved types checked and the others unchecked
>>
>> I think you really need three tables:
>>
>> Vendors
>> VendorID (primary key)
>> VendorName
>> (other fields ...)
>>
>> MerchandiseTypes
>> MerchandiseID (primary key)
>> MerchandiseDescription
>> (other fields ...)
>>
>> VendorsMerchandise
>> VendorID (compound primary key)
>> MerchandiseID (compound primary key)
>>
>> A record in VendorsMerchandise represents the fact that vendor
>> (VendorID) deals in merchandise (MerchandiseID).
>>
>> Given such tables, you can certainly represent the data correctly and
>> efficiently. All that's left is the user interface design. Normally,
>> one would present the VendorsMerchandise table as a subform on the
>> Vendors form, showing only the records on the subform that are
>> related to the current Vendor record on the main form. However,
>> that won't let you see all merchandise at once, nor select/deselect
>> merchandise by clicking with the mouse. There's no built-in,
>> code-free Access mechanism to do that, AFAIK, so it's necessary to
>> write some code.
>>
>> Tell me, are you absolutely wedded to the idea of using a check box
>> to select items? I know a way to do that, but the implementation
>> looks a bit clunky to my eye. How would you feel about using a
>> multiselect list box instead? The list box would show all the
>> items, and the ones that are actually selected for the current
>> vendor would be highlighted. In my experience, that looks a bit
>> better than the calculated check boxes that are otherwise required.

How about this, then?

Assuming you have set up tables the way I described, build a form named
"frmVendors" with the Vendors table as its recordsource. On that form,
put a list box with these properties:

    Name: lstVendors
    Column Count: 2
    ColumnHeads: No
    Columns Widths: 0"; 2" (or whatever seems approopriate)
    Control Source: (blank)
    Multi Select: Simple
    Row Source Type: Table/Query
    Row Source:
        SELECT
            MerchandiseTypes.MerchandiseID,
            MerchandiseTypes.MerchandiseDescription,
            IsNull([T].[VendorID]) AS SoldByCurrentVendor
        FROM
            MerchandiseTypes
        LEFT JOIN
            [SELECT *
             FROM VendorsMerchandise VM
             WHERE VM.VendorID = Forms!frmVendors!VendorID]. AS T
        ON MerchandiseTypes.MerchandiseID = T.MerchandiseID
        ORDER BY
            IsNull([T].[VendorID]) DESC,
            MerchandiseTypes.MerchandiseDescription;

Create the following code module for the form:

'----- start of code for form module -----
Option Compare Database
Option Explicit

Private Sub ClearMerchandiseSelections()

    Dim intI As Integer

    With Me.lstMerchandise
        For intI = (.ItemsSelected.Count - 1) To 0 Step -1
            .Selected(.ItemsSelected(intI)) = False
        Next intI
    End With

End Sub

Private Sub Form_Current()

    Dim rs As DAO.Recordset
    Dim intI As Integer

    Me.lstMerchandise.Requery

    ' Clear all currently selected merchndise.
    ClearMerchandiseSelections

    If Not Me.NewRecord Then

        Set rs = CurrentDb.OpenRecordset( _
            "SELECT MerchandiseID FROM VendorsMerchandise " & _
                "WHERE VendorID=" & Me.VendorID)

        ' Select the merchandise currently on record for this VendorID.
        With Me.lstMerchandise
            Do Until rs.EOF
                For intI = 0 To (.ListCount - 1)
                    If .ItemData(intI) = CStr(rs!MerchandiseID) Then
                        .Selected(intI) = True
                        Exit For
                    End If
                Next intI
                rs.MoveNext
            Loop
            rs.Close
            Set rs = Nothing
        End With

    End If

End Sub

Private Sub lstMerchandise_AfterUpdate()

    On Error GoTo Err_lstMerchandise_AfterUpdate

    Dim db As DAO.Database
    Dim ws As DAO.Workspace
    Dim strSQL As String
    Dim blnInTransaction As Boolean
    Dim varItem As Variant

    ' Make sure the current member record has been saved.
    If Me.Dirty Then Me.Dirty = False

    Set ws = Workspaces(0)
    Set db = ws.Databases(0)

    ws.BeginTrans
    blnInTransaction = True

    ' Delete all merchandise now on record.
    strSQL = "DELETE FROM VendorsMerchandise " & _
                "WHERE VendorID = " & Me.VendorID

    db.Execute strSQL, dbFailOnError

    ' Add each hobby selected in the list box.
    With Me.lstMerchandise
        For Each varItem In .ItemsSelected
            strSQL = _
                "INSERT INTO VendorsMerchandise (VendorID,
MerchandiseID) VALUES (" & _
                    Me.VendorID & ", " & .ItemData(varItem) & ")"
            db.Execute strSQL, dbFailOnError
        Next varItem
    End With

    ws.CommitTrans
    blnInTransaction = False

Exit_lstMerchandise_AfterUpdate:
    Set db = Nothing
    Set ws = Nothing
    Exit Sub

Err_lstMerchandise_AfterUpdate:
    MsgBox "Error " & Err.Number & ": " & Err.Description,
vbExclamation, _
        "Unable to Update"
    If blnInTransaction Then
        ws.Rollback
        blnInTransaction = False
    End If
    Resume Exit_lstMerchandise_AfterUpdate

End Sub
'----- end of code for form module -----

That will give you a multi-select list box that reflects the mechandise
sold by a particular vendor by selecting those items, and updates it
when you de-select an item. When a vendor's record is first opened, the
selected items are always at the top of the list. I'm not sure that
last is a good idea, from a user-interface point of view, but you asked
for it.

-- 
Dirk Goldgar, MS Access MVP
www.datagnostics.com
(please reply to the newsgroup)


Relevant Pages

  • Re: Validation Data & Goto question
    ... Nevertheless, with your Validation ... Private Sub Worksheet_Change ... Dim findrow As Long ... One of the columns has vendor names (column ...
    (microsoft.public.excel.misc)
  • Re: replace special character for filename save
    ... I get a 1004 error message whenever I run it and the vendor name has either ... Sub SaveWork() ... Dim vennumber As String ...
    (microsoft.public.excel.programming)
  • RE: Blank fields when adding new record to combo box
    ... StartDate = StartDate ... Dave Hargis, Microsoft Access MVP ... you need to requery the combo so it has the new vendor in the ... Private Sub Combo35_NotInList ...
    (microsoft.public.access.formscoding)
  • RE: Blank fields when adding new record to combo box
    ... Dave Hargis, Microsoft Access MVP ... StartDate = StartDate ... you need to requery the combo so it has the new vendor in the ... Private Sub Combo35_NotInList ...
    (microsoft.public.access.formscoding)
  • RE: Blank fields when adding new record to combo box
    ... Adding the requery line gave me the "runtime error 2118" that I should save ... Dave Hargis, Microsoft Access MVP ... you need to requery the combo so it has the new vendor in the ... Private Sub Combo35_NotInList ...
    (microsoft.public.access.formscoding)