In this post, we will be showing you how to call a function from a Swtichboard.
Being able to call code from a Switchboard is very useful as it gives us the flexibility to determine how we open our forms and reports. In the video, we show you how to use a filter to open up the Supplier’s form. This enables us to only view records that are relevant to what we are looking for and is a much more efficient way of working.
Please download 05_dbTedsTranslations_1
Code Behind The Filter
Private Sub cmdSubmit_Click() On Error Resume Next Dim strFilter As String Dim strFilterType As String Dim strSql As String 'loop through all the combo-boxes and create a simple filter strFilter = "" Dim ctrl As Control For Each ctrl In Me.Controls If ctrl.ControlType = acComboBox Then If Not IsNull(Controls(ctrl.Name).Value) Then 'string or integer If IsNumeric(Controls(ctrl.Name).Value) Then strFilter = strFilter & "[" & ctrl.Name & "]=" & _ Controls(ctrl.Name).Value & " AND " Else strFilter = strFilter & "[" & ctrl.Name & "]='" & _ Controls(ctrl.Name).Value & "' AND " End If End If End If Next strFilter = Left(strFilter, Len(strFilter) - 5) strSql = "UPDATE settings SET Filters ='" & strFilter & "' WHERE ID=1" CurrentDb.Execute strSql, dbFailOnError DoCmd.Close acForm, "frmSuppliersFilter", acSaveNo End Sub
Code For The Function
Public Function filterSupplier() Dim strFilter As String Dim strSql As String Dim db As DAO.Database Dim rs As DAO.Recordset 'open filter form. The form will compose a string that can be used as a filter 'the filter will be saved to settings>filters DoCmd.OpenForm "frmSuppliersFilter", , , , , acDialog 'get filter strFilter = Nz(DLookup("[Filters]", "settings"), "[ID] LIKE '*'") 'open up qrySuppliersExtended using the filter strSql = "SELECT DISTINCT ID FROM qrySuppliersExtended WHERE " & strFilter Set db = CurrentDb Set rs = db.OpenRecordset(strSql) 'set default filter strFilter = "" With rs 'if the recordset is populated create a second filter... If Not .BOF And Not .EOF Then .MoveLast .MoveFirst strFilter = "[ID] IN(" While (Not .EOF) strFilter = strFilter & .Fields("ID") & ", " .MoveNext Wend strFilter = Left(strFilter, Len(strFilter) - 2) strFilter = strFilter & ")" Else 'if not records go to new supplier strFilter = "[ID] IN(-1)" End If .Close End With DoCmd.OpenForm "frmSuppliersDataEntry", , , strFilter ExitSub: Set rs = Nothing Set db = Nothing End Function
In this video, we have shown you how to use a Switchboard form to call a VBA function. This will help your Switchboard forms to be more dynamic and give you greater control over your database.
I’ve studied the code for this and pretty much understand what you’re doing. I want to do something similar but I want my filter to open a report that’s populated with a query. Is this possible?
I’m trying to figure out if this is possible to do without VBA? I’m playing around with criteria in the query but am having trouble handling situations where a combo box might have a null value.
It is definitely possible.