Sommario Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi Convenzioni e caratteristiche utilizzate nel libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxv File di esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi Ringraziamenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix Parte 1: Ambiente e linguaggio VBA Capitolo 1: Utilizzo dell'editor VBA e debug del codice . . . . . . . . . . . . . . . . . . . . . . . . 3 Debug di codice in una maschera. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Accesso all'editor VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Finestra dell'applicazione e del codice VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Creazione di moduli e routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Creazione di un modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Creazione di una routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Esecuzione di una subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Esecuzione di una funzione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Visualizzazione e ricerca di codice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Finestra Dividi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Ricerca nel codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Debug di codice in un modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Comandi di debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Inserimento di punti di interruzione nel codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Comando Set Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Comandi di esecuzione dopo i punti di interruzione . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Visualizzazione di variabili nella finestra Variabili locali. . . . . . . . . . . . . . . . . . . . . . . . . 30 Traccia delle routine con Stack di chiamate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Controllo di variabili ed espressioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Aggiunta di espressioni di controllo condizionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Utilizzo della finestra Immediata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Modifica immediata del codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Utilizzo di Visualizzatore oggetti e della Guida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Configurazione della Guida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Utilizzo di Visualizzatore oggetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 ix Book 1.indb ix 09/02/2012 11:26:25 x Sommario Capitolo 2: Struttura del linguaggio VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Impostazioni di VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Commenti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Impostazione di Option Explicit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Selezione di Option Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Compilazione del codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Compilazione condizionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Utilizzo di costanti e variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Miglioramento della qualità del codice con le costanti . . . . . . . . . . . . . . . . . . . . . . . . . 49 Parola chiave Enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Variabili e tipi di campi database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Gestione di valori NULL, IsNull e Nz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Utilizzo di variabili statiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Utilizzo di variabili globali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Ambito e durata delle variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Utilizzo di array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Strutture dei tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Funzioni e routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Gestione del codice di subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Definizione dei parametri ByRef e ByValue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Routine private e public. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Parametri opzionali e denominati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Qualificatore ParamArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Organizzazione del codice in moduli e moduli di classe . . . . . . . . . . . . . . . . . . . . . . . . 76 Istruzioni di controllo e flusso di programma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Istruzioni IF… Then… Else…. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Istruzioni IIF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Istruzioni Choose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Istruzioni Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Istruzioni TypeOf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Cicli For e For Each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Cicli Do While e Do Until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Istruzioni Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Istruzione With. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 GoTo e GoSub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Continuazione di riga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Suddivisione di SQL in più righe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Capitolo 3: Funzionalità del linguaggio VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Utilizzo delle funzioni incorporate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Funzioni di data e ora. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Funzioni di stringa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Funzioni di dominio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Creazione di clausole Where . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 SQL e virgolette incorporate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Utilizzo di funzioni VBA nelle query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Funzione Eval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Book 1.indb x 09/02/2012 11:26:25 Sommario xi Shell e Sendkeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Comando DoEvents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Oggetti e insiemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Variabili di oggetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Is Nothing, IsEmpty, IsObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Creazione di codice gestibile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Denominazione degli oggetti nei documenti Access. . . . . . . . . . . . . . . . . . . . . . . . . . 108 Denominazione dei campi del database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Denominazione dei controlli non associati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Denominazione delle variabili nel codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Rientro del codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Altre convenzioni di denominazione delle variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 VBA e macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Access Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Conversioni delle macro in VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Gestione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 On Error Resume Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Oggetto Err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 On Error GoTo 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Sviluppo di un gestore errori generico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 OpenArgs e maschere di dialogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Err.Raise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Parte 2: Access Object Model e Data Access Objects (DAO) Capitolo 4: Utilizzo del modello oggetto di Access . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Metodi e proprietà dell'oggetto Application. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Metodo Run . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Metodo RunCommand. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Semplificazione delle operazioni di filtro con BuildCriteria . . . . . . . . . . . . . . . . . . . . . 130 Campi memo ColumnHistory e Append only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Analisi di TempVars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Richiamo del Generatore di espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Oggetti CurrentProject e CurrentData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Recupero dei dati sulla versione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Modifica delle proprietà di visualizzazione foglio dati della maschera . . . . . . . . . . 136 Dipendenze degli oggetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Oggetto DoCmd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Controllo di ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Verifica di dimensione e posizione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Spostamenti nell'applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Scambio di dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Manipolazione degli insiemi Forms e Reports. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Utilizzo del Generatore di espressioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Riferimento a controlli in una maschera secondaria. . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Creazione di oggetti Access nel codice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Utilizzo dell'oggetto Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Modifica della forma del puntatore del mouse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Utilizzo di ActiveForm e ActiveControl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Book 1.indb xi 09/02/2012 11:26:25 xii Sommario Sviluppo dell’interfaccia utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Opzioni di impostazione e acquisizione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Blocco di Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Monitoraggio dello stato di avanzamento con SysCmd. . . . . . . . . . . . . . . . . . . . . . . . 155 Barre di stato personalizzate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Selezione di file con FileDialog di Office. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Capitolo 5: Introduzione a Data Access Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Il modello DAO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 DAO, ADO e riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Utilizzo dei database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Oggetto DBEngine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Oggetto Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Transazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 La raccolta Error. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Oggetto Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 CurrentDB, DBEngine e CodeDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Raccolta TableDefs e indici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Gestione delle proprietà del foglio dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Relazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Manipolazione dei dati con Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Ricerca. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Segnalibri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Sintassi dei campi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Proprietà Filter e Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Aggiunta, modifica e aggiornamento di record . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Campi di ricerca multivalore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Campi Attachment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Visualizzazione delle informazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Tipo di dati oggetti OLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Campi calcolati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Clonazione e copia di Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Lettura di record in un array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 Utilizzo di query nel codice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 QueryDefs temporanei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 QueryDefs e Recordsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Creazione di QueryDefs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Parametri QueryDef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Analisi e documentazione degli oggetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Contenitori e documenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Proprietà oggetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Applicazioni di esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Documentazione di un database utilizzando DAO. . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Ricerca di oggetti in un database utilizzando DAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Book 1.indb xii 09/02/2012 11:26:25 Sommario xiii Parte 3: Lavorare con maschere e report Capitolo 6: Utilizzo di maschere ed eventi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 Visualizzazione di record . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Maschere associate e non associate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Maschere a scelta obbligatoria e popup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Eventi Open e Load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Filtro tramite i controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Filtro tramite la proprietà Filter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Filtro tramite un'altra maschera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Private Sub cmdFilter_Click() DoCmd.OpenForm "frmCustomersFilterPopup" End Sub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Evento ApplyFilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Eventi Unload e Close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Utilizzo di RecordsetClone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Comandi Refresh, Repaint, Recalc e Requery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 Chiamata di routine tra maschere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Interazione con i record su una maschera. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Evento Current . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Eventi Deactivate e Activate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Impostazione della proprietà Intervallo del timer dell'evento Timer . . . . . . . . . . . . 257 Eventi Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Operazioni di modifica e annullamento su un record. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Eventi BeforeUpdate e AfterUpdate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Attivazione e disattivazione dei controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 Eventi BeforeInsert e AfterInsert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Evento Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Eventi KeyPreview ed eventi tasto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Evento Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 Salvataggio di record . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Capitolo 7: Utilizzo di controlli ed eventi delle maschere . . . . . . . . . . . . . . . . . . . . . 273 Eventi di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Eventi Click e DblClick. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Evento BeforeUpdate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Evento AfterUpdate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Eventi GotFocus e LostFocus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Caselle combinate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Sincronizzazione dei dati nei controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Casella combinata di tipo RowSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Colonne delle caselle combinate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 Modifica di Elenco valori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Modifica di Tabella/query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Caselle di riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Selezioni multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Selezioni multiple con due caselle di riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Utilizzo della casella di riepilogo come maschera secondaria . . . . . . . . . . . . . . . . . . . 292 Book 1.indb xiii 09/02/2012 11:26:25 xiv Sommario Controllo TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Aggiunta del controllo TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 Popolamento dell'albero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 Aggiunta di immagini. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 Espansione e compressione dei nodi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 Trascinamento della selezione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 Eliminazione di un nodo con la ricorsione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 Aggiunta di nodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Controllo Tab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 Aggiornamento tra schede e controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 Evento OnChange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Caricamento dinamico delle schede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 Capitolo 8: Creazione di eventi e report. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 Sequenze di eventi nei report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 Creazione di report drill-down ed evento Current . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 Creazione di una griglia di caselle con l'evento Print . . . . . . . . . . . . . . . . . . . . . . . . . . 327 Controllo del layout ed evento Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 Controllo del layout nei report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Creazione di report da una maschera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Riduzione dei join con caselle combinate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Programmazione di un raggruppamento di report . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Compressione di dati sugli indirizzi con ParamArray . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Controllo delle stampanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Parte 4: Programmazione avanzata con le classi VBA Capitolo 9: Aggiunta di funzionalità con le classi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Sviluppo del controllo dinamico Tab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 Creazione di un modulo di classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Proprietà Let e Get degli oggetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 Creazione di un oggetto con New e Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Insiemi di oggetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 Creazione di classi di insiemi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Utilizzo di classi con Tab dinamico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Semplificazione dell'applicazione con le classi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 Creazione di una gerarchia di classi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Creazione di una classe base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Classi derivate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 Capitolo 10: Utilizzo di classi ed eventi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 Elaborazione WithEvents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 Gestione di eventi delle maschere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 Gestione di eventi dei controlli. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 Elaborazione asincrona degli eventi e RaiseEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 Book 1.indb xiv 09/02/2012 11:26:25 Sommario xv Classi astratte e classi di implementazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 Classi astratte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 Classi di implementazione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Implementazione di una classe astratta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 Classi astratte ibride e classi non astratte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 Metodi Friend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 Capitolo 11: Utilizzo di classi e maschere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 pertura di più istanze di una maschera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Classi e associazione di maschere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 Associazione di una maschera a un oggetto Recordset DAO . . . . . . . . . . . . . . . . . . . 383 Associazione di una maschera a un oggetto Recordset ADO . . . . . . . . . . . . . . . . . . . 384 Controlli ActiveX ed eventi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 Aggiunta di un controllo Slider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 Controllo UpDown o Spin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 Parte 5: Dati esterni e integrazione con Office Capitolo 12: Collegamento di tabelle Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Collegamento Access-Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo del sistema di separazione database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestione tabelle collegate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ricollegamento automatico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a Excel e a file di testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a file di testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configurazione del database di esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creazione di un DSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connessione alle tabelle di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aggiornamento delle tabelle collegate di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . Connessione a una vista di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aggiornamento delle viste di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a SQL Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DSN di SQL Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a SQL Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a elenchi SharePoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ricollegamento degli elenchi di SharePoint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Collegamento a database Web di Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ricollegamento a un database Web di Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 397 398 398 406 406 407 407 407 410 416 417 418 419 420 420 424 426 428 430 432 435 Capitolo 13: Integrazione con Microsoft Office . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 Utilizzo di oggetti e modelli a oggetti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Confronto tra associazione anticipata e tardiva e confronto tra CreateObject e New . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Parola chiave GetObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 Apertura di file esistenti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 Book 1.indb xv 09/02/2012 11:26:25 xvi Sommario Connessione di Access a Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Generazione di documenti da un documento segnaposto. . . . . . . . . . . . . . . . . . . . . Apertura di un documento segnaposto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unione dei dati con i segnalibri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connessione di Access a Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Scrittura di dati in un foglio di calcolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lettura di dati da un foglio di calcolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creazione di report con Excel collegato ad Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo di MS Query e delle Origini dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connessione di Access a Outlook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrazione di informazioni da Outlook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creazione di oggetti in Outlook. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo di Outlook per scrivere in Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 444 446 447 450 451 458 459 468 470 472 475 477 479 Parte 6: SQL Server e SQL Azure Capitolo 14: Utilizzo di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 Introduzione a SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 Confronto tra programmi e servizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 Prestazioni client-server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 Versioni di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 SQL Express e prodotti SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 Percorsi dei file di database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 File di log e modelli di recupero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 Istanze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 Servizi di Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492 Database di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493 Tabelle di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494 Introduzione a SQL Server Management Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 Esecuzione dello script di database di esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 Creazione di un nuovo database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 Creazione di tabelle e relazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 Diagrammi database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 Tabelle, relazioni e file script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 Modifica della struttura di una tabella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 Utilizzo della proprietà Identity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Utilizzo delle viste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 Interfaccia grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 Viste e file script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 Query CROSSTAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 Utilizzo delle stored procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 Introduzione a T-SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 Definizione di variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 Utilizzo di CAST e CONVERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 Funzioni incorporate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 Variabili di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 Controllo del flusso di programma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Gestione degli errori. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 Book 1.indb xvi 09/02/2012 11:26:25 Sommario xvii Utilizzo dei trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo delle transazioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Livelli di isolamento transazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Transazioni nidificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funzioni definite dall’utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operazioni preliminari per la sicurezza di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configurazione della superficie di attacco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Autenticazione di SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Autenticazione di Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 530 533 533 534 536 536 538 541 542 Capitolo 15: Upsize di Access a SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Pianificazione dell'upsize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Tipi di dati testo e UNICODE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 Dati di tipo Data e ora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 Dati booleani . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 Numeri interi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Numeri reali, decimali e a virgola mobile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Collegamenti ipertestuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 IMAGE, VARBINARY(Max), e Oggetto OLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Dati Memo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Valuta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Allegati e dati a più valori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Campi richiesti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Cicli e percorsi a catena multipla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 Campi senza corrispondenza nella relazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 Database replicati e numerazione automatica casuale . . . . . . . . . . . . . . . . . . . . . . . . 551 Indice univoco e valori null da ignorare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 Timestamp e Rowversion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554 Schemi e sinonimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 Upsize guidato e SQL Server Migration Assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 Upsize guidato. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 Upsize per l'utilizzo di progetti ADP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 SSMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 Sviluppo con Access e SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 Costante dbSeeChanges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 Query pass-through . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 Stored procedure e tabelle temporanee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 Gestione di query complesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579 Prestazioni e piani di esecuzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 SQL Server Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 Capitolo 16: Utilizzo di SQL Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Introduzione a SQL Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creazione dei database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Impostazioni firewall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo di Management Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sviluppo tramite l'interfaccia browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Book 1.indb xvii 590 590 591 592 595 09/02/2012 11:26:25 xviii Sommario Migrazione dei database SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creazione di un set di tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trasferimento di dati tramite Importazione/Esportazione guidata SQL Server. . . . Backup e copia di un database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servizio di sincronizzazione dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data Sync Agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gruppi e account di sincronizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modifica dei dati e della struttura del database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Risoluzione dei conflitti nei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modifica della struttura delle tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pianificazione e gestione della sicurezza. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creazione di applicazioni multi-tentant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo di tabelle e viste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabelle e viste dell'applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestione della protezione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SQL Server Migration Assistant e accesso ad Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 597 599 603 604 605 609 611 612 613 614 616 617 619 622 623 627 Parte 7: Progettazione di applicazioni Capitolo 17: Creazione delle applicazioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 Sviluppo delle applicazioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spostamento nell'applicazione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Progettazione della barra multifunzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ambienti a 32 e a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo del Registro di sistema di Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizzo dell'API di Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Completamento di un'applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schermate iniziali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Indicatore di stato. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestione degli errori. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blocco di un'applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distribuzione delle applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Protezione del progetto con file ACCDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distribuzione di Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uno o più file dell'applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DSN e ricollegamento delle applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dipendenza dai riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aggiornamento delle applicazioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 632 639 650 651 651 653 653 654 654 654 655 655 655 655 656 656 656 657 Capitolo 18: Utilizzo di ADO e ADOX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659 ActiveX Data Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cursori. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operazioni asincrone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Maschere e Recordset ADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Book 1.indb xviii 660 661 662 662 09/02/2012 11:26:25 Sommario xix Lavorare con SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stringhe di connessione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connessione a SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oggetto comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stored procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multiple Active Result Sets e prestazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MARS e connessioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADOX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663 663 664 666 666 668 669 672 673 Indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 Autore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701 Book 1.indb xix 09/02/2012 11:26:25