La prima cosa è appunto Relazionare le due tabelle Codici_infrazioni e Dati_auto come ti dicevo andando su Strumenti > Relazioni. Aggiungi prima una e poi l'altra tabella selezionandole, e trascinando il campo Codice_Infrazione della prima verso lo stesso campo dell'altra tabella scegliendo la Join da uno a molti (vedi la freccia va verso molti)
Poi ho realizzato la query necessaria per avere una tabella virtuale e completa "QDatiMulta". Con questa query tu hai tutti i dati dall'auto alla descrizione del codice della strada.
Per fare una query, clicchi su Nuova query (puoi eseguire solo struttura e scrivere il codice direttamente in SQL) oppure con la creazione guidata di query semplice > nella finestra successiva ha la possibilità di inserire sia i campi della tabella dati_auto che tabella codici_infrazioni, inserirai tutti i campi della 1ª tabella escludendo il campo ID e tutti campi della seconda tabella escludendo oltre all'ID anche il campo Codice_Infrazione (in quanto già inserito dalla 1ª tabella). Alla fine della procedura, se tutto ok e avviando la query, avrai la tua tabella "virtuale" completa di tutti i dati. Virtuale perché non è proprio una tabella fisica come le tabelle dati ma viene creata ogni volta che lanci la query (fisicamente non esiste).
Dopo questo ho creato la maschera di inserimento dati.
esegui la procedura guidata di nuova maschera collegando (all'inizio della procedura) alla tabella dati_auto selezionando tutti i campi escluso L'ID lascia tutto per default (le opzioni grafiche etc) avrai così una maschera collegata direttamente alla tabella dati.
Cosa significa questo? Che all'apertura della maschera tu puoi andare sia a modificare i dati preesistenti che aggiungere nuovi record.
Noterai che, all'apertura, la maschera si posizionerà sul primo record della tabella e si deve cliccare sulla freccetta con asterisco in basso per aggiungere un nuovo record (in fondo alla tabella), cosa, questa, che ho reputato fastidiosa per una maschera di inserimento dati quindi ho messo un codice VBA nel Form di apertura della maschera che punta direttamente al nuovo record,
il codice in questione è questo
- Codice: Seleziona tutto
Private Sub Form_Load()
DoCmd.GoToRecord , , acNewRec
End Sub
Il codice è molto intuitivo
Do.Cmd (esegui comando), GoToRecord (vai a record), acNewRec (nuovo record)
Ora all'apertura della maschera hai tutti i campi maschera vuoti pronti per essere compilati
Una volta digitati il record è già registrato, se chiudi con la X (in alto a destra) la maschera si chiude e il record lo troverai nella tabella Dati_auto. Se devi inserire un altro record devi riaprire di nuovo la maschera oppure premere il pulsate freccia con * nella barra in basso della maschera ma per agevolare gli utenti ho preferito mettere un comando Registra che esegue lo stesso comando del Form all'apertura
- Codice: Seleziona tutto
Private Sub Registra_Click()
DoCmd.GoToRecord , , acNext
End Sub
La maschera in sé e per sé sarebbe finita ma se ci mettiamo nei panni di chi digita i dati che deve inserire l'importo della multa con valore in un range minimo e massimo cosa fa? Va ad aprire la tabella codice, per cercare il codice multa, e sapere quale somma deve inserire? Ho reputato tutto questo troppo dispersivo e allora ho creato due campi Minimo e Massimo (campi non collegati a nessuna tabella, quindi non di input ma di output).
Per fare questo ho fatto la query QImporto con questo codice
- Codice: Seleziona tutto
SELECT Codici_infrazioni.Importo_minimo AS minimo, Codici_infrazioni.Importo_massimo AS massimo
FROM Codici_infrazioni
WHERE (((Codici_infrazioni.Codice_infrazione)=[forms]![MInp_Dati_auto]![Codice_infrazione]));
In effetti è una semplice query su tabella Codici_infrazioni che filtra l'importo minimo e l'importo massimo
Dove (Where) Il codice_infrazione corrisponde al campo della maschera con nome Codice_Infrazione, il che significa che quando la maschera è aperta e il campo codice infrazione assume un valore (esistente nell'elenco dei codici) la query fornirà il suo importo minimo e massimo.
Ora si tratta solo di farlo visualizzare nei due campi,
per fare questo ho inserito una macro nell’aggiornamento del campo da digitare (Codice_infrazione della maschera)
- Codice: Seleziona tutto
Private Sub Codice_infrazione_BeforeUpdate(Cancel As Integer)
Me.Minimo = (DMax("Minimo", "QImporto"))
Me.Massimo = (DMax("Massimo", "QImporto"))
Me.PuntiPat = (DMax("Punti_patente", "QPuntiPat"))
End Sub
Le prime due righe si riferiscono agli importi minimo e massimo mentre la terza riga ai punti patente che utilizza lo stesso sistema utilizzando, però, la query "QPuntiPat" in questo caso viene riempito il campo “PuntiP" collegato alla tabella Dati_auto, quindi questa macro mette i valori delle query nei campi informativi (range importi min e max) e di input (punti patente).
Ho messo un Punto Interrogativo (?) per aprire direttamente la tabella Codici_Infrazioni e agevolare così l'utente alla sua consultazione
Ora la maschera è completata.
Passiamo ai report
Anche per questi è utile utilizzare la procedura guidata (forse più di tutti gli altri oggetti del database)
Un report lo dice il termine stesso "Rapporto", Referto, riportare quindi i dati in un formato scelto dall'utente a seconda dell'esigenza.
Puoi fare un report di una tabella e vedere il tuo bel rapportino già impaginato e idoneo per essere presentato cosa che invece, non si può dire della stampa di una tabella.
Nel tuo caso però doveva essere un report con una determinata specifica
Report 1 "Costruire un report con le targhe dei veicoli e dei vigili che hanno elevato multe per divieto di sosta. "
quindi non essendo il report indicato per filtrare i "divieti di sosta" ho creato una query che lo facesse "QMultaDDS":
- Codice: Seleziona tutto
SELECT QDatiMulta.Targa, QDatiMulta.Vigile, QDatiMulta.Descrizione_breve
FROM QDatiMulta
WHERE QDatiMulta.Descrizione_breve = "Divieto di Sosta";
Come vedi il filtro Where chiede che il campo sia "Divieto di Sosta"
e poi ho creato il report su questa query.
Infine il secondo report richiesto era:
"Costruire un report delle multe elevate da un determinato vigile "
Non sapendo quale vigile dovessi filtrare ho messo una variabile non conosciuta dal Database (NomeVigile) e lì la query si blocca chiedendo il valore del parametro
- Codice: Seleziona tutto
SELECT QDatiMulta.Veicolo, QDatiMulta.Targa, QDatiMulta.Proprietario, QDatiMulta.Data, QDatiMulta.Luogo, QDatiMulta.Codice_infrazione, QDatiMulta.Multa, QDatiMulta.PuntiP, QDatiMulta.Vigile, QDatiMulta.Importo_minimo, QDatiMulta.Importo_massimo, QDatiMulta.Punti_patente, QDatiMulta.Descrizione_breve, QDatiMulta.Descrizione_dettagliata
FROM QDatiMulta
WHERE QDatiMulta.Vigile = NomeVigile;
Quando il report attiva la query, la query chiede il valore mancante e, una volta inserito, la query fornirà tutti i dati richiesti e il Report sarà completo.
Ma un buon libro sui database no, eh? Ciao