[Risolto] Problema su proprietà "Riducibile" di intestazione report

di il
9 risposte

[Risolto] Problema su proprietà "Riducibile" di intestazione report

Salve a tutti di nuovo.

Ho un problema con un report creato con Access 2010.

Sto creando un'applicazione dove c'è un menù iniziale e partire da esso altri menù a cascata fino a quattro livelli successivi, per un totale di cinque (per ora!!!).
Ho creato una tabella delle funzioni dove ho inserito tutte le funzioni di tutti i menù secondo i livelli con codice progressivo a due a due.
Nella tabella c'è il codice della funzione e il codice di provenienza (es. Codice "00" Menù Iniziale, Codice "0001" Anagrafiche - Codice provenienza "00", Codice "000101" Tabelle - Codice provenienza "0001", Codice "00010101" Categorie - Codice provenienza "000101", ecc...).
Poi ho creato una query dove utilizzo la tabella cinque volte mettendo in relazione uno-a-molti i codici con i codici di provenienza.
Infine ho creato un report, con lo scopo di visualizzare le funzioni a cascata (tipo flow-chart orizzontale moooolto grezzo) per aiutarmi poi ad assegnare queste funzioni per i diritti d'accesso dei gruppi/utenti.

Ho fatto due versioni: nella prima (..V1) ho creato gruppi con sola intestazione per i primi quattro livelli e il corpo per il quinto, con proprietà Riducibile a Sì; nella seconda (..V2) due sole intestazioni riducibili con i campi con proprietà Nascondi duplicati a Sì.
Naturalmente anche tutti i campi sono impostati Riducibile a Sì.

Il problema è che per ambedue le versioni il risultato è essenzialmente analogo, cioè mi dà righe vuote anche se non ci sono dati.

Vi allego screen-shot di tabella, Query di origine dati del report e le due versioni del Report (V! e V2) tutto in visualizzazione struttura e foglio dati/anteprima.

Di sicuro è una cavolata ma non riesco a capire perché non funziona. Dove sbaglio?

Grazie a chi vorrà dedicarmi del tempo.

Alex66

9 Risposte

  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    .
    .
    Scusate, ma proprio non riesco ad allegare gli screen-shot.

    Se qualcuno mi volesse aiutare, gliene sarei grato.

    Alex66
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    Scusa ma se avessi avuto 10 Livelli facevi Query a relazioni infinite(10)...?
    Non ti "suona" male tecnicamente questa cosa, o meglio non ritieni sia un approccio che impone un grosso limite...?

    Da quanto ho capito la tua è una gestione Gerarchica, che si gestisce con 1 Tabella ed un poco di codice.
    Siccome il tuo Oggetto è sempre il medesimo ma può essere Primario o Figlio basta aggiungere un campo nella Tabella che identifica il Padre.

    IdPadre
    IdMenu

    La valorizzazione del Menù avviene per IdPadre, e la dove IdPadre=Null significa che è un PRINCIPALE.

    Questo impone la scrittura di una gestione RICORSIVA da codice, credo ti sia obbligo capire questo aspetto.
    Nel report poi serve una tabella di APPOGGIO che converta la Tabella Gerarchica in Tabella sequenziale.
    Questo sistema è usato per la Gestione di Magazzino, e/o le DI.BA gerarchie con Livelli Multipli... di cui il TREEVIEW è la rappresentazione grafica più conosciuta... l'esplora risorse è la stessa cosa....

    La cosa è più complicata da spiegare che dafare... ma questo è l'approccio che devi avere.
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    @Alex ha scritto:


    Scusa ma se avessi avuto 10 Livelli facevi Query a relazioni infinite(10)...?
    Non ti "suona" male tecnicamente questa cosa, o meglio non ritieni sia un approccio che impone un grosso limite...?

    Da quanto ho capito la tua è una gestione Gerarchica, che si gestisce con 1 Tabella ed un poco di codice.
    Siccome il tuo Oggetto è sempre il medesimo ma può essere Primario o Figlio basta aggiungere un campo nella Tabella che identifica il Padre.

    IdPadre
    IdMenu

    La valorizzazione del Menù avviene per IdPadre, e la dove IdPadre=Null significa che è un PRINCIPALE.

    Questo impone la scrittura di una gestione RICORSIVA da codice, credo ti sia obbligo capire questo aspetto.
    Nel report poi serve una tabella di APPOGGIO che converta la Tabella Gerarchica in Tabella sequenziale.
    Questo sistema è usato per la Gestione di Magazzino, e/o le DI.BA gerarchie con Livelli Multipli... di cui il TREEVIEW è la rappresentazione grafica più conosciuta... l'esplora risorse è la stessa cosa....

    La cosa è più complicata da spiegare che dafare... ma questo è l'approccio che devi avere.
    Grazie Alex, per il tempo dedicato.

    Però avevo scritto che nella tabella delle funzioni esiste sia il codice della funzione che il codice di provenienza (ovvero il codice padre), e che in effetti il menù iniziale ha come codice di provenienza valore Null. Inoltre ho inserito anche il livello della funzione (che va per ora da 0 per il menù iniziale, o principale, a 4) e il tipo di funzione, ossia se menù di livello successivo o programma (maschera o report) a solo scopo informativo, ma evidentemente mi ero spiegato male.
    Poi non sono riuscito ad allegare file e/o immagini, altrimenti l'equivoco non si sarebbe creato. Anzi se mi scrivi come poter fare per le prossime volte ti sarei grato.

    Ma in effetti alla tabella di appoggio non avevo pensato.

    Vorrei evitare di usare codice perché non sono programmatore, ma posso provare a fare più query estrapolando i diversi livelli ed unirli in una query di unione e usarla come origine dati per il report.

    Adesso ci provo e ti faccio sapere.

    Alex66
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    L'errore è nel gestire le query con le tabelle in AutoReferenza
    Devi scrivere un codice ricorsivo, sono 4 righe di codice, che a partire dai record Principali(Idparent=null) richiami ricorsivamente i record figli ed i figli dei figli... in contemporanea scriva nella tabella serializzata.
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    @Alex ha scritto:


    L'errore è nel gestire le query con le tabelle in AutoReferenza
    Devi scrivere un codice ricorsivo, sono 4 righe di codice, che a partire dai record Principali(Idparent=null) richiami ricorsivamente i record figli ed i figli dei figli... in contemporanea scriva nella tabella serializzata.
    Ragionando su quello da te scritto, ho creato dieci query, una per ogni livello di funzione con i campi necessari.
    Poi ho creato una query utilizzando le precedenti relazionando quella del livello 0 con quella del livello 1 il codice con il codice di provenienza uno-a-molti e così via fino al livello 9, selezionando tutti i campi.
    Poi ho costruito un report con nove intestazioni dal livello 0 al livello 8 e il corpo per il livello 9 scalando a destra i campi in ogni intestazione. Tutte le sezioni sono "Riducibili".
    Ho simulato funzioni fino al livello nove e il risultato del report, visivamente ma anche formalmente, è corretto!!!

    Quindi ho risolto.

    Però ho visto che il controllo treeview è mooolto interessante e può servirmi ad esempio per assegnare i diritti di accesso.

    Allora mi sono impegnato, giuro, a studiare, ma niente da fare.

    Ho visto sul tubo un esempio fatto su Nordwind da Emanuele Lana e l'ho ricopiato passo passo. Questo l'indirizzo:



    Dice che lui lo fa su access 2013 ma va bene anche su 2010. A lui funziona.

    Su una maschera vuota ha creato un controllo TreeVeiw con nome "tv" e poi un pulsante con nome "CaricaTreeView".

    All'evento click ha scritto il codice.

    Però, tanto per cominciare i nomi delle tabelle sono diversi e quelli dei campi oltre ad essere diversi a volte anche inframezzati da spazi (avrà una versione diversa di Northwind). Poco male perché ho sostituito i nomi, usando parentesi quadre ove necessitava, sperando di aver fatto bene.
    Mi dà Errore run-time '35601': Element not found
    Eseguendo il debug si posiziona sulla riga evidenziata con "!!!ERRORE!!!".
    Questo il codice da lui usato e da me modificato con i nomi di tabelle e campi del MIO northwind:
    
    Private Sub cmdCaricaTreeView_Click()
    
    Dim tempNode As MSComctlLib.Node
    
    Dim rsC As DAO.Recordset 'contiene i record dei clienti
    Dim rsO As DAO.Recordset 'contiene i record degli ordini
    
    tv.Nodes.Clear  'svuota il controllo treeview
    
    Set tempNode = tv.Nodes.Add(,, "C", "Clienti")
    ' il primo argomento rappresenta il primo livello dei nodi e si può lasciare vuoto
    ' il secondo argomento è il tipo di relazione e si può lasciare vuoto
    
    Set rsC = CurrentDb.OpenRecordset("SELECT ID,Società FROM Clienti ORDER BY Società", , dbReadOnly)
    Do While Not rsC.EOF
        Set tempNode = tv.Nodes.Add("C", tvwChild, "CL" & rsC.Fields("ID"), rsC.Fields("Società")) "!!!ERRORE!!!"
      ' carico gli ordini del cliente
      Set rsO = CurrentDb.OpenRecordset("SELECT [ID Ordine] as ChiaveOrdine,[Data Ordine] FROM Ordini WHERE [ID Cliente]=""" & rsC.Fields("ID") & """ ORDER BY [Data Ordine] DESC", , dbReadOnly)
        Do While Not rsO.EOF
            Set tempNode = tv.Nodes.Add("CL" & rsC.Fields("ID"), tvwChild, "O" & rsO.Fields("ChiaveOrdine"), rsO.Fields("[Data Ordine]"))
            rsO.MoveNext
        Loop
        rsO.Close
        rsC.MoveNext
    Loop
    
    rsC.Close
    
    tv.Nodes.Item(1).Expanded = True
    ' per espandere automaticamente il primo livello
    
    End Sub
    
    Vabbè. Non ho risolto l'errore però non mi sono perso d'animo e ho riprodotto il codice sul mio db, caso mai il problema sia la versione di nortwind e/o di access.

    Ho creato una maschera nuova, il controllo treeview e il pulsante con gli stessi nomi dell'esempio e all'evento click ho scritto questo codice inserendo anche stringhe SQL un po' più complesse, volendo visualizzare più campi e selezionare il livello, per i primi due livelli delle funzioni, tanto per provare, e mi dà Errore run-time '35603': Invalid key alla riga evidenziata con "!!!ERRORE!!!".
    
    Private Sub cmdCaricaTreeView_Click()
    
    Dim tempNode As MSComctlLib.Node
    
    Dim rs0 As DAO.Recordset 'contiene i record del livello 0
    Dim rs1 As DAO.Recordset 'contiene i record del livello 1
    
    
    tv.Nodes.Clear  'svuota il controllo treeview
    
    Set tempNode = tv.Nodes.Add(, , "0", "Livello0")
    ' il primo argomento rappresenta il primo livello dei nodi e si può lasciare vuoto
    ' il secondo argomento è il tipo di relazione e si può lasciare vuoto
    
    Set rs0 = CurrentDb.OpenRecordset("SELECT LIVELLO,CODICE_FUNZIONE,DESCRIZIONE_FUNZIONE,TIPO_FUNZIONE FROM Accesso_Funzioni_Applicazione WHERE LIVELLO=0 ORDER BY CODICE_FUNZIONE", , dbReadOnly)
    Do While Not rs0.EOF
        Set tempNode = tv.Nodes.Add("0", tvwChild, "00" & rs0.Fields("CODICE_FUNZIONE"), rs0.Fields("DESCRIZIONE_FUNZIONE"))
      ' carico il livello 1
      Set rs1 = CurrentDb.OpenRecordset("SELECT LIVELLO,CODICE_FUNZIONE,DESCRIZIONE_FUNZIONE,TIPO_FUNZIONE FROM Accesso_Funzioni_Applicazione WHERE LIVELLO=1 ORDER BY CODICE_FUNZIONE", , dbReadOnly)
        Do While Not rs1.EOF
            Set tempNode = tv.Nodes.Add("00" & rs0.Fields("CODICE_FUNZIONE"), tvwChild, "01" & rs1.Fields("CODICE_FUNZIONE"), rs1.Fields("[DESCRIZIONE_FUNZIONE]"))
            rs1.MoveNext
        Loop
        rs1.Close
        
        rs0.MoveNext
    Loop
    
    rs0.Close
    
    
    tv.Nodes.Item(1).Expanded = True
    ' per espandere automaticamente il primo livello
    End Sub
    

    Mi sapresti dire dove sbaglio?

    Grazie.


    Alex66
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    Prima di tutto hai risolto in modo che eviterei di consigliare, tecnicamente una cosa assurda, ovviamente opposta a quanto suggerito, ma.se va bene a te...

    Per il treeview è completamente fuori tema specifico apri un nuovo 3D.
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    @Alex ha scritto:


    Prima di tutto hai risolto in modo che eviterei di consigliare, tecnicamente una cosa assurda, ovviamente opposta a quanto suggerito, ma.se va bene a te...

    Per il treeview è completamente fuori tema specifico apri un nuovo 3D.
    Che per un programmatore tecnicamente sia una cosa assurda sono d'accordo con te, ma per un autodidatta come me, ma con una certa esperienza di database e di query come me (ho iniziato trent'anni fa con le query OS/400 su DB2 e se le conosci converrai con me che quelle di access sono una passeggiata di salute), è una soluzione ottimale.
    Poi il metodo da me seguito corrisponde con il tuo, visto che praticamente ho creato 10 recordset separati e messi in serie come dici tu, se per seriale intendi campi del primo livello+campi secondo livello+....+campi decimo livello .
    D'altronde parliamo di un'origine di poche decine di records. Funziona ed è veloce.

    Grazie comunque per il consiglio della serializzazione dei livelli, che mi è stato molto utile.

    Adesso provvedo ad aprire il 3D sul treeview.

    Alex66
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    alex66 ha scritto:


    @Alex ha scritto:


    Prima di tutto hai risolto in modo che eviterei di consigliare, tecnicamente una cosa assurda, ovviamente opposta a quanto suggerito, ma.se va bene a te...

    Per il treeview è completamente fuori tema specifico apri un nuovo 3D.
    Che per un programmatore tecnicamente sia una cosa assurda sono d'accordo con te, ma per un autodidatta come me, ma con una certa esperienza di database e di query come me (ho iniziato trent'anni fa con le query OS/400 su DB2 e se le conosci converrai con me che quelle di access sono una passeggiata di salute), è una soluzione ottimale.
    Poi il metodo da me seguito corrisponde con il tuo, visto che praticamente ho creato 10 recordset separati e messi in serie come dici tu, se per seriale intendi campi del primo livello+campi secondo livello+....+campi decimo livello .
    D'altronde parliamo di un'origine di poche decine di records. Funziona ed è veloce.

    Grazie comunque per il consiglio della serializzazione dei livelli, che mi è stato molto utile.

    Adesso provvedo ad aprire il 3D sul treeview.

    Alex66
    Quello che hai fatto, pur generando un risultato finale equivalente, NON HA NULLA a che vedere con quanto suggerito a livello tecnico.
    Di norma non suggeriamo soluzioni "basta che funzioni" ma suggeriamo soluzioni di buona tecnica.

    Quindi solo per chiarezza, la tua soluzione è fortemente vincolata al LIVELLO GERARCHICO esplorato... vuoi sia 5 o 10... conta poco ha un LIMITE FISICO ed una complessità che possono essere evitati..., poi capisco che per te sarà sufficiente...

    E' come generare la funzione di calcolo del Fattoriale con una serie di Moltiplicazioni... ovvio che funziona per quel numero solo ma funziona, cambi numero che fai, riscrivi tutto...?

    Quindi giusto per fare comprendere, magari a chi legge per non avere dubbi sulle 2 opzioni, la soluzione che ti proponevo NON è affatto confrontabile tecnicamente, proprio perchè si basa su un concetto di Flessibilità che consente di non dover prevedere nè definire a priori un LIMITE fisico di profondità... ma si scrive un codice che è in grado di gestire il Livello.
    Di questo ti accorgerai meglio proprio quando approfondirai la gestione a livelli infiniti del TreeeView... dove se non vuoi scrivere tonnellate inutili di codice, perchè inutili sono, ti dedicherai alla soluzione RICORSIVA, scoprendo che i tuoi 10 Recordset in serie in realtà vengono egregiamente sostituiti da solo 1... rimuovendo i limiti.

    Quindi accettiamo di buon grado che tu possa ritenerti soddisfatto del risultato, ma se vuoi convincerti che sia equivalente ti serve rifletterci.
  • Re: [Risolto] Problema su proprietà "Riducibile" di intestazione report

    Ci ho già riflettuto e ti avevo scritto che sono d'accordo con te.

    Quando avrò più dimestichezza con il VBA sicuramente il livello della discussione salirà, visto che adesso è molto basso per miei limiti.

    Comunque, tanto per dire, credo che 10 livelli di funzioni, rimanendo nei gestionali amministrativo-aziendali, neanche SAP ce l'abbia!
    Poi oh, ammesso e non concesso che ce ne sarà l'esigenza, e con tutti i miei limiti, aggiungere qualche recordset non mi pare così complicato.

    A presto.

    Alex66
Devi accedere o registrarti per scrivere nel forum
9 risposte