Wprowadzenie.
W zeszłym tygodniu stworzyliśmy nową klasę Wrapper ClsTiles, używając dwukrotnie klasy ClsArea w nowym module klasy, jedną instancję dla Floor wartości wymiarów, a drugie wystąpienie dla Płytki podłogowej wymiar, aby obliczyć liczbę płytek w pokoju.
W nowym module klasy Wrapper przekształcimy klasę wolumenu (ClsVolume2) na klasę Sales (ClsSales). Po kilku kosmetycznych zmianach dokonamy całkowitego liftingu w klasie Wrapper, ukrywając jej prawdziwą tożsamość jako klasy obliczania objętości i użyjemy jej do obliczenia ceny sprzedaży produktów z rabatem.
Zgadza się, nasza klasa ClsVolume2 ma wszystkie właściwości niezbędne do wprowadzenia wymaganych wartości danych sprzedaży, takich jak Opis, Ilość, Cena jednostkowa i Procent rabatu, które zostaną umieszczone odpowiednio we właściwościach klasy wolumenu strDesc, dblLength, dblWidth, dblHeight.
Nie powinniśmy zapominać, że klasa ClsVolume2 jest klasą pochodną , zbudowany przy użyciu ClsArea jako klasy bazowej.
Ponowna wizyta w klasie ClsVolume2.
Ale najpierw kod VBA modułu klasy ClsVolume2 (klasa podstawowa dla naszego nowego modułu klasy ClsSales) jest odtworzony poniżej w celach informacyjnych:
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
Jedyny problem, który uniemożliwia nam używanie klasy ClsVolume2 bezpośrednio do Sprzedaży wpis danych jest taki, że nazwy procedury właściwości dblLength, dblWidth, dblHeight nie są zgodne dla wartości właściwości Sales Quantity, UnitPrice, Discount Percentage. Numeryczne typy danych klasy ClsVolume2 to liczby o podwójnej precyzji, które są odpowiednie dla naszej klasy sprzedaży i mogą być używane bez zmiany typu danych. Nazwy funkcji publicznych Area() i Volume() również nie są odpowiednie, ale formuła ich obliczeń może być używana do obliczeń sprzedaży bez zmian.
a) Powierzchnia =dblLength * dblWidth jest odpowiednia dla ceny całkowitej =ilość * cena jednostkowa
b) Objętość =Powierzchnia * dblHeight jest odpowiednia dla DiscountAmount =TotalPrice * DiscountPercentage
Tutaj mamy dwie możliwości wykorzystania klasy ClsVolume2 jako klasy ClsSales.
- Najłatwiej jest zrobić kopię klasy ClsVolume2 i zapisać ją w nowym module klasy o nazwie ClsSales. Wprowadź odpowiednie zmiany w Procedurze właściwości i publicznych nazwach funkcji odpowiednich dla wartości sprzedaży i obliczeń. W razie potrzeby dodaj więcej funkcji w nowym module zajęć.
- Utwórz klasę opakowującą, używając ClsVolume2 jako klasy bazowej i utwórz odpowiednie procedury właściwości oraz zmiany nazw funkcji publicznych, maskując procedury właściwości i nazwy funkcji klasy bazowej. W razie potrzeby utwórz nowe funkcje w klasie opakowującej.
Pierwsza opcja jest dość prosta i łatwa do wdrożenia. Ale wybierzemy drugą opcję, aby dowiedzieć się, jak adresować właściwości klasy bazowej w nowej klasie opakowującej i jak maskować jej oryginalne nazwy właściwości nowymi.
Przekształcona klasa ClsVolume2.
- Otwórz swoją bazę danych i wyświetl okno edycji VBA (Alt+F11).
- Wybierz Moduł zajęć od Wstaw Menu, aby wstawić nowy moduł klasy.
- Zmień wartość właściwości Nazwa modułu klasy z Class1 na ClsSales .
- Skopiuj i wklej następujący kod VBA do modułu i zapisz kod:
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
Co zrobiliśmy w klasie Wrapper? Utworzono instancję klasy ClsVolume2 i zmieniono jej nazwy właściwości, nazwy funkcji oraz dodano kontrole walidacji z odpowiednimi komunikatami o błędach i zapobiegły porzuceniu sprawdzania walidacji klasy bazowej z nieodpowiednimi komunikatami o błędach, takimi jak „Wartość w dblLength właściwość jest nieprawidłowa” może wyskoczyć z klasy woluminu.
Sprawdź wiersze, które zaznaczyłem w powyższym kodzie i mam nadzieję, że będziesz w stanie dowiedzieć się, w jaki sposób wartości właściwości są przypisywane/pobierane do/z klasy bazowej ClsVolume2.
Możesz przejść najpierw przez moduł klasy ClsArea, a następnie przez moduł klasy ClsVolume2 – klasę pochodną używającą klasy ClsArea jako klasy bazowej. Po przejrzeniu obu tych kodów możesz ponownie przyjrzeć się kodowi w tej klasie opakowującej.
Program testowy dla klasy ClsSales w module standardowym.
Napiszmy program testowy, aby wypróbować klasę opakowania.
- Skopiuj i wklej następujący kod VBA do modułu standardowego.
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
Uruchom kod.
- Pozostaw otwarte okno debugowania (Ctrl+G).
- Kliknij gdzieś w środku kodu i naciśnij F5 aby uruchomić kod i wydrukować dane wyjściowe w oknie debugowania.
- Kod można dalej testować, wprowadzając dowolną z wartości wejściowych z liczbą ujemną i uruchamiając kod w celu wywołania nowego komunikatu o błędzie. Wyłącz dowolny z wierszy wejściowych za pomocą symbolu komentarza ('), uruchom kod i zobacz, co się stanie.
Oblicz cenę/rabat dla tablicy produktów.
Poniższy kod testowy tworzy tablicę trzech produktów i wartości sprzedaży, wprowadzając bezpośrednio z klawiatury.
Skopiuj i wklej następujący kod do modułu standardowego i uruchom, aby dalej testować klasę opakowania.
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
Po pomyślnym wprowadzeniu poprawnych wartości do tablicy, nazwy produktów i wartości sprzedaży są drukowane w oknie Debug.
MODUŁY KLASY.
- Moduł klasy MS-Access i VBA
- Tablice obiektów klasy MS-Access VBA
- Klasa bazowa MS-Access i obiekty pochodne
- Klasa podstawowa VBA i obiekty pochodne-2
- Warianty klasy bazowej i obiektów pochodnych
- Ms-Access Recordset and Class Module
- Dostęp do modułu klas i klas opakowujących
- Transformacja funkcjonalności klasy opakowującej
PRZEDMIOT ZBIORU.
- Podstawy dostępu do MS i obiektów kolekcji
- Moduł klasy Ms-Access i obiekt kolekcji
- Rekordy tabeli w obiekcie i formularzu kolekcji
OBIEKT SŁOWNIKA.
- Podstawy obiektów słownika
- Podstawy obiektów słownika-2
- Sortowanie kluczy obiektów i elementów słownika
- Wyświetl rekordy ze słownika do formularza
- Dodaj obiekty klasy jako elementy słownika
- Aktualizuj element słownika obiektów klasy w formularzu