Applicare filtro maschera anche a casella combinata

di il
12 risposte

Applicare filtro maschera anche a casella combinata

Ciao, mi scuso se il titolo è fuorviante...
In sostanza vi dico cosa ho impostato (probabilmente non sempre in maniera coerente) e cosa vorrei ottenere.

Il db mi serve a gestire il mio albero genealogico

Una tabella contiene "l' anagrafica" ed è relazionata con una seconda tabella "Note" in cui ho aggiunto altri campi utili per le ricerche ecc...
La relazione è sul campo Title (PK) 1-1.

Ho una maschera singola che come origine dati ha una query che integra i campi che mi occorrono dalle due tabelle.
Nella maschera ho inserito una casella combinata per ricercare i record sul campo che ha la primary key (Title).

Dopo molti test e con l'aiuto indispensabile di Osvaldo e Gibra sono riuscito ad ottenere quello che volevo e la ricerca tramite la casella combinata funziona anche con record (nomi e cognomi) omonimi.

In questo modo a maschera aperta ho attualmente 450 record.
Sempre nella tabella "Note" avevo aggiunto un campo "Ramo" in cui sono possibili solo i valori "M" e "P" (Materno e Paterno).
Ho aggiunto alla maschera due pulsanti che via macro ("ApplicaFiltro") mi filtrano i record mostrandomi i record di uno o dell'altro ramo. E un terzo pulsante per rimuovere i filtri.

Ora: non so se fino a qui ho seguito (soprattutto per la parte dei filtri) l'approccio corretto... comunque quello che a questo punto vorrei ottenere é che la casella combinata che mi ricerca i record possa, dopo che io applico il filtro di uno dei due rami, popolarsi con i record appartenenti solo a quel ramo.
Cioè applico il filtro Ramo P e ho 278 record, clicco sulla casella combinata e posso cercare tra questi 278 record
Rimuovo il filtro e la casella mi ripropone tutti i record
Applico il filtro Ramo M e ho 172 record, clicco sulla casella combinata e posso cercare tra questi 172 record.

Come dovrei procedere?

Vi ringrazio in anticipo, ciao
J

12 Risposte

  • Re: Applicare filtro maschera anche a casella combinata

    Per me, sebbene tu sia stato molto chiaro a descrivere di cosa parla il database...sarebbe bene se tu esponessi chiaramente tutti i campi di entrambe le tabelle. Poi indica come ti comporti indicando esattamente i campi coinvolti.
    Attenzione, la relazione uno-a-uno non la usa quasi nessuno in quanto conviene convogliare tutti i campi nella stessa tabella. Il fatto che tu eventualmente abbia MOLTI campi e desideri spezzettare le informazioni secondo tua logica, questa è una strategia che puoi mettere in atto a livello di maschera, per esempio con struttura a schede.
  • Re: Applicare filtro maschera anche a casella combinata

    Ciao, ti spiego il perchè delle due tabelle relazionate 1-1.

    Io ho un file generato da un'applicazione web che in genealogia segue uno standard. Il file si chiama Gedcom ed è un file testuale.
    Scaricato il file ho un convertitore che si occupa di esportarlo direttamente in mdb al cui interno viene generata una tabella con parecchi campi (circa 40).
    I campi sono praticamente tutti testuali (anche la data purtroppo non è un formato data).
    Poichè il sistema online ad ogni aggiornamento modificava quello che credevo essere un ID univoco (si chiama INDI_ID) ho dovuto (sempre online) creare un evento fittizio e inserirlo in un campo TITLE. Io questo "evento" per comodità l'ho creato come Pn (PersonaNumero). Questo campo a differenza dell'INDI_ID generato dal sistema rimane fisso perchè è statico e così ho P1, P2 ecc.
    Superato questo scoglio ho dovuto preoccuparmi del fatto che ogni volta che io aggiungo/modifico informazioni o persone sul sito e poi esporto ricreo un mdb da zero sovrascrivendolo.

    Quindi ho pensato (magari sbagliando) che per poter integrare questa tabella con altri dati (campi) di mia utilità avrei dovuto creare un secondo db, lasciando "intatto" quello convertito e creare una tabella "Note" con nuovi campi e un campo Title relazionato 1-1 con il Title della tabella collegata.
    In questo modo nel secondo db ho aggiunto maschere, sottomaschere, query e report.
    Per gestire la maschera singola a questo punto (grazie al vostro aiuto) ho usato come origine dati una query che mi seleziona tutti i campi dalla tabella scaricata (e collegata) e alcuni dalla tabella "Note".

    A questo punto sono arrivato tra ieri e oggi con la mia maschera (che ha anche due sottomaschere per mostrarmi i figli dell'individuo di - eventuali - prime e seconde nozze, ma questo è un altro discorso) che funziona come voglio e grazie a te e ad altri esperti del forum ho aggiunto la casella combinata che mi permette di puntare all'individuo velocemente agganciando il campo TITLE, gestendo correttamente i casi di omonimia, ordinata per cognome, nome e data di nascita.

    Funziona. E quindi mi potrei accontentare ma siccome vorrei sfruttare il db quando vado negli archivi per fare ricerche, mi sarebbe utile poter filtrare gli antenati del ramo paterno da quelli del ramo materno e viceversa poichè appartengono a province differenti e, per esempio, se vado a Lodi, non m'interessa vedere il ramo paterno (tutto di Mantova e Provincia) ma solo quello materno.
    Così ho aggiunto un campo Ramo (testuale) alla mia tabella Note con due valori "M" o "P" e aggiunto i pulsanti che filtrano appunto seguendo tale condizione.

    Solo che la casella combinata non è filtrata e quindi mi mostra l'elenco di entrambi i rami anche se applico il filtro alla maschera.

    Io se vuoi posso anche dirti tutti i campi delle tabelle ma non credo servano a molto visto che sono tutti testuali e la relazione è data sulla primary key Title.

    Scusa la logorrea, ho tentato di illustrare il perchè di alcune scelte che immagino all'occhio del programmatore siano illogiche o sbagliate.

    A questo punto la mia domanda è sempre: come fare in modo che a filtro del ramo attivato nella maschera la casella combinata si adegui.

    Grazie di nuovo, ciao
    J
  • Re: Applicare filtro maschera anche a casella combinata

    Quando importi un File di Testo, puoi definire la specifica di Importazione ed andare a RIDefinire il Field-Type colonna per colonna.
    Quindi definita la S.I., la usi quando si fa il TransftertText.

    Per il resto... lascio a chi ha provato a seguire.
  • Re: Applicare filtro maschera anche a casella combinata

    @Alex ha scritto:


    Per il resto... lascio a chi ha provato a seguire.
    Bella patata bollente!

    Per Jfk105: trovo che proponi 2 cose molto diverse e lontane dalle reciproche logiche delle applicazioni in questione.
    Il file testuale è quello che è. Tu hai detto che sei riuscito a incanalarlo/incolonnarlo in tabelle di Access. OK "relativo". Chi mi assicura che quei dati (hai parlato di 40 campi) sono NORMALIZZATI secondo la logica dei database e di Access?
    Io so ragionare soltanto con la logica di Access (se non altro siamo nella sezione Access) e non mi sento affatto competente circa il passaggio da txt a mdb o accdb. Provando a mettermi nei tuoi panni, mi sentirei costretto a fare tutti i passaggi "manualmente" e con tanto di occhi a controllare che tutto sia incanalato correttamente. In altra analisi, se davvero c'è qualcosa di "ripetitivo" e/o "routinabile" occorre miticolosamente coglierne i minimi passaggi e accertarsi che i dati confluiscano correttamente nelle tabelle normalizzate di Access. Direi comunque che in entrami i casi si tratta di bagni di sangue da affrontare, altro non saprei.
  • Re: Applicare filtro maschera anche a casella combinata

    Ciao, grazie delle risposte.
    @Alex scusa ma dal basso della mia conoscenza non ho capito nulla Comunque io non importo un file di testo ma un mdb generato da un convertitore. Il file di testo non è strutturato ad esempio come un csv o simile...

    @Osvaldo.
    Ok ho capito il tuo discorso ma a parte la normalizzazone (che posso intuire come significato ma che non essendo un programmatore non saprei da che parte gestirla e come)... non potresti indirizzarmi su come gestire la casella combinata e il filtro?
    Se non è possibile grazie comunque
    Ciao, buona girnata
    J
  • Re: Applicare filtro maschera anche a casella combinata

    Jfk105 ha scritto:


    Ok ho capito il tuo discorso ma a parte la normalizzazone (che posso intuire come significato ma che non essendo un programmatore non saprei da che parte gestirla e come)
    La normalizzazione è un punto cardine nella progettazione di un database. Se un database parte "storto" (ossia non normalizzato), all'inizio va avanti a colpi di calci in **** e/o fortuna. Mano a mano che viene sviluppato poi (perché ti garantisco che Access è una miniera di sapere con l'appetito che vien mangiano quando lo conosci), diventa sempre più ingestibile.

    Jfk105 ha scritto:


    non potresti indirizzarmi su come gestire la casella combinata e il filtro?
    Ho solo capito che vuoi gestire un database "genealogico"...ma non come. Per questo motivo ti ho chiesto di elencare TUTTI i campi di tutte le tabelle.
    Però non posso suggerirti nulla se non risolvi prima la questione del punto precedente.
  • Re: Applicare filtro maschera anche a casella combinata

    Grazie, vedo quello che riesco a fare e poi eventualmente chiederò di nuovo supporto.
    Ciao, J
  • Re: Applicare filtro maschera anche a casella combinata

    Ciao, ho provato a ripartire creando un minidb di test di base.
    Ho:
    Una tabella "Anagrafica" con campi: ID (PK), Nome (Testo), Cognome (Testo), Sesso (Testo)
    Una maschera singola "Persona" con origine dati la tabella "Anagrafica" con tutti i campi della tabella
    Una Combobox di ricerca record "cboPersona" in cui ho inserito i campi della tabella riferiti tramite l'ID e ordinati in base a Cognome e Nome
    A questo punto filtro la maschera con pulsanti in base al Sesso (M oppure F). (O via macro o con gruppo ozioni, ho provato entrambe le possibilità )
    Funziona tutto ma sono punto e a capo con il mio problem ddi cui sopra perchè la combobox (a filtro attivato) mi mostra comunque tutti i record (sia di sesso maschile che di sesso femminile). Se scelgo un record che corrisponde al filtro mi ci porta, altrimenti non fa nulla (che è ok come comportamento, direi) .
    A questo punto dovrei soltanto nascondere dallac ombobox i record che non rientrano nel filtro (cioè nascondere le femmine se il filtro è ON su maschio e viceversa).
    Grazie mille, ciao
    J
  • Re: Applicare filtro maschera anche a casella combinata

    Riassumo.
    Usi la Combo non per Filtrare ma per Cercare, mentre per Filtrare usi SOLO il Gruppo Opzioni M/F, e vorresti che il RowSource della Combo avesse il medesimo Filtro della Maschera.

    Secondo me è una cavolata filtrare la Combo... questa deve essere OPEN e con tutti i dati... tuttavia... ognuno fa quello che pensa giusto.

    La cosa in questo caso è da gestire da Codice, in modo un poco più comodo ma più teccnico.
    Una Combo si può popolare in diversi modi... uno, quello che useremo, è il meno usato ma il più utile in questo contesto è passargli il Recordset, e possibilmente già Filtrato... e siccome ne hai già uno, quello della Maschera, useremo questo.

    Riconfigura la combo come Colonne e Larghezza colonne in modo da avere tutti i campi che hai anche nella Maschera, ovviamente potrai renderli NON VISIBILI impostando la larghezza=0... poi sperimenti quando hai capito il metodo...!
    Una volta configurata, togli il RowSource.
    Su Load della Maschera metti
    
    Set Me.NomeComboBox.Recordset=Me.Recordset
    Ora dovresti vedere nella Combo l'elenco dei dati pari pari alla Maschera.

    Ora devi definire il metodo di Filtro, non puoi pensare di usare Macro o altre amenità varie, devi gestirlo da Codice.
    Non so se come Filtro associato a M/F usi un Numerico oppure proprio il TESTO M/F, ipotizzo tu abbia un campo testo, ma sai che il Gruppo Opzioni restituisce un Numero, quindi lo converto... in questo caso dovrai modificare il codice in base a come hai gestito il Campo e di conseguenza il Filtro... sono tutte informazioni che non hai dato quindi prendo una strada a caso...
    
    Private NomeGurppoOpzioni_AfterUpdate()
       Me.Filter="Sesso='" & IIF(Me.NomeGruppoOpzioni=1,"M","F") & "'"
       Me.FilterOn=True
       Set Me.NomeComboBox.Recordset=Me.Recordset
    End Sub
    Ovviamente spero tu possa avere una visione più strutturata dei filtri e pensare che magari di avere più CRITERI, Nome e/o Cognome magari da concatenare un modo per RESETTARE perchè cerchi Bianchi, Maschio ma Paola e non Giorgio... ecc...

    Per questo la Combo non serve a nulla Filtrarla... se predisponi gli stessi campi Visualizzati anche per l'eventuale Ricerca...
    Ancora meglio sarebbe avere N combo popolate con il DISTINCTROW del singolo Campo...
    Insomma ci sono molti modi per fare le cose.
  • Re: Applicare filtro maschera anche a casella combinata

    Grazie mille Alex, spiegazione molto esauriente.
    Secondo me è una cavolata filtrare la Combo... questa deve essere OPEN e con tutti i dati... tuttavia... ognuno fa quello che pensa giusto.
    Hai ragione, la mia logica è da "incompetente" di Access e seguo un'idea che è (purtroppo) "il fine giustifica i mezzi", ma se devo prendere la strada giusta non ho problemi a tentare di approcciare nel verso corretto e imparare come si dovrebbe fare normalmente.
    Mi mancano le basi indubbiamente...
    Comunque, se hai voglia e tempo e pazienza, mi potresti indicare (con il codice e procedure come hai appena fatto) il metodo corretto per lasciare la combo completa (OPEN) e usare i filtri per raggiungere lo scopo (io non so se è un "nascondere" i campi della combo, eseguire qualche ulteriore operazione con il filtro o altro).
    In questo modo aiuteresti sicuramente altri neofiti come me
    La rifaccio da zero se occorre, ci mancherebbe...
    In questo modo se dovessi riapplicare il metodo successivamente farei la cosa giusta.
    Grazie mille! Altrimenti applico quello che mi hai scritto nel messaggio qui sopra.
    Ciao, buona giornata
    J
  • Re: Applicare filtro maschera anche a casella combinata

    Intanto è evidente che per fare certe cose servono le Basi, altrimenti è improponibile... se non le hai quello di cui si sta parlando è di difficile Comprensione, nel senso che devi prenderti il tempo che serve per approfondire le cose.
    Ovvio è che non posso fornirti Codice completo, nè fare un Corso di Access Online, perchè non è nello spirito del Gruppo.

    Provo a darti delle indicazioni, poi ci devi mettere del tuo per studiarci sopra e sperimentare.

    Premessa: Maschera basata su Tabella [T1] con tutti i controlli associati a campi nel Corpo della stessa
    
    IdPK       [Numerico Intero Lungo] Chiave Primaria
    Cognome    [Testo]
    Nome       [Testo]
    Sesso      [Testo]
    Destiniamo quindi a titolo di chiarimento l'intestazione della Maschera per inserire i controlli NON ASSOCIATI destinati a Filtro e Ricerca.
    I controlli possono essere TextBox, o ComboBox.
    Le comboBox devon essere specifiche, quindi 4 COmbo:
    
    1° Combo Completa   Puoi avere N Colonne ma Colonna associata la PK della Tabella.
    2° Combo Cognome    RowSource----> SELECT DISTINCTROW Cognome From T1 ORDER BY Cognome
    3° Combo Nome       RowSource----> SELECT DISTINCTROW Nome From T1 ORDER BY Nome
    4° Combo Sesso      RowSource----> SELECT DISTINCTROW Sesso From T1 ORDER BY Sesso
    Prima ho distinto le 2 Parole( Filtro e Ricerca), in quanto hanno 2 funzioni differenti e 2 tecniche differenti.
    Diciamo che sarebbe meglio sapere prima come agire, si può quindi predisporre una OptionGroup per definire se Ricerca(Valore 1) o se Filtro(Valore 2), ed un Button per APPLICARE (Filtro/RIcerca)

    Su After Update dell'OptionGroup secondo me si disabilitano i controlli NON UTILI alla ricerca... i questo caso l'unico utile è la Combo con l'elenco completo, quindi si disabilitano gli altri
    
    Priavate NomeOptionGropup_AfterUpdate()
       Me!ComboCompleta.SetFocus
       Me!NomeComboCognome.Enabled=Me!NomeOptionGropup.Value=2
       Me!NomeComboNome.Enabled=Me!NomeOptionGropup.Value=2
       Me!NomeComboSesso.Enabled=Me!NomeOptionGropup.Value=2
    End Sub
    Ricerca
    Non filtra, ma semplicemente Visualizza il Record Cercato(se esiste) e lascia inalterato l'elenco dati della Maschera.
    Questa funzione si effettua con una ComboBox, popolata con l'elenco completo dei Records della Maschera, deve avere come Colonna associata la PK della Tabella.
    Il Codice da usare su Click della Button per Applicare Filtro/Ricerca è da differenziare a seconda della Selezione:
    
    Pribvate Sub NomeButton_Click()
        Select Case Me!NomeOptionGropup.Value
            Case 1  ' Ricerca
                 With Me.RecordsetClone
                       .FindFirst "IdPK=" & Me!NomeCombo.Value
                       If Not .NoMatch Then
                             me.Bookmark=.Bookmark
                       Else
                             MsgBox "Non trovato"
                       End If
                  End With
             Case 2   ' Filtro
                ' Sviluppata sotto....
           End Select
    End Sub

    Filtro
    Il Filtro invece agisce restringendo l'elenco dei Records a solo quelli che SODDISFANO il Criterio.
    La prima cosa da capire è che se un CRITERIO NON SERVE non si usa... molti li inseriscono rendendo le queries lente per inefficienza.
    I criteri è bene vengano dosati solo sui campi veramente utili ed in questo caso è meglio che tali campi siano INDICIZZATI.

    Nel tuo caso quindi potresti avere 4 Criteri, uno Numerico e 3 Testo come esposto all'inizio.
    Ora quindi partiamo dalla gestione di Criteri Multipli o Composti...
    I Criteri si aggregano tramite Operatori LOGICI AND/OR ecc... Logica BOOLEANA quindi AND devono essere VERI TUTTI, OR .... oppure basta uno..
    Di solito si usa AND.
    Il modo quindi per comporre un criterio è validare SOLO i campi che hanno un criterio da applicare...

    Questa la Logica per costruire la Stringa del Criterio da applicare al Codice sopra...
    
    Dim strWH As String
    If Len(Me!ComboCompleta.Value & vbNullstring)>0 Then strWH=strWH & "IdPK=" & Me!Controllo1.Value& " AND "   ' Numerico
    If Len(Me!ComboCognome.Value & vbNullstring)>0 Then strWH=strWH & "Cognome='" & Replace(Me!ComboCognome.Value,"'","''") & " AND "
    .... ' aggiungi le altre N condizioni...
    If Len(strWH)>0 then strWH=Mid$(strWH,1,Len(strWH)-5)
    Me.Filter=strWH
    Me.FilterON=True
    Ovviamente tutte queste INFO sono dei pezzi del Puzzle da unire sapendo il disegno... manca la gestione errori, manca il Reset dei controlli...

    Credo tu abbia molto materiale ora da studiare e provare.
  • Re: Applicare filtro maschera anche a casella combinata

    Alex grazie mille, non potevo chiedere di meglio.
    Studio e applico, vediamo se arrivo da qualche parte
    Sei stato, oltre che disponibile, molto chiaro, grazie
    Ciao
    J
Devi accedere o registrarti per scrivere nel forum
12 risposte