Attivare una azione sui dati da una maschera correlata con il VBA
Impariamo come attivare una azione sui dati da una maschera correlata con il VBA Visual Basic for Application
Un blocco di codice fra i più complessi che si trovano nel database Libri può essere attivato o dalla maschera frmBooks o da frmAuthorBooks che è parte della maschera frmAuthors.
Dopo essersi registrati correttamente nell’applicazione, si può fare clic sui pulsante Ordina questo mentre si sta esaminando qualunque libro, per aggiungere quel libro al proprio ordine “aperto” corrente.
Nella figura qui sotto il puntatore del mouse è appoggiato su questo pulsante. Viene definito ordine “aperto” l’ordine più recente che non è stato ancora stampato.
Se non esiste un ordine “aperto”, il codice chiamato da questo pulsante crea un ordine nuovo di zecca e aggiunge il libro a quell’ordine (figura 1).
Public Function OrderThis(strISBN As String) As Integer
Dim db As Database, rstC As Recordset, rstO As Recordset, rstOD As Recordset
Dim strSQL As String, intTrans As Integer, lngOrderID As Long
On Error GoTo OrderThis_Err
' Verifica che l’utente sia registrato
If glngCurrentCustID = 0 Then
If vbYes = MsgBox("You must be signed on to order a book." & _
" Would you like to sign on now?", vbQuestion + vbYesNo, "Microsoft Press") Then
' Cerca di registrare l’utente e avverte la maschera frmSignOn di non andare a frmMain
DoCmd.OpenForm FormName:="frmSignon", WindowMode:=acDialog, OpenArgs:="NotMain"
' Se l’utente non vuole registrarsi esce
If glngCurrentCustID = 0 Then Exit Function
Else
Exit Function
End If
End If
Set db = CurrentDb
BeginTrans
intTrans = True
' Predispone per trovare l’ultimo ordine aperto di questo cliente
strSQL = "SELECT * FROM tblOrders" & _
" WHERE [CustomerID] = " & glngCurrentCustID & _
" AND [Printed] = False" & _
" AND [OrderDate] = " & _
"(Select Max([OrderDate]) From tblOrders As tblO2" & _
" WHERE tblO2.[CustomerID] = " & glngCurrentCustID & _
" AND tblO2.[Printed] = False);"
Set rstO = db.OpenRecordset(strSQL, dbOpenDynaset)
' Se non trova un ordine aperto, allora...
If rstO.RecordCount = 0 Then
' Va a cercare il record del cliente e aggiunge un nuovo ordine
strSQL = "SELECT * FROM tblCustomers WHERE [CustomerID] = " & glngCurrentCustID
Set rstC = db.OpenRecordset(strSQL, dbOpenDynaset)
If rstC.RecordCount = 0 Then
Err.Raise 9001, , "Unexpected error. Customer record for customer number " & glngCurrentCustID & " not found."
End If
rstO.AddNew
rstO!CustomerID = glngCurrentCustID
rstO!OrderDate = Date
rstO!ShipName = rstC!FirstName & IIf(IsNull(rstC![MiddleInit]), "", " " & rstC![MiddleInit] & ".") & " " & rstC!LastName
rstO!ShipAddress = rstC!Address
rstO!ShipCity = rstC!City
rstO!ShipStateOrProvince = rstC!StateOrProvince
rstO!ShipPostalCode = rstC!PostalCode
rstO!ShipCountry = rstC!Country
rstO!ShipPhoneNumber = rstC!PhoneNumber
rstO!PayBy = rstC!PayBy
rstO!CCNumber = rstC!CCNumber
rstO!Printed = False
' Salva il numero dellordine generato per le righe di dettaglio
lngOrderID = rstO!OrderID
' Aggiunge la riga master dell'Ordine
rstO.Update
rstC.Close
Else
lngOrderID = rstO!OrderID
End If
rstO.Close
' Controlla se il libro è già in questo ordine
strSQL = "SELECT * FROM tblOrderDetails" & _
" WHERE [OrderID] = " & lngOrderID & _
" AND [ISBNNumber] = """ & strISBN & """;"
Set rstOD = db.OpenRecordset(strSQL, dbOpenDynaset)
If rstOD.RecordCount = 0 Then
' Non c’è, aggiunge una nuova riga
rstOD.AddNew
rstOD![OrderID] = lngOrderID
rstOD![ISBNNumber] = strISBN
' Sì, modificalo!
Else
rstOD.Edit
End If
rstOD![Quantity] = rstOD![Quantity] + 1
rstOD.Update
rstOD.Close
CommitTrans
intTrans = False
OrderThis = True
Exit Function
OrderThis_Err:
MsgBox "Unexpected error: " & Err & ", " & Error
If intTrans Then Rollback
Exit Function
End Function
La prima parte di questa funzione controlla l’esistenza di un cliente correttamente registrato.
Se non l’utente non è registrato, la funzione gli dà la possibilità di farlo chiamando la maschera frmSignOn con un parametro speciale per far sapere a questa maschera che non deve aprire la maschera del pannello comandi principale (frmMain) se la registrazione è andata a buon fine.
Se si è registrati correttamente, il codice costruisce una query per trovare l’ordine più recente che non è stato ancora stampato per quell’ID cliente.
Se non trova alcun ordine “aperto”, crea un nuovo record in tblOrders e salva il nuovo OrderlD.
Successivamente la funzione cerca una riga di dettaglio ordine per il numero ISBN del libro passatole dalla routine chiamante.
Se ne trova una, modifica la riga e somma semplicemente uno alla quantità ordinata.
Se nell’ordine non esiste alcuna riga per questo libro, la funzione aggiunge una nuova riga con una quantità 1.
Si osservi che la funzione non ricalcola alcuno sconto potenziale se la quantità totale ordinata supera qualche soglia di sconto.
La funzione avvia anche una transazione prima di cominciare eventuali aggiornamenti, in modo tale che o tutte le righe (sia in tblOrders sia in tblOrderDetails) vengono aggiunte o nessuna, se si verifica un errore.
Esempi di accesso ai dati con VBA Microsoft Access
Tutorials su Microsoft Access
Dr.Maurizio Cucchiara
autore del corso:
"Corso Base di Microsoft Access"
disponibile on line su questo sito
MC2 E-Learning S.a r.l.
Formazione per il Web
http://www.mc2.it/html/access.html
Cerca sul web con Google:
