Ho deciso di fare questo articolo in quanto molto interessante perchè potrebbe avere diverse applicazioni.
Immaginiamo di voler ottenere un report con un elenco di voci con accanto a ciascuna di esse un valore che indichi se quella voce è stata selezionata o meno.
Esempi tipici:
Proprio quest'ultima fattispecie è quella richiesta dall'amico P. che mi contatta scrivendo:
ciao Michele,
....Mi sono autocostruito con Access 2002 (da autodidatta) un database per la registrazione di sintomi.
Attualmente raccolgo i dati attraverso una scheda cartacea, nella quale ho una tabella con i sintomi ordinati da 1 a 100.
Facendo un esempio "potabile",
1. mal di testa
2. mal d’orecchi
3. mal di denti
….
99. unghie incarnite
100. vesciche
Per ogni paziente, in fase di analisi uso una scheda cartacea, e “crocetto” le malattie presenti, indicando anche la gravità del sintomo (Lieve, Moderato, Grave).
In seconda battuta, registro i sintomi nel mio database, attraverso una maschera in cui inserisco il codice del sintomo e la gravità registrata (es. 1 L = mal di testa lieve, 3 G, 99 M). Al momento, esco dal database con un report che mi da, in ciascuna scheda paziente, solo i sintomi riscontrati (che quindi ho registrato in database) e la loro gravità. Il mio committente, però, mi chiede ora di uscire dal database con un report che è il CLONE della scheda cartacea con cui si raccolgono i dati, ovvero con 100 righe riportanti i sintomi e, a fianco dei sintomi riscontrati per ciascun paziente, la loro gravità.
Nell’esempio qui sopra, devo quindi avere 100 righe di cui 97 hanno la casella gravità vuota e solo 3 (quelle relative ai sintomi riscontrati) un valore nella gravità (L nella riga 1, G nella riga 3, M nella riga 99). Non riesco però in nessun modo a produrre questo report!
Il mio problema, oltre che pratico, è anche di tipo metodologico:
- mi sembra scorretto registrare un valore pari a 0 per i sintomi che non vengono rilevati, perché così registrerei 100 dati per ogni paziente, pur essendocene magari solo 3 o 4 (al massimo 8-10), creando una mole di dati assurda, e aumentando in maniera folle i tempi di registrazione;
- il database però ora mi tira fuori solo i 3-4 sintomi riscontrati (perché li ho registrati!) e non tutto l’elenco dei 100 sintomi possibili;
- se baso il report sulla tabella sintomi, il risultato è che ho sì l’elenco di tutti i 100 sintomi riscontrabili, ma nessun legame con quelli effettivamente riscontrati per ciascun paziente.
Come posso fare? Veramente non ne esco.
Ti ringrazio per ogni aiuto che potrai darmi
Per ottenere un tale report dobbiamo costruire opportunamente una struttura dati ed una query. La struttura dati pùo essere, ad esempio, la seguente:
dove il significato delle tabelle è:
Questa struttura è in terza forma normale e quindi NON HA RIDONDANZE, rispondendo pienamente al dubbio metodologico del nostro amico P.
Per realizzare il tipo di report richiesto vi sono diversi approcci: uno di tipo procedurale, che ho suggerito privatamente all'amico P, ed uno di tipo set-oriented, ovvero realizzato senza scrivere una linea di codice VBA ma con una opportuna query SQL.
Descriviamo in questa sede il secondo approccio che è molto interessante.
La query SQL che dobbiamo usare come sorgente di dati per popolare il report è la seguente:
SELECT X.*, A1.COGNOME, A1.NOME,
SS.DATA
FROM ANAGRAFICA AS A1, SCHEDA
AS SS, [SELECT SI.DESCRIZIONE, iif(isnull(A.ID),'No',
'Si') AS PRESENTE, IIF(ISNULL(DS.GRAVITA), 0, DS.GRAVITA) AS GRAVITA
FROM (((SINTOMI AS SI LEFT JOIN DETTAGLI_SCHEDA AS DS ON SI.ID=DS.SINTOMO)
LEFT JOIN SCHEDA AS SA ON (SA.ID=DS.SCHEDA AND DS.SCHEDA=1))
LEFT JOIN ANAGRAFICA AS A ON A.ID=SA.PAZIENTE)]. AS X
WHERE A1.ID=1
AND SS.ID=1;
Nella query si individua una sottoquery (vedi interna di colore rosso) che effettua dei join esterni per ottenere tutti i sintomi e non solo quelli presenti nel dettaglio della scheda. La query esterna, invece, realizza un prodotto scalare in modo da inserire delle opportune ridondanze che verranno sfruttate nei raggruppamenti del report. In colore verde sono inserite le condizioni di filtraggio ovvero il codice del paziente ed il codice di una particolare scheda di quel paziente (notare la ridondanza, purtroppo necessaria).
La struttura del report è la seguente:
Si osservi che la proprietà Origine Record del report è impostata a "Nuova_Sintomatologia" che è il nome assegnato alla query.
Eseguendo il report si ottiene il seguente risultato:
L'esempio, per meglio studiare la soluzione, è riportato al seguente link.
Buon lavoro.
[da 1 a 1 di 1 commenti] | Indietro