Questa volta cominciamo dalla fine. Diversamente da quanto visto nei precedenti articoli dedicati alla programmazione con Visual Basic 2005, vi proponiamo sin da subito la versione finale di una semplice applicazione per la gestione degli assegni emessi.
Ovviamente il progetto è ampiamente migliorabile: si tratta comunque di un buon esempio per capire alcuni meccanismi legati alla programmazione con Visual Basic 2005.
Anche questa volta, la base dati impiegata è realizzata in Microsoft Access. E’ comunque possibile giungere al medesimo risultato utilizzando altri DBMS, decisamente più performanti, come SQL Server 2005.
Come primo passo, prepariamo la base dati alla quale desideriamo collegarci dalla nostra applicazione Visual Basic 2005.
In questo caso, il database Access in formato .mdb è assai semplice. Lo schema relazionale è quello riportato in figura:
La tabella ove viene memorizzato l’archivio degli assegni emessi si chiama “Assegno”. A ciascun assegno è possibile associare una banca, un beneficiario ed una causale. L’idea è quella di fornire all’utente la possibilità di impostare degli archivi di causali, beneficiari e banche di riferimento utilizzabili poi in fase di registrazione di ciascun assegno emesso.
Dopo aver avviato un nuovo progetto Visual Basic 2005, similmente a quanto già visto nelle precedenti puntate, si provvederà ad aggiungere un’origine dati selezionando il database Access appena preparato.
Nella finestra Origini dati di Visual Basic 2005 si otterrà l’elenco delle quattro tabelle che compongono il database.
La nostra applicazione si compone di tre form:
– frmPrincipale
. La finestra principale che si presenterà ad ogni avvio dell’applicazione: da qui l’utente potrà aggiungere in archivio nuovi assegni, modificare quelli già presenti, cancellarli, associare banche, causali e beneficiari collegati.
– frmDatiCorrelati
. Qui l’utente potrà specificare tutti i dati relativi a banche, causali e beneficiari.
– frmInterrogazioni
. In questa finestra l’utente potrà ricercare tutti gli assegni emessi per uno specifico beneficiario.
Selezioniamo il form frmPrincipale
dalla finestra Esplora soluzioni di Visual Basic 2005 quindi facciamo doppio clic su di esso (oppure clicchiamo sul pulsante Visualizza finestra di progettazione).
Portiamoci nella finestra Origini dati, agiamo sul menù a tendina proposto in corrispondenza della tabella “Assegno” ed assicuriamoci che sia selezionata la voce Datagridview. Trasciniamo quindi la tabella “Assegno” sul form frmPrincipale
.
Facendo clic sulla freccia posizionata sul Datagridview in alto a destra quindi selezionando la voce Modifica colonne, si accederà alle varie opzioni che consentono di intervenire sul layout della griglia. Come già illustrato nelle precedenti puntate, utilizziamo i pulsanti freccia per impostare l’ordine con cui debbono compare le varie colonne ed i campi Width
, Visible
e ReadOnly
per indicare, per ogni singola colonna, la sua dimensione in pixel, se questa debba essere visualizzata o meno, se debba avere l’attributo di sola lettura.
Nelle colonne Beneficiario, Causale e Banca, vengono mostrati gli ID – letti dal database Access – facenti riferimento alle rispettive tabelle correlate. Ma come è possibile visualizzare il nome del beneficiario, quello dell’istituto di credito e la causale in forma descrittiva al posto del semplice ID?
E’ sufficiente, per le colonne Beneficiario, Causale e Banca selezionare l’opzione DataGridViewComboBoxColumn in corrispondenza della voce ColumnType (sezione Progettazione).
In questo modo, dalla sezione Dati, si potrà creare una sorta di associazione uno-a-uno tra l’ID ed il corrispondente valore nelle tabelle Beneficiario, Banca e Causale del database Access.
L’utente, agendo sul “combo box”, potrà selezionare, di volta in volta, il beneficiario, la banca e la causale d’interesse.
In particolare, ValueMember consente di specificare il campo da cui ottenere i valori che corrispondono a ciascun elemento che andrà a comporre il menù a tendina (“combo box”) mentre, viceversa, DisplayMember permette di selezionare il campo dal quale verrà prelevato il valore da mostrare all’utente.
Per quanto riguarda il codice dell’applicazione, si noterà come Visual Basic 2005 abbia provveduto ad aggiungere – nell’evento Load
del form quanto segue:
Private Sub frmPrincipale_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: questa riga di codice carica i dati nella tabella 'AssegniDataSet.Bancà. È possibile spostarla o rimuoverla se necessario.
Me.BancaTableAdapter.Fill(Me.AssegniDataSet.Banca)
'TODO: questa riga di codice carica i dati nella tabella 'AssegniDataSet.Causalè. È possibile spostarla o rimuoverla se necessario.
Me.CausaleTableAdapter.Fill(Me.AssegniDataSet.Causale)
'TODO: questa riga di codice carica i dati nella tabella 'AssegniDataSet.Beneficiariò. È possibile spostarla o rimuoverla se necessario.
Me.BeneficiarioTableAdapter.Fill(Me.AssegniDataSet.Beneficiario)
'TODO: questa riga di codice carica i dati nella tabella 'AssegniDataSet.Assegnò. È possibile spostarla o rimuoverla se necessario.
Me.AssegnoTableAdapter.Fill(Me.AssegniDataSet.Assegno)
End Sub
Questa parte del codice non necessita di modifiche e consente il caricamento dal database dei dati memorizzati nelle varie tabelle.
All’interno dell’evento inseriamo invece la riga di codice che segue:
Private Sub frmPrincipale_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
AssegnoBindingNavigatorSaveItem_Click(sender, e)
End Sub
Ogni volta che la nostra applicazione sarà chiusa, le modifiche effettuate verranno così salvate nel database.
Aggiungiamo ora un nuovo form, utilizzando le modalità già ampiamente illustrate in precedenza, e denominiamolo frmDatiCorrelati
. Qui l’utente potrà allestire e modificare in qualsiasi momento gli archivi personali relativi a beneficiari, causali ed istituti di credito. Gli elementi inseriti nel database attraverso questo form, potranno poi essere utilizzato nella finestra principale, per l’inserimento in archivio di un nuovo assegno. Ricorriamo ad un controllo TabControl (sezione “Contenitori” della Casella degli strumenti di Visual Basic 2005) per separare i tre elenchi (“Elenco beneficiari”, “Elenco causali”, “Banche”). Per aggiungere una nuova scheda, è sufficiente cliccare con il tasto destro del mouse sul controllo appena inserito nel form e cliccare sulla voce Aggiungi scheda. La proprietà Text
di ogni singola scheda consente, ovviamente, di modificarne l’etichetta visualizzata.
Al solito, trasciniamo – dalla finestra Origini dati di Visual Basic, la tabella “Beneficiario” sul form frmDatiCorrelati, nella scheda “Elenco beneficiari”.
Ripetiamo l’operazione, dopo aver selezionato le schede “Elenco causali” e “Banche” del TabControl, per le tabelle “Causale” e “Banca”. Dal menù a tendina che compare cliccando sulle varie tabelle elencate nella finestra Origini dati, assicuriamoci sempre che sia selezionata la voce Datagridview.
Provvediamo, quindi, a modificare il “look” delle tre tabelle appena inserite cliccando con il tasto destro del mouse su ciascuna di esse e facendo riferimento alla voce Proprietà. Ricordiamo che selezionando la colonna più a destra, quindi scegliendo l’opzione Fill in corrispondenza della voce AutoSizeMode, è possibile fare in modo che la larghezza della stessa sia adattata a quella del DataGridView.
Nelle tre schede del TabControl inseriamo due pulsanti, subito sotto ciascun DataGridView. Il primo permetterà l’aggiunta di un nuovo record, il secondo la cancellazione.
Il codice da utilizzare per il pulsante di aggiunta, nel caso della scheda relativi ai beneficiari, è Me.BeneficiarioBindingSource.AddNew()
, per l’eliminazione Me.BeneficiarioBindingSource.RemoveCurrent()
.
Una subroutine che chiameremo salva()
, ogniqualvolta invocata, provvederà invece a salvare su database tutte le modifiche apportate alle tre tabelle.
Tale subroutine dovrà essere richiamata non appena si passa da una scheda ad un’altra (“Elenco beneficiari”, “Elenco causali”, “Banche”) ed all’atto della chiusura del form:
Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
salva()
End Sub
Interrogazione del database con ADO.NET
Provvediamo adesso ad aggiungere un terzo form (frmInterrogazioni
) per consentire all’utente di ottenere l’elenco degli assegni emessi nei confronti di un medesimo beneficiario.
Qui aggiungiamo una DataGridView trascinando sul form la tabella Assegno a partire dalla finestra Origini dati. Selezioniamo, quindi, la tabella Beneficiario e selezioniamo, dal relativo menù a tendina, la voce Label per i campi Ragione_sociale, Cognome, Nome ed Indirizzo.
Trascinando i quattro campi sul form (è consigliabile raggrupparli assieme in un controllo Panel), questi verranno collegati automaticamente con i corrispodenti del database Access ma risulteranno non modificabili da parte dell’utente trattandosi di semplici etichette (“Label”). Il form frmInterrogazioni
, sul quale stiamo lavorando, non deve poter consentire modifiche dai dati da parte dell’utente ma soltanto permettere l’effettuazioni di interrogazioni sulla base dati.
Inseriamo poi nel form i seguenti oggetti: un combo box, un pulsante “Cerca”, una label.
Attraverso il combo box l’utente avrà la possibilità di scegliere un beneficiario tra quelli presenti in archivio. Clicchiamo sulla freccia che compare selezionando il menù a tendina ed impostiamo le varie voci così come in figura:
Per impedire modifiche al contenuto del combo box, è sufficiente selezionare la voce DropDownList in corrispondenza della proprietà DropDownStyle.
Per quanto riguarda il DataGridView, si disabilitino le caselle Attiva aggiunta/modifica/eliminazione:
All’interno dell’evento Load
del form, inseriamo quindi il codice seguente:
Me.BeneficiarioTableAdapter.Fill(Me.AssegniDataSet.Beneficiario)
Me.AssegnoDataGridView.Enabled = False
Me.AssegnoDataGridView.Visible = False
Me.pnl_DatiBeneficiario.Visible = False
Me.lbl_SommaImporti.Visible = False
Come si vede, fintanto che l’utente non sceglierà un beneficiario dal menù a tendina (“combo box”), i vari controlli per la visualizzazione dei dati saranno nascosti (la proprietà Visible
viene impostata a False
).
E’ bene fare in modo che i vari controlli siano nascosti anche quando l’utente sceglie un beneficiario differente mediante il combo box:
Private Sub cmb_Beneficiario_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_Beneficiario.SelectedIndexChanged
Me.AssegnoDataGridView.Enabled = False
Me.AssegnoDataGridView.Visible = False
Me.pnl_DatiBeneficiario.Visible = False
Me.lbl_SommaImporti.Visible = False
End Sub
Facciamo doppio clic su assegniDataSet.xsd
da Esplora soluzioni: la finestra che compare a video riassume graficamente la struttura del database e restituisce tutte le informazioni sulle relazioni tra le varie tabelle, sugli indici, sui valori predefiniti per i vari campi e così via. Clicchiamo con il tasto destro del mouse su AssegnoTableAdapter quindi sulla voce Aggiungi query. Dalle finestre seguenti optiamo, in sequenza, per Usa istruzioni SQL, SELECT che restituisce righe quindi introduciamo la query SQL che ci servirà successivamente per inserire, nel DataGridView, aggiunto al form frmInterrogazioni
, solo l’elenco degli assegni emessi nei confronti del beneficiario selezionato. La query da digitare è la seguente:
Il simbolo ? (punto interrogativo) funge da “segnaposto” per il valore del parametro. La query che abbiamo introdotto, in sostanza, consente di selezionare solo i record della tabella “Assegno” del database che nel campo IDBeneficiario abbiano l’identificativo dello specifico beneficiario al momento selezionato da parte dell’utente.
La sintassi per l’impostazione del parametro può variare a seconda del DBMS utilizzato. Nel caso di Access, ad esempio, si utilizza il punto interrogativo (?) ma nel caso di SQL Server bisogna utilizzare il simbolo @.
Come nomi dei metodi (Riempi database e Restituisci un DataTable) scriviamo, rispettivamente, FillByBeneficiario
e GetDataByBeneficiario
. Clicchiamo ancora su Avanti quindi sul pulsante Fine.
Inseriamo prima di qualunque dichiarazioni quanto segue:
Imports System.Data
Imports System.Data.OleDb
Si tratta di due riferimenti allo spazio dei nomi System.Data
che consentono l’accesso al database. In particolare, System.Data
contiene gli oggetti di base utilizzati per accedere e memorizzare i dati mentre System.Data.OleDb
contiene le classi pubbliche utilizzate per connettersi e manipolare dati attraverso un provider OLEDB (quindi Microsoft Access). Esistono molti altri spazi dei nomi (“namespace”) per l’accesso ad altrettante sorgenti di dati (i.e. System.Data.Odbc, System.Data.OracleClient, System.Data.SqlClient,...
).
All’interno dell’evento Click
del pulsante “Cerca” inseriamo il codice seguente:
Dim IDBeneficiario As Long
IDBeneficiario = Me.cmb_Beneficiario.SelectedValue
Me.AssegnoDataGridView.Enabled = True
Me.AssegnoDataGridView.Visible = True
Me.pnl_DatiBeneficiario.Visible = True
Me.AssegnoTableAdapter.FillByBeneficiario(Me.AssegniDataSet.Assegno, IDBeneficiario)
Dim objConnection As OleDbConnection
objConnection = New OleDbConnection(My.Settings.dbConnectionString)
Try
objConnection.Open()
Catch OleDbExceptionErr As OleDbException
MessageBox.Show(OleDbExceptionErr.Message, "Errore database")
Catch InvalidOperationExceptionErr As InvalidOperationException
MessageBox.Show(InvalidOperationExceptionErr.Message, "Errore database")
End Try
If objConnection.State ConnectionState.Open Then
MessageBox.Show("L'aggiornamento del database non sarà effettuato", "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Exit Sub
End If
Dim strSQL As String = "SELECT SUM(Importo_Assegno) AS SommaImporti FROM Assegno WHERE IDBeneficiario=" & IDBeneficiario
Dim objCommand As New OleDbCommand(strSQL, objConnection)
Dim objDataReader As OleDbDataReader
objCommand.Connection = objConnection
objCommand.CommandText = strSQL
objDataReader = objCommand.ExecuteReader()
If objDataReader.HasRows Then
objDataReader.Read()
If objDataReader("SommaImporti") Is DBNull.Value Then
Me.lbl_SommaImporti.Text = "€ 0"
Else
Me.lbl_SommaImporti.Text = "€ " & objDataReader("SommaImporti")
End If
End If
objCommand.Dispose()
objDataReader.Close()
objDataReader = Nothing
objConnection.Close()
objConnection.Dispose()
objConnection = Nothing
Me.lbl_SommaImporti.Visible = True
Il codice popola dapprima il DataGridView con i dati corrispondenti all’ID del beneficiario scelto dall’utente mediante il combo box (Me.AssegnoTableAdapter.FillByBeneficiario(Me.AssegniDataSet.Assegno, IDBeneficiario)
) quindi effettua una query sul database Access per ottenere l’importo complessivo di tutti gli assegni emessi nei confronti del beneficiario specificato ("SELECT SUM(Importo_Assegno) AS SommaImporti FROM Assegno WHERE IDBeneficiario=" & IDBeneficiario
).
Se la query dà un risultato valido ovvero esiste almeno un assegno emesso nei confronti del beneficiario selezionato (If objDataReader.HasRows Then
), viene letto il valore del campo somma restituito dall’interrogazione SQL e, a meno che non sia nullo, viene visualizzato nella proprietà Text
della Label inserita precedentemente nel form (Me.lbl_SommaImporti.Text = "€ " & objDataReader("SommaImporti")
).
Per concludere, sottolineiamo un aspetto importante. Con un semplice espediente possiamo fare in modo che la nostra applicazione, qualunque sia la cartella ove è stata installata, utilizzi sempre il file assegni.mdb memorizzato nella stessa directory come sorgente dati. Per far ciò, basta selezionare dal menù Progetto di Visual Basic 2005, la voce Proprietà di GestioneAssegni…, scegliere la scheda Impostazioni quindi cliccare su Visualizza codice in alto. Si digiti, quindi, quanto segue:
Partial Friend NotInheritable Class MySettings
Private Sub MySettings_SettingsLoaded(ByVal sender As Object, ByVal e As System.Configuration.SettingsLoadedEventArgs) Handles Me.SettingsLoaded
Me.Item("dbConnectionString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.Info.DirectoryPath + "\assegni.mdb"
End Sub
End Class
).
– I precedenti articoli dedicati alla programmazione con Visual Basic 2005:
Visual Basic 2005 passo-passo: Accesso ai dati – prima puntata
Visual Basic 2005 passo-passo: Accesso ai dati – seconda puntata