Vediamo come implementare la scheda delle anagrafiche di clienti e fornitori nel programma per magazzino in Access che stiamo creando. In questa lezione vedremo come visualizzare i dati dei clienti e fornitori all’interno di una form o maschera o finestra. Le form in Access sono delle finestre che è possibile ottimizzare per la visualizzazione dei dati all’utilizzatore del programma. Vediamo in visualizzazione struttura come devono essere organizzati i controlli all’interno delle nostre finestre. La predisposizione dei controlli all’interno della finestra ( layout ) è personalizzabile ed ognuno può distribuirli come vuole.
Anche la formattazione, colore e carattere del testo all’interno dei controlli, è personalizzabile, in Access basta utilizzare il menu “Formato“.
Per effettuare delle azioni al caricamento della finestra o soltanto per rispondere ad azioni dell’utente, dobbiamo lavorare a livello di codice VBA ( Visual Basic for Application ). In visualizzazione struttura maschera premiamo sul pulsante della barra degli strumenti “Codice” e verremo proiettati in un editor di testo, nel quale possiamo creare delle routine con un vero e proprio linguaggio di programmazione. In questo corso vedremo come creare un’applicazione per magazzino e non ci soffermeremo sui dettagli del linguaggio, nozioni che devono già essere conosciute.
Il codice necessario al funzionamento delle maschere dei clienti e dei fornitori è uguale per entrambe le maschere, avendo gli stessi controlli e stessi dati.
Option Compare Database Option Explicit Private Sub Abi_DblClick(Cancel As Integer) Banca_DblClick (Cancel) End Sub Private Sub Abi_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire una nuova banca!" Response = acDataErrContinue End Sub Private Sub Agenzia_DblClick(Cancel As Integer) Banca_DblClick (Cancel) End Sub Private Sub Agenzia_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire una nuova banca!" Response = acDataErrContinue End Sub Private Sub Banca_DblClick(Cancel As Integer) On Error GoTo Err_Banca_DblClick If Not IsNull(Me.OpenArgs) Then Exit Sub Dim lBan As Long lBan = 0 If Not IsNull(Me!IDBanca) Then lBan = Me!IDBanca If lBan = 0 Then DoCmd.OpenForm "Banche", , , , , acDialog, "GotoNew" Else DoCmd.OpenForm "Banche", , , , , acDialog, lBan End If lBan = GetSetting("Calus", "RetVal", "Last", 0) If lBan <> 0 Then Me!IDBanca = lBan Me.Banca.Requery Me.ABI.Requery Me.CAB.Requery Me.Agenzia.Requery Me.Indirizzo_Banca.Requery Me.Comune_Banca.Requery Exit_Banca_DblClick: Exit Sub Err_Banca_DblClick: MsgBox Err.Description Resume Exit_Banca_DblClick End Sub Private Sub Banca_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire una nuova banca!" Response = acDataErrContinue End Sub Private Sub Cab_DblClick(Cancel As Integer) Banca_DblClick (Cancel) End Sub Private Sub Cab_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire una nuova banca!" Response = acDataErrContinue End Sub Private Sub Cap_AfterUpdate() Dim myData As dao.Database, myRec As dao.Recordset Set myData = CurrentDb Set myRec = myData.OpenRecordset("Comuni", dbOpenDynaset) Dim strSQL As String If Not IsNull(CAP.Value) Then strSQL = "CAP = '" & CAP.Value & "'" myRec.FindFirst strSQL If Not myRec.NoMatch Then Comune.Value = myRec!Comune.Value Provincia.Value = myRec!Provincia.Value End If End If myRec.Close Set myData = Nothing End Sub Private Sub Comune_AfterUpdate() Dim myData As dao.Database, myRec As dao.Recordset Set myData = CurrentDb Set myRec = myData.OpenRecordset("Comuni", dbOpenDynaset) Dim strSQL As String If Not IsNull(Comune.Value) Then strSQL = "Comune = '" & Comune.Value & "'" myRec.FindFirst strSQL If Not myRec.NoMatch Then CAP.Value = myRec!CAP.Value Provincia.Value = myRec!Provincia.Value End If End If myRec.Close Set myData = Nothing End Sub Private Sub Comune_Banca_DblClick(Cancel As Integer) Banca_DblClick (Cancel) End Sub Private Sub Comune_Banca_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire una nuova banca!" Response = acDataErrContinue End Sub Private Sub Form_Load() If Not IsNull(Me!IDCliente) And Not IsNull(Me.OpenArgs) Then If Me.OpenArgs = "GotoNew" Then DoCmd.DoMenuItem acFormBar, 3, 0, , acMenuVer70 DoCmd.GoToRecord , , acNewRec Else Dim myRec As dao.Recordset Set myRec = Me.RecordsetClone myRec.FindFirst "IDCliente = " & Me.OpenArgs If Not myRec.NoMatch Then Me.Bookmark = myRec.Bookmark myRec.Close End If Else DoCmd.GoToRecord , , acLast End If End Sub Private Sub Form_Unload(Cancel As Integer) If Not IsNull(Me!IDCliente) Then SaveSetting "Calus", "RetVal", "Last", Me!IDCliente Else SaveSetting "Calus", "RetVal", "Last", 0 End If Forms![Pannello comandi].Visible = True End Sub Private Sub Indirizzo_Banca_DblClick(Cancel As Integer) Banca_DblClick (Cancel) End Sub Private Sub Indirizzo_Banca_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire una nuova banca!" Response = acDataErrContinue End Sub Private Sub Tipo_Indirizzo_DblClick(Cancel As Integer) On Error GoTo Err_Tipo_Indirizzo_DblClick If Not IsNull(Me.OpenArgs) Then Exit Sub Dim strTipo As String strTipo = "" If Not IsNull(Me![Tipo Indirizzo]) Then strTipo = Me![Tipo Indirizzo] End If If strTipo = "" Then DoCmd.OpenForm "Tipi di Indirizzo", , , , , acDialog, "GotoNew" Else DoCmd.OpenForm "Tipi di Indirizzo", , , , , acDialog, DLookup("ID", "Tipo Indirizzo", "[Nome Tipo indirizzo] = '" & strTipo & "'") End If If GetSetting("Calus", "RetVal", "Last", 0) > 0 Then strTipo = DLookup("[Nome Tipo indirizzo]", "Tipo indirizzo", "ID = " & GetSetting("Calus", "RetVal", "Last", 0)) Else strTipo = "" End If If strTipo <> "" Then Me![Tipo Indirizzo] = strTipo Me.Tipo_Indirizzo.Requery Exit_Tipo_Indirizzo_DblClick: Exit Sub Err_Tipo_Indirizzo_DblClick: MsgBox Err.Description Resume Exit_Tipo_Indirizzo_DblClick End Sub Private Sub Tipo_Indirizzo_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire un nuovo tipo di Indirizzo!" Response = acDataErrContinue End Sub Private Sub Titolo_DblClick(Cancel As Integer) On Error GoTo Err_Titolo_DblClick If Not IsNull(Me.OpenArgs) Then Exit Sub Dim strTit As String strTit = "" If Not IsNull(Me!Titolo) Then strTit = Me!Titolo If strTit = "" Then DoCmd.OpenForm "Titoli", , , , , acDialog, "GotoNew" Else DoCmd.OpenForm "Titoli", , , , , acDialog, DLookup("ID", "Titoli", "[Nome Titolo] = '" & strTit & "'") End If If GetSetting("Calus", "RetVal", "Last", 0) > 0 Then strTit = DLookup("[Nome Titolo]", "Titoli", "ID = " & GetSetting("Calus", "RetVal", "Last", 0)) Else strTit = "" End If If strTit <> "" Then Me!Titolo = strTit Me.Titolo.Requery Exit_Titolo_DblClick: Exit Sub Err_Titolo_DblClick: MsgBox Err.Description Resume Exit_Titolo_DblClick End Sub Private Sub Titolo_NotInList(NewData As String, Response As Integer) MsgBox "Fare doppio clic sul campo per inserire un nuovo titolo!" Response = acDataErrContinue End Sub
Il codice è molto semplice da comprendere, in pratica abbiamo soltanto la necessità di mostrare una lista di banche, titoli e tipi di indirizzo che facendo doppio clic sul controllo, deve aprire una finestra modale per fare le modifiche, gli inserimenti e le eliminazioni dei valori dell’elenco; tutte nozioni che ho già spiegato in un articolo di qualche tempo fa sulla creazione delle finestre popup in Access.