Forms

3.31 Filtrare una maschera in base al valore contenuto in un controllo di una sua sottomaschera.
  Roberto
(D)
Come si può filtrare una maschera in base al valore contenuto in un controllo di una sua sottomaschera?

(R)
Presupposti.
La maschera principale si chiama Maschera ed ha come origine record una tabella (tbl_Ordini) che ha come chiave primaria un campo contatore o numerico chiamato NrOrd.
La sottomaschera ha come origine record una tabella (tbl_DetOrdini) in relazione uno-a-molti con la tabella tbl_Ordini tramite il campo NrOrd. La tabella tbl_DetOrdini contiene anche un campo di tipo numerico chiamato CodArt.
Esiste anche una tabella tbl_Articoli composta da un campo CodArt (chiave primaria) ed un campo di tipo testo chiamato DescrArt.

Soluzione.
Nell’intestazione di Maschera inserire una casella combinata non associata a due colonne (delle quali visibile solo la seconda) e chiamata Articolo; dare alla casella combinata un valore predefinito uguale a 0 (zero).
Come origine riga della casella combinata inserire il nome di una query unione che abbia il seguente codice SQL:
   SELECT 0 As CodArt, "<Tutti>" As DescrArt
   FROM tbl_Articoli
   UNION SELECT tbl_Articoli.CodArt, tbl_Articoli.DescrArt
   FROM tbl_Articoli;
A fronte dell’evento "Dopo aggiornamento" della casella combinata Articolo generare il seguente codice VBA:
Private Sub Articolo_AfterUpdate()
Dim db As DAO.Database, rst As DAO.Recordset
Dim strArt As String, gstr As String
gstr = ""
If Me!Articolo <> 0 Then
    strArt = "[CodArt] =" & Me!Articolo
        gstr = "[NrOrd] IN (Select NrOrd From tbl_DetOrdini Where " _
          & strArt & ")"
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT DISTINCTROW " & _
    "tbl_Ordini.NrOrd " & _
    "FROM tbl_Ordini" & _
    " WHERE " & gstr & ";")
If rst.RecordCount = 0 Then
    MsgBox "Non ci sono Ordini che soddisfano i criteri", _
        vbExclamation, "Esito ricerca negativa"
    gstr = ""
    rst.Close
    Exit Sub
End If
rst.Close
End If
If Me!Articolo = 0 Then
DoCmd.Close acForm, Me.Name
End If
DoCmd.OpenForm FormName:="Maschera", _
 WhereCondition:=gstr
End Sub
Aprendo Maschera, dalla lista della casella combinata selezionare il nome dell’articolo desiderato o scegliere la scritta <Tutti> nel caso si voglia visualizzare tutti gli ordini.

Nota
La sub di cui sopra fa riferimento alla libreria Microsoft DAO quindi, se si usa una versione di Access successiva ad Access 97, è necessario aggiungere al database i riferimenti a Microsoft DAO 3.6 Object Library.

Download:
 
  RicercaSottomaschera.zip (23Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.