Access
 sql >> Datenbank >  >> RDS >> Access

Transformation der Wrapper-Klassenfunktionalität

Einführung.

Letzte Woche haben wir eine neue Wrapper-Klasse ClsTiles erstellt, die die ClsArea-Klasse zweimal im neuen Klassenmodul verwendet, eine Instanz für Floor Dimensionswerte und die zweite Instanz für Floor-Tile Dimension, um die Anzahl der Kacheln für den Raum zu berechnen.

Im neuen Wrapper-Klassenmodul werden wir die Volume-Klasse (ClsVolume2) in die Sales-Klasse (ClsSales) umwandeln. Mit einigen kosmetischen Änderungen werden wir ihr in der Wrapper-Klasse ein komplettes Facelift geben, ihre wahre Identität als Volumenberechnungsklasse verbergen und sie zur Berechnung des Verkaufspreises von Produkten mit Rabatt verwenden.

Richtig, unsere ClsVolume2-Klasse verfügt über alle erforderlichen Eigenschaften, um die erforderlichen Verkaufsdatenwerte wie Beschreibung, Menge, Stückpreis und Rabattprozentsatz einzugeben, die in die Volume-Klasseneigenschaften strDesc, dblLength, dblWidth bzw. dblHeight eingehen.

Wir sollten nicht vergessen, dass die Klasse ClsVolume2 eine abgeleitete Klasse ist , erstellt mit ClsArea als Basisklasse.

ClsVolume2-Klasse erneut besucht.

Aber zuerst wird der VBA-Code des ClsVolume2-Klassenmoduls (die Basisklasse für unser neues ClsSales-Klassenmodul) unten als Referenz wiedergegeben:

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

Das einzige Problem, das uns daran hindert, die ClsVolume2-Klasse direkt für den Verkauf zu verwenden Dateneingabe ist, dass die Property-Prozedurnamen dblLength, dblWidth, dblHeight nicht mit den Sales-Property-Werten Quantity, UnitPrice, Discount Percentage übereinstimmen. Die numerischen Datentypen der Klasse ClsVolume2 sind alle Zahlen mit doppelter Genauigkeit und sie sind für unsere Verkaufsklasse geeignet und können ohne Datentypänderung verwendet werden. Die Namen der öffentlichen Funktionen Area() und Volume() sind ebenfalls nicht geeignet, aber ihre Berechnungsformel kann ohne Änderung für Umsatzberechnungen verwendet werden.

a) Area =dblLength * dblWidth ist geeignet für TotalPrice =Quantity * UnitPrice

b) Volume =Area * dblHeight ist gut für DiscountAmount =TotalPrice * DiscountPercentage

Hier haben wir zwei Möglichkeiten, die ClsVolume2-Klasse als ClsSales-Klasse zu verwenden.

  1. Der einfachste Weg ist, eine Kopie der Klasse ClsVolume2 zu erstellen und sie in einem neuen Klassenmodul mit dem Namen ClsSales zu speichern. Nehmen Sie geeignete Änderungen an der Eigenschaftsprozedur und den öffentlichen Funktionsnamen vor, die für Verkaufswerte und Berechnungen geeignet sind. Fügen Sie im neuen Klassenmodul bei Bedarf weitere Funktionen hinzu.
  2. Erstellen Sie eine Wrapper-Klasse mit ClsVolume2 als Basisklasse und erstellen Sie geeignete Eigenschaftsprozeduren und öffentliche Funktionsnamensänderungen, wobei Sie die Eigenschaftsprozeduren und Funktionsnamen der Basisklasse maskieren. Erstellen Sie bei Bedarf neue Funktionen in der Wrapper-Klasse.

Die erste Option ist etwas geradlinig und einfach zu implementieren. Wir werden jedoch die zweite Option auswählen, um zu erfahren, wie die Eigenschaften der Basisklasse in der neuen Wrapper-Klasse adressiert werden und wie ihre ursprünglichen Eigenschaftsnamen mit neuen maskiert werden.

Die transformierte ClsVolume2-Klasse.

  1. Öffnen Sie Ihre Datenbank und zeigen Sie das VBA-Bearbeitungsfenster an (Alt+F11).
  2. Wählen Sie das Klassenmodul aus von Einfügen Menü, um ein neues Klassenmodul einzufügen.
  3. Ändern Sie den Namenseigenschaftswert des Klassenmoduls von Class1 in ClsSales .
  4. Kopieren Sie den folgenden VBA-Code, fügen Sie ihn in das Modul ein und speichern Sie den Code:
    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
     

Was haben wir in der Wrapper-Klasse gemacht? Erstellt eine Instanz der ClsVolume2-Klasse und ändert ihre Eigenschaftsnamen, Funktionsnamen und fügt Validierungsprüfungen mit entsprechenden Fehlermeldungen hinzu und verhindert, dass sie mit unangemessenen Fehlermeldungen wie „Wert in dblLength“ in die Validierungsprüfung der Basisklasse fällt. em> Eigenschaft ist ungültig“ kann aus der Volume-Klasse erscheinen.

Überprüfen Sie die Zeilen, die ich im obigen Code hervorgehoben habe, und ich hoffe, Sie können herausfinden, wie die Eigenschaftswerte der Basisklasse ClsVolume2 zugewiesen/von ihr abgerufen werden.

Sie können zuerst das ClsArea-Klassenmodul und dann das ClsVolume2-Klassenmodul durchlaufen – die abgeleitete Klasse, die die ClsArea-Klasse als Basisklasse verwendet. Nachdem Sie diese beiden Codes durchgegangen sind, können Sie sich den Code in dieser Wrapper-Klasse noch einmal ansehen.

Testprogramm für die ClsSales-Klasse im Standardmodul.

Lassen Sie uns ein Testprogramm schreiben, um die Wrapper-Klasse auszuprobieren.

  1. Kopieren Sie den folgenden VBA-Code und fügen Sie ihn in ein Standardmodul ein.
    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

    Führen Sie den Code aus.

  2. Lassen Sie das Debug-Fenster geöffnet (Strg+G).
  3. Klicken Sie irgendwo in die Mitte des Codes und drücken Sie F5 Taste, um den Code auszuführen und die Ausgabe im Debug-Fenster zu drucken.
  4. Sie können den Code weiter testen, indem Sie einen der Eingabewerte mit einer negativen Zahl eingeben und den Code ausführen, um die neue Fehlermeldung auszulösen. Deaktivieren Sie alle Eingabezeilen mit einem Kommentarsymbol ('), führen Sie den Code aus und sehen Sie, was passiert.

Preis/Rabatt für eine Reihe von Produkten berechnen.

Der folgende Testcode erstellt ein Array aus drei Produkten und Verkaufswerten, indem er direkt über die Tastatur eingegeben wird.

Kopieren Sie den folgenden Code, fügen Sie ihn in ein Standardmodul ein und führen Sie ihn aus, um die Wrapper-Klasse weiter zu testen.

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

Nach erfolgreicher Eingabe der korrekten Werte in das Array werden die Produktnamen und Verkaufswerte im Debug-Fenster ausgegeben.

KLASSENMODULE.

  1. MS-Access-Klassenmodul und VBA
  2. MS-Access-VBA-Klassenobjekt-Arrays
  3. MS-Access-Basisklasse und abgeleitete Objekte
  4. VBA-Basisklasse und abgeleitete Objekte-2
  5. Basisklasse und abgeleitete Objektvarianten
  6. Ms-Access Recordset und Klassenmodul
  7. Zugriff auf Klassenmodul und Wrapper-Klassen
  8. Umwandlung der Wrapper-Klassenfunktionalität

SAMMLUNGSOBJEKT.

  1. Grundlagen von MS-Access und Erfassungsobjekten
  2. MS-Access-Klassenmodul und Sammlungsobjekt
  3. Tabellensätze in Sammlungsobjekt und Formular

WÖRTERBUCHOBJEKT.

  1. Wörterbuchobjekt-Grundlagen
  2. Wörterbuchobjekt-Grundlagen-2
  3. Sortieren von Dictionary-Objektschlüsseln und -Elementen
  4. Datensätze aus Wörterbuch in Formular anzeigen
  5. Klassenobjekte als Wörterbucheinträge hinzufügen
  6. Klassenobjekt-Wörterbuchelement auf Formular aktualisieren