Costruire una Query Union con Microsoft Access
Impariamo a costruire una Query Union con Microsoft Access prendendo spunto da un esempio tratto dalla nostra applicazione database Gestione Clienti e Fatturazione con Microsoft Access
Innanzitutto che cos'è Query Union?
La Query Union è un particolare tipo di query composta da 2 parti o "enunciati" la quale produce una tabella risultato che contiene le righe restituite sia dal primo enunciato di selezione sia dal secondo.
Si deve usare la visualizzazione SQL per definire una query UNION (detta anche query di unione).
Sintassi:
enunciato-di -selezione
UNION [ALL]
enunciato-di -selezione
[ORDER BY {nome-colonna|nome-colonna}]
[ASC | DESC]
Se si specifica ALL, Microsoft Access restituisce tutte le righe in entrambe le tabelle logiche. Se non si specifica ALL, Accesselimina le righe duplicate.
Le tabelle restituite da ciascun enunciato di selezione devono contenere un numero uguale di colonne e ciascuna colonna deve avere attributi identici. Non si può usare la clausola ORDER BY negli enunciati di selezione che vengono combinati in base a operatori query; tuttavia si può includere un’unica clausola ORDER BY alla fine di un enunciato che usa uno o più operatori query. Questa azione applicherà l’ordine specificato sul risultato dell’intero enunciato.
Access deriva i nomi delle colonne dell’output dai nomi delle colonne restituite dal primo enunciato di selezione.
Se si vogliono usare nomi di colonne nella clausola ORDER BY, utffizzare i nomi della prima query.
Si possono usare anche inumeri delle colonne di output per definire criteri ORDER BY. Si possono mettere insieme vari enunciati di selezione usando UNION per ottenere risultati complessi.
Si possono anche usare le parentesi per modificare la sequenza in cui Access applica gli operatori, come si vede qui sotto: SELECT . . . UNION (SELECT . . . UNION SELECT . .)
Esempio (tratto dal database GestioneClientiMC2_Euro.mdb, prodotto da MC2 E-Learning, in omaggio come bonus aggiuntivo agli acquirenti del Corso Base di Microsoft Access):
Per realizzare il Sottoreport FattureTotaliIVA contenuto all'interno del Report Fattura (vedi la parte "cerchiata" nella figura qui sotto) è stata impiegata unaQuery Union,FattureTotaliIVA, i cui enunciati sono riportati più in basso.
Lo scopo è quello di ottenere una unica tabella di sintesi per la compilazione del riquadro Riepilogo IVA della fattura, a partire da due tabelle:Dettagli prestazione e Spese per prestazione.
Difatti gliimporti da fatturare periodicamente ad un dato cliente e soggetti ad iva provengono da entrambe le fonti e devono essere raggruppati in fattura come è noto in base alle aliquote iva vigenti (es. iva al 10%, iva al 15%, iva al 20%, ecc.)
Gli oggetti legati alla tabellaCodiciIVA sono rispettivamente Articoli Fatturazione per quanto riguarda le prestazioni e Codici Spese per quanto riguarda le Spese anticipate (non art.15 quindi soggette ad iva).
Se ci fossero state spese imponibili nell'esempio della fattura sopra raffigurata, indipendentemente dalla relativa aliquota di assoggettamento, queste sarebbero state sommate ai valori di imponibile e di iva riportati nel riquadro Riepilogo IVA.
I nomi delle colonne della tabella finale sono6, risultato della query union, e sono quelle del primo enunciato, evidenziate inrosso, e cioè: FatturatoPerArticolo, IDCodiceIVA, Descrizione, %IVA, Importo IVA e IDPrestazione.
Questo è il risultato della Query Union dell'esempio in modalità Visualizzazione Dati:

I valori ImponibileSpese, IDCodiceIVA,Descrizione, %IVA, ImportoIVA e IDPrestazione del secondo enunciato vengono "sommati" e raggruppati per aliquota iva come specificato nella clausola GROUP BY (evidenziata in verde) grazie alla query union.
Prima parte della Query Union (interrogazione su tabela Dettagli prestazione)

SELECT DISTINCTROW
Sum([Dettagli prestazione].ImportoDaFatturareEuro)
AS FatturatoPerArticolo, CodiciIVA.IDCodiceIVA, CodiciIVA.Descrizione, CodiciIVA.[%IVA],
[FatturatoPerArticolo]*[%IVA] AS [Importo IVA], [Dettagli prestazione].IDPrestazione
FROM (CodiciIVA INNER JOIN [Articoli Fatturazione] ON CodiciIVA.IDCodiceIVA = [Articoli Fatturazione].IDCodiceIVA) INNER JOIN [Dettagli prestazione] ON [Articoli Fatturazione].IDArticoloFatturazione = [Dettagli prestazione].IDArticoloFatturazione
WHERE [Dettagli prestazione].IDPeriodoDiFatturazione=DLookUp("IDPeriodoFatturazione","StampaFattura") AND [Dettagli prestazione].FatturaONotaEmessa=False
GROUP BY CodiciIVA.IDCodiceIVA,CodiciIVA.Descrizione, [Dettagli prestazione].IDPrestazione, CodiciIVA.[%IVA]
ORDER BY CodiciIVA.Descrizione;
Seconda parte della Query Union (interrogazione su tabella Spese per prestazione)

SELECT DISTINCTROW Sum([Spese per prestazione].ImportoSpesaEuro) AS ImponibileSpese, CodiciIVA.IDCodiceIVA, CodiciIVA.Descrizione, CodiciIVA.[%IVA],[ImponibileSpese]*[%IVA] AS [Importo IVA], [Spese per prestazione].IDPrestazione
FROM (CodiciIVA INNER JOIN [Codici Spese] ON CodiciIVA.IDCodiceIVA = [Codici Spese].IDCodiceIVA) INNER JOIN [Spese per prestazione] ON [Codici Spese].IDCodiceSpese = [Spese per prestazione].IDCodiceSpese
WHERE [Spese per prestazione].IDPeriodoDiFatturazione=DLookUp("IDPeriodoFatturazione","StampaFattura") AND [Spese per prestazione].FatturaONotaEmessa=False
GROUP BY CodiciIVA.IDCodiceIVA,CodiciIVA.Descrizione, [Spese per prestazione].IDPrestazione, CodiciIVA.[%IVA];
Enunciato completo della Query Union: (non visualizzabile in modalità visualizzazione struttura query ma soltanto in visualizzazione SQL)
SELECT DISTINCTROW
Sum([Dettagli prestazione].ImportoDaFatturareEuro)
AS FatturatoPerArticolo, CodiciIVA.IDCodiceIVA, CodiciIVA.Descrizione, CodiciIVA.[%IVA],
[FatturatoPerArticolo]*[%IVA] AS [Importo IVA], [Dettagli prestazione].IDPrestazione
FROM (CodiciIVA INNER JOIN [Articoli Fatturazione] ON CodiciIVA.IDCodiceIVA = [Articoli Fatturazione].IDCodiceIVA) INNER JOIN [Dettagli prestazione] ON [Articoli Fatturazione].IDArticoloFatturazione = [Dettagli prestazione].IDArticoloFatturazione
WHERE [Dettagli prestazione].IDPeriodoDiFatturazione=DLookUp("IDPeriodoFatturazione","StampaFattura") AND [Dettagli prestazione].FatturaONotaEmessa=False
GROUP BY CodiciIVA.IDCodiceIVA,CodiciIVA.Descrizione, [Dettagli prestazione].IDPrestazione, CodiciIVA.[%IVA]
ORDER BY CodiciIVA.Descrizione;
UNIONSELECT DISTINCTROW Sum([Spese per prestazione].ImportoSpesaEuro) AS ImponibileSpese, CodiciIVA.IDCodiceIVA, CodiciIVA.Descrizione, CodiciIVA.[%IVA],[ImponibileSpese]*[%IVA] AS [Importo IVA], [Spese per prestazione].IDPrestazione
FROM (CodiciIVA INNER JOIN [Codici Spese] ON CodiciIVA.IDCodiceIVA = [Codici Spese].IDCodiceIVA) INNER JOIN [Spese per prestazione] ON [Codici Spese].IDCodiceSpese = [Spese per prestazione].IDCodiceSpese
WHERE [Spese per prestazione].IDPeriodoDiFatturazione=DLookUp("IDPeriodoFatturazione","StampaFattura") AND [Spese per prestazione].FatturaONotaEmessa=False
GROUP BY CodiciIVA.IDCodiceIVA, CodiciIVA.Descrizione, [Spese per prestazione].IDPrestazione, CodiciIVA.[%IVA];
Le Relazioni tra le tabelle di Access
Costruire una tabella con Access
Esempi Query con Access
Tutorials su Microsoft Access
Dr.Maurizio Cucchiara
autore del corso:
"Corso Base di Microsoft Access"
disponibile on line su questo sito
MC2 E-Learning S.a r.l.
Formazione per il Web
http://www.mc2.it/html/access.html
Cerca sul web con Google:
