QUERY RICORSIVA

di il
15 risposte

QUERY RICORSIVA

Salve, avrei bisogno di una mano:

Ho una tabella con id, Cognome, Nome, Id_Padre ogni record può avere un padre che a sua volta può avere anch'esso un padre e così via, fino ad arrivare a ‘n’ livelli. Ho bisogno di fare una query che una volta selezionato un dato record mi produca un recordset che mi elenchi tutti i record che fanno capo a quell'ID, anche i record di LIV 2, 3 ecc.  ES.:

ID   COGNOME          NOME                ID_PADRE

1     ROSSI                   MATTEO   

2     CONFALONIERI  ALESSANDRO    1

3     GRASSI                TOBIA                  2

4     LANCELLOTTI     FEDERICO           3

Quindi selezionando il record con ID 2 la query mi dovrà restituire i record con ID 2, 3 e 4.

Grazie per l'aiuto. Stefano

15 Risposte

  • Re: QUERY RICORSIVA

    Io non ho capito… ma ID_PADRE è una chiave di un altra tabella relazionata?
    E il LIV 2,3 ecc  cosa intendi?

  • Re: QUERY RICORSIVA

    Non sono certo di aver capito, ma se intendi che ogni record della tabella id, cognome, nome debba essere correlato con una tabella distinta, credo che tu non abbia capito come funzionano le relazioni. Nel caso devi fare correlazioni uno a molti per poi creare una query di selezione.

  • Re: QUERY RICORSIVA

    @peperoncino

    SEMBRA banale, ma non lo e'

    una query ricorsiva serve per navigare una struttura dati gerarchica come, appunto, una struttura ad albero (padre/figlio)

    le strutture gerarchiche sono INCOMPATIBILI con il modello relazionale dei dati. 

    solo ALCUNI DBMS supportano un SQL specializzato per fare query gerarchiche. Access NON LO SUPPORTA, almeno da quello che leggo su Internet. 

    Pertanto devi scrivere del codice che implementa la navigazione gerarchica ed usare L'SQL SOLO per fare il singolo passo. 

  • Re: QUERY RICORSIVA

    Come ti ha detto @Migliorabile serve codice, Access non ti consente di farlo nativamente con query in ricorsione.

    Detto questo la cosa si complica ulteriormente in quanto la struttura gerarchica per essere rappresentata necessita di un controllo gerarchico… tipo TreeView o ListView che access non ha… allora si deve gestire diversamente ed iniziano i problemi.

    Per questo a seconda di come e cosa vuoi fare Maschera o Report, in entrambi i casi devi serializzare la gerarchia generando una tabella temporanea compilata su scan di tutta la gerarchia ed inserendo i records nella tabella in modo seriale, seguendo la gerarchia ed aggiungendo oltre aì dati necessari, la relazione PadreFiglio ma anche il Livello di profondità gerarchica.

    Questo significa scrivere codice di scan ricorsivo… da fare con attenzio e in quanto spesso si genera overflow se mal scritto.

    A quel punto la visualizzazione nel report è banale.

    Nelle form invece serve tutt'altra invenzione… si sfrutta una listbox sempre dalla tabella serializzata e si EMULA in modo barbaro un treeview esploso.

    Io per gestire gerarchie grafiche uso classi e ClassiCollection che in sostanza sono come il treeview senza parte grafica con Childs Collection ecc… decisamente meno Basico.

    Tuttavia se il livello di profondità gerarchica si ferma a 2 puoi rappresentarlo con form subform e form in modalità foglio dati, ma dall'esempio fatto sei gia al Livello=4

  • Re: QUERY RICORSIVA

    18/04/2023 - By65Franco ha scritto:


    Io non ho capito… ma ID_PADRE è una chiave di un altra tabella relazionata?
    E il LIV 2,3 ecc  cosa intendi?

    Non è detto, se un Item può essere associato solo ad un PadreItem, la tabella viene AutoReferenziata a se stessa, SelfReference.

    Se un Item può avere più PadriItem allora serve una Tabella esterna di Associazione.

    Esempio nel campo ricette, la farina è un Item che può essere usato in più ricette… quindi serve la Tabella Ingredienti e la Tabella Ricette

    Ogni Ingrediente può avere Sotto Ingredienti, quando non hai un Livello Fisso si deve lavorare in modalità Ricorsiva.

  • Re: QUERY RICORSIVA

    18/04/2023 - Antony73 ha scritto:


    Non sono certo di aver capito, ma se intendi che ogni record della tabella id, cognome, nome debba essere correlato con una tabella distinta, credo che tu non abbia capito come funzionano le relazioni. Nel caso devi fare correlazioni uno a molti per poi creare una query di selezione.

    No proprio… è una gestione Gerarchia, può essere Relazionata con se stessa e non c'è dubbio che si possa fare con una Query, temo tu non abbia compreso l'argomento della gestione Gerarchica.

  • Re: QUERY RICORSIVA

    18/04/2023 - Peperoncino ha scritto:


    Salve, avrei bisogno di una mano:

    Ho una tabella con id, Cognome, Nome, Id_Padre ogni record può avere un padre che a sua volta può avere anch'esso un padre e così via, fino ad arrivare a ‘n’ livelli. Ho bisogno di fare una query che una volta selezionato un dato record mi produca un recordset che mi elenchi tutti i record che fanno capo a quell'ID, anche i record di LIV 2, 3 ecc.  ES.:

    ID   COGNOME          NOME                ID_PADRE

    1     ROSSI                   MATTEO   

    2     CONFALONIERI  ALESSANDRO    1

    3     GRASSI                TOBIA                  2

    4     LANCELLOTTI     FEDERICO           3

    Quindi selezionando il record con ID 2 la query mi dovrà restituire i record con ID 2, 3 e 4.

    Grazie per l'aiuto. Stefano

    Rispondo per tutti: La tabella è unica, l'ID Padre corrisponde al campo ID da cui dipende il record. Quindi nell'esempio l'ID 2 dipende dall'ID 1, l'ID 3 dipende dall'ID 2 e l'ID 4 dipende dall'id 3. La mia esigenza quindi è selezionato il record con ID 2 la query restituisca i record con ID 2, 3 e 4 in quanto dipendenti tra di loro a cascata.

    Su SQL lo so che si può fare una query ricorsiva, ma mi mancava il fatto che Access non lo potesse fare. Per la compilazione di un albero Treeview ho usato un funzione che fa uno scan dei record e costruisce l'albero sulla stessa tabella andando in profondità anche al livello 7 (per quello che serve a me). Ora, siccome sto scrivendo un parte di codice che mi serve per effettuare degli aggiornamenti sui recordset volevo evitare di fare lo scan di tutto il recordset per poter effettuare gli aggiornamenti di tutta la catena di record padre-figlio. Quindi ho necessità di fare una query per poter mettere assieme tutti i record tra loro dipendenti, e sul recordset poi effettuare le variazioni che mi servono. 

    Grazie a tutti

  • Re: QUERY RICORSIVA

    Io procedo cosi.

    Mi soni creato una struttura di classi e MasterClassi che popolo con i records.

    Quando ad esempio edito un nodo, la classe nodo, questa contiene la collection Childs quindi le modifiche fatte al nodo la dove serve, vengono spalmate sui childs xhe essendo classi nodo a loro volta gerarchicamente spalmato sui figli ..

    Alla fine quando termino aggiorno la tabella.

    Chiaramente la cosa è discretamente complessa gestisco le modifiche e memorizzo i dati modificati con un flag nella classe, alla fine ciclo solo le nclassi con il flag a true ed aggiorno la tabella quando seleziono il Salva.

  • Re: QUERY RICORSIVA

    19/04/2023 - @Alex ha scritto:


    18/04/2023 - By65Franco ha scritto:


    Io non ho capito… ma ID_PADRE è una chiave di un altra tabella relazionata?
    E il LIV 2,3 ecc  cosa intendi?

    Non è detto, se un Item può essere associato solo ad un PadreItem, la tabella viene AutoReferenziata a se stessa, SelfReference.

    Se un Item può avere più PadriItem allora serve una Tabella esterna di Associazione.

    Esempio nel campo ricette, la farina è un Item che può essere usato in più ricette… quindi serve la Tabella Ingredienti e la Tabella Ricette

    Ogni Ingrediente può avere Sotto Ingredienti, quando non hai un Livello Fisso si deve lavorare in modalità Ricorsiva.

    Ora ho capito… mi capitò una volta in un progetto, ma non ricordo se in VBA o in VB.
    Grazie @Alex per info, come sempre esaustivo e molto preziosi i tuoi contributi. 

  • Re: QUERY RICORSIVA

    19/04/2023 - @Alex ha scritto:


    Io procedo cosi.

    Mi soni creato una struttura di classi e MasterClassi che popolo con i records.

    Quando ad esempio edito un nodo, la classe nodo, questa contiene la collection Childs quindi le modifiche fatte al nodo la dove serve, vengono spalmate sui childs xhe essendo classi nodo a loro volta gerarchicamente spalmato sui figli ..

    Alla fine quando termino aggiorno la tabella.

    Chiaramente la cosa è discretamente complessa gestisco le modifiche e memorizzo i dati modificati con un flag nella classe, alla fine ciclo solo le nclassi con il flag a true ed aggiorno la tabella quando seleziono il Salva.

    Purtroppo non ho mai usato le classi (anche se dando una prima occhiata non sembrerebbe una cosa difficile), riusciresti a farmi un esempio o un link dove prendere spunto, se possibile?

    Grazie

  • Re: QUERY RICORSIVA

    Ho questo esempio, che ho sviluppato per generare un GANTT, è discretamente complesso, ma consente la gestione Gerarchica delle Classi e gestisce i dati più o meno in modo completo pur essendo un DEMO.

    Temo tuttavia non sia così semplice come hai pensato, non è una cosa impossibile, ma la programmazione ad Oggetti con il VBA non è proprio alla portata di tutti, o meglio richiede discrete basi di programmazione, pertanto se hai conoscenze di altri linguaggi più strutturati che appunto usano programmazione ad oggetti non avrai problemi, anche se in VBA ci sono parecchie limitazioni nella gestione OOP, altrimenti temo sarà più laborioso di quanto hai pensato.

    Quì trovi il Demo, vedi tu:

    https://1drv.ms/u/s!Are2sGzrs4WCh2poSLs1OQrGJR5N?e=ajStvt

  • Re: QUERY RICORSIVA

    20/04/2023 - @Alex ha scritto:


    Ho questo esempio, che ho sviluppato per generare un GANTT, è discretamente complesso, ma consente la gestione Gerarchica delle Classi e gestisce i dati più o meno in modo completo pur essendo un DEMO.

    Temo tuttavia non sia così semplice come hai pensato, non è una cosa impossibile, ma la programmazione ad Oggetti con il VBA non è proprio alla portata di tutti, o meglio richiede discrete basi di programmazione, pertanto se hai conoscenze di altri linguaggi più strutturati che appunto usano programmazione ad oggetti non avrai problemi, anche se in VBA ci sono parecchie limitazioni nella gestione OOP, altrimenti temo sarà più laborioso di quanto hai pensato.

    Quì trovi il Demo, vedi tu:

    https://1drv.ms/u/s!Are2sGzrs4WCh2poSLs1OQrGJR5N?e=ajStvt

    Ti ringrazio, è interessante ma allo stesso tempo laborioso. Siccome sono autodidatta non ho mai approfondito questi argomenti che ho sempre trovato interessanti seguendo tutorial trovati in rete. Se tu hai link che trattano l'argomento classi ti sarei grato così approfondisco. 

    Grazie mille 

  • Re: QUERY RICORSIVA

    No, non esistono i demo che cerchi… 

  • Re: QUERY RICORSIVA

    Peperoncino,
    per gestire una struttura gerarchica, come ti è stato già indicato, devi procedere tramite codice (sia in merito a query ricorsiva, controllo Treeview predefinito o Classi di oggetti grafici) per realizzare la presentazione dei dati in modo da personalizzare i legami di dipendenza fra i vari record.

    Se può esserti utile puoi vedere questi thread che trattano:


    - sulla struttura gerarchica

    https://www.iprogrammatori.it/forum-programmazione/access/gerarchia-per-albero-t46048.html

    https://www.experts-exchange.com/articles/2153/Managing-Trees-and-Hierachies-in-Access.html

    https://stackoverflow.com/questions/65059263/get-all-possible-childs-decendants-of-a-parent

    - sul Controllo Treeview 

    http://www.alfainfo.it/come-usare-un-controllo-treeview-in-access/

    https://www.access-programmers.co.uk/forums/threads/hierarchical-data-recursion-tree-view-and-a-another-great-custom-class.309753/

    - sulle Classi 

    https://learn.microsoft.com/it-it/dotnet/visual-basic/programming-guide/language-features/objects-and-classes/

    http://www.snb-vba.eu/bestanden/Getz%20classes%20in%20VBA.pdf

    https://www.youtube.com/watch?v=GBMKycvWRPo

Devi accedere o registrarti per scrivere nel forum
15 risposte