Sei sulla pagina 1di 48

18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 637

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.

Quando apri un file di progetto connesso correttamente a un database di SQL Server


o MSDE, puoi visualizzare le query nel database facendo clic sul pulsante Query sulla
barra Oggetti, come mostrato nella figura 18.1. Anche se le query sembrano essere
memorizzate direttamente nel file di progetto, si trovano in effetti nel database.

637
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 638

Parte 4: Preparazione di un progetto di Access

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

Per poter utilizzare il file di progetto di esempio LawTrack Contacts (Contacts.adp) e


il suo database di SQL Server associato (ContactsSQL.mdf), devi per prima cosa
installare Microsoft SQL Server Data Engine (MSDE) oppure ottenere il permesso di
creare database su un computer con Microsoft Access SQL Server versione 2000 dis-
ponibile in rete. Puoi installare MSDE dai CD di installazione di Microsoft Office
2003; per ulteriori informazioni, consulta l’appendice A, “Installazione di Microsoft
Office”.

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

server locale, il codice offre la possibilità di aprire la finestra di dialogo Proprietà di


Data Link per connettere i file di database al server dalla posizione di installazione
predefinita dei file di esempio. Per ulteriori informazioni, consulta la sezione
“Connessione a un database SQL Server esistente”, a pagina 603. Se hai installato i
file di esempio in una posizione diversa o hai spostato i file di database di esempio,
questo metodo potrebbe non funzionare.

638
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 639

Capitolo 18: Creazione di query in un progetto di Access

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”

Anche il file Detach Contacts.bat esegue il programma OSQL, ma fa riferimento al


file Detach Contacts.SQL che contiene un comando sp_detach_database.

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

Parte 4: Preparazione di un progetto di Access

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

red procedure complesse, funzioni scalari e funzioni valutate a livello di tabella.

Costruzione di query con la finestra


di progettazione query
L’utilizzo della finestra di progettazione query in un progetto di Access è il modo
migliore per iniziare a progettare le query per SQL Server, soprattutto se hai già
acquisito familiarità con la costruzione delle query in un database desktop.
640
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 641

Capitolo 18: Creazione di query in un progetto di Access

La finestra di progettazione query


Come hai osservato in precedenza, puoi utilizzare la finestra di progettazione query
per creare tre tipi diversi di query: visualizzazioni, funzioni inline e stored procedu-
re, che restituiscono un risultato da una singola istruzione di selezione. Anche se que-
ste query hanno scopi diversi, molti degli strumenti utilizzati per crearle nella visua-
lizzazione Struttura sono gli stessi. Iniziamo osservando gli elementi comuni nella
finestra di progettazione query per tutti i tipi di query; le sezioni successive del capi-
tolo si occupano delle differenze per ogni tipo di query.

Aggiunta di tabelle, visualizzazioni e funzioni


Iniziamo creando una nuova visualizzazione. Avvia Access e apri il file di progetto di
esempio Contacts.adp o un file di progetto connesso al database di esempio Contacts-
SQL.mdf. Fai clic sul pulsante Query sulla barra Oggetti nella finestra Database e poi
fai doppio clic su Crea una visualizzazione nella finestra di progettazione. Access apre
una visualizzazione vuota nella finestra di progettazione query e visualizza la finestra
di dialogo Aggiungi tabella, mostrata nella figura 18.2.
La finestra di dialogo Aggiungi tabella permette di specificare quali tabelle, visualiz-
zazioni e funzioni vuoi utilizzare come origine record per la nuova query. Puoi pas-
sare tra i diversi tipi di origine record facendo clic sulle schede nella parte superiore
della finestra; fai doppio clic sul nome di un’origine record per aggiungere quell’ori-
gine alla griglia di progettazione. Puoi anche fare clic su un nome per selezionarlo,
tenere premuto Ctrl e fare clic su più nomi non contigui per selezionarli, oppure
tenere premuto Maiusc e selezionare un intervallo di nomi. Dopo avere selezionato
tutte le origini record desiderate, fai clic sul pulsante Aggiungi per aggiungerle alla
nuova query.

Figura 18.2 L’aggiunta di tabelle, visualizzazioni e funzioni a una nuova query.


Capitolo 18

Procedi aggiungendo la tabella tblCompanies a questa visualizzazione e fai clic su


Chiudi.

Riquadri nella finestra di progettazione query


Dopo avere aggiunto la tabella tblCompanies e avere chiuso la finestra di dialogo
Aggiungi tabella, apparirà una finestra di progettazione query come quella mostrata
641
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 642

Parte 4: Preparazione di un progetto di Access

nella figura 18.3. Per impostazione predefinita, la finestra di progettazione query


mostra due riquadri: il riquadro del diagramma nella parte superiore e il riquadro
della griglia nella parte inferiore della finestra.

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.

Suggerimento Un modo per imparare a costruire le query utilizzando SQL consi-


ste nel visualizzare sempre il riquadro SQL durante la costruzione di una query. Ogni
volta che aggiungi o elimini un’origine record, aggiungi o elimini una relazione nel
riquadro del diagramma, oppure modifichi le specifiche nella griglia di progettazio-
Capitolo 18

ne, Access aggiorna il riquadro SQL per riflettere le modifiche.

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

Capitolo 18: Creazione di query in un progetto di Access

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.

Selezione delle colonne


Puoi aggiungere le colonne alla query in diversi modi: puoi trascinare un nome di
colonna dal riquadro del diagramma e rilasciarlo nel riquadro della griglia, oppure
puoi aggiungere una colonna facendo clic sulla casella a sinistra del nome di colonna
nel riquadro del diagramma. Quando svolgi questa operazione, appare un segno di
spunta accanto al nome della colonna; Access, inoltre, aggiunge la colonna al riqua-
dro della griglia, come mostrato nella figura 18.5.

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

Parte 4: Preparazione di un progetto di Access

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.

Utilizzo del riquadro del diagramma


Dopo avere iniziato a lavorare sulla query, puoi aggiungere altre origini record facen-
do clic con il pulsante destro del mouse in un’area vuota del riquadro del diagramma
e selezionando Aggiungi tabella dal menu di scelta rapida. Puoi anche fare clic sul
pulsante Aggiungi tabella sulla barra degli strumenti o selezionare Aggiungi tabella
dal menu Query. Access visualizza la finestra di dialogo Aggiungi tabella, in modo che
tu possa selezionare origini record aggiuntive (figura 18.2). Puoi rimuovere qualsiasi
origine record dal riquadro del diagramma facendo clic con il pulsante destro del
mouse sull’origine record e selezionando Rimuovi, oppure facendo clic sulla barra del
titolo dell’origine record per selezionarla e poi premendo Canc. Aggiungi le tabelle
tblCompanyContacts e tblContacts utilizzando la finestra di dialogo Aggiungi tabel-
la; fai clic su Chiudi quando hai terminato. La griglia di progettazione ora dovrebbe
apparire come mostrato nella figura 18.7.
Capitolo 18

Figura 18.7 Una nuova visualizzazione con le tabelle tblCompanyContacts e tblContacts


aggiunte.
644
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 645

Capitolo 18: Creazione di query in un progetto di Access

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

Parte 4: Preparazione di un progetto di Access

Inside Out
Join esterno completo, join sinistro e join destro: qual è la differenza

Quando specifichi un join esterno nella proposizione FROM di un’istruzione SQL,


stai chiedendo al database di restituire tutte le righe di una o entrambe le origini
record che partecipano al join, indipendentemente dalla corrispondenza delle righe
di un’origine record con le righe dell’altra origine. Un join esterno sinistro o destro
restituisce tutte le righe di una sola delle origini record. Sinistro o destro specifica se
a restituire tutte le righe è l’origine record sulla sinistra (la prima nell’istruzione di join
leggendo da sinistra a destra) o quella sulla destra. Access aggiunge i nomi delle ori-
gini record alla proposizione FROM nella sequenza con cui le origini sono state
aggiunte nel riquadro del diagramma; puoi sempre spostare le origini record nel
riquadro del diagramma, ma la prima aggiunta resta sempre quella a sinistra nell’i-
struzione SQL.

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.

SQL Server, invece, supporta la restituzione di tutte le righe di entrambe le origini


record; quando modifichi le proprietà di join per chiedere questo risultato, Access
cambia il codice SQL per specificare un join esterno completo. Quando esegui una
query di join esterno completo, potresti vedere alcune righe che contengono valori
di colonna dalla prima origine record e valori Null nelle colonne della seconda origi-
ne record, alcune righe che contengono valori di colonna da entrambe le origini
record, e alcune righe che contengono valori Null nelle colonne della prima origine
record e valori di colonna dalla seconda origine record.

La sezione superiore della finestra Proprietà consente di specificare un operatore per


la condizione di join. L’operatore predefinito, il segno di uguale, chiede al database di
restituire le righe solo quando i valori nella colonna a un’estremità del join corri-
spondono ai valori nella colonna unita dell’altra tabella. Tuttavia, puoi utilizzare un
operatore diverso se desideri che la query restituisca le righe con valori che non cor-
rispondono (<>), maggiori (>), maggiori o uguali (<=), minori (<), oppure minori
o uguali (<=) ai valori delle righe corrispondenti nella tabella unita. Se specifichi un
operatore diverso dal join con operatore uguale (detto anche equi-join) tra le due
tabelle, il simbolo a forma di rombo sulla linea di join nel riquadro del diagramma
Capitolo 18

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

Capitolo 18: Creazione di query in un progetto di Access

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à.

Utilizzo del riquadro della griglia


Puoi specificare numerose opzioni per ogni colonna nel riquadro della griglia. Nel
campo Alias puoi assegnare un nome diverso alla colonna quando viene generata in
output dalla query; se hai specificato una proprietà Didascalia per la colonna duran-
te la creazione nella tabella, la query visualizza la didascalia come intestazione della
colonna quando apri la query nella visualizzazione Foglio dati. Ad ogni modo, il
nome o l’alias della colonna che specifichi è ancora il nome corretto da utilizzare per
fare riferimento alla colonna della query da altre query, oppure in maschere e report.
Oltre a selezionare un nome di colonna da una delle origini record, per una colonna
puoi inserire un’espressione: l’espressione può essere semplice come un valore lette-
rale, oppure essere un’espressione matematica o di concatenazione complessa che uti-
lizza le colonne dalle origini record. Quando inserisci un’espressione per una colon-
na, devi anche inserire un nome alias per assegnare un nome alla colonna di output;
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

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

Capitolo 18: Creazione di query in un progetto di Access

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

Parte 4: Preparazione di un progetto di Access

Tabella 18.1 Opzioni di raggruppamento per la finestra di progettazione query


in SQL Server (continua)
Opzione Descrizione
Max Restituisce il valore più elevato nella colonna (l’ultimo valore in ordine
Max Distinct alfabetico per i tipi di dati di testo). Max Distinct, incluso per la compati-
bilità con lo standard ANSI SQL-92, considera solo i valori univoci nella
colonna, ma non restituisce un risultato diverso da Max. I valori Null sono
ignorati.
Min Restituisce il valore più basso nella colonna (il primo valore in ordine alfa-
Min Distinct betico per i tipi di dati di testo). Min Distinct, incluso per la compatibilità
con lo standard ANSI SQL-92, considera solo i valori univoci nella colon-
na, ma non restituisce un risultato diverso da Min. I valori Null sono igno-
rati.
StDev Restituisce la deviazione standard per tutti i valori nella colonna. StDevP
StDevP restituisce la deviazione standard per la popolazione di tutti i valori nella
colonna. La colonna può contenere solo valori numerici.
Sum Restituisce il totale di tutti i valori nella colonna. Sum Distinct calcola la
Sum Distinct somma dei soli valori univoci (i duplicati vengono ignorati). La colonna
può contenere solo valori numerici.
Var Restituisce la varianza statistica per tutti i valori nella colonna. VarP resti-
VarP tuisce la varianza statistica per la popolazione di tutti i valori nella colonna.
Where Specifica che questa colonna o espressione non è inclusa in un’espressio-
ne di aggregazione nell’elenco SELECT o nella proposizione GROUP BY,
ma è disponibile per il filtraggio delle righe prima che la query formi i
gruppi. Access genera una proposizione WHERE subito dopo la proposi-
zione FROM nel codice SQL che definisce la query.

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

Visualizzazione di altre proprietà


Puoi specificare molte altre proprietà per una query, per esempio il numero di righe
che devono essere restituite, alcune ricerche per le colonne restituite, e informazioni
sui parametri di input che potresti voler utilizzare. Per visualizzare le proprietà per
qualsiasi tipo di query nella visualizzazione Struttura, fai clic con il pulsante destro
del mouse all’interno del riquadro del diagramma o del riquadro della griglia e sele-

650
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 651

Capitolo 18: Creazione di query in un progetto di Access

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.

Utilizzo delle visualizzazioni


Le visualizzazioni sono il tipo di query più semplice supportato da SQL Server; offro-
no un modo per controllare quali dati vengono visualizzati e l’ordine in cui sono
mostrati. Le visualizzazioni sono strumenti molto utili per lo sviluppatore di SQL
Server, perché consentono di controllare l’accesso ai dati nelle tabelle: anziché asse-
gnare singole autorizzazioni utente per alcune parti di una tabella, puoi creare una
visualizzazione e assegnare le autorizzazioni utente per vedere e cambiare i dati solo
attraverso la visualizzazione.
Ecco alcuni dei motivi per utilizzare una visualizzazione:
● Desideri un sostituto sicuro e aggiornabile per una tabella. Con una visualiz-
zazione progettata correttamente, gli utenti possono ancora aggiungere, eli-
minare e aggiornare le righe, ma non necessitano delle autorizzazioni per
accedere direttamente alle tabelle sottostanti. Puoi assegnare agli utenti le
autorizzazioni per utilizzare la visualizzazione e, se vuoi, puoi limitare l’acces-
so a colonne specifiche semplicemente rimuovendole dalla visualizzazione.
● Desideri organizzare i recordset utilizzati per le maschere e i report. Puoi uti-
lizzare una visualizzazione come origine record per qualsiasi maschera o
report, oppure come origine delle righe per qualsiasi casella combinata o
casella di riepilogo. Se pianifichi attentamente una convenzione di assegna-
zione dei nomi, puoi creare una visualizzazione per ogni maschera o report
per facilitare il riconoscimento degli oggetti che utilizzano il recordset: per
esempio, vwFrmCompanies potrebbe essere la visualizzazione che fornisce il
recordset per la maschera frmCompanies.
● Desideri aggiungere le capacità di interrogazione ai tuoi recordset. A differen-
za delle tabelle, le visualizzazioni possono ordinare o filtrare automaticamen-
te le informazioni in base a intervalli di date fissi o a valori predeterminati. Per
esempio, se i tuoi utenti devono lavorare solo con le fatture del mese corren-
te, puoi costruire una visualizzazione sotto forma di un recordset che visua-
lizza le fatture solo per il mese corrente.
● Puoi utilizzare le visualizzazioni come origine record in qualsiasi punto in cui
Capitolo 18

puoi utilizzare una tabella come origine record; puoi anche utilizzare funzio-
ni e stored procedure come origini record nelle visualizzazioni.

Nota Le visualizzazioni sono di solito pensate per fornire recordset aggiornabili, ma


non è sempre possibile ottenere questo risultato: le visualizzazioni non sono aggiorna-
bili quando includi una funzione di aggregazione che riepiloga i dati o quando rag-
gruppi questi ultimi. Le visualizzazioni, inoltre, sono parzialmente aggiornabili se stai
costruendo un recordset da più tabelle, perché solo il lato molti del recordset fornito da
una visualizzazione è aggiornabile. Devi ricordarlo quando costruisci le visualizzazioni.
651
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 652

Parte 4: Preparazione di un progetto di Access

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

Questa visualizzazione sarà utilizzata come origine record per la maschera


Companies, pertanto sarà più facile scorrere i record della maschera Companies se
questi sono ordinati per nome della società. Desideri anche che il nome della società
sia l’unica colonna in base alla quale viene ordinato l’insieme di risultati, quindi
rimuovi il tipo di ordinamento dalla colonna Department cambiando il valore nella
casella di riepilogo in Non ordinato. Quando svolgi questa operazione, Access regola
automaticamente a 1 il valore del criterio di ordinamento per la colonna Compa-
nyName. Fai clic sul pulsante Salva sulla barra degli strumenti per salvare la visualiz-
zazione; digita vwCompanies come nome della visualizzazione nella finestra di dia-
652
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 653

Capitolo 18: Creazione di query in un progetto di Access

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.

Figura 18.13 La visualizzazione vwCompanies completata.

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.

Dopo avere salvato la visualizzazione, puoi dare un’occhiata all’insieme di risultati


facendo clic sul pulsante Visualizza sulla barra degli strumenti (la visualizzazione Foglio
dati è quella predefinita per questo pulsante quando una visualizzazione è aperta nella
visualizzazione Struttura). Osserva che vengono visualizzate tutte le colonne per la ta-
bella tblCompanies, con i record in ordine alfabetico per nome della società.

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

Parte 4: Preparazione di un progetto di Access

(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

Figura 18.14 La scheda Vista della finestra Proprietà per le visualizzazioni.

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

Capitolo 18: Creazione di query in un progetto di Access

singola colonna nella visualizzazione, come Descrizione, Didascalia, Formato e


Posizioni decimali. La scheda Ricerca permette di definire le ricerche per ogni colonna.
La scheda Dati consente di specificare filtri e fogli dati secondari. Per ulteriori informa-
zioni su queste proprietà, consulta la sezione “Le proprietà delle colonne”, a pagina 616.
La scheda con cui potresti non avere familiarità è la scheda Vista; le proprietà che puoi
impostare nella scheda Vista sono elencate nella tabella 18.2.
Tabella 18.2 Opzioni nella scheda Vista della finestra Proprietà
Opzione Descrizione
Vista Il nome attualmente assegnato a questa visualizzazione. Non puoi cambiare que-
sto valore nella finestra Proprietà, ma viene aggiornato se salvi la visualizzazione
con un nome differente.
Tutte La selezione di questa opzione equivale a selezionare l’opzione * (tutte le colonne)
le colonne nel riquadro del diagramma. Vengono restituite tutte le colonne nella tabella.
Valori DISTINCT La visualizzazione mostra solo i valori distinti e filtra tutte le righe duplicate.
Associa La selezione di questa opzione impedisce a tutti gli utenti di modificare la struttu-
a schema ra di qualsiasi origine record sottostante a questa visualizzazione (tabelle, funzioni
e stored procedure). È un’opzione utile perché, se qualcuno cambia le origini record
sottostanti, questa visualizzazione (e altre visualizzazioni, funzioni o stored proce-
dure basate sulle stesse origini record) potrebbero diventare non valide e non fun-
zionare più correttamente.
Aggiorna con Quando costruisci una visualizzazione utilizzando più origini record e poi ese-
regole vista gui gli aggiornamenti attraverso la visualizzazione, Access spesso invia comandi di
aggiornamento al server utilizzando la tabella di base modificata, non la visualizza-
zione. Quando selezioni questa opzione, Access esegue sempre i comandi di
aggiornamento utilizzando la visualizzazione.
Opzione Se selezioni l’opzione Aggiorna con regole vista, puoi selezionare questa opzione
CHECK per assicurare che qualsiasi riga modificata nella visualizzazione soddisfi le condi-
zioni nella proposizione WHERE della visualizzazione. Impedisce agli utenti di inse-
rire o modificare una riga che sarebbe eliminata dal criterio nella proposizione
WHERE.
Estensione Queste opzioni aggiuntive sono disponibili se hai specificato il raggruppamento
GROUP BY nella visualizzazione:
WITH CUBE specifica che la visualizzazione dovrebbe restituire un insieme di risul-
tati multidimensionale per le colonne specificate nella proposizione GROUP BY che
riepiloga tutte le combinazioni di funzioni di aggregazione e colonne nella visualiz-
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

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.

Utilizzo delle funzioni inline


Quando utilizzi le funzioni inline nella finestra di progettazione query, potresti pen-
sare ad esse come a un punto di equilibrio tra la semplicità delle visualizzazioni e la
potenza delle stored procedure. Come le visualizzazioni, le funzioni inline hanno la
capacità di restituire recordset che possono essere modificati e aggiornati; come le
stored procedure, le funzioni inline possono utilizzare i parametri. I parametri sono
variabili passate alla funzione che possono controllarne il comportamento: per esem-
pio, puoi creare una funzione che recupera i record creati all’interno di un certo
intervallo di date e utilizzare i parametri per specificare le date iniziali e finali dell’in-
tervallo di date quando la funzione viene eseguita.
Ecco alcuni motivi per utilizzare una funzione inline:
● Hai bisogno di un recordset aggiornabile che può essere costruito sulla base di
parametri condizionali. Per esempio, potresti avere bisogno di modificare le
informazioni di contatto per ogni contatto di una certa società: puoi così
costruire una funzione inline che acquisisce i contatti solo per la società spe-
cificata e modificare le informazioni direttamente nei risultati della query.
● Le funzioni inline sono utili per la restituzione di dati aggregati, come un con-
teggio dei record o un prezzo medio di vendita al dettaglio. Anche le visualizza-
zioni possono restituire queste informazioni, ma i requisiti per l’acquisizione di
questi dati spesso si basano su informazioni fornite dall’utente, che puoi richie-
dere più facilmente utilizzando una funzione inline con parametri.
● In modo simile, le funzioni inline sono un’ottima origine record per i report. I
Capitolo 18

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

Capitolo 18: Creazione di query in un progetto di Access

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

Parte 4: Preparazione di un progetto di Access

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

un semplice letterale stringa Access inserisce la lettera maiuscola N automaticamente,


per assicurare che i caratteri nella stringa possano essere confrontati con l’intera
gamma di caratteri che potrebbe essere memorizzata nella colonna. Puoi osservare che
ora appare un’icona a forma di filtro accanto alla colonna CompanyName nel riqua-
dro del diagramma per indicare che è stato definito un criterio per questa colonna.
Ora la funzione è completa: fai clic sul pulsante Salva sulla barra degli strumenti per
salvare le modifiche. La funzione completata dovrebbe apparire come mostrato nella
figura 18.16.
658
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 659

Capitolo 18: Creazione di query in un progetto di Access

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

Parte 4: Preparazione di un progetto di Access

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

Capitolo 18: Creazione di query in un progetto di Access

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.

Utilizzo delle stored procedure


Le stored procedure sono il tipo più potente di query che puoi costruire nella finestra
di progettazione query; queste query possiedono la maggior parte delle capacità delle
visualizzazioni e delle funzioni inline, ma permettono anche di eseguire query di
comando (aggiornamento, eliminazione e aggiunta di dati). Il vero potenziale delle
stored procedure è di molto superiore alle capacità della finestra di progettazione
query. Le stored procedure permettono infatti di scrivere routine complesse che com-
prendono l’esecuzione di test logici (If…Else) e cicli (While), la creazione di tabelle
temporanee e l’intercettazione degli errori utilizzando Transact-SQL. Ad ogni modo,
durante la costruzione di una stored procedure, la finestra di progettazione query si
rivelerà spesso utile.
L’utilizzo primario delle stored procedure costruite nella finestra di progettazione
query è l’esecuzione di query di comando. Come le funzioni, le stored procedure pos-
sono accettare parametri e possono restituire recordset aggiornabili. Per questo moti-
vo, puoi utilizzare una stored procedure come origine record di una maschera o un
report; tuttavia, non puoi utilizzare le stored procedure come origine record di altre
visualizzazioni o funzioni inline.
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

Entrambi i metodi sono adatti all’aggiunta di un record alla tabella tblCompanies, ma


la sintassi di accodamento valori è più diretta, specialmente se devi inserire una sola
riga; offre anche il vantaggio di essere più facile da convertire in una stored procedu-
re di testo, come imparerai in seguito nel capitolo.
Inizia aprendo il progetto Contact.adp, selezionando Query sulla barra Oggetti e
facendo doppio clic sul collegamento Crea una stored procedure nella finestra di pro-
gettazione. Aggiungi la tabella tblCompanies alla nuova stored procedure dalla fine-
stra di dialogo Aggiungi tabella e poi chiudi la finestra di dialogo. Assicurati che il
riquadro SQL sia visibile facendo clic sul pulsante SQL sulla barra degli strumenti, in
modo da poter osservare come Access crea questa query in SQL; sono informazioni
che risulteranno utili quando costruirai una query da solo nell’editor di testo.
Successivamente, specifica che si tratta di una query di accodamento valori. A tal fine,
individua la casella di riepilogo Tipo query sulla barra degli strumenti, mostrata nella
figura 18.21, e seleziona l’opzione Query di accodamento valori. La finestra di pro-
gettazione query cambia e mostra due sole opzioni nel riquadro della griglia: Co-
lonna e Nuovo valore.

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

apparire come nella figura 18.22.


Ora devi specificare i valori che desideri accodare alla tabella tblCompanies. Puoi
inserire semplicemente i valori nel campo Nuovo valore per ogni colonna ed esegui-
re la stored procedure; tuttavia, la prossima volta che vorrai aggiungere una riga alla
tabella tblCompanies dovrai ricostruire la routine.
È quindi preferibile utilizzare i parametri per ogni valore: in questo caso, Access richie-
de i valori che vuoi inserire in una nuova riga ogni volta che esegui la stored procedu-

662
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 663

Capitolo 18: Creazione di query in un progetto di Access

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.

Nome colonna Nome parametro


CompanyName @CompanyName
Department @Department
Address @Address
City @City
County @County
StateOrProvince @StateOrProvince
PostalCode @PostalCode
Country @Country
PhoneNumber @PhoneNumber
FaxNumber @FaxNumber
Website CAST(@Website AS nvarchar(50))
ReferredBy @ReferredBy
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

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.

Figura 18.23 La stored procedure completata spAddOneCompany.

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.

Attenzione Quando lavori con le query di comando in un database desktop di


Access (.mdb), puoi passare alla visualizzazione Foglio dati e vedere un recordset che
rappresenta le potenziali modifiche ai dati. La query di comando su un database desk-
top non esegue modifiche fino a quando fai clic sul pulsante Esegui; questo non vale
per le stored procedure nella finestra di progettazione query in un file di progetto
(.adp). La visualizzazione di una stored procedure equivale alla sua esecuzione; presta
attenzione quando costruisci le query di comando e provale sempre su una copia di
Capitolo 18

backup delle tabelle prima di eseguirle nuovamente sulle tabelle di produzione.

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

Capitolo 18: Creazione di query in un progetto di Access

me in precedenza, puoi visualizzare le proprietà per una stored procedure facendo


clic con il pulsante destro del mouse all’interno dell’area di progettazione e selezio-
nando Proprietà dal menu di scelta rapida. Access visualizza la finestra Proprietà per
la stored procedure, come mostrato nella figura 18.24.

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.

Costruzione delle query con un editor di testo


Finora hai imparato a costruire le query utilizzando la finestra di progettazione
query; hai anche scoperto che puoi duplicare la funzionalità delle query di un data-
665
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 666

Parte 4: Preparazione di un progetto di Access

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.

Figura 18.25 La finestra di dialogo Nuova query in un file di progetto di Access.

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

Capitolo 18: Creazione di query in un progetto di Access

Visto che Transact-SQL è un linguaggio così potente e complesso, questo capitolo


analizza solo le basi durante la descrizione delle sue caratteristiche. La sezione suc-
cessiva, “Costruzione di una stored procedure di testo”, mostra come procedere passo
per passo nella costruzione di una stored procedure nel database Contacts utilizzan-
do Transact-SQL. Le due sezioni rimanenti offrono brevi descrizioni dell’utilizzo
delle funzioni scalari di testo e delle funzioni valutate a livello di tabella di testo, insie-
me a esempi per iniziare a costruire query personali.
L’editor di testo è uno strumento relativamente semplice che offre alcune funzionali-
tà per facilitare il compito della scrittura di query basate sul testo. Quando apri una
nuova query nell’editor di testo, parte della sintassi viene già fornita: questa sintassi
stende le basi per il tipo di query da creare e include anche alcuni dei comandi pre-
definiti che potresti dover utilizzare nella maggior parte delle query di testo di quel
tipo. In effetti, la sintassi fornita è l’unica differenza tra la creazione di un tipo di
query (come una stored procedure) rispetto a un altro tipo (come una funzione valu-
tata a livello di tabella). Se vuoi, puoi cambiare un tipo di query in un altro (purché
tu non abbia ancora salvato la query) semplicemente modificando la sintassi fornita
nell’editor di testo.
Se desideri aggiungere istruzioni SQL nell’editor, puoi sia digitarle sia utilizzare la fine-
stra di progettazione query per costruirne una. Per utilizzare la finestra di progettazio-
ne query per costruire un’istruzione SQL, puoi fare clic con il pulsante destro del
mouse nell’editor di testo e selezionare Inserisci codice SQL dal menu di scelta rapida,
oppure fare clic sul pulsante Inserisci codice SQL sulla barra degli strumenti. Quando
hai terminato la creazione della query nella finestra di progettazione query (che Access
apre sotto forma di finestra di dialogo), puoi chiudere la finestra di progettazione
query: Access chiede se desideri inserire il codice SQL creato nell’editor di testo. Se fai
clic su Sì, Access copia il codice SQL creato nella finestra dell’editor di testo, nella posi-
zione del cursore.
Puoi anche utilizzare la finestra di progettazione query per modificare un’istruzione
SQL esistente: a tal fine, evidenzia l’istruzione SQL, fai clic con il pulsante destro del
mouse sulla selezione evidenziata e scegli Modifica SQL dal menu di scelta rapida;
puoi anche fare clic sul pulsante Modifica SQL sulla barra degli strumenti. Entrambi
i metodi visualizzano il testo evidenziato in una finestra di dialogo per la progetta-
zione delle query, dove puoi modificare il testo o controllare la sintassi di SQL con lo
strumento di controllo della sintassi.

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

Costruzione di una stored procedure di testo


Il tipo di query più potente che puoi creare in un progetto di Access è la stored pro-
cedure. Finora hai potuto comprendere lo scopo delle stored procedure progettando-
ne una con la finestra di progettazione query. Per trarre vantaggio dalle capacità delle
stored procedure, però, devi crearle utilizzando l’editor di testo. Ecco alcune delle
capacità a disposizione con una stored procedure di testo:

667
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 668

Parte 4: Preparazione di un progetto di Access

● Utilizza qualsiasi istruzione SQL, comprese SELECT, DELETE, UPDATE e


INSERT.
● Modifica o crea altri oggetti di database. Puoi creare tabelle e visualizzazioni,
modificandone le proprietà e il contenuto.
● Esegui altre stored procedure e funzioni. Puoi utilizzare qualsiasi stored pro-
cedure, funzione o variabile di sistema disponibile chiamandola o eseguendo-
la da una stored procedure.
● Dichiara parametri e variabili. Puoi ottenere e generare dati specifici, nonché
dichiarare le variabili che vengono utilizzate e modificate all’interno della sto-
red procedure.
● Utilizza le istruzioni di controllo del flusso. Simili alle istruzioni disponibili
nelle routine di Visual Basic, le istruzioni di controllo del flusso nelle stored
procedure permettono di controllare le condizioni, eseguire più volte un
gruppo di istruzioni e intercettare gli errori.
● Raggruppa più istruzioni utilizzando le transazioni. Puoi assicurare il com-
pletamento di un intero gruppo di operazioni raggruppandole in una trans-
azione e poi monitorando gli errori. Se un’operazione fallisce, puoi chiedere a
SQL Server di annullare tutte le modifiche apportate al database all’interno
della transazione.
Prendiamo la stored procedure creata nella finestra di progettazione query e rico-
struiamola nell’editor di testo. Potrai migliorarla dichiarando le variabili, aggiungen-
do le istruzioni di controllo del flusso, inserendo l’intercettazione degli errori e chia-
mando un’altra stored procedure.

Creazione di una nuova stored procedure nell’editor di testo


Apri il file di progetto di esempio Contacts.adp. Seleziona Query sulla barra Oggetti
della finestra Database, fai clic sul pulsante Nuovo sulla barra degli strumenti della
finestra Database e seleziona Crea stored procedure nella finestra di dialogo Nuova
query (figura 18.25). Fai clic su OK: Access apre l’editor di testo, che contiene già
codice Transact-SQL e commenti, come mostrato nella figura 18.26.
Capitolo 18

Figura 18.26 Una nuova stored procedure nell’editor di testo.

668
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 669

Capitolo 18: Creazione di query in un progetto di Access

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 */

-- Questo è un commento su una singola riga

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.

Se la routine richiede parametri, devi dichiararli all’interno di parentesi che seguono


immediatamente il nome della routine; dichiara i parametri per ogni dato che desi-
deri ottenere in input per la routine o che desideri produrre in output dalla routine.
Per dichiarare un parametro, inserisci il suo nome (il primo carattere deve essere @),
uno o più spazi e il tipo di dati del parametro. Se il tipo di dati corrisponde a uno dei
tipi di dati di testo, puoi anche specificare la lunghezza massima tra due parentesi che
seguono il nome del tipo di dati. Per alcuni tipi di dati numerici puoi specificare la
precisione e la scala nelle parentesi che seguono il nome del tipo di dati. Consulta la
tabella 17.1 per un elenco dei tipi di dati supportati da SQL Server.
Se vuoi puoi specificare un valore predefinito, facendo seguire la specifica del tipo di
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

chiamato @City, con il tipo di dati nvarchar, una dimensione di 30 e un valore pre-
definito Null.
(
@City nvarchar(30) = NULL
)

Per impostazione predefinita, SQL server restituisce ad Access un messaggio di con-


teggio delle righe (con il numero di righe restituite/influenzate) dopo l’esecuzione di
ogni istruzione SQL: si tratta di una funzionalità utile se stai monitorando il conteg-
gio delle righe per ogni istruzione SQL internamente alla routine. Tuttavia, come è già
stato affermato in precedenza, se stai utilizzando più istruzioni SQL nella routine e la
prima non restituisce righe, Access presume che l’intera routine non restituisca alcu-
na riga; se successivamente esegui un’istruzione che restituisce qualche riga (nella
visualizzazione Foglio dati, per esempio), Access non la visualizzerà. Per evitare que-
sta situazione, utilizza l’istruzione SET NOCOUNT seguita dalla parola chiave ON
(che comunica ad Access di non leggere il conteggio delle righe dopo ogni istruzione
SQL). Visto che questa istruzione è già inclusa nella stored procedure di base, è suffi-
ciente rimuovere gli indicatori di commento iniziale e finale per attivarla.
Puoi inserire il corpo della stored procedure dopo l’istruzione SET NOCOUNT e
prima dell’istruzione RETURN: il corpo include tutte le istruzioni SQL, le istruzioni
di controllo del flusso e le informazioni di output. Quando ricreerai la stored proce-
dure spAddOneCompany, qui inserirai l’istruzione INSERT.
L’istruzione RETURN comunica alla stored procedure di uscire dalla routine incondi-
zionatamente; se stai valutando alcune condizioni nella routine e devi terminare l’ese-
cuzione per qualche motivo, puoi tranquillamente utilizzare l’istruzione RETURN.

Ricreare la stored procedure dall’esempio della finestra


di progettazione query
In base alle informazioni presentate finora, potresti avere indovinato ciò che devi fare
per ricreare la stored procedure spAddOneCompany: devi dichiarare un parametro
di input per ogni valore da aggiungere alla tabella tblCompanies, poi devi inserire l’i-
struzione INSERT dopo l’istruzione AS per aggiungere il record alla tabella. In que-
sto esempio, non devi impostare NOCOUNT su ON perché la routine contiene una
sola istruzione SQL. Il codice che svolge l’operazione è il seguente:
CREATE PROCEDURE sptAddOneCompany
-- Questa routine crea un nuovo record nella tabella tblCompanies
(
@Company_Name nvarchar(50),
Capitolo 18

@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,
@Website ntext = Null,
@Referred_By int = Null
)
670
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 671

Capitolo 18: Creazione di query in un progetto di Access

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.

Questa routine è salvata come sptXmplAddOneCompany nel database di esempio.


Quando salvi ed esegui questa stored procedure, viene richiesto ogni parametro di
input: puoi inserire un valore per ogni input, oppure selezionare <DEFAULT> o
<NULL> dalla casella di riepilogo (nella maggior parte dei casi il valore predefinito è
Null). Assicurati di inserire un valore per il nome della società; quando hai termina-
to, riceverai un messaggio come quello mostrato nella figura 18.27.
In questo caso non vengono restituiti record perché non hai specificato questa ope-
razione nella stored procedure; se apri la tabella tblCompanies, vedrai che il record è
stato aggiunto correttamente. Se non inserisci un nome di società, apparirà un mes-
saggio come quello mostrato nella figura 18.28, perché il nome della società è una
colonna obbligatoria nella tabella tblCompanies; di conseguenza, non vedrai una
nuova riga nella tabella tblCompanies.

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

Parte 4: Preparazione di un progetto di Access

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”.

Nota Se rimuovi l’istruzione RETURN nella stored procedure di testo di esempio, la


salvi e la riapri di nuovo nella visualizzazione Struttura, Access la visualizza utilizzan-
do la finestra di progettazione query, perché non hai aggiunto alcun comando SQL
che non può essere rappresentato nella finestra di progettazione. Finché la stored
procedure contiene una singola istruzione SQL senza altre proposizioni, Access pre-
ferisce mostrarla nella finestra di progettazione. I rimanenti esempi di questo capito-
lo possono essere modificati solo utilizzando l’editor di testo.

Aggiunta di istruzioni di controllo del flusso alla stored


procedure
Prima di modificare la stored procedure, devi imparare alcune nuove istruzioni che
potrai utilizzare per controllare il nome della società. In questa sezione imparerai
come:
● Dichiarare le variabili, assegnare loro i valori e verificarle
● Includere istruzioni IF/ELSE che verificano le variabili ed eseguono un insie-
me di istruzioni alternativo
● Includere istruzioni BEGIN/END per definire un blocco di istruzioni che SQL
Server dovrebbe eseguire dopo un’istruzione IF o ELSE
● Utilizzare le variabili di sistema @@ROWCOUNT e @@IDENTITY
Hai già imparato come creare e utilizzare i parametri nelle routine; puoi anche
dichiarare variabili che memorizzano dati con cui lavorare internamente durante l’e-
secuzione della routine. La dichiarazione delle variabili è simile alla dichiarazione dei
parametri, tranne per il fatto che devi utilizzare l’istruzione DECLARE dopo l’istru-
zione AS. Puoi dichiarare più variabili in un’istruzione DECLARE, separandole con
le virgole; per esempio, il codice seguente crea due variabili chiamate @CompanyID
e @retMsg:
DECLARE @CompanyID int,
@retMsg varchar(150)
Capitolo 18

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

Capitolo 18: Creazione di query in un progetto di Access

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

In questo esempio, se la variabile @Company_Name è Null, la routine assegna un


messaggio informativo a una variabile, restituisce tale variabile in una colonna chia-
Capitolo 18

mata Status ed esce utilizzando un’istruzione RETURN. Osserva l’utilizzo dell’istru-


zione AS: questa parola chiave specifica che il valore di @retMsg dovrebbe essere
restituito come recordset con l’intestazione di colonna Status. Se l’istruzione IF viene
valutata true, vedrai un risultato simile a quello della figura 18.29. Una routine di
esempio che include questo test è salvata come sptXmplAddOneCompanyTest nel da-
tabase di esempio.

673
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 674

Parte 4: Preparazione di un progetto di Access

Figura 18.29 La routine restituisce un messaggio di errore come un recordset quando


non fornisci un nome per la società.

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.

Suggerimento Per ulteriori informazioni sulle variabili, le funzioni e le stored pro-


cedure di sistema disponibili per migliorare le prestazioni di una stored procedure
definita dall’utente, consulta Microsoft SQL Server Books Online. Ricorda che puoi
scaricarne una copia gratuita (un insieme di file di Guida) dall’indirizzo http://www.
microsoft.com/sql/techinfo/productdoc/2000/books.asp.

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

@Website ntext = Null,


@Referred_By int = Null
)
AS

SET NOCOUNT ON

-- Dichiara una variabile per restituire il nuovo ID della società


-- e un messaggio di stato
DECLARE @CompanyID int,
@retMsg varchar(150)

674
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 675

Capitolo 18: Creazione di query in un progetto di Access

-- Assicura la presenza di un nome per la società


If @Company_Name is Null
BEGIN
-- No. Imposta e restituisce un messaggio di errore, poi esce.
SET @CompanyID = 0
SET @retMsg = ‘You must supply a company name.’
SELECT @retMsg AS “Status”, @CompanyID AS “CompanyID”
RETURN
END

-- Il nome della società è stato fornito, quindi tenta l’inserimento


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)

-- Se il conteggio delle righe non è zero


If @@ROWCOUNT > 0
-- La riga è stata inserita correttamente
BEGIN
SET @CompanyID = @@IDENTITY
SET @retMsg = ‘New Company Added Successfully’
END

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

-- Restituisce lo stato dell’inserimento e il nuovo ID, se disponibile


SELECT @retMsg AS “Status”, @CompanyID AS “CompanyID”
RETURN
Questa routine perfezionata non solo controlla il valore del parametro @Compa-
ny_Name, ma restituisce anche un recordset alla fine della routine per comprendere se
l’operazione ha avuto successo. Per questo scopo, utilizza un altro insieme di istruzioni
IF/ELSE per valutare la variabile @@ROWCOUNT e assegnare i valori alle variabili
@retMsg e @CompanyID. Quando l’inserimento avviene correttamente, la routine uti-
lizza la variabile @@IDENTITY per trovare l’ID della nuova riga, in modo che possa
restituirlo come parte del messaggio di inserimento corretto. L’istruzione SELECT alla
fine della routine restituisce il messaggio e l’ID della società. Questa query è salvata
come sptXmplAddOneCompanyTest nel database di esempio.

Raggruppamento di più istruzioni con le transazioni


Una delle più importanti funzionalità delle stored procedure e di Transact-SQL è la
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

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

Capitolo 18: Creazione di query in un progetto di Access

@Work_Country nvarchar(50) = ‘United States’,


@Work_Phone nvarchar(30) = Null,
@Work_Extension nvarchar(20) = Null,
@Work_Fax_Number nvarchar(30) = Null,
@Home_Address nvarchar(255) = Null,
@Home_City nvarchar(20) = Null,
@Home_State_Or_Province nvarchar(20) = Null,
@Home_Postal_Code nvarchar(20) = Null,
@Home_Country nvarchar(50) = ‘United States’,
@Home_Phone nvarchar(30) = Null,
@Mobile_Phone nvarchar(30) = Null,
@Email_Name ntext = Null,
@Website ntext = Null,
@Photo image = Null,
@Spouse_Name nvarchar(75) = Null,
@Spouse_Birth_Date datetime = Null,
@Notes ntext = Null,
@Commission_Percent float = 0,
@ContactID int OUTPUT
)

AS
SET NOCOUNT ON

-- Esce dalla routine se @Last_Name è null


IF @Last_Name IS NULL
BEGIN
SET @ContactID = 0
RETURN
END

-- Altrimenti, esegue l’inserimento


INSERT INTO tblContacts
(LastName, FirstName, MiddleInit, Title, Suffix, ContactType,
BirthDate, DefaultAddress, WorkAddress, WorkCity,
WorkStateOrProvince, WorkPostalCode, WorkCountry, WorkPhone,
WorkExtension, WorkFaxNumber, HomeAddress, HomeCity,
HomeStateOrProvince, HomePostalCode, HomeCountry, HomePhone,
MobilePhone, EmailName, Website, Photo, SpouseName, SpouseBirth
Date,
Notes, CommissionPercent)

VALUES
(@Last_Name, @First_Name, @Middle_Init, @Title, @Suffix,
@Contact_Type, @Birth_Date, @Default_Address, @Work_Address,

@Work_City, @Work_State_Or_Province, @Work_Postal_Code,


@Work_Country, @Work_Phone, @Work_Extension,
@Work_Fax_Number, @Home_Address, @Home_City,
@Home_State_Or_Province, @Home_Postal_Code, @Home_Country,
@Home_Phone, @Mobile_Phone, @Email_Name, @Website, @Photo,
@Spouse_Name, @Spouse_Birth_Date, @Notes, @Commission_Percent)

If @@ROWCOUNT > 0
SET @ContactID = @@IDENTITY
ELSE
SET @ContactID = 0

RETURN
Capitolo 18

Se vuoi, puoi aprire la routine sptXmplAddContact di esempio e selezionare Salva


con nome dal menu File per salvare una copia con un nuovo nome. Come puoi vede-
re, la routine sptAddContact è in grado di aggiungere un record completo per un
contatto alla tabella tblContacts; include anche @ContactID come parametro di out-
put. Se sptAddContact viene chiamata da un’altra routine, restituisce @ContactID
per far sapere alla routine chiamante se l’inserimento è andato a buon fine: se @Con-
tactID è 0 non sono stati aggiunti record, altrimenti @ContactID equivale al valore di
identità della nuova riga.
677
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 678

Parte 4: Preparazione di un progetto di Access

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

Devi dichiarare sia @Contact_Last_Name sia @intContactID come variabili locali.


L’aggiunta della parola chiave OUTPUT all’assegnazione @ContactID nella chiamata
alla routine indica che la routine chiamata dovrebbe restituire un valore
@intContactID. Al completamento della routine chiamata, puoi utilizzare la variabi-
le locale (@intContactID) per valutare che cosa è stato restituito dalla routine (per
esempio, puoi controllare se è stato restituito un ContactID).
Ora che hai imparato le varie funzionalità e capacità di una stored procedure, è il
momento di creare una routine più complessa che sfrutta ogni nozione presentata
finora. La routine, dopo l’aggiornamento per l’utilizzo delle transazioni per monito-
rare più istruzioni SQL, dovrebbe essere la seguente:
ALTER PROCEDURE sptAddCompanyAndContact
/* Questa routine crea un nuovo record nella tabella tblCompanies .
Aggiunge anche un record corrispondente alla tabella tblContacts
e completa la relazione aggiungendo un record di collegamento
alla tabella tblCompanyContacts */
(
@Company_Name nvarchar(50),
@Contact_Last_Name nvarchar(50),
@Contact_First_Name nvarchar(50) = Null,
@Contact_Extension nvarchar(20) = Null,
@Department nvarchar(50) = Null,
@Address nvarchar(255) = Null,
@City nvarchar(50) = Null,
@County nvarchar(50) = Null,
@State_Or_Province nvarchar(20) = Null,
@Postal_Code nvarchar(20) = Null,
@Country nvarchar(50) = ‘United States’,
Capitolo 18

@Phone_Number nvarchar(30) = Null,


@Fax_Number nvarchar(30) = Null,
@Website ntext = Null,
@Referred_By int = Null,
--Indica se la routine ha avuto successo:
@retSuccess bit = 1 OUTPUT,
@retMsg varchar(150) = Null OUTPUT
)

AS

678
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 679

Capitolo 18: Creazione di query in un progetto di Access

SET NOCOUNT ON

DECLARE
@intCompanyID int,
@intContactID int,
@retErr int --Acquisirà i messaggi di errore

--Assicura che tutte le variabili e i parametri di output siano


impostati ai valori predefiniti
SELECT @intCompanyID = 0, @intContactID = 0, @retSuccess = 1,
@retErr = 0

-- Esce dalla routine se @Company_Name è null


IF @Company_Name IS NULL
BEGIN
SELECT @intCompanyID = 0, @retMsg = ‘You must supply a company name. ‘
SELECT @intCompanyID AS ‘New CompanyID’, @intContactID AS
‘New ContactID’,
@retMsg AS ‘Last Status Message’
RETURN
END

-- Esce dalla routine se @Contact_Last_Name è null


IF @Contact_Last_Name IS NULL
BEGIN
SELECT @intContactID = 0, @retMsg = ‘You must supply a contact last name. ‘
SELECT @intCompanyID AS ‘New CompanyID’, @intContactID AS ‘New ContactID’,
@retMsg AS ‘Last Status Message’
RETURN
END

/* Sono disponibili i valori per @Company_Name e @Contact_Last_Name


Inizia la transazione con l’aggiunta delle righe */
BEGIN TRANSACTION

-- Per prima cosa, aggiunge la riga della società


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, @Postal_Code,
@Country, @Phone_Number, @Fax_Number, @Website, @Referred_By)

SET @retErr = @@Error --Controlla eventuali errori


IF @retErr <> 0
SELECT @retSuccess = 0, @intCompanyID = 0,
@retMsg = ‘Insert failed. No company was added. ‘

ELSE
SELECT @retSuccess = 1, @intCompanyID = @@IDENTITY,
@retMsg = ‘New company added successfully ‘

--Dopo di che, aggiunge la riga del contatto eseguendo sptAddContact


--ma non svolge l’operazione se la società ha già prodotto un errore
IF @retSuccess = 1
BEGIN
Capitolo 18

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

Parte 4: Preparazione di un progetto di Access

@Work_Country = @Country,
@Work_Phone = @Phone_Number,
@Work_Extension = @Contact_Extension,
@Work_Fax_Number = @Fax_Number,
@Website = @Website,
@ContactID = @intContactID OUTPUT

SET @retErr = @@Error —Controlla eventuali errori


-- Verifica anche @intContactID restituito dalla routine
IF @retErr <> 0 Or @intContactID = 0
SELECT @retSuccess = 0,
@retMsg = ‘Insert failed. No contact was added. ‘
ELSE
SELECT @retSuccess = 1, @intContactID = @@IDENTITY,
@retMsg = ‘New contact added successfully ‘
END

--Infine, aggiunge la riga alla tabella tblCompanyContacts


--ma non svolge l’operazione se gli inserimenti precedenti sono falliti
IF @retSuccess = 1
BEGIN
INSERT INTO dbo.tblCompanyContacts
(CompanyID, ContactID, DefaultForContact, DefaultForCompany)
VALUES
(@intCompanyID, @intContactID,1,1)

SET @retErr = @@Error —Check for any errors


IF @retErr <> 0
SELECT @retSuccess = 0,
@retMsg = ‘Insert failed. No company-contact was added.’
ELSE
SELECT @retMsg = ‘New company-contact added successfully.’
END

If @retSuccess = 1
BEGIN
COMMIT TRANSACTION
END

ELSE
BEGIN
ROLLBACK TRANSACTION
END

-- Restituisce i nuovi ID della società, ID del contatto e il messaggio


di stato.
-- Gli ID saranno zero se la routine è fallita.
SELECT @intCompanyID AS ‘New CompanyID’, @intContactID AS ‘New ContactID’,
@retMsg AS ‘Last Status Message’

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

(1) o annulla tutti gli aggiornamenti se il valore è false (0).


Osserva anche che l’indirizzo e il numero di telefono della società vengono utilizzati
come indirizzo e numero telefonico dell’ufficio per il contatto. Visto che stai creando
un contatto per la società, puoi presumere che queste informazioni siano le stesse.
Puoi tralasciare l’indirizzo dell’abitazione del contatto e altre informazioni irrilevan-
ti per la creazione di un record utile per un contatto di una società.

680
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 681

Capitolo 18: Creazione di query in un progetto di Access

Questa routine è salvata come sptXmplAddCompanyAndContact nel database di


esempio. Per provarla, puoi aprire la tabella tblContacts nella visualizzazione
Struttura e deselezionare la proprietà Ammetti Null per la colonna FirstName. Esegui
la routine e fornisci un nome per la società e un cognome per il contatto, ma non un
nome per il contatto. La routine dovrebbe fallire; non troverai quindi un nuovo
record per la società nel database, anche se l’operazione INSERT sulla tabella
tblCompanies ha avuto successo.

Nota Quando esegui la stored procedure sptXmplAddCompanyAndContact, Ac-


cess chiede i due parametri di output, @retSuccess e @retMsg: non dovresti inserire
valori per questi due parametri. Di norma eseguirai questa stored procedure da
un’altra query o da una routine di Visual Basic. Visto che i due parametri di output
presentano valori predefiniti, non devi fornirli quando esegui questa routine da
un’altra routine.

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.

Costruzione di una funzione scalare di testo


Un altro tipo di query che puoi costruire nell’editor di testo è la funzione scalare di
testo. Le funzioni scalari sono molto simili, per concetto, alle funzioni di sistema for-
nite da SQL Server; sono generalmente definite per servire a un singolo scopo e resti-
tuire un singolo valore. Per esempio, puoi costruire una funzione scalare se devi cal-
colare ripetutamente un singolo valore aggregato quando lavori con i recordset nel
database. Puoi costruire la funzione scalare e poi eseguirla ogni volta che devi calco-
lare il valore. Per esempio, se devi conoscere spesso il prezzo medio dei prodotti ven-
duti in un dato intervallo di tempo, puoi costruire una funzione scalare che calcoli
quel valore automaticamente; in seguito dovrai solo eseguire la funzione scalare al
posto di calcolare il valore nella query ogni volta che devi utilizzarlo.
Come le stored procedure, le funzioni scalari possono utilizzare molte funzionalità di
Capitolo 18

Transact-SQL: possono accettare parametri, eseguire più istruzioni SQL e utilizzare le


variabili. Con le funzioni scalari è comunque fondamentale ricordare che restituisco-
no sempre un valore singolo.
Per questo motivo possono essere utilizzate in qualsiasi posizione in cui è possibile
utilizzare un valore singolo, una variabile o un parametro in altre visualizzazioni,
funzioni e stored procedure. La flessibilità delle funzioni scalari le rende molto utili
durante la progettazione e l’implementazione di altre query nel database.

681
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 682

Parte 4: Preparazione di un progetto di Access

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.

Figura 18.30 Una nuova funzione scalare nell’editor di testo.

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.

Costruzione di una funzione valutata a livello di tabella


Capitolo 18

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

Capitolo 18: Creazione di query in un progetto di Access

le che rappresentano l’insieme di risultati di diverse query complesse. I recordset


restituiti dalle funzioni valutate a livello di tabella sono di sola lettura.
In una funzione valutata a livello di tabella puoi utilizzare la stessa sintassi Transact-
SQL delle funzioni scalari; la differenza sta nel fatto che una funzione valutata a livel-
lo di tabella restituisce una tabella logica anziché un singolo valore, e utilizza una o
più istruzioni INSERT per creare la tabella logica restituita. Se devi costruire un
recordset basato su più query su altre tabelle che potrebbero richiedere alcuni para-
metri per determinare il risultato, una funzione valutata a livello di tabella è la solu-
zione ideale perché consente di eseguire l’intero processo in una funzione. Visto che
le funzioni valutate a livello di tabella restituiscono recordset, puoi utilizzarle ovun-
que sia possibile utilizzare una singola istruzione SQL in altre visualizzazioni, fun-
zioni e stored procedure. Devi solamente ricordare che non puoi modificare l’insie-
me di risultati di una funzione valutata a livello di tabella.
Dai un’occhiata alla sintassi per la creazione di un funzione valutata a livello di tabel-
la nell’editor di testo. Per prima cosa, crea una nuova funzione valutata a livello di
tabella selezionando Crea funzione valutata a livello di tabella dalla finestra di dialo-
go Nuova query (figura 18.25). Access crea una nuova funzione valutata a livello di
tabella, come mostrato nella figura 18.31.

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

singolo recordset. L’istruzione RETURNS identifica il valore che la funzione restitui-


rà (in questo caso una variabile tabella); devi anche specificare i nomi e i tipi di dati
per le colonne della tabella all’interno di parentesi che seguono il nome della variabi-
le tabella. Assicurati di separare le dichiarazioni di colonna con le virgole; natural-
mente, devi anche rimuovere i simboli di commento (/* e */) che circondano la
dichiarazione di tabella richiesta.
In modo simile alle funzioni scalari, le funzioni valutate a livello di tabella devono
contenere l’intero corpo della funzione all’interno di un blocco di istruzioni BE-

683
18 ACCESS 2003 INSIDEOUT XP 21-01-2004 10:41 Pagina 684

Parte 4: Preparazione di un progetto di Access

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