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.
- 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.
- 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.
- Öffnen Sie Ihre Datenbank und zeigen Sie das VBA-Bearbeitungsfenster an (Alt+F11).
- Wählen Sie das Klassenmodul aus von Einfügen Menü, um ein neues Klassenmodul einzufügen.
- Ändern Sie den Namenseigenschaftswert des Klassenmoduls von Class1 in ClsSales .
- 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.
- 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.
- Lassen Sie das Debug-Fenster geöffnet (Strg+G).
- 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.
- 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.
- MS-Access-Klassenmodul und VBA
- MS-Access-VBA-Klassenobjekt-Arrays
- MS-Access-Basisklasse und abgeleitete Objekte
- VBA-Basisklasse und abgeleitete Objekte-2
- Basisklasse und abgeleitete Objektvarianten
- Ms-Access Recordset und Klassenmodul
- Zugriff auf Klassenmodul und Wrapper-Klassen
- Umwandlung der Wrapper-Klassenfunktionalität
SAMMLUNGSOBJEKT.
- Grundlagen von MS-Access und Erfassungsobjekten
- MS-Access-Klassenmodul und Sammlungsobjekt
- Tabellensätze in Sammlungsobjekt und Formular
WÖRTERBUCHOBJEKT.
- Wörterbuchobjekt-Grundlagen
- Wörterbuchobjekt-Grundlagen-2
- Sortieren von Dictionary-Objektschlüsseln und -Elementen
- Datensätze aus Wörterbuch in Formular anzeigen
- Klassenobjekte als Wörterbucheinträge hinzufügen
- Klassenobjekt-Wörterbuchelement auf Formular aktualisieren