Report con raggruppamento

di il
8 risposte

Report con raggruppamento

Premetto che ho pochissima dimestichezza con i report.
Dunque ho gia' un report con i tutti i dati anagrafici dell'allievo, ed e' un report che mando in stampa per un singolo allievo, quindi con una clausola sulla PK dell'anagrafica.
Dopo aver elencato tutti i campi dell'anagrafica che mi servono dovrei iniziare una sezione con tutti gli esami sostenuti dall'allievo, il numero degli esami e' variabile.
Ovviamente le tabelle sono collegate uno a molti.
L'applicazione funziona ormai perfettamente e adesso mi serve anche qualche stampa...
E' una cosa possibile o bisogna partire necessariamente da una creazione guidata con raggruppamento?
Qualche suggerimento o qualche guida?

8 Risposte

  • Re: Report con raggruppamento

    Puoi esplicitare i nomi propri dei campi di tutte le tabelle che entrano in gioco e che vuoi stampare? Poi indica su quale/i campo/i vuoi fare il raggruppamento.
  • Re: Report con raggruppamento

    Dunque il report si alimenta da 3 tabelle e altre query (sono contatori che non mi danno problemi:
    1) ANAGRAFE PK ID_ANAGRAFE
    2) ESAMI PK ID_ESAMI collegata molti a uno ESAMI.COD_ANAGRAFE -> ANAGRAFE.ID_ANAGRAFE
    3) TURNI PK ID_TURNI collegata uno a molti TURNI.ID_TURNI -> ESAMI.COD_TURNI
    In ANAGRAFE ci sono gli allievi
    In ESAMI ci sono gli esami sostenuti da ogni singolo allievo con relativo esito (numero variabile di esami per ogni allievo ... da 0 a N)
    In TURNI ci sono la data del turno di esame e gli allievi iscritti a quel turno (numero variabile di allievi iscritti al turno di esame da 1 a N)
    i collegamenti funzionano perfettamente
    devo stampare un po di dati da ANAGRAFE compresi i contatori tratti dalle query
    e fin qui tutto gia' fatto
    e poi a seguire alcuni dati degli esami sostenuti (principalmente la data e l'esito)
    data (da TURNI) ed esito esami (da ESAMI) sostenuti dall'allievo
    SELECT Anagrafe.ID_ANAGRAFE, Anagrafe.NOME, Anagrafe.SEX, Anagrafe.NATO_IL, Anagrafe.NATO_A, Anagrafe.NATO_PROV, Anagrafe.COD_FISCALE, Anagrafe.EXTRA_UE, Anagrafe.INDIRIZZO, Anagrafe.CAP, Anagrafe.CITTA, Anagrafe.PROV, Anagrafe.TELEFONO, Anagrafe.TEL_ALTRI, Anagrafe.EMAIL, Anagrafe.SOCIAL, Anagrafe.CORSO, Anagrafe.EX_PATENTE, Anagrafe.ATTIVO, Anagrafe.FASE_CORSO, Anagrafe.DATA_ISCRIZIONE, Anagrafe.MATRICOLA, Anagrafe.STATINO, Anagrafe.APP_IOS, Anagrafe.VISITA_DOC, Anagrafe.VISITA_DATA, Anagrafe.PRIVATISTA, Anagrafe.ESTENSIONE, Anagrafe.LISTINO, Anagrafe.PROMOZIONI, Anagrafe.NOTE_VELOCI, Anagrafe.APP_REG, Anagrafe.APP_MAIL, Anagrafe.ALTRE_SCUOLE, Anagrafe.FINANZIAMENTO, Anagrafe.NOTE_LUNGHE, Anagrafe.CALENDARIZZATO, Anagrafe.ULTIMO_TURNO, Anagrafe.TEORIA_START, Anagrafe.TEORIA_END, Anagrafe.LEZ_AULA, Anagrafe.TEO_VOTO, Anagrafe.F_ROSA_START, Anagrafe.F_ROSA_END, Anagrafe.RIPORTO_TEO, Anagrafe.GUI_VOTO, Anagrafe.PATENTE_NUM, Anagrafe.PATENTE_DATA, Anagrafe.PATENTE_SCAD, Anagrafe.SEI_GUI_A1_1, Anagrafe.SEI_GUI_A1_2, Anagrafe.SEI_GUI_A1_3, Anagrafe.SEI_GUI_A2_1, Anagrafe.SEI_GUI_A2_2, Anagrafe.SEI_GUI_A2_3, Anagrafe.SEI_GUI_B1_1, Anagrafe.SEI_GUI_B1_2, Anagrafe.SEI_GUI_B1_3, Anagrafe.SEI_GUI_B2_1, Anagrafe.SEI_GUI_B2_2, Anagrafe.SEI_GUI_B2_3, Anagrafe.SEI_GUI_C1_1, Anagrafe.SEI_GUI_C1_2, Anagrafe.SEI_GUI_C1_3, Anagrafe.SEI_GUI_C2_1, Anagrafe.SEI_GUI_C2_2, Anagrafe.SEI_GUI_C2_3, qryGuideCONTAORE.SommaDiORE, qryGuideCONTAOREA10.SommaDiORE, qryGuideCONTAORENotte.SommaDiORE, qryTeorieCONTAORE.SommaDiORE, qryTeorieCONTAORE_Aula.SommaDiORE, qryTeorieCONTAORE_OnLine.SommaDiORE, Turni.DATA, Turni.PRATICA, Turni.CONCLUSO, Turni.ESAMINATORE, Esami.PRESENTE, Esami.PROMOSSO, Esami.NUM_ERRORI
    FROM Turni INNER JOIN (((((((Anagrafe LEFT JOIN qryGuideCONTAORE ON Anagrafe.ID_ANAGRAFE = qryGuideCONTAORE.COD_ANAGRAFE) LEFT JOIN qryGuideCONTAOREA10 ON Anagrafe.ID_ANAGRAFE = qryGuideCONTAOREA10.COD_ANAGRAFE) LEFT JOIN qryGuideCONTAORENotte ON Anagrafe.ID_ANAGRAFE = qryGuideCONTAORENotte.COD_ANAGRAFE) LEFT JOIN qryTeorieCONTAORE ON Anagrafe.ID_ANAGRAFE = qryTeorieCONTAORE.COD_ANAGRAFE) LEFT JOIN qryTeorieCONTAORE_Aula ON Anagrafe.ID_ANAGRAFE = qryTeorieCONTAORE_Aula.COD_ANAGRAFE) LEFT JOIN qryTeorieCONTAORE_OnLine ON Anagrafe.ID_ANAGRAFE = qryTeorieCONTAORE_OnLine.COD_ANAGRAFE) INNER JOIN Esami ON Anagrafe.ID_ANAGRAFE = Esami.COD_ANAGRAFE) ON Turni.ID_TURNI = Esami.COD_TURNI;
    probabilmente e' una cosa semplice come potrebbe essere la stampa di una fattura dove ci sono N oggetti venduti per una singola fattura
    ma come detto non sono ancora pratico di report
    ps. i collegamenti alle query non interessano quei dati sono gia' inseriri nel report e funzionano bene, l'intoppo che ho e' sugli esami
  • Re: Report con raggruppamento

    Walter61 ha scritto:


    1) ANAGRAFE PK ID_ANAGRAFE
    2) ESAMI PK ID_ESAMI collegata molti a uno ESAMI.COD_ANAGRAFE -> ANAGRAFE.ID_ANAGRAFE
    3) TURNI PK ID_TURNI collegata uno a molti TURNI.ID_TURNI -> ESAMI.COD_TURNI
    In ANAGRAFE ci sono gli allievi
    In ESAMI ci sono gli esami sostenuti da ogni singolo allievo con relativo esito (numero variabile di esami per ogni allievo ... da 0 a N)
    In TURNI ci sono la data del turno di esame e gli allievi iscritti a quel turno (numero variabile di allievi iscritti al turno di esame da 1 a N)
    A me il punto 2) non torna. Secondo me un Anagrafica può sostenere molti Esami. Un Esame può essere sostenuto da molti Anagrafiche. Quindi ti serve una tabella di congiunzione che accolga dal lato molti sia IDAnagrafica, sia IDEsame.
    Non ho capito il significato della tabella Turni.
    Se elenchi i campi di tutte le tabelle, il quadro è più chiaro di come lo hai raccontato con i soli campi chiave (credo mal) relazionati.
    Poi non ho ancora capito in base a quale/i campo/i vuoi raggruppare il report.
  • Re: Report con raggruppamento

    Nei turni di esame (tabella TURNI) con indicazione della data ci sono gli esami (tabella ESAMI) dei singoli allievi con gli esiti
    In un turno di esame ci sono diversi allievi esaminati (da 1 a N)
    Ogni allievo puo' sostenere diversi esami (da 0 a N)
  • Re: Report con raggruppamento

    Lo ammetto, mi chiamo Osvaldo Laviosa, molto ben conosciuto nel forum per essere "il più duro di comprendonio". Ma tu...
    Scusa, ti viene l'ernia del disco a descrivere:
    - nomi propri di tutte le tabelle (OK, lo hai già fatto)
    - nomi propri di tutti i loro campi con indicazione della chiave primaria
    - le relazioni (che...in base alla mia logica...per ora...non tornano se non espliciti il secondo punto e/o racconti tutto con un esempio concreto...mostra un recordset di dati)
    - in base a quale/i campo/i intendi raggruppare il report (questo non lo hai mai indicato dall'inizio della discussione)

    P.S.: ho provato a dare una "piccola" occhiata alla SELECT che hai postato (non sono bravo con SQL). Secondo me ci sono moltissimi campi che non sono strettamente legati a Anagrafica...ho un forte sospetto sulla "normalizzazione"...che proprio essa potrebbe impedirti di avere una visione chiara sia della query, sia del report.
  • Re: Report con raggruppamento

    Intanto grazie infinite Osvaldo
    lasciamo perdere la normalizzazione e semplifichiamo
    invece di elencare tutti i campi mi limito a semplificare al massimo limitando i campi allo strettissimo necessario per poter fare un esempio concreto
    intanto ti spiego cosa fa l'applicazione
    gestiamo una autoscuola quindi allievi iscritti , esami di teoria ed esami di guida
    quindi le tabelle (solo quelle che ci servono per l'esempio):
    1) ANAGRAFE (anagrafiche degli allievi iscritti)
    PK ID (numerazione automatica)
    campo principale
    NOME
    (lasciamo stare tutti gli altri campi)
    2) TURNI (turni / sedute di esame con N variabile di candidati in ognuna)
    PK ID (numerazione automatica)
    campi principali
    DATA (data dell'esame)
    PRATICA (booleano esame di pratica o esame di teoria)
    (lasciamo stare tutti gli altri campi)
    3) ESAMI (ogni sessione di esame per l'allievo)
    PK ID numerazione automatica
    campi principali
    ESITO
    (lasciamo stare tutti gli altri campi)

    Le relazioni sono:
    ANAGRAFE e ESAMI uno a molti
    ogni allievo puo' fare una o piu' volte l'esame di teoria e/o l'esame di guida (ovviamente gli esami vengono ripetuti se con esito negativo)
    normalmente gli allievi devono superare l'esame di teoria e poi quello di guida pratica
    non tutti gli allievi fanno gli esami di teoria (chi ha gia' una patente salta direttamente all'esame di guida pratica)
    TURNI e ESAMI uno a molti
    ci sono turni/sessioni di teorie e di pratica
    spiego perche' devo usare una tabella TURNI: devo gestire le fasi di prenotazione dei TURNI con la motorizzazione civile con molto anticipo quindi ho bisogno di un elemento che mi gestisca collettivamente tutti gli allievi prenotati ad una sessione e devo avere la possibilita' inoltre di cambiare velocemente gli allivi iscritti ad un esame, magari anche sostituendoli
    Tutta l'applicazione funziona egregiamente, ora ho bisogno di fare qualche stampa
    Ho in mente una stampa individuale solo per l'allievo X (e fin qui tutto funzionante)
    per quanto riguarda tutti i dati pescati da ANAGRAFE e' tutto funzionante compresi i conteggi delle ore di lezione (che non riguardano il problema)
    in coda alla scheda con i dati generali dell'allievo ho bisogno di una sezione che mi elenchi tutti gli esami EVENTUALMENTE sostenuti in ordine di data
    Qui e' il nocciolo del mio problema
    devo poter stampare una scheda per un allievo anche se non ha ancora dato esami ne' di teoria ne' di pratica e se li ha dati con i relativi esiti
    Ecco che ti semplifico quello che dovrei fare:
    NOME
    DATA esame/i di teoria ed ESITO
    DATA esame/i di pratica ed ESITO
    e ripeto posso avere allievi che non hanno ancora esami
    o che li hanno solo di pratica
    Spero di non essere stato troppo prolisso
  • Re: Report con raggruppamento

    Chiudo gli occhi sulla normalizzazione. Procedo provando a seguire la parte "migliore" del tuo discorso.
    1. La tua query deve includere le tabelle Anagrafica e Esami...Turni non l'ho ancora capita, ma se serve prelevare campi testuali da essa, la includi.
    2. La relazione Anagrafica uno-a-molti Esami (nella query) deve essere di tipo 2 (LEFT) in modo da mostrare anche i Nomi che non hanno Esami.
    3. Fai poggiare il report sulla query e raggruppa in base a "qualsiasi campo significativo" di Anagrafica (IDAnagrafica o la coppia Cognome Nome…).
  • Re: Report con raggruppamento

    Infatti ho provato e ho risolto inserendo nella query che fornisce i dati al report
    1) ANAGRAFICA
    2) QUERY con i dati di TURNI ed ESAMI anziche direttamente le tabelle TURNI ed ESAMI
    la join collega tutte le ANAGRAFE anche senza ESAMI
    raggruppo sul nome e quindi OK
    Sulla normalizzazione fidati... mi sono occupato di DB fin dai tempi del dBase III
    Ti spiego perche' ho bisogno di una tabella TURNI che faccia da tramite con gli esami degli allievi:
    prenoto le sedute in motorizzazione, con molto anticipo e senza ancora sapere quali allievi verranno inseriti in quelle sedute
    le sedute (TURNI) hanno una data di svolgimento dell'esame e ovviamente possono essere sedute di teoria, di guida, di moto, di auto, motorini ecc.
    ecco quindi che ho N sedute prenotate da qui ai prossimi 2/3 mesi senza sapere ancora chi sara' esaminato
    ho quindi la necessita' di inserire nelle varie sedute gli allievi man mano che saranno pronti
    e comunque prima dell'esame devo comunicare alla motorizzazione i nominativi degli allievi che saranno sottoposti a quella seduta (TURNI)
    e quindi ho necessita' di una storicizzazione delle sedute (TURNI)
    quindi ANAGRAFICA relazionata a ESAMI relazionata a TURNI
    TURNI e' un collettore, un contenitore
    Grazie Osvaldo per la pazienza e i suggerimenti
Devi accedere o registrarti per scrivere nel forum
8 risposte