Newsgroup: it.comp.appl.access
Titolo: Come filtrare un report sulla selezione multipla su due caselle di riepilogo?

Basandomi su quanto contenuto sul sito comune (report011) ho ritenuto
di poter filtrare un report sulla base delle proprietà Filter e FilterOn
(per i newbie freschi di mercato "filtro" e "applica filtro" delle 
proprietà del Report) utilizzando, non una, bensì due _o più_ caselle di
riepilogo.
La necessità era quella di filtrare in base "facoltà" e/o "tipo problema"
record che rappresentano problematiche riscontrabili nella registrazione 
degli esami.
Quindi nelle "facoltà" potevo avere:
"Giurisprudenza", "Architettura", "Medicina e Chirurgia", ecc.
Nei "tipoprob" potevo invece avere
"manca voto sul verbale", "studente non iscritto", "propedeuticità", ecc.
Solo per dare un'idea del db dirò che ho realizzato cinque tabelle:
tblstudenti, tblfacoltà, tblinsegnamenti, tbltipoprob e, naturalmente, 
tblproblemi.
Tblstudenti e tblinsegnamenti sono in relazione molti a molti con
in mezzo tblproblemi. L'id_facoltà viene associato ai record di
tblproblemi in relazione alla facoltà dove viene impartito 
l'insegnamento. Lo studente potrebbe infatti sostenere un
esame mutuato da un'altra facoltà, ma il problema specifico rimane
a carico della segreteria di facoltà incaricata della registrazione.
Sintetizzando, ho realizzato una query che rappresenta l'origine dei 
dati della maschera per il caricamento dei problemi, nonché del report 
"problemi" per la relativa stampa o anteprima. I campi presenti nella 
query sono:
id_problema
matricola     	'dello studente
id_insegnamento
id_tipoprob
id_facoltà    	'mutuato via maschera con Dlookup da tblinsegnamenti
data esame
voto esame
Ho realizzato una maschera con due caselle di riepilogo non associate,
"Elencofacoltà" ed "Elencoproblemi" la cui origine riga è un istruzione 
sql che rispettivamente ora trattiene id_facoltà e facoltà da tblfacoltà,
ora id_tipoprob e tipoprob da tbltipoprob
L'esigenza è quella di filtrare sulla base di quanto si è selezionato e,
nel caso non ci sia selezione, considerare il controllo come inesistente 
(ergo come se li avessi selezionati tutti).
La domanda è: esiste un modo più pulito per fare quello che ho fatto io.
Non so un fico secco di programmazione e sono curioso di sapere come avrebbe 
proceduto una persona un po' più "imparata". In particolare del mio listato
non mi convince isnumeric. Il problema è che isnull restituiva sempre e
comunque false. Nel caso in cui dovessi filtrare su una base differente 
rispetto a un campo numerico non saprei come fare.
Io ho risolto così:
Private Sub Anteprima_Click()
On Error GoTo Err_Anteprima_Click
    'dichiaro cinque variabili stringa
    'strCriteri mi serve per unire alla fine le variabili referenti     
    'delle caselle di controllo
    Dim strCriteri As String
    'StrLista e strCriteri servono rispettivamente per catturare l'id (o gli
    'id) selezionati e per concatenare l'espressione Filter per la singola 
    'casella di controllo    
    Dim strListaFacoltà As String
    Dim strCriteriFacoltà As String
    Dim strListaProblemi As String
    Dim strCriteriProblemi As String
 
Controllo_Elencofacoltà:
    Me!Listafacoltà = Null
    Dim varItemFac As Variant
    'Se non ci sono voci selezionate non ci sono attività da effettuare
    'In tal caso va al controllo successivo (strListaFacoltà rimane vuota)
    If Me!Elencofacoltà.ItemsSelected.Count = 0 Then GoTo Controllo_Elencoproblemi
    'Cicla nell'insieme delle voci selezionate
    For Each varItemFac In Me!Elencofacoltà.ItemsSelected
        'Cattura la colonna IDSocietà di ciascuna
        'voce selezionata
        strListaFacoltà = strListaFacoltà & _
            Me!Elencofacoltà.Column(0, varItemFac) & ","
        Me!Listafacoltà = Me!Listafacoltà & _
            Me!Elencofacoltà.Column(1, varItemFac) & ", "
    Next varItemFac
    'Elimina la virgola eccedente
    strListaFacoltà = Left$(strListaFacoltà, Len(strListaFacoltà) - 1)
    Me!Listafacoltà = Left$(Me!Listafacoltà, Len(Me!Listafacoltà) - 2)
    'Deseleziona tutte le righe della casella di riepilogo
    Dim ContFac As Integer
    For ContFac = 0 To Me!Elencofacoltà.ListCount - 1
        Me!Elencofacoltà.Selected(ContFac) = False
    Next ContFac
 
Controllo_Elencoproblemi:
    Me!Listaproblemi = Null
    Dim varItemProb As Variant
    'Se non ci sono voci selezionate non ci sono attività da effettuare
    'In tal caso va al controllo successivo (strListaProblemi rimane vuota)
    If Me!Elencoproblemi.ItemsSelected.Count = 0 Then GoTo Composizione_finale:
    'Cicla nell'insieme delle voci selezionate
    For Each varItemProb In Me!Elencoproblemi.ItemsSelected
        'Cattura la colonna IDSocietà di ciascuna
        'voce selezionata
        strListaProblemi = strListaProblemi & _
            Me!Elencoproblemi.Column(0, varItemProb) & ","
        Me!Listaproblemi = Me!Listaproblemi & _
            Me!Elencoproblemi.Column(1, varItemProb) & ", "
    Next varItemProb
    'Elimina la virgola eccedente
    strListaProblemi = Left$(strListaProblemi, Len(strListaProblemi) - 1)
    Me!Listaproblemi = Left$(Me!Listaproblemi, Len(Me!Listaproblemi) - 2)
    'Deseleziona tutte le righe della casella di riepilogo
    Dim ContProb As Integer
    For ContProb = 0 To Me!Elencoproblemi.ListCount - 1
        Me!Elencoproblemi.Selected(ContProb) = False
    Next ContProb
 
Composizione_finale:
    If IsNumeric(strListaFacoltà) = True Then
    strCriteriFacoltà = " AND ([id_facoltà] IN (" & strListaFacoltà & "))"
    End If
    If IsNumeric(strListaProblemi) = True Then
    strCriteriProblemi = " AND ([id_tipoprob] IN (" & strListaProblemi & "))"
    End If
    'concateno le due variabili
    strCriteri = strCriteriFacoltà & strCriteriProblemi
    'elido i primi 4 caratteri che sicuramente contengono " AND "
    strCriteri = Right$(strCriteri, Len(strCriteri) - 4)
    MsgBox (strCriteri)
    'apro il report problemi imponendo strCriteri come proprietà Filter
    DoCmd.OpenReport "problemi", acPreview, , strCriteri
 
Exit_Anteprima_Click:
    Exit Sub
Err_Anteprima_Click:
    MsgBox Err.Description
    Resume Exit_Anteprima_Click
End Sub

"massimo" <n...@send.invalid> ha scritto nel messaggio
news:Xns93465F2C...@news.inwind.it...
[SUPERCUT]
Scusami ma la mia sensazione č che tu non abbia scritto un messaggio ma una
tesi di laurea, e che stia cercando qualcuno che la discuta al posto tuo.
;-)
Non so gli altri frequentatori del NG, ma io mi ci sono perso dentro.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------


[CUT]
Scusa la mia poca disponibiltà... ma non potresti essere più sintetico e
riportare solamente le parti più salienti del codice dove riscontri dei
problemi? Non ho intenzione di farmi diventare i capelli bianchi qui :-)
Ciao, omnitow

 diventare i capelli bianchi qui :-) 
No. Lo ripubblico per intero, funzionante :-)
La parte migliore del codice proviene da sitocomune (report011).
Ho una maschera con due caselle di riepilogo, Elencofacoltà ed
Elencoproblemi, e due caselle di testo, studente e insegnamento.
Con un bottone cambio la proprietà filter di un report in relazione
alle righe selezionate o al testo/matricola ricercato. 
Ad esempio posso filtrare tutti i "Rossi" che hanno avuto problemi di
"propedeuticità" a "Giurisprudenza" e "Scienze Politiche" su 
insegnamenti che contengono la parola "amministrativo". Oppure
chiedere una selezione secca di tutti i problemi esami in cui è
incorsa la matricola 15454. Ecc.
Più sintetico di così non riesco.
Private Sub Anteprima_Click()
On Error GoTo Err_Anteprima_Click
    Dim strCriteri As String
 
Controllo_Elencofacoltà:
    Dim strListaFacoltà As String
    Dim strCriteriFacoltà As String
    Me!Listafacoltà = Null
    Dim varItemFac As Variant
    'Se non ci sono voci selezionate non ci sono attività da effettuare
    If Me!Elencofacoltà.ItemsSelected.Count = 0 Then GoTo Controllo_Elencoproblemi
    'Cicla nell'insieme delle voci selezionate
    For Each varItemFac In Me!Elencofacoltà.ItemsSelected
    'Cattura la colonna id_facoltà di ciascuna voce selezionata
    strListaFacoltà = strListaFacoltà & _
            Me!Elencofacoltà.Column(0, varItemFac) & ","
        Me!Listafacoltà = Me!Listafacoltà & _
            Me!Elencofacoltà.Column(1, varItemFac) & ", "
    Next varItemFac
    'Elimina la virgola eccedente
    strListaFacoltà = Left$(strListaFacoltà, Len(strListaFacoltà) - 1)
    Me!Listafacoltà = Left$(Me!Listafacoltà, Len(Me!Listafacoltà) - 2)
    'Deseleziona tutte le righe della casella di riepilogo
    Dim ContFac As Integer
    For ContFac = 0 To Me!Elencofacoltà.ListCount - 1
        Me!Elencofacoltà.Selected(ContFac) = False
    Next ContFac
    strCriteriFacoltà = " AND ([id_facoltà] IN (" & strListaFacoltà & "))"
 
Controllo_Elencoproblemi:
    Dim strListaProblemi As String
    Dim strCriteriProblemi As String
    Me!Listaproblemi = Null
    Dim varItemProb As Variant
    'Se non ci sono voci selezionate non ci sono attività da effettuare
    If Me!Elencoproblemi.ItemsSelected.Count = 0 Then GoTo Controllo_Studente:
    'Cicla nell'insieme delle voci selezionate
    For Each varItemProb In Me!Elencoproblemi.ItemsSelected
        'Cattura la colonna id_tipoprob di ciascuna voce selezionata
        strListaProblemi = strListaProblemi & _
            Me!Elencoproblemi.Column(0, varItemProb) & ","
        Me!Listaproblemi = Me!Listaproblemi & _
            Me!Elencoproblemi.Column(1, varItemProb) & ", "
    Next varItemProb
    'Elimina la virgola eccedente
    strListaProblemi = Left$(strListaProblemi, Len(strListaProblemi) - 1)
    Me!Listaproblemi = Left$(Me!Listaproblemi, Len(Me!Listaproblemi) - 2)
    'Deseleziona tutte le righe della casella di riepilogo
    Dim ContProb As Integer
    For ContProb = 0 To Me!Elencoproblemi.ListCount - 1
        Me!Elencoproblemi.Selected(ContProb) = False
    Next ContProb
    strCriteriProblemi = " AND ([id_tipoprob] IN (" & strListaProblemi & "))"
Controllo_Studente:
    Dim strCriteriStudente As String
    Dim varItemStud As Variant
    varItemStud = Me!studente
    Me!studente = Null
    If IsNull(varItemStud) Then GoTo Controllo_Insegnamento
    If IsNumeric(varItemStud) Then
    strCriteriStudente = " AND ([matricola] IN (" & varItemStud & "))"
    Else: strCriteriStudente = " AND ([studente] Like _
    	(" & Chr$(34) & "*" & varItemStud & "*" & Chr$(34) & "))"
    End If
 
Controllo_Insegnamento:
    Dim strCriteriIns As String
    Dim varItemIns As Variant
    varItemIns = Me!insegnamento
    Me!insegnamento = Null
    If IsNull(varItemIns) Then GoTo Composizione_Finale
    If IsNumeric(varItemIns) Then
    strCriteriIns = " AND ([id_insegnamento] IN (" & varItemIns & "))"
    Else: strCriteriIns = " AND ([insegnamento] Like _ 
    	(" & Chr$(34) & "*" & varItemIns & "*" & Chr$(34) & "))"
    End If
 
Composizione_Finale:
    strCriteri = strCriteriFacoltà & strCriteriProblemi _ 
    	    	& strCriteriStudente & strCriteriIns
    'elido i primi 4 caratteri che sicuramente contengono " AND "
    If Len(strCriteri) > 0 Then
    strCriteri = Right$(strCriteri, Len(strCriteri) - 4)
    End If
    MsgBox (strCriteri)
