logo MC2 E-Learning S.a r.l.
Logo Einstein grigio sfumato
e = m x c al quadrato





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:


Google