harry61 ha scritto:
Da quello che ho capito da una maschera che funge da cruscotto vorresti inserire un nome di città e qualche numero di ufficio in modo da ottenere un query che filtra dei nominativi da una tabella con la città in AND sugli uffici in OR tra di loro.
Allo scopo ti suggerisco come esempio il seguente codice.
Private Sub Comando10_Click()
Dim VarCittà As String
Dim VarUfficio1 As Integer
Dim VarUfficio2 As Integer
Dim VarUfficio3 As Integer
Dim VarSQL As String
Dim db As DAO.Database
Dim qry As DAO.QueryDef
Set db = CurrentDb
VarCittà = Me.CITTA.Value
VarUfficio1 = Me.UFFICIO1.Value
VarUfficio2 = Me.UFFICIO2.Value
VarUfficio3 = Me.UFFICIO3.Value
VarSQL = "SELECT tabella.* "
VarSQL = VarSQL & "FROM tabella "
VarSQL = VarSQL & "WHERE (((tabella.città)=""" & VarCittà & """) AND ((tabella.ufficio)= " & VarUfficio1 & " Or (tabella.ufficio)= " & VarUfficio2 & " Or (tabella.ufficio)=" & VarUfficio3 & "));"
For Each qry In db.QueryDefs
If qry.Name = "QryFiltro" Then
DoCmd.Close acQuery, "QryFiltro", acSaveNo
DoCmd.DeleteObject acQuery, "QryFiltro"
End If
Next
Set qry = db.CreateQueryDef("QryFiltro", VarSQL)
DoCmd.OpenQuery "QryFiltro"
qry.Close
db.Close
End Sub
Su Click di un pulsante comando su Maschera1, preleva i valori CITTA, UFFICIO1, UFFICIO2, UFFICIO3 da controlli sempre su Maschera1. Non importa che la maschera abbia una origine record. Il codice poi compone una stringa VarSQL in linguaggio SQL, cancella se esiste la query QryFiltro, crea una nuova QryFiltro sulla base dei dati inseriti e la apre.
Come dicevo il codice è essenziale e dovrebbe essere arricchito da una serie di controlli di inserimento (per esempio se un dato non fosse inserito ti darebbe errore) e logiche di composizione della stringa, ma credo che possa essere sufficiente come spunto.
Questo codice suggerito è molto maldestro, mi riferisco alla inutile necessità di CICLARE le query per cancellarne 1 per poi ricrearla:
For Each qry In db.QueryDefs
If qry.Name = "QryFiltro" Then
DoCmd.Close acQuery, "QryFiltro", acSaveNo
DoCmd.DeleteObject acQuery, "QryFiltro"
End If
Next
Contiene almeno 2 ERRORI di sonstanza concettuale:
1)basta puntare alla Query specifica e cancellarla...
db.QueryDefs("QryFiltro").Delete
2)che senso ha cancellarla per poi ricrearla...? Barsa modificarla
db.QueryDefs("QryFiltro").SQL=VarSQL
Detto questo, meglio usare la propriatà FILTER di maschera
Me.Filter=VarSQL
Me.FilterOn=True
Saluti