Access
 sql >> Database >  >> RDS >> Access

Trasformazione della funzionalità della classe wrapper

Introduzione.

La scorsa settimana abbiamo creato una nuova classe Wrapper ClsTiles, utilizzando la classe ClsArea due volte nel nuovo modulo di classe, un'istanza per Floor valori di dimensione e la seconda istanza per Floor-Tile dimensione, per calcolare il numero di Tessere per la stanza.

Nel nuovo modulo Classe Wrapper, trasformeremo la Classe Volume (ClsVolume2) in Classe Sales (ClsSales). Con alcune modifiche estetiche, gli daremo un lifting totale nella Classe Wrapper, nascondendo la sua vera identità come Classe di calcolo del volume e la utilizzeremo per calcolare il prezzo di vendita dei prodotti con sconto.

Esatto, la nostra classe ClsVolume2 ha tutte le proprietà necessarie per inserire i valori dei dati di vendita richiesti come descrizione, quantità, prezzo unitario e percentuale di sconto, che andranno rispettivamente nelle proprietà della classe di volume strDesc, dblLength, dblWidth, dblHeight.

Non dobbiamo dimenticare che la classe ClsVolume2 è una Classe derivata , costruito utilizzando ClsArea come Classe Base.

Classe ClsVolume2 rivisitata.

Ma, prima, il codice VBA del modulo di classe ClsVolume2 (la classe base per il nostro nuovo modulo di classe ClsSales) è riprodotto di seguito come riferimento:

Option Compare Database
Option Explicit

Private p_Height As Double
Private p_Area As ClsArea

Public Property Get dblHeight() As Double
    dblHeight = p_Height
End Property

Public Property Let dblHeight(ByVal dblNewValue As Double)
    p_Height = dblNewValue
End Property

Public Function Volume() As Double
    Volume = CArea.dblLength * CArea.dblWidth * Me.dblHeight
End Function

Public Property Get CArea() As ClsArea
   Set CArea = p_Area
End Property

Public Property Set CArea(ByRef AreaValue As ClsArea)
  Set p_Area = AreaValue
End Property

Private Sub Class_Initialize()
Set p_Area = New ClsArea
End Sub

Private Sub Class_Terminate()
Set p_Area = Nothing
End Sub

L'unico problema che ci impedisce di utilizzare ClsVolume2 Class direttamente per le Vendite l'immissione di dati è che i nomi della procedura della proprietà dblLength, dblWidth, dblHeight non corrispondono ai valori delle proprietà di vendita Quantità, Prezzo Unitario, Percentuale di sconto. I tipi di dati numerici di ClsVolume2 Class sono tutti numeri a doppia precisione e sono adatti alla nostra Classe di vendita e possono essere utilizzati senza modificare il tipo di dati. Anche i nomi delle funzioni pubbliche Area() e Volume() non sono adatti, ma la loro formula di calcolo può essere utilizzata per i calcoli delle vendite senza modifiche.

a) Area =dblLength * dblWidth è adatto per TotalPrice =Quantità * UnitPrice

b) Volume =Area * dblHeight va bene per DiscountAmount =TotalPrice * DiscountPercentage

Qui, abbiamo due scelte per utilizzare la classe ClsVolume2 come classe ClsSales.

  1. Il modo più semplice è fare una copia della Classe ClsVolume2 e salvarla in una nuova classe Modulo con il nome ClsSales. Apportare le modifiche appropriate alla procedura della proprietà e ai nomi delle funzioni pubbliche adatte ai valori e ai calcoli delle vendite. Aggiungi più funzioni, se necessario, nel nuovo modulo di classe.
  2. Crea una classe wrapper utilizzando ClsVolume2 come classe base e crea procedure di proprietà adeguate e modifiche pubbliche ai nomi delle funzioni, mascherando le procedure delle proprietà e i nomi delle funzioni della classe base. Crea nuove funzioni nella classe Wrapper, se necessario.

La prima opzione è piuttosto semplice e facile da implementare. Ma selezioneremo la seconda opzione per imparare come indirizzare le proprietà della classe base nella nuova classe wrapper e come mascherare i suoi nomi di proprietà originali con quelli nuovi.

La classe ClsVolume2 trasformata.

  1. Apri il tuo database e visualizza la finestra di modifica VBA (Alt+F11).
  2. Seleziona il Modulo del corso da Inserisci Menu, per inserire un nuovo Modulo Classe.
  3. Modifica il valore della proprietà Name del modulo di classe da Class1 a ClsSales .
  4. Copia e incolla il seguente codice VBA nel modulo e salva il codice:
    Option Compare Database
    Option Explicit
    
    Private m_Sales As ClsVolume2
    
    Private Sub Class_Initialize()
        'instantiate the Base Class in Memory
        Set m_Sales = New ClsVolume2
    End Sub
    
    Private Sub Class_Terminate()
        'Clear the Base Class from Memory
        Set m_Sales = Nothing
    End Sub
    
    Public Property Get Description() As String
      Description = m_Sales.CArea.strDesc 'Get from Base Class
    End Property
    
    Public Property Let Description(ByVal strValue As String)
      m_Sales.CArea.strDesc = strValue ' Assign to Base Class
    End Property
    
    Public Property Get Quantity() As Double
    Quantity = m_Sales.CArea.dblLength
    End Property
    
    Public Property Let Quantity(ByVal dblValue As Double)
       If dblValue > 0 Then
         m_Sales.CArea.dblLength = dblValue ' Assign to clsArea, Base Class of ClsVolume2
       Else
         MsgBox "Quantity: " & dblValue & " Invalid.", vbExclamation, "ClsSales"
         Do While m_Sales.CArea.dblLength <= 0
              m_Sales.CArea.dblLength = InputBox("Quantity:, Valid Value >0")
         Loop
       End If
    End Property
    
    Public Property Get UnitPrice() As Double
       UnitPrice = m_Sales.CArea.dblWidth
    End Property
    
    Public Property Let UnitPrice(ByVal dblValue As Double)
       If dblValue > 0 Then
          m_Sales.CArea.dblWidth = dblValue ' Assign to clsArea, Base Class of ClsVolume2
       Else
         MsgBox "UnitPrice: " & dblValue & " Invalid.", vbExclamation, "ClsSales"
           Do While m_Sales.CArea.dblWidth <= 0
              m_Sales.CArea.dblWidth = InputBox("UnitPrice:, Valid Value >0")
           Loop
       End If
    End Property
    
    Public Property Get DiscountPercent() As Double
       DiscountPercent = m_Sales.dblHeight
    End Property
    
    Public Property Let DiscountPercent(ByVal dblValue As Double)
    ' Assign to Class .dblHeight of ClsVolume2
    Select Case dblValue
        Case Is <= 0
           MsgBox "Discount % -ve Value" & dblValue & " Invalid!", vbExclamation, "ClsSales"
           Do While m_Sales.dblHeight <= 0
              m_Sales.dblHeight = InputBox("Discount %, Valid Value >0")
           Loop
        Case Is >= 1
           m_Sales.dblHeight = dblValue / 100
        Case 0.01 To 0.75
           m_Sales.dblHeight = dblValue
    End Select
    End Property
    
    Public Function TotalPrice() As Double
    Dim Q As Double, U As Double
    Q = m_Sales.CArea.dblLength
    U = m_Sales.CArea.dblWidth
    If (Q * U) = 0 Then
       MsgBox "Quantity / UnitPrice Value(s) 0", vbExclamation, "ClsVolume"
    Else
       TotalPrice = m_Sales.CArea.Area 'Get from Base Class ClsArea
    End If
    End Function
    
    Public Function DiscountAmount() As Double
       DiscountAmount = TotalPrice * DiscountPercent
    End Function
    
    Public Function PriceAfterDiscount()
       PriceAfterDiscount = TotalPrice - DiscountAmount
    End Function
     

Cosa abbiamo fatto nella classe Wrapper? Creata un'istanza della classe ClsVolume2 e modificata i suoi nomi di proprietà, nomi di funzione e aggiunti controlli di convalida con messaggi di errore appropriati e impedito di cadere nel controllo di convalida della classe Base con messaggi di errore inappropriati, come 'Value in dblLength la proprietà non è valida' potrebbe apparire dalla classe di volume.

Controlla le righe che ho evidenziato nel codice sopra e spero che sarai in grado di capire come vengono assegnati/recuperati i valori delle proprietà alla/dalla Classe Base ClsVolume2.

Puoi passare prima attraverso il modulo di classe ClsArea e accanto al modulo di classe ClsVolume2, la classe derivata che utilizza la classe ClsArea come classe base. Dopo aver esaminato entrambi questi codici, puoi dare una seconda occhiata al codice in questa classe wrapper.

Programma di test per la classe ClsSales nel modulo standard.

Scriviamo un programma di test per provare la classe Wrapper.

  1. Copia e incolla il seguente codice VBA in un modulo standard.
    Public Sub SalesTest()
    Dim S As ClsSales
    
    Set S = New ClsSales
    
    S.Description = "Micro Drive"
    S.Quantity = 12
    S.UnitPrice = 25
    S.DiscountPercent = 0.07
    
    Debug.Print "Desccription", "Quantity", "UnitPrice", "Total Price", "Disc. Amt", "To Pay"
    With S
        Debug.Print .Description, .Quantity, .UnitPrice, .TotalPrice, .DiscountAmount, .PriceAfterDiscount
    End With
    End Sub

    Esegui il codice.

  2. Tieni aperta la finestra di debug (Ctrl+G).
  3. Fai clic da qualche parte nel mezzo del codice e premi F5 per eseguire il codice e per stampare l'output nella finestra di debug.
  4. Puoi testare ulteriormente il codice inserendo uno qualsiasi dei valori di input con un numero negativo ed eseguendo il codice per attivare il nuovo messaggio di errore. Disattiva qualsiasi riga di input, con un simbolo di commento ('), esegui il codice e guarda cosa succede.

Calcola il prezzo/sconto per una serie di prodotti.

Il codice di test seguente crea una matrice di tre prodotti e valori di vendita immettendoli direttamente dalla tastiera.

Copia e incolla il codice seguente in un modulo standard ed esegui per testare ulteriormente la classe Wrapper.

Public Sub SalesTest2()

Dim S() As ClsSales
Dim tmp As ClsSales
Dim j As Long

For j = 1 To 3
Set tmp = New ClsSales
   tmp.Description = InputBox(j & ") Description")
   tmp.Quantity = InputBox(j & ") Quantity")
   tmp.UnitPrice = InputBox(j & ") UnitPrice")
   tmp.DiscountPercent = InputBox(j & ") Discount Percentage")
 ReDim Preserve S(1 To j) As ClsSales
 Set S(j) = tmp
 Set tmp = Nothing
Next

'Output Section
Debug.Print "Desccription", "Quantity", "UnitPrice", "Total Price", "Disc. Amt", "To Pay"
For j = 1 To 3
   With S(j)
       Debug.Print .Description, .Quantity, .UnitPrice, .TotalPrice, .DiscountAmount, .PriceAfterDiscount
   End With
Next

For j = 1 To 3
  Set S(j) = Nothing
Next

End Sub

Dopo aver inserito correttamente i valori corretti nell'array, i nomi dei prodotti e i valori di vendita vengono stampati nella finestra di debug.

MODULI DI CLASSE.

  1. Modulo di classe MS-Access e VBA
  2. Matrici di oggetti di classe VBA MS-Access
  3. Classe base MS-Access e oggetti derivati
  4. Classe base VBA e oggetti derivati-2
  5. Classe base e varianti di oggetti derivati
  6. Recordset Ms-Access e modulo di classe
  7. Accedi al modulo di classe e alle classi wrapper
  8. Trasformazione della funzionalità della classe wrapper

OGGETTO DA RACCOLTA.

  1. Nozioni di base su Ms-Access e Collection Object
  2. Modulo di classe Ms-Access e oggetto Collection
  3. Record di tabella nell'oggetto e nella forma della raccolta

OGGETTO DIZIONARIO.

  1. Nozioni di base sugli oggetti del dizionario
  2. Nozioni di base sugli oggetti del dizionario-2
  3. Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
  4. Visualizza record dal dizionario al modulo
  5. Aggiungi oggetti classe come elementi del dizionario
  6. Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo