Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Capitolo 18
Creazione di query
in un progetto di Access
Costruzione di query con la finestra Costruzione delle query
di progettazione query .......................640 con un editor di testo ........................665
Come hai già imparato nei capitoli 7, 8 e 9, puoi costruire rapidamente quasi tutti i
tipi di query necessari in un database desktop di Access (.mdb) utilizzando la finestra
di struttura query. La finestra di progettazione query in un file di progetto di Access
(.adp) offre un’interfaccia simile a quella utilizzata in un database desktop di Access
(.mdb); di conseguenza, con una piccola curva di apprendimento potrai presto
costruire query nei tuoi progetti di Access.
Ricorda che il file di progetto di Access non memorizza i dati e le query: devi con-
nettere il progetto a Microsoft SQL Server Data Engine (MSDE) o Microsoft SQL Ser-
ver, perché è il server che contiene i dati e le query. SQL Server offre funzionalità per
le query che vanno ben oltre le già notevoli capacità di un database desktop di Access
(.mdb). SQL Server offre molti tipi diversi di query che permettono di sfruttare l’ele-
vato potenziale di SQL Server. Puoi costruire molte delle query necessarie per l’ap-
plicazione utilizzando la finestra di progettazione query; tuttavia, per utilizzare com-
pletamente il potenziale di SQL Server, devi imparare il suo linguaggio di program-
mazione, Transact-SQL, e costruire le query nell’editor di testo. Transact-SQL non
include solo le istruzioni SQL compatibili con lo standard intermedio ANSI SQL-92,
ma offre anche capacità estese che lo rendono molto più simile a un linguaggio di
programmazione avvolto intorno al linguaggio di interrogazione esistente.
Nota Puoi trovare una guida di riferimento al linguaggio SQL supportato da Micro-
soft Access e Microsoft SQL Server nell’appendice B, “SQL”. Per ottenere una guida
di riferimento completa a Transact-SQL, scarica una copia gratuita di Microsoft SQL
Server 2000 Books Online (un insieme di file della guida) dall’indirizzo http://www.
microsoft.com/sql/techinfo/productdoc/2000/books.asp.
637
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 638
SUL Nota Per seguire gli esempi in questo capitolo puoi aprire il file di progetto di esem-
pio Contacts.adp, oppure puoi creare un nuovo file di progetto e connetterlo al data-
base di esempio ContactSQL.mdf. Puoi trovare entrambi i file sul CD allegato. Per
ulteriori informazioni sulla creazione di un nuovo file di progetto e sulla sua connes-
sione a un file esistente, consulta il capitolo 17, “Creazione di tabelle in un proget-
to di Access”.
Figura 18.1 Le query nel database di esempio ContactsSQL.mdf viste dal progetto di
esempio Contacts.adp.
Inside Out
Altri passaggi da svolgere per lavorare con il file di progetto di esempio
Il metodo più semplice prevede di installare e avviare MSDE sul computer. Quando
apri per la prima volta il file di progetto di esempio Contacts.adp, viene eseguito del
codice Visual Basic che tenta di connettersi al server locale e di individuare il data-
base ContactsSQL utilizzato dal progetto. Se non è in grado di trovare il database sul
Capitolo 18
638
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 639
Un altro metodo prevede di utilizzare i file di comando di esempio forniti sul CD alle-
gato per connettere il database al server locale prima di aprire il progetto di esempio
per la prima volta. Troverai quattro piccoli file nella cartella \Microsoft Press\Access
2003 Inside Out\SQL, che ti aiuteranno a collegare e scollegare i file di database di
esempio dal server locale. Due dei file sono file .bat che puoi eseguire facendo dop-
pio clic su essi in Esplora risorse oppure digitando il loro nome al prompt dei coman-
di. Il file Attach Contacts.bat connette i file ContactsSQL.mdf e ContactsSQL.ldf al
server, mentre il file Detach Contacts.bat li scollega (è una buona precauzione da
seguire prima di spostare o aggiornare i file di database dall’esterno di Access); ad
ogni modo, potresti dover svolgere qualche operazione di preparazione prima di uti-
lizzare questi file.
Se visualizzi il file Attach Contacts.bat, puoi vedere che contiene solo due righe:
OSQL –E –i “C:\Microsoft Press\Access 2003 Inside Out\SQL\Attach Conta
cts.SQL”
Pause
Il file batch invoca OSQL, un programma della riga di comando che permette di ese-
guire comandi SQL, che a sua volta chiama un file di script SQL denominato Attach
Contacts.SQL. La seconda riga interrompe temporaneamente l’esecuzione per con-
sentire la lettura dei messaggi restituiti dal server. Anche lo script SQL è composto di
una sola riga, questa volta un comando SQL:
sp_attach_db “ContactsSQL”, “C:\Microsoft Press\Access 2003 Inside Out
\SQL\ContactsSQL.mdf”, “C:\Microsoft Press\Access 2003 Inside Out\SQL
\Contacts SQL.ldf”
Affinché operino correttamente, i quattro file devono essere contenuti nella cartella
Access 2003 Inside Out\SQL (all’interno di C:\Microsoft Press), mentre i file di data-
base devono essere contenuti nella stessa sottocartella e presentare i nomi Con-
tactsSQL.mdf e ContactsSQL.ldf. Ad ogni modo, puoi facilmente adattare questi file
aprendo ogni file in un editor di testo normale come Blocco note e regolando atten-
tamente i nomi e i percorsi dei database, come necessario. Dopo avere modificato i
file, esegui il file Attach Contacts.bat individuandolo in Esplora risorse e facendo
doppio clic su esso; ora dovresti essere in grado di aprire il file di progetto di esem-
pio Contacts.adp senza problemi.
Nei file di progetto di Access, puoi lavorare con tre diversi tipi di oggetti in SQL Server
come query. Una visualizzazione ricorda molto le query di selezione che puoi creare
Capitolo 18
Visualiz-
in un database desktop di Access: in pratica, è una tabella logica che restituisce una o
zazione
più colonne da una o più tabelle. La differenza principale tra una visualizzazione in
un progetto di Access (.adp) e un’istruzione di selezione di un database desktop di
Access (.mdb) sta nel fatto che le visualizzazioni non possono accettare parametri;
inoltre, puoi inserire una specifica di ordinamento (ORDER BY) solo quando inclu-
di anche la parola chiave TOP nella proposizione SELECT.
639
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 640
Una funzione può restituire una tabella (funzione inline), un insieme di colonne da
più tabelle (funzione valutata a livello di tabella) o un singolo valore calcolato (fun-
Funzione
zione scalare). Puoi chiamare le funzioni da altre funzioni, dalle visualizzazioni o dalle
stored procedure (descritte in seguito). Puoi utilizzare una funzione inline come ori-
gine record per una maschera o un report, o come origine delle righe per una casella
combinata o una casella di riepilogo, ma non come origine record per una pagina di
accesso ai dati. La principale limitazione di una funzione riguarda l’impossibilità di
chiamare le funzioni non deterministiche, vale a dire funzioni che restituiscono un
valore diverso anche quando viene passato loro lo stesso insieme di parametri. Per
esempio, la funzione incorporata GETDATE è non deterministica, perché restituisce
sempre un valore diverso in base all’impostazione dell’orologio di sistema.
Naturalmente, una funzione può accettare parametri.
Una stored procedure è probabilmente l’oggetto di programmazione più potente che
puoi creare in SQL Server. Con una stored procedure, puoi definire l’equivalente di
Stored
una query di selezione, di una query di selezione con parametri o di una query di co-
procedure
mando (UPDATE, INSERT, DELETE o SELECT INTO) di un database desktop. Puoi
inoltre utilizzare le capacità del linguaggio Transact-SQL per definire insiemi com-
plessi di azioni da eseguire quando il codice esegue la stored procedure. Quando una
stored procedure restituisce una tabella logica, puoi utilizzarla come origine record in
una maschera o in un report, oppure come origine delle righe in una casella combi-
nata o in una casella di riepilogo. Se la stored procedure restituisce una tabella logica
come risultato dell’esecuzione di più istruzioni di selezione, la tabella è “di sola lettu-
ra”; quando la stored procedure restituisce una tabella logica da una singola istruzio-
ne di selezione, puoi utilizzare quest’ultima come origine record in una maschera
aggiornabile.
Lo scopo di questo capitolo è familiarizzare con le funzioni di progettazione delle
query in un file di progetto di Access. Il capitolo non vuole insegnarti tutto quello che
c’è da sapere su Transact-SQL, che richiederebbe un intero libro; tuttavia, dovresti
essere in grado di unire quanto imparerai in questo capitolo alle tecniche di proget-
tazione apprese nei tre capitoli sulla progettazione delle query per i database desktop
per poi costruire la maggior parte delle query necessarie per un’applicazione incor-
porata in un file di progetto.
La prima sezione di questo capitolo, “Costruzione di query con la finestra di proget-
tazione query”, spiega passo per passo come costruire i tipi di query che già conosci.
Puoi utilizzare la finestra di progettazione query per creare visualizzazioni, funzioni
inline e stored procedure che restituiscono una tabella logica. La seconda sezione,
“Costruzione delle query con un editor di testo”, mostra come iniziare a costruire
query più complesse utilizzando Transact-SQL. Nell’editor di testo, puoi creare sto-
Capitolo 18
Figura 18.3 Una nuova visualizzazione nella finestra di progettazione query dopo l’ag-
giunta della tabella tblCompanies.
Il riquadro del diagramma mostra una rappresentazione grafica delle tabelle, delle
funzioni e delle visualizzazioni che stai utilizzando per creare la query e le relazioni
tra esse. Il riquadro della griglia mostra le informazioni sulle colonne che stai utiliz-
zando nella query, in modo simile alla griglia di progettazione per una query in un
database desktop. Tuttavia, la finestra di progettazione query in un progetto elenca le
colonne verticalmente, anziché orizzontalmente. Per ogni colonna, puoi vedere il
nome della colonna, gli alias assegnati alla colonna, la tabella di origine della colon-
na, un’indicazione del fatto che la colonna sarà generata in output dalla query (simi-
le alla casella di controllo Mostra nella griglia di progettazione delle query in un data-
base desktop) e infine l’ordinamento e il criterio di filtraggio per la colonna.
Quando stai lavorando in un database desktop, devi passare alla visualizzazione SQL
per vedere il codice SQL che definisce la query. Tuttavia, in un file di progetto, puoi
visualizzare e modificare il codice SQL aprendo il riquadro SQL: fai clic sul pulsante
SQL sulla barra degli strumenti o seleziona Mostra riquadri dal menu Visualizza e poi
seleziona SQL dal sottomenu per aprire il riquadro SQL, come mostrato nella figura
18.4.
Puoi inserire un’istruzione SQL direttamente nel riquadro SQL: la finestra di proget-
tazione query aggiorna la visualizzazione non appena sposti lo stato attivo all’esterno
del riquadro SQL (facendo clic nel riquadro della griglia o del diagramma). Tuttavia,
la finestra di progettazione query può rappresentare graficamente solo un piccolo
sottoinsieme delle possibili istruzioni SQL che potresti utilizzare. Se inserisci del
codice SQL che la finestra di progettazione non può visualizzare, otterrai un messag-
642
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 643
gio di avviso che afferma che il codice non può essere rappresentato graficamente. La
volta successiva che aprirai la query nella visualizzazione Struttura, vedrai la versione
con il solo testo SQL.
Figura 18.4 Una nuova visualizzazione nella finestra di progettazione query con il riqua-
dro SQL visualizzato.
Capitolo 18
Figura 18.5 L’aggiunta di una colonna alla visualizzazione con l’inserimento di un segno
di spunta accanto al nome della colonna nel riquadro del diagramma.
Puoi anche selezionare una colonna dalla casella di riepilogo Colonna nel riquadro
della griglia, come mostrato nella figura 18.6. Se hai specificato più origini record nel
643
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 644
riquadro del diagramma, puoi filtrare l’elenco di nomi di colonna disponibili nella
casella di riepilogo Colonna selezionando prima l’origine record dalla casella di riepi-
logo Tabella. Aggiungi le colonne CompanyName e Department alla visualizzazione
facendo clic accanto alle voci relative nel riquadro del diagramma.
Figura 18.6 L’aggiunta di una colonna a una visualizzazione selezionando il nome della
colonna dalla casella di riepilogo nel riquadro della griglia.
Se esiste una relazione tra le due tabelle nel riquadro del diagramma, Access crea
automaticamente un join interno e visualizza una riga che connette la chiave prima-
ria di una tabella (il simbolo della chiave) alla chiave esterna della tabella correlata (il
simbolo di infinito), in modo simile alla rappresentazione delle relazioni di un dia-
gramma di database desktop (come spiegato nel capitolo 17). Puoi ricordare dal capi-
tolo 8, “Creazione di query complesse”, che un join interno restituisce solo le righe
delle due tabelle che presentano valori corrispondenti in entrambe le tabelle. Nella
figura 18.7 puoi notare le due proposizioni INNER JOIN create da Access (nel riqua-
dro SQL) e le linee che connettono le tre tabelle (nel riquadro del diagramma) per
rappresentare le relazioni definite.
Quando includi visualizzazioni o funzioni nella query, Access crea automaticamente
un join se può trovare campi con lo stesso nome e tipo di dati in due delle origini
record. Puoi creare altri join facendo clic su un nome di colonna in un’origine record
e trascinandolo e rilasciandolo sopra il nome di colonna correlato in un’origine
record separata. Per rimuovere un join, fai clic su esso una volta per selezionarlo e poi
premi Canc sulla tastiera; puoi rimuovere un join anche facendo clic con il pulsante
destro del mouse su esso e selezionando Rimuovi dal menu di scelta rapida.
Puoi specificare il tipo di join desiderato facendo clic con il pulsante destro del mouse
sulla riga che rappresenta il join tra le due tabelle: dal menu di scelta rapida, puoi sce-
gliere un comando per selezionare tutte le righe di entrambe le tabelle del join.
L’operazione equivale a specificare un join sinistro o destro durante la scrittura della
query in SQL (osserva che Access aggiorna la sintassi nel riquadro SQL in LEFT JOIN
o RIGHT JOIN se selezioni una di queste due opzioni). Puoi specificare opzioni
aggiuntive per il join visualizzando le proprietà del join: fai clic con il pulsante destro
del mouse sul join tra le tabelle tblCompanies e tblCompanyContacts e seleziona
Proprietà. Access visualizza la finestra Proprietà, come mostrato nella figura 18.8.
Figura 18.8 La specifica delle proprietà della linea di join tra le tabelle tblCompanies e
Capitolo 18
tblCompanyContacts.
645
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 646
Inside Out
Join esterno completo, join sinistro e join destro: qual è la differenza
Come hai imparato nel capitolo 8, puoi modificare le proprietà di join in una query
di un database desktop al fine di restituire tutte le righe di una tabella o dell’altra.
Quando svolgi questa operazione, Access modifica il codice SQL dietro le quinte per
utilizzare un join sinistro o destro, come appropriato. Non puoi creare una query in
un database desktop di Access che restituisce tutte le righe di entrambe le tabelle.
visualizza l’operatore in questione all’interno del rombo. Il simbolo del rombo nel
riquadro del diagramma rimane vuoto per un equi-join.
La sezione inferiore della finestra Proprietà permette di specificare se desideri che
siano restituite tutte le righe da una o entrambe le tabelle. Questa operazione equiva-
le a fare clic con il pulsante destro del mouse sulla linea di join nel riquadro del dia-
gramma e a selezionare una delle opzioni Seleziona tutte le righe da… Fai clic sulla
casella di controllo a sinistra di Tutte le righe da tblCompanies: puoi notare che il
simbolo a forma di rombo sul lato sinistro della finestra cambia, come mostrato nella
646
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 647
figura 18.9. Un lato ora assume una forma particolare (simile a quella della casa base
su un campo di baseball). Il rombo sulla linea di join cambia anche nel riquadro del
diagramma, con il lato quadrato della forma rivolto verso la tabella tblCompanies.
Questa rappresentazione grafica indica che dalla tabella tblCompanies vengono sele-
zionati tutti i record (join esterno).
Figura 18.9 La specifica delle proprietà della linea di join tra le tabelle tblCompanies e
tblCompanyContacts con l’opzione Tutte le righe da tblCompanies selezionata.
Se modifichi il codice SQL per specificare un join sinistro o destro tra le due tabelle,
il simbolo del rombo assume una forma quadrata sul lato della linea di join connes-
so alla tabella che restituisce tutte le righe; se chiedi un join esterno completo in SQL,
l’intero simbolo a forma di rombo diventa un quadrato. Deseleziona la casella di con-
trollo Tutte le righe da tblCompanies e chiudi la finestra Proprietà.
se non inserisci un alias, Access genera un nome alias come ExprN, dove N è un valo-
re intero che parte da 1 per il primo alias generato, 2 per il secondo e così via.
L’opzione Tipo ordinamento consente di specificare come desideri ordinare una
colonna nei risultati della query. Se richiedi un ordinamento su più colonne, puoi
indicare il criterio di ordinamento per ogni colonna, in modo da stabilire l’ordine con
cui il database esegue l’ordinamento. Per esempio, supponi di voler ordinare questa
visualizzazione per reparto e poi per nome della società. Nel riquadro della griglia,
seleziona Crescente per entrambe le colonne Department e CompanyName dalla
647
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 648
casella di riepilogo Tipo ordinamento; visto che desideri che Department sia il primo
criterio, assicurati di selezionare il valore 1 nella casella di riepilogo Criterio ordina-
mento. La struttura della visualizzazione ora dovrebbe apparire come mostrato nella
figura 18.10. Osserva anche che, quando specifichi un ordinamento su una colonna,
appare un’icona di ordinamento A-Z accanto al nome della colonna nel riquadro del
diagramma, con una freccia che indica in quale direzione è applicato l’ordinamento.
Figura 18.10 La specifica del tipo e del criterio di ordinamento per le colonne Compa-
nyName e Department.
Se desideri cambiare l’ordine in cui appaiono le colonne nei risultati della query, fai
clic sul pulsante di selezione a sinistra del nome della colonna da spostare nel riqua-
dro della griglia e trascina verso l’alto o verso il basso per spostarlo nella posizione
desiderata.
Nota Ricorda che, cambiando l’ordine in cui sono visualizzate le colonne in un insie-
me di risultati non modifichi il loro ordinamento (a differenza di un database desk-
top di Access).
Utilizza il campo Criteri per inserire i criteri che desideri applicare alla colonna nella
query. Puoi inserire i criteri esattamente come in una query di un database desktop
di Access, tranne per il fatto che devi utilizzare le virgolette singole per racchiudere
caratteri e i letterali data/ora; devi anche utilizzare i caratteri jolly % e _ nei criteri
LIKE al posto, rispettivamente, di * e ? (consulta i capitoli 7 e 8 per i dettagli sulla spe-
cifica dei criteri in una query). Puoi utilizzare i campi Oppure per specificare criteri
aggiuntivi; l’inserimento di criteri in campi Oppure separati equivale all’utilizzo del-
l’operatore booleano OR tra due istruzioni.
Capitolo 18
Puoi convertire qualsiasi query nella finestra di progettazione query in una query di
aggregazione (che raggruppa, somma o esegue altri calcoli matematici sui risultati)
facendo clic sul pulsante Raggruppa sulla barra degli strumenti o selezionando
Raggruppa dal menu Query. L’operazione equivale a fare clic sul pulsante Totali sulla
barra degli strumenti o alla selezione di Totali dal menu Visualizza quando lavori con
le query in un database desktop di Access, ma un progetto di Access offre maggiori
opzioni per le funzioni di aggregazione.
648
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 649
Dopo avere selezionato l’opzione Raggruppa, Access visualizza una colonna aggiun-
tiva nel riquadro della griglia che permette di scegliere le diverse funzioni di aggrega-
zione che puoi applicare alle colonne, come mostrato nella figura 18.11.
Figura 18.11 La colonna Raggruppamento visualizzata nel riquadro della griglia della
finestra di progettazione query.
La tabella 18.1 elenca le diverse opzioni e funzioni che possono essere selezionate
nella finestra di progettazione query all’interno della colonna Raggruppamento. Puoi
osservare che alcune di queste funzioni possono essere utilizzate solo nelle colonne
contenenti un tipo di dati numerico. Come puoi notare, SQL Server supporta molte
più funzioni di quelle disponibili in un database desktop.
Tabella 18.1 Opzioni di raggruppamento per la finestra di progettazione query
in SQL Server
Opzione Descrizione
Avg Restituisce la media di tutti i valori non Null nella colonna. Avg Distinct cal-
Avg Distinct cola la media dei soli valori univoci (i duplicati vengono ignorati). Puoi spe-
cificare questa opzione solo su una colonna numerica.
Checksum_Agg Restituisce il valore della somma di controllo di una colonna intera, igno-
Checksum_Agg Distinct rando i valori Null. Checksum_Agg Distinct calcola la somma di controllo
utilizzando solo i valori univoci (i duplicati vengono ignorati). Puoi speci-
ficare questa opzione solo su una colonna o un’espressione con il tipo di
dati int.
Count Restituisce il conteggio di tutti gli elementi non Null nella colonna.
Count Distinct Count_Big equivale a Count tranne per il fatto che restituisce sempre un
Capitolo 18
Count_Big tipo di dati bigint, mentre Count restituisce sempre un tipo di dati int.
Count_Big Distinct Count Distinct e Count_Big Distinct contano solo i valori univoci (i dupli-
cati vengono ignorati).
Espressione Indica che la colonna contiene un’espressione che utilizza una o più fun-
zioni di aggregazione.
Raggruppamento Raggruppa i calcoli di aggregazione sui valori di questa colonna. Puoi spe-
cificare Raggruppamento per più colonne.
649
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 650
Uno strumento utile per la costruzione delle query nella finestra di progettazione
query è il pulsante Verifica sintassi SQL: puoi trovarlo tra i pulsanti SQL e Raggruppa
sulla barra degli strumenti. Quando fai clic sul pulsante, Access esegue una chiamata
a SQL Server per verificare che la sintassi SQL della query sia corretta; se SQL Server
trova qualche errore, Access restituisce un messaggio che indica la natura dell’errore
di sintassi. Questo strumento è particolarmente utile se stai scrivendo il codice SQL
direttamente nel riquadro SQL, o se stai valutando un’istruzione SQL dall’editor di
testo (per ulteriori informazioni, consulta la sezione “Costruzione delle query con un
editor di testo” in seguito nel capitolo).
Capitolo 18
650
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 651
ziona Proprietà dal menu di scelta rapida, oppure fai clic sul pulsante Proprietà sulla
barra degli strumenti. Puoi visualizzare le proprietà per una query anche attivando la
finestra di progettazione query e quindi selezionando Proprietà dal menu Visualizza.
Le proprietà per ogni tipo di query sono differenti, perché ogni tipo di query sup-
porta funzionalità diverse. Conoscerai meglio le proprietà per ogni tipo di query in
seguito nel capitolo.
puoi utilizzare una tabella come origine record; puoi anche utilizzare funzio-
ni e stored procedure come origini record nelle visualizzazioni.
Ora che conosci alcuni utilizzi per le visualizzazioni, puoi completare la costruzione
della visualizzazione iniziata in precedenza. Per mantenere semplice questo primo
esempio, inizia a rimuovere alcuni elementi dalla visualizzazione esistente: rimuovi le
tabelle tblCompanyContacts e tblContacts facendo clic con il pulsante destro del mouse
su esse e selezionando Rimuovi dal menu di scelta rapida; inoltre, se hai attivato l’op-
zione Raggruppa, disattivala facendo clic sul pulsante Raggruppa sulla barra degli stru-
menti. Al termine, la visualizzazione dovrebbe apparire come nella figura 18.12.
Figura 18.12 Una visualizzazione nella finestra di progettazione query con la sola tabel-
la tblCompanies inclusa.
Devi progettare questa visualizzazione in modo che diventi un’origine record adatta
per la maschera Companies; includi quindi tutte le colonne dalla tabella tblCompa-
nies nell’insieme di risultati inserendo un segno di spunta accanto al nome di ogni
colonna nel riquadro del diagramma. Non devi includere il campo upsize_ts perché
è un campo di sistema non aggiornabile, che Access utilizza per rendere i comandi di
aggiornamento più efficienti. Puoi selezionare tutte le colonne anche inserendo un
segno di spunta accanto all’opzione * (tutte le colonne), ma visto che vuoi specifica-
re un ordinamento su una delle colonne di output è preferibile aggiungere tutte le
colonne singolarmente (esiste comunque un modo per specificare un ordinamento
quando utilizzi l’opzione *; sarà mostrato nella sezione successiva, “Utilizzo delle fun-
zioni inline”).
Visto che in precedenza avevi aggiunto alla visualizzazione i campi CompanyName e
Department, Access aggiunge il campo CompanyID sotto il campo Department. Fai
clic sul pulsante di selezione accanto al campo CompanyID nel riquadro della griglia
e trascinalo in cima all’elenco.
Capitolo 18
logo Salva con nome e fai clic su OK. La visualizzazione completata dovrebbe appa-
rire come mostrato nella figura 18.13. Questa visualizzazione è salvata come
vwXmplCompanies nel database di esempio.
Nota Potresti notare che, in questo capitolo, ti viene chiesto di salvare la query ogni
volta che la modifichi prima di passare alla visualizzazione Foglio dati. A differenza
delle query nei database desktop, un progetto di Access deve salvare la query in SQL
Server prima di poterla eseguire: se tenti di passare alla visualizzazione Foglio dati
prima di avere salvato i cambiamenti, Access visualizza una finestra di dialogo di
avviso che ti chiede di salvare prima le modifiche. Puoi fare clic su Sì per salvare le
modifiche ed eseguire la query, o su No per tornare alla visualizzazione Struttura.
Nota Puoi aggiornare le colonne, nonché eliminare ed inserire righe nella visualiz-
zazione vwCompanies. Come in qualsiasi visualizzazione Foglio dati in Access, puoi
aggiungere nuove righe inserendo i dati nella nuova riga alla fine del foglio dati; di
conseguenza, le nuove righe non appariranno in ordine alfabetico per nome della
società. Ad ogni modo, le righe appariranno nell’ordine corretto alla successiva aper-
tura della visualizzazione.
Capitolo 18
Inside Out
SELECT TOP 100 PERCENT
Potresti avere notato che, quando specifichi la proprietà Tipo ordinamento per qual-
siasi colonna, Access aggiunge automaticamente una proposizione TOP 100 PER-
CENT all’istruzione SQL per la visualizzazione. Questa proposizione restituisce tutti
653
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 654
(100%) i record restituiti dall’istruzione SELECT a partire dall’inizio (top) del record-
set. La proposizione potrebbe sembrare ridondante, ma è richiesta affinché i risulta-
ti siano ordinabili. Nello standard ANSI SQL corrente, le visualizzazioni restituiscono
recordset non ordinati; lo standard non permette inoltre di utilizzare la proposizione
OREDER BY in una visualizzazione. Lo standard non definisce nemmeno la proposi-
zione TOP: SQL Server 2000 e successivi, però, definiscono un’estensione allo stan-
dard che permette di includere una proposizione ORDER BY in una visualizzazione,
ma solo quando viene inclusa anche la proposizione non standard TOP. SQL Server
permette anche di specificare una proposizione TOP senza includere una proposi-
zione ORDER BY.
Potresti ricordare dal capitolo 8 che le query in un database desktop di Access sup-
portano anche una proposizione TOP e ORDER BY; tuttavia, puoi includere una pro-
posizione ORDER BY anche senza specificare TOP. Se ci pensi, l’utilizzo di TOP senza
una specifica ORDER BY non ha molto senso, a meno che desideri un numero spe-
cifico di righe arbitrarie restituite dalla query; quando inserisci TOP e ORDER BY, la
query restituisce le righe superiori in base alla sequenza di ordinamento specificata.
Dovresti sempre ricordare il requisito di SQL Server relativo all’aggiunta della propo-
sizione TOP a qualsiasi istruzione SELECT che include una proposizione ORDER BY,
specialmente quando lavori nell’editor di testo per creare visualizzazioni, funzioni e
stored procedure.
Prima di passare alla creazione di query più complesse utilizzando le funzioni inline,
è opportuno dare un’occhiata alle diverse proprietà che puoi specificare per una
visualizzazione. Fai clic con il pulsante destro del mouse all’interno dell’area di pro-
gettazione e seleziona Proprietà dal menu di scelta rapida, oppure fai clic sul pulsan-
te Proprietà sulla barra degli strumenti. La figura 18.14 mostra la finestra Proprietà
per la visualizzazione vwCompanies.
Capitolo 18
Puoi vedere quattro schede nella finestra Proprietà per una visualizzazione; le schede
Colonne, Ricerca e Dati contengono proprietà simili a quelle che puoi specificare per
una tabella. La scheda Colonne permette di sovrascrivere le proprietà estese per ogni
654
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 655
zazione.
WITH ROLLUP specifica che la visualizzazione dovrebbe restituire un insieme di
risultati multidimensionale per le colonne specificate nella proposizione GROUP BY
che fornisce un singolo riepilogo per ogni combinazione di funzioni di aggregazio-
ne e colonne nella visualizzazione.
ALL include tutti i duplicati nell’insieme di risultati (per impostazione predefinita, la
proposizione GROUP BY elimina i duplicati).
Proprietario Il proprietario SQL Server della visualizzazione. Il proprietario predefinito è dbo.
655
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 656
Tabella 18.2 Opzioni nella scheda Vista della finestra Proprietà (continua)
Opzione Descrizione
TOP Specifica questa opzione affinché i risultati della visualizzazione possano essere
ordinati e vengano restituiti solo i numeri di riga o le percentuali iniziali.
PERCENT specifica una percentuale di righe da restituire, anziché un numero.
WITH TIES restituisce tutte le righe associate quando più di una riga viene qualifi-
cata per il taglio del limite TOP perché contiene valori duplicati nel criterio di ordi-
namento. Per esempio, se richiedi TOP 10 WITH TIES e la colonna ordinata con-
tiene cinque righe con il valore 1 e otto righe con il valore 2, la visualizzazione resti-
tuisce 13 righe perché più righe contengono lo stesso valore della decima riga.
Descrizione Memorizza una descrizione della visualizzazione nella sua definizione.
Commento SQL Permette di aggiungere un commento sulla visualizzazione. Il commento può esse-
re letto da chiunque acceda alla sintassi SQL della visualizzazione.
report vengono spesso prodotti utilizzando uno specifico intervallo di date o una
persona specifica; le funzioni inline permettono di costruire l’origine record in
base alle esigenze specifiche della persona che recupera il report.
● Puoi utilizzare una funzione inline come origine record in qualsiasi punto in
cui puoi utilizzare una tabella o una visualizzazione come origine record; puoi
anche utilizzare visualizzazioni, altre funzioni e stored procedure come origi-
ni record nelle funzioni inline.
656
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 657
Nota Quando lavori con le funzioni inline, potresti trovare più facile la creazione di
una funzione che restituisce un recordset non aggiornabile. Le stesse considerazioni
di progettazione relative all’impossibilità di aggiornare i recordset delle visualizzazio-
ni valgono anche per le funzioni inline; tuttavia, visto che le funzioni inline vengono
spesso utilizzate per aggregare i dati, di frequente restituiranno recordset che non
possono essere aggiornati. Tieni presente questa differenza quando decidi quale tipo
di query costruire: se necessiti di un recordset aggiornabile che non richiede para-
metri, utilizza una visualizzazione; se hai bisogno di aggregare i dati o accettare para-
metri, utilizza una funzione inline. Se devi costruire una funzione aggiornabile, pre-
sta molta attenzione al modo in cui costruisci la funzione inline e verificala sempre
per assicurare la possibilità di aggiornare il recordset restituito.
Ora che conosci meglio alcuni utilizzi delle funzioni inline, puoi costruirne una nella
finestra di progettazione query. In questo esempio costruirai una funzione che resti-
tuisce le informazioni di contatto per ogni contatto associato a una specifica società.
Utilizzerai più join per associare le informazioni sui contatti alle informazioni sulle
società, poi ordinerai i risultati per cognome e nome di ogni contatto. Per seleziona-
re le righe, utilizzerai un parametro per specificare la società per cui devono essere
restituite le informazioni sui contatti.
Apri il database di esempio Contacts.adp, seleziona Query sulla barra Oggetti nella fine-
stra Database e fai doppio clic su Crea una funzione nella finestra di progettazione per
creare una nuova funzione inline. Aggiungi le tabelle tblCompanies, tblCompanyCon-
tacts e tblContacts dalla finestra di dialogo Aggiungi tabella, poi chiudi la finestra di
dialogo. Per gli scopi di questa procedura devi eliminare la relazione fra il campo Re-
ferredBy della tabella tblCompanies e il campo ContactID della tabella tblContacts: fai
clic con il pulsante destro del mouse sulla linea della relazione e selezione Rimuovi.
Quando aggiungi le tabelle al riquadro del diagramma, Access visualizza automatica-
mente i join che rappresentano le relazioni tra queste tabelle. Se apri il riquadro SQL,
puoi osservare che Access ha creato le proposizioni INNER JOIN appropriate nella pro-
posizione FROM: si tratta dei join che devi utilizzare per questa query al fine di acqui-
sire le righe correlate dalle tre tabelle. Ora devi specificare quali colonne dovranno esse-
re restituite nella query: seleziona la colonna CompanyName dalla tabella
tblCompanies e l’opzione * (tutte le colonne) dalla tabella tblContacts. Visto che desi-
deri ordinare i record per cognome e nome del contatto, aggiungi anche le colonne
LastName e FirstName alla query. Quando hai terminato, la finestra di progettazione
query dovrebbe apparire come mostrato nella figura 18.15 (con il riquadro SQL visua-
lizzato).
Fai clic sul pulsante Salva sulla barra degli strumenti e assegna alla funzione il nome
Capitolo 18
fctCompanyContacts nella finestra di dialogo Salva con nome. Fai quindi clic sul pul-
sante Visualizza sulla barra degli strumenti per vedere i risultati della funzione inline:
puoi notare che tutte le informazioni sui contatti vengono restituite in modo non
ordinato, e che le colonne LastName e FirstName sono ripetute nell’insieme di risul-
tati. Devi svolgere ancora molto lavoro prima che questa funzione operi come desi-
derato.
657
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 658
Figura 18.15 Una nuova funzione inline nella finestra di progettazione query con tre
tabelle aggiunte.
Per prima cosa, ritorna alla visualizzazione Struttura e specifica il criterio di ordina-
mento; devi anche impedire che le colonne LastName e FirstName siano ripetute nel-
l’insieme dei risultati. Seleziona Crescente dalla casella di riepilogo Tipo ordinamento
per la colonna LastName: Access assegna automaticamente un criterio di ordinamen-
to pari a 1. Ora seleziona Crescente per la colonna FirstName e osserva che criterio di
ordinamento viene impostato a 2. Per impedire che le colonne appaiano due volte,
rimuovi il segno di spunta sotto Output accanto alle colonne LastName e FirstName:
in questo modo puoi assicurare che le informazioni su cognome e nome siano visua-
lizzate solo una volta, quando vengono restituite dalla colonna * (tutte le colonne).
Ora devi specificare il parametro che filtra la società per cui desideri le informazioni
di contatto. Come per le query in un database desktop, puoi utilizzare un parametro
ovunque potresti altrimenti specificare un valore letterale; di conseguenza, puoi uti-
lizzare un parametro in un’espressione di criteri per la colonna CompanyName. In
una query di un progetto di Access, puoi dichiarare un parametro utilizzando il sim-
bolo @ seguito dal nome del parametro. A differenza dei parametri in un database
desktop di Access, non puoi utilizzare spazi o altri caratteri speciali in un nome di
parametro, ma puoi utilizzare il trattino basso (_) per inserire una spaziatura nel
nome. Per consentire all’utente di inserire il nome della società (o parte di esso), inse-
risci quanto segue nel criterio per la colonna CompanyName:
LIKE @Enter_Company_Name + N’%’
La lettera N maiuscola che precede ‘%’ indica che desideri utilizzare un letterale Na-
tional Language nel concatenamento; un letterale National Language (o Unicode) uti-
lizza due byte per ogni carattere e supporta un intervallo più esteso di caratteri. Visto
che la colonna CompanyName è un campo Unicode (tipo di dati nvarchar), se digiti
Capitolo 18
Figura 18.16 Una funzione inline con un parametro utilizzato come criterio per filtrare
la colonna CompanyName.
Ora sei pronto per provare la nuova funzione. Passa alla visualizzazione Foglio dati:
Access visualizza una finestra di dialogo Immettere valore parametro, come mostra-
to nella figura 18.17.
Figura 18.17 Access visualizza la finestra di dialogo Immettere valore parametro quan-
do esegui una query che utilizza parametri.
Il database di esempio contiene diversi nomi di società che iniziano con la lettera T,
quindi digita questa lettera come risposta alla richiesta del parametro e fai clic su OK.
Access visualizza i risultati, come mostrato nella figura 18.18.
Figura 18.18 Il risultato della ricerca dei contatti associati alle società che possiedono un
nome che inizia con la lettera T.
Capitolo 18
Puoi osservare che la query ha trovato tre società con nomi che iniziano con la lette-
ra T, ma i risultati sono ordinati per cognomi e nomi dei contatti come progettato
nella query.
659
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 660
Suggerimento È sempre una buona idea utilizzare nomi descrittivi per i parametri
utilizzati nelle funzioni e nelle stored procedure, anche se prevedi di nasconderli all’u-
tente con una maschera o un’interfaccia di codice. Per prima cosa, un nome descrit-
tivo aiuta a ricordare come vengono utilizzati i parametri dalla query; in secondo
luogo, se un utente esegue la query dalla finestra Database, il nome del parametro
dovrebbe spiegare ciò che egli deve inserire.
Prima di passare alle stored procedure, diamo una rapida occhiata alle diverse pro-
prietà che puoi specificare per una funzione. Ritorna alla visualizzazione Struttura,
fai clic con il pulsante destro del mouse all’interno dell’area di progettazione e sele-
ziona Proprietà dal menu di scelta rapida. Access visualizza la finestra Proprietà per
la funzione inline, come mostrato nella figura 18.19.
Figura 18.19 La scheda Funzione inline della finestra Proprietà per una funzione inline.
Le schede disponibili nella finestra Proprietà per le funzioni inline sono simili a quel-
le per le visualizzazioni, tranne per il fatto che una funzione inline offre le schede
Funzione inline e Parametri della funzione. Le schede Colonne, Ricerca e Dati equi-
valgono a quelle nella finestra Proprietà per le visualizzazioni. La scheda Funzione
inline offre molte delle stesse opzioni della scheda Vista nella finestra Proprietà per le
visualizzazioni; tuttavia, una funzione inline non offre le opzioni Aggiorna con rego-
le vista e Opzione CHECK. Per ulteriori informazioni sulle altre opzioni nella scheda
Funzione inline, consulta la tabella 18.2.
Fai clic sulla scheda Parametri della funzione per vedere l’elenco dei parametri speci-
Capitolo 18
ficati per questa funzione inline, come mostrato nella figura 18.20. È un ottimo modo
per verificare tutti i parametri specificati per una funzione inline (o una stored pro-
cedure). Non puoi aggiungere altri parametri in questa finestra, perché Access non
saprebbe dove utilizzarli nella query; tuttavia, puoi specificare un tipo di dati e un
valore predefinito per i parametri che sono già stati creati. Ricorda che stai inserendo
un valore letterale nella colonna Predefinito, quindi devi racchiudere i caratteri e i
valori data/ora tra virgolette singole.
660
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 661
La figura mostra che è stato inserito il valore predefinito N‘Viescas’. Questa query è
salvata come fctXmplCompanyContacts nel database di esempio. Quando esegui que-
sta query, puoi selezionare <DEFAULT> dalla casella di riepilogo nella finestra di dia-
logo Immettere valore parametro, affinché la query restituisca i record per le società
il cui nome inizia con questa stringa di caratteri.
Figura 18.20 La scheda Parametri della funzione della finestra Proprietà per una funzio-
ne inline.
Visto che l’utilizzo migliore per una stored procedure costruita nella finestra di pro-
gettazione query è l’esecuzione di una query di comando, costruiremo una stored
procedure che inserisce (accoda nella terminologia di Access) un record nella tabella
tblCompanies. Per eseguire questa operazione hai due possibilità: puoi utilizzare una
query di accodamento (un’istruzione INSERT che utilizza una query per acquisire
una o più righe da inserire) oppure puoi utilizzare una query di accodamento valori
(un’istruzione INSERT che utilizza una proposizione VALUES per specificare i valo-
ri di colonna per una nuova riga).
661
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 662
Figura 18.21 La selezione di Query di accodamento valori dalla casella di riepilogo Tipo
query.
Utilizza Colonna per specificare quali colonne desideri accodare alla tabella tblCom-
panies; Nuovo valore ti permette di indicare i valori che vuoi aggiungere per ogni
colonna. Osserva che puoi selezionare quali colonne desideri accodare facendo clic
sulla casella a sinistra di ogni nome di colonna nel riquadro del diagramma; quando
selezioni una colonna, Access visualizza un segno più (al posto del segno di spunta)
nella casella. Visto che vuoi aggiungere un’intera riga alla tabella tblCompanies, fai
clic accanto a ogni nome di colonna, tranne CompanyID e upsize_ts (la colonna
CompanyID presenta il tipo di dati Contatore, quindi SQL Server genera automati-
camente il valore successivo quando inserisci una riga, mentre la colonna upsize_ts è
un valore timestamp mantenuto dal sistema che aiuta Access a migliorare le presta-
zioni degli aggiornamenti). Al termine, la finestra di progettazione query dovrebbe
Capitolo 18
662
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 663
re. Puoi anche eseguire la stored procedure dal codice Visual Basic e fornire i valori di
colonna impostando i parametri. Per trasformare ogni nuovo valore in un parametro,
devi inserire un nome di parametro valido accanto a ogni nome di colonna. Ricorda
che il nome del parametro deve iniziare con il carattere @ e non può contenere spazi
vuoti o caratteri speciali diversi dal trattino basso (_). Fai riferimento all’elenco se-
guente per i nomi di parametro suggeriti per ogni nome di colonna.
Figura 18.22 La selezione delle colonne a cui la stored procedure accoderà i valori.
Osserva che devi convertire (CAST) il parametro @Website in un tipo di dati nvarchar,
perché il tipo di dati della colonna Website è ntext, ma la finestra di progettazione
query non accetta parametri per una colonna con tipo di dati ntext. La conversione del
parametro in un tipo di dati nvarchar permette l’utilizzo del parametro per l’accoda-
mento dei dati alla colonna Website. È interessante notare che, quando inserisci questo
parametro, Access visualizza una finestra di dialogo che comunica che la conversione
potrebbe non essere necessaria; tuttavia, se tenti di inserire un nome di parametro sem-
663
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 664
plice, Access comunica che viene prodotto un errore di conversione del tipo di dati e
non ti permette di lasciare la casella Nuovo valore fino a quando correggi l’errore.
Dopo avere inserito tutti i nomi di parametro, la stored procedure è completa; fai clic
sul pulsante Salva sulla barra degli strumenti e assegna alla routine il nome spAdd-
OneCompany. La stored procedure completata dovrebbe apparire come nella figura
18.23. Questa query è salvata come spXmplAddOneCompany nel database di esempio.
Puoi vedere la stored procedure all’opera facendo clic sul pulsante Visualizza o Esegui
sulla barra degli strumenti. Access chiede di inserire ogni valore di parametro in suc-
cessione: inserisci un valore per ogni parametro e fai clic su OK, ma ricorda che solo
il campo CompanyName è necessario per salvare la nuova riga (il parametro
ReferredBy è un valore intero che identifica l’ID contatto della persona che ha pre-
sentato questa società; inserisci un valore ContactID valido o lascia vuoto il campo).
Quando la routine è completa, appare un messaggio che afferma che la routine è stata
completata con successo ma non ha restituito alcun record. Ora apri la tabella
tblCompanies nella visualizzazione Foglio dati: le informazioni fornite appaiono in
una nuova riga della tabella.
Prima di passare alle query di testo, diamo un’occhiata alle proprietà di una stored
procedure. Visto che la stored procedure costruita è una query di accodamento, non
sarà possibile vedere tutte le proprietà disponibili per una stored procedure nella fine-
stra Proprietà per la query. Apri la query di esempio spXmplCompanyParameter nella
visualizzazione Struttura: si tratta di una semplice stored procedure sulla tabella
tblCompanies che utilizza un parametro per filtrare la colonna CompanyName. Co-
664
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 665
Figura 18.24 La scheda Stored procedure della finestra Proprietà di una stored procedure.
Puoi notare che, a differenza di una funzione o una visualizzazione, non puoi defini-
re proprietà estese per le colonne (per esempio con le proprietà Didascalia e Formato)
e non puoi definire un campo di ricerca per le colonne di output. Tuttavia, puoi defi-
nire filtri e fogli dati secondari con la scheda Dati, proprio come per visualizzazioni
e funzioni. Le informazioni e le opzioni nella scheda Parametri delle stored procedu-
re sono identiche a quelle disponibili nella scheda Parametri della funzione di una
funzione, mostrate nella figura 18.20.
Nella scheda Stored procedure, puoi vedere molte opzioni simili a quelle disponibili
per visualizzazioni e funzioni. L’unica opzione univoca per le stored procedure è
NOCOUNT. Di solito, quando esegui una stored procedure, la routine restituisce un
conteggio delle righe influenzate; quando esegui la stored procedure da un’altra routi-
ne, puoi richiedere il numero di righe influenzate facendo riferimento alla funzione
incorporata @@ROWCOUNT. Quando selezioni NOCOUNT, la stored procedure
non restituisce il conteggio dei record. Per alcune stored procedure complesse utiliz-
zate nei progetti di Access, è opportuno selezionare questa opzione. Quando la routi-
ne include più istruzioni SELECT, e una o più istruzioni precedenti nella routine resti-
tuiscono un conteggio delle righe pari a 0, Access presume che l’output della routine
corrisponda a zero righe. Se l’istruzione SELECT finale restituisce un recordset, Access
non lo visualizzerà se NOCOUNT è disattivato (l’impostazione predefinita); attivan-
Capitolo 18
do NOCOUNT, la routine non restituisce il conteggio delle righe e Access può visua-
lizzare correttamente il recordset finale.
Per ulteriori informazioni sulle rimanenti proprietà, consulta la tabella 18.1.
base desktop di Access (.mdb) utilizzando l’interfaccia simile fornita dalla finestra di
progettazione query dei progetti di Access. Tuttavia, SQL Server offre una potenza di
interrogazione maggiore rispetto a quella ottenuta con l’utilizzo della sola finestra di
progettazione query grafica. Per ottenere il massimo dalla potenza di interrogazione
di SQL Server, devi creare le query utilizzando Transact-SQL nell’editor di testo.
Non troverai alcun collegamento per la costruzione di una query nell’editor di testo
nell’elenco delle opzioni per le query nella finestra Database. Per iniziare la costru-
zione di una query utilizzando l’editor di testo, puoi selezionare Query sulla barra
Oggetti nella finestra Database e fare clic sul pulsante Nuovo sulla barra degli stru-
menti della finestra Database, oppure selezionare Query dal menu Inserisci. Quando
esegui questa operazione, Access visualizza la finestra di dialogo Nuova query, mo-
strata nella figura 18.25.
Puoi osservare che questa finestra di dialogo offre le opzioni per iniziare a progettare
le funzioni inline, le visualizzazioni e le stored procedure nella finestra di progetta-
zione query; i tre tipi di query rimanenti sono quelli che possono essere costruiti nel-
l’editor di testo: stored procedure, funzioni scalari e funzioni valutate a livello di
tabella.
Nota SQL Server in effetti supporta solo tre tipi di query: visualizzazioni, funzioni e
stored procedure. Per facilitare la progettazione delle comuni query di selezione e
comando, i progetti di Access offrono le versioni di questi tipi di query per la finestra
di progettazione query. Visto che le funzioni e le stored procedure possono essere
molto più robuste di quanto possa essere visualizzato dalla finestra di progettazione
query, i progetti di Access offrono anche la possibilità di progettare questi tipi di query
utilizzando un editor di testo per trarre vantaggio dalla funzionalità disponibili.
Per creare una query di testo devi utilizzare Transact-SQL; Transact-SQL (o T-SQL)
è una forma speciale di SQL utilizzata da SQL Server, che include funzionalità e
comandi aggiuntivi per estenderne le capacità. Puoi pensare a Transact-SQL come
Capitolo 18
alle “nozioni fondamentali per SQL Server”: estende infatti le capacità di SQL intro-
ducendo le istruzioni di controllo del flusso (come IF…ELSE e WHILE), l’ispezione
dei parametri durante l’esecuzione, l’intercettamento degli errori, calcoli matematici
complessi e il raggruppamento delle transazioni. Transact-SQL è abbastanza robusto
per eseguire la maggior parte delle azioni per cui normalmente utilizzeresti Visual
Basic o un altro linguaggio di programmazione, ma la vera bellezza di Transact-SQL
sta nel fatto che le query vengono compilate ed eseguite da SQL Server, migliorando
così la velocità e le prestazioni del database.
666
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 667
Attenzione Salva spesso il lavoro e conserva copie di backup delle tue query di
testo (Blocco note è ottimo per questo scopo). L’editor di testo non possiede funzio-
ni di annullamento e può essere implacabile se commetti un errore.
Capitolo 18
667
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 668
668
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 669
Puoi creare una stored procedure utilizzando qualsiasi strumento di modifica del
testo e poi importarla nell’Analizzatore query di SQL Server. Affinché SQL Server
riconosca che stai cercando di creare una stored procedure, devi utilizzare l’istruzio-
ne CREATE PROCEDURE seguita dal nome della routine tra virgolette doppie. Allo
stesso modo, se vuoi cambiare una stored procedure esistente, devi utilizzare l’istru-
zione ALTER PROCEDURE seguita dal nome della routine da modificare (non devi
necessariamente utilizzare le virgolette quando fai riferimento a una routine esisten-
te, a meno che il nome della routine contenga spazi o caratteri speciali). Se salvassi
questa routine, la chiudessi e la riaprissi in Access, vedresti l’istruzione ALTER al
posto di CREATE, perché staresti modificando una routine esistente.
I simboli /* e */ contrassegnano l’inizio e la fine di un blocco di commenti: tutto ciò
che viene scritto all’interno di questi simboli è designato come commento e ha il solo
scopo di fornire informazioni sullo scopo della stored procedure. Puoi anche inseri-
re un commento su riga singola digitando due trattini (--) all’inizio della riga. Ecco
un paio di esempi:
/* Questo è un blocco di testo di più righe
che descrive una sezione della stored procedure */
Nota Puoi osservare che le uniche parole chiave nella stored procedure di base,
mostrata nella figura 18.26, che non si trovano all’interno di blocchi di commento
sono CREATE, AS e RETURN. Access include la sezione di dichiarazione dei parame-
tri e l’istruzione SET NOCOUNT ON all’interno di blocchi di commento, perché pre-
sume che non vorrai utilizzare sempre queste sezioni; tuttavia, la sintassi di queste
sezioni è corretta, quindi è sufficiente rimuovere i simboli di commento per renderle
parte della routine.
dati da un segno di uguale e dal valore che desideri assegnare come predefinito.
Ricorda di racchiudere i caratteri e i letterali data/ora tra virgolette singole. Per impo-
stazione predefinita, tutti i parametri sono parametri di input; se vuoi utilizzare un
parametro per l’output, devi utilizzare la parola chiave OUTPUT alla fine della
dichiarazione del parametro. Se desideri dichiarare più parametri, puoi separarla con
la virgola. Apprenderai maggiori informazioni sui parametri lavorando con essi nel-
l’esempio di questa sezione. Ecco un esempio che crea un singolo parametro di input
669
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 670
chiamato @City, con il tipo di dati nvarchar, una dimensione di 30 e un valore pre-
definito Null.
(
@City nvarchar(30) = NULL
)
AS
INSERT INTO dbo.tblCompanies
(CompanyName, Department, Address, City, County, StateOrProvince,
PostalCode, Country, PhoneNumber, FaxNumber, Website, ReferredBy)
VALUES
(@Company_Name, @Department, @Address, @City, @County,
@State_Or_Province, @PostalCode, @Country, @Phone_Number, @Fax_Number,
@Website, @Referred_By)
RETURN
Suggerimento Puoi costruire facilmente questo codice nella routine di base inse-
rendo una riga vuota dopo la parola chiave AS e poi avviando la finestra di proget-
tazione SQL facendo clic sul pulsante Inserisci codice SQL sulla barra degli strumen-
ti. Segui i passaggi mostrati in precedenza nel capitolo per creare l’istruzione INSERT
necessaria e poi chiudi la finestra di progettazione; fai clic su Sì quando Access si
offre di incollare il codice SQL nella routine. Puoi anche aprire la routine spAddOne-
Company creata in precedenza (o la query di esempio spXmplAddOneCompany),
copiare il codice SQL negli Appunti e incollarlo nella nuova routine.
Figura 18.27 Un messaggio che afferma che la stored procedure è stata eseguita con
successo.
Capitolo 18
Figura 18.28 Un messaggio che afferma che la stored procedure non è stata eseguita
con successo.
Durante la scrittura della stored procedure non vi sono modi per impedire la com-
parsa di questo messaggio se l’utente non fornisce un nome per la società; tuttavia,
671
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 672
esistono diverse opzioni utilizzabili per controllare l’input nella stored procedure.
Puoi utilizzare una maschera con codice ADO in un modulo Visual Basic che con-
trolla l’input, richiede all’utente di inserire un nome per la società e poi lo passa alla
stored procedure. Puoi anche modificare la stored procedure stessa per controllare i
valori corretti e restituire informazioni più descrittive in caso di errore, come farai in
seguito. Per ulteriori informazioni su ADO, consulta il capitolo 29, “Upsize di un’ap-
plicazione desktop a progetto”.
Il valore predefinito per tutte le variabili è Null; se desideri assegnare un valore a una
variabile, puoi utilizzare sia l’istruzione SELECT sia l’istruzione speciale SET.
Entrambe presentano sintassi simili. Ecco alcuni esempi:
-- Assegna un valore alla variabile @retMsg utilizzando SELECT
SELECT @retMsg = ‘This message value was created using the SELECT state-
ment.’
-- Assegna un valore alla variabile @retMsg utilizzando SET
SET @retMsg = ‘This message value was created using the SET statement.’
672
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 673
Con l’istruzione SELECT puoi assegnare valori a più variabili separando le assegna-
zioni con alcune virgole. Per esempio, la seguente istruzione SELECT assegna valori
a due variabili:
SELECT @retMsg = ‘Assign two values.’, @CompanyID = 0
Con l’istruzione SET, puoi assegnare un solo valore per istruzione; dopo avere dichia-
rato una variabile, puoi utilizzarla all’interno della routine nelle posizioni in cui nor-
malmente potresti utilizzare un valore dello stesso tipo di dati.
Le istruzioni IF/ELSE permettono di verificare una condizione ed eseguire attività
alternative. Quando utilizzi un’istruzione IF, puoi includere qualsiasi espressione
valida che possa essere valutata true o false. Puoi anche utilizzare un’istruzione
SELECT valutata true o false, ma devi inserirla tra parentesi. Se SQL Server valuta
true l’istruzione IF, esegue la riga di codice che segue immediatamente l’istruzione IF;
se SQL Server valuta false l’istruzione IF, cerca un’istruzione ELSE. Se esiste un’istru-
zione ELSE, SQL Server esegue il codice che segue immediatamente l’istruzione
ELSE; se non esiste un’istruzione ELSE, SQL Server continua l’esecuzione del resto
della routine dopo l’istruzione IF. Ecco un esempio di un’istruzione IF con un’istru-
zione ELSE:
IF @Company_Name is Null
RETURN
ELSE
SET @retMsg = ‘The company name was provided.’
Quando la condizione nell’istruzione IF viene valutata true, SQL Server esegue solo
l’istruzione che segue immediatamente l’istruzione IF. Che cosa puoi dunque fare per
eseguire più istruzioni in base alla valutazione di una singola istruzione IF? Una pos-
sibilità consiste nell’inserire nuovamente l’istruzione IF, con una nuova riga di codi-
ce dopo la seconda e le successive istruzioni IF; un’altra possibilità prevede di creare
un blocco di codice utilizzando le istruzioni BEGIN/END. SQL Server tratta tutte le
righe di codice tra un’istruzione BEGIN e un’istruzione END come un singolo bloc-
co (o riga) di codice. Se desideri eseguire più istruzioni in base a una condizione IF,
utilizza le istruzioni BEGIN ed END per raggrupparle. Ecco un esempio:
If @Company_Name is Null
BEGIN
SET @retMsg = ‘You must supply a company name.’
SELECT @retMsg AS “Status”
RETURN
END
673
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 674
SQL Server fornisce molte stored procedure e variabili di sistema predefinite che pos-
sono essere utilizzate per migliorare le prestazioni delle routine. Una variabile utile
fornita da SQL Server è la variabile @@ROWCOUNT (i nomi delle variabili di siste-
ma iniziano sempre con due simboli @). @@ROWCOUNT memorizza il numero di
righe restituite dall’ultima istruzione SQL eseguita, ed è utile per determinare se sono
stati restituiti record. Un’altra variabile utile è la variabile @@IDENTITY. Dopo avere
eseguito un’istruzione SQL che aggiorna, aggiunge o elimina una riga contenente una
colonna identità (equivalente a un contatore in un database desktop), la variabile
@@IDENTITY contiene il valore di identità dell’ultima riga aggiornata.
Dopo avere conosciuto alcune delle funzionalità disponibili per una stored procedu-
re, puoi risolvere il problema che si verifica quando un utente non fornisce il nome
della società. Come potresti avere indovinato, devi utilizzare un’istruzione IF/ELSE
per valutare l’input del parametro @Company_Name. Modifica la routine sptAdd-
OneCompany come segue:
ALTER PROCEDURE sptAddOneCompany
-- Questa routine crea un nuovo record nella tabella tblCompanies
(
@Company_Name nvarchar(50),
@Department nvarchar(50) = Null,
@Address nvarchar(255) = Null,
@City nvarchar(50) = Null,
@County nvarchar(50) = Null,
@State_Or_Province nvarchar(20) = Null,
@PostalCode nvarchar(20) = Null,
@Country nvarchar(50) = N’United States’,
@Phone_Number nvarchar(30) = Null,
@Fax_Number nvarchar(30) = Null,
Capitolo 18
SET NOCOUNT ON
674
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 675
ELSE
--L’inserimento è fallito, restituisce un ID società pari a 0
e un messaggio di errore
BEGIN
SET @CompanyID = 0
SET @retMsg = ‘There was an Error. No Company was added.’
END
possibilità di controllare più istruzioni SQL in una stored procedure. Finora hai
imparato come aggiungere un nuovo record alla tabella tblCompanies e come con-
trollare i valori richiesti prima dell’esecuzione del comando INSERT. Che cosa acca-
de se le regole per questo database indicano in modo specifico che non puoi aggiun-
gere una società senza almeno un contatto valido? Potresti creare due routine separa-
te (una per aggiungere una società e un’altra per aggiungere il contatto), ma questo
non garantirebbe la correlazione delle righe in ogni tabella. La creazione di rotuine
675
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 676
separate significa anche che gli utenti potrebbero eseguire una routine e non l’altra,
lasciando il lavoro a metà.
La soluzione è l’utilizzo di una transazione di SQL Server. Quando utilizzi una trans-
azione, puoi raggruppare tutte le istruzioni SQL in una routine e confermare le modi-
fiche alle tabelle solo se tutte le istruzioni SQL vengono eseguite con successo. Se si
verificano errori o vengono violati dei vincoli, puoi annullare l’intera transazione ed
evitare che solo parte della routine sia svolta con successo. La creazione di una trans-
azione in una routine richiede l’utilizzo di tre istruzioni Transact-SQL: BEGIN
TRANSACTION, COMMIT TRANSACTION e ROLLBACK TRANSACTION.
L’utilizzo di queste istruzioni è piuttosto semplice: indica l’inizio di un blocco di
transizione utilizzando le parole chiave BEGIN TRANSACTION e poi includi tutte le
istruzioni SQL che desideri siano parte della transazione. Se tutte le istruzioni hanno
successo, devi utilizzare l’istruzione COMMIT TRANSACTION per confermare le
modifiche al database; se le istruzioni condizionali all’interno della transazione iden-
tificano un errore, devi utilizzare l’istruzione ROLLBACK TRANSACTION per
annullare tutte le modifiche apportate da qualsiasi istruzione SQL nel blocco della
transizione.
La sintassi di base per un blocco di transizione è semplice; la parte difficile sta nell’u-
tilizzo di istruzioni condizionali efficaci per valutare se esiste un problema che richie-
de di annullare la transizione. Una variabile di sistema particolarmente utile per que-
sto scopo è la variabile @@Error. Puoi controllare la variabile @@Error dopo l’esecu-
zione di ogni istruzione SQL: se @@Error è diversa da zero, significa che devi annul-
lare la transazione.
Puoi utilizzare una transazione per eseguire più istruzioni SQL in una singola routi-
ne, ma questo non significa che tutte le istruzioni SQL dovrebbero essere parte della
routine. Ogni routine dovrebbe essere diretta e presentare uno scopo unico. Quando
crei la stored procedure che aggiunge la riga per la società e la riga per il contatto,
creerai una routine separata per aggiungere il contatto; in questo modo, avrai una
routine con il singolo scopo di creare una società completa e un’altra routine con lo
scopo di aggiungere un contatto.
Dopo avere creato una routine che aggiunge le informazioni di contatto alla tabella
dei contatti, puoi eseguirla dalla routine sptAddOneCompany. Affinché la routine per
il contatto comunichi alla routine per la società il successo delle operazioni, devi uti-
lizzare dei parametri di output da restituire alla routine per la società. Diamo un’oc-
chiata alla routine che aggiunge le informazioni di contatto (sptAddContact).
CREATE PROCEDURE sptAddContact
-- Questa routine crea un nuovo record nella tabella tblContacts
(
Capitolo 18
@Last_Name nvarchar(50),
@First_Name nvarchar(50) = Null,
@Middle_Init nvarchar(1) = Null,
@Title nvarchar(10) = Null,
@Suffix nvarchar(10) = Null,
@Contact_Type nvarchar(50) = Null,
@Birth_Date datetime = Null,
@Default_Address smallint = 1,
@Work_Address nvarchar(255) = Null,
@Work_City nvarchar(50) = Null,
@Work_State_Or_Province nvarchar(20) = Null,
@Work_Postal_Code nvarchar(20) = Null,
676
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 677
AS
SET NOCOUNT ON
VALUES
(@Last_Name, @First_Name, @Middle_Init, @Title, @Suffix,
@Contact_Type, @Birth_Date, @Default_Address, @Work_Address,
If @@ROWCOUNT > 0
SET @ContactID = @@IDENTITY
ELSE
SET @ContactID = 0
RETURN
Capitolo 18
Dopo avere costruito la routine sptAddContact, sei pronto per aggiornare la stored
procedure sptAddOneCompany (potresti aprire quella query nella visualizzazione
Struttura, selezionare Salva con nome dal menu File, salvare una copia come
sptAddCompanyAndContact e poi modificare la nuova copia). Non devi solo com-
pilare le tabelle tblContacts e tblCompanies, ma devi anche aggiungere un record alla
tabella di collegamento tblCompanyContacts per creare la relazione tra le righe.
Come potresti avere indovinato, utilizzerai una transizione per monitorare queste tre
azioni INSERT e per assicurare che vengano tutte completate correttamente.
Per eseguire la stored procedure sptAddContact, devi utilizzare il comando EXECU-
TE: a tal fine, devi digitare il comando seguito dal nome della routine da eseguire e
da tutti i parametri richiesti. Puoi fornire i parametri nell’ordine specificato nella
routine chiamata, oppure puoi identificarli in modo specifico per nome. Ecco un
esempio che li identifica per nome in modo specifico:
EXECUTE sptAddContact
@Last_Name = @Contact_Last_Name,
@ContactID = @intContactID OUTPUT
AS
678
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 679
SET NOCOUNT ON
DECLARE
@intCompanyID int,
@intContactID int,
@retErr int --Acquisirà i messaggi di errore
VALUES
(@Company_Name, @Department, @Address, @City, @County,
@State_Or_Province, @Postal_Code,
@Country, @Phone_Number, @Fax_Number, @Website, @Referred_By)
ELSE
SELECT @retSuccess = 1, @intCompanyID = @@IDENTITY,
@retMsg = ‘New company added successfully ‘
EXECUTE sptXmplAddContact
@Last_Name = @Contact_Last_Name,
@First_Name = @Contact_First_Name,
@Work_Address = @Address,
@Work_City = @City,
@Work_State_Or_Province = @State_Or_Province,
@Work_Postal_Code = @Postal_Code,
679
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 680
@Work_Country = @Country,
@Work_Phone = @Phone_Number,
@Work_Extension = @Contact_Extension,
@Work_Fax_Number = @Fax_Number,
@Website = @Website,
@ContactID = @intContactID OUTPUT
If @retSuccess = 1
BEGIN
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTION
END
RETURN
La routine utilizza una variabile bit locale, @retSuccess, per tenere traccia del succes-
so o del fallimento delle istruzioni INSERT. Quando un’istruzione fallisce, la routine
non tenta di eseguire le istruzioni INSERT successive; alla fine della routine, il codice
controlla il valore di @retSuccess e conferma tutti gli aggiornamenti se il valore è true
Capitolo 18
680
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 681
Finora sono stati esaminati molti comandi utilizzati spesso nelle stored procedure,
ma è stata osservata solo la superficie. Se desideri ottenere ulteriori informazioni sulla
creazione di stored procedure e su Transact-SQL in generale, SQL Server Books Online
è un ottimo punto di partenza.
Suggerimento Puoi cercare alcune delle funzioni di sistema di SQL Server nell’ap-
pendice D, “Guida di riferimento alle funzioni Visual Basic”. Sono organizzate per
tipo di funzione (aritmetica, di conversione, per data/ora e così via) e sono elencate
in ordine in base ai loro equivalenti Visual Basic.
681
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 682
Nota Quando fai riferimento alle funzioni scalari o ad altri tipi di funzione che hai
costruito, devi sempre includere le parentesi () dopo il nome della funzione nell’i-
struzione EXECUTE: è la sintassi standard per chiamare una funzione e deve essere
utilizzata anche se la funzione non accetta parametri.
Dai un’occhiata alla sintassi per la creazione di un funzione scalare nell’editor di testo.
Per prima cosa, crea una nuova funzione scalare selezionando Crea funzione scalare
dalla finestra di dialogo Nuova query (figura 18.25). Access crea una nuova funzione
scalare, come mostrato nella figura 18.30.
La prima metà della funzione dovrebbe esserti familiare: la sezione tra parentesi è
quella in cui dichiarai i parametri che userai nella funzione scalare. Ricorda di sepa-
rare i parametri dichiarati con la virgola e di rimuovere i simboli di commento (/* e
*/). Osserva anche che non puoi dichiarare parametri OUTPUT, perché le funzioni
scalari presentano un solo output: il valore restituito.
L’istruzione RETURNS permette di identificare il tipo di dati del valore che la fun-
zione scalare deve restituire. Il corpo della funzione scalare deve essere contenuto
interamente all’interno di un blocco di istruzioni BEGIN/END che segue la parola
chiave AS. Se devi dichiarare qualsiasi variabile locale, definiscila all’interno del bloc-
co di istruzioni BEGIN/END. L’ultima istruzione utilizzata prima della parola chiave
END è l’istruzione RETURN, seguita dal parametro o dalla variabile che contiene le
informazioni restituite dalla funzione scalare.
di testo
L’ultimo tipo di query che puoi costruire utilizzando l’editor di testo è la funzione
valutata a livello di tabella. Durante l’esecuzione, la funzione valutata a livello di
tabella è simile a una query di selezione: restituisce infatti un intero recordset (o
tabella). La principale differenza è che le funzioni valutate a livello di tabella possono
contenere più istruzioni SQL utilizzate per produrre il recordset finale che viene resti-
tuito. Come risultato, le funzioni valutate a livello di tabella possono restituire tabel-
682
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 683
Figura 18.31 Una nuova funzione valutata a livello di tabella nell’editor di testo.
La sintassi per una funzione valutata a livello di tabella è molto simile alla sintassi per
una funzione scalare. La prima sezione tra parentesi è quella in cui dichiari i para-
metri che potrebbero essere necessari; ancora una volta, puoi dichiarare solo para-
metri di input perché il solo output di una funzione valutata a livello di tabella è un
Capitolo 18
683
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 684
GIN/END che segue la parola chiave AS. Puoi utilizzare numerose istruzioni SQL
all’interno del blocco di istruzioni; puoi anche eseguire inserimenti, aggiornamenti
ed eliminazioni sulla variabile tabella dichiarata. Se devi utilizzare variabili locali,
assicurati di dichiararle all’interno del blocco; l’ultima istruzione del blocco
BEGIN/END deve essere un’istruzione RETURN. SQL Server restituisce tutte le righe
che il codice ha inserito nella tabella RETURNS.
In questo capitolo hai conosciuto i diversi tipi di query che puoi costruire in un pro-
getto di Access. Puoi vedere che, in un progetto, sono disponibili più opzioni di inter-
rogazione rispetto a un database desktop di Access (.mdb) e che le query offrono
anche funzionalità potenti che non sono disponibili in un database desktop. Anche se
ogni tipo di query è stato esaminato solo brevemente, dovresti esserti fatto un’idea
delle diverse caratteristiche di ogni tipo di query e di come utilizzarle al meglio per
svolgere le attività necessarie in un progetto di Access. Combinando queste informa-
zioni con le nozioni apprese nei precedenti capitoli sulle query, dovresti essere pron-
to a creare visualizzazioni, funzioni e stored procedure da solo. Il capitolo successivo
si occuperà della creazione di maschere in un progetto di Access.
Capitolo 18
684