Access
 sql >> Baza danych >  >> RDS >> Access

Transformacja funkcjonalności klasy opakowującej

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.

  1. 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ęć.
  2. 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.

  1. Otwórz swoją bazę danych i wyświetl okno edycji VBA (Alt+F11).
  2. Wybierz Moduł zajęć od Wstaw Menu, aby wstawić nowy moduł klasy.
  3. Zmień wartość właściwości Nazwa modułu klasy z Class1 na ClsSales .
  4. 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.

  1. 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.

  2. Pozostaw otwarte okno debugowania (Ctrl+G).
  3. Kliknij gdzieś w środku kodu i naciśnij F5 aby uruchomić kod i wydrukować dane wyjściowe w oknie debugowania.
  4. 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.

  1. Moduł klasy MS-Access i VBA
  2. Tablice obiektów klasy MS-Access VBA
  3. Klasa bazowa MS-Access i obiekty pochodne
  4. Klasa podstawowa VBA i obiekty pochodne-2
  5. Warianty klasy bazowej i obiektów pochodnych
  6. Ms-Access Recordset and Class Module
  7. Dostęp do modułu klas i klas opakowujących
  8. Transformacja funkcjonalności klasy opakowującej

PRZEDMIOT ZBIORU.

  1. Podstawy dostępu do MS i obiektów kolekcji
  2. Moduł klasy Ms-Access i obiekt kolekcji
  3. Rekordy tabeli w obiekcie i formularzu kolekcji

OBIEKT SŁOWNIKA.

  1. Podstawy obiektów słownika
  2. Podstawy obiektów słownika-2
  3. Sortowanie kluczy obiektów i elementów słownika
  4. Wyświetl rekordy ze słownika do formularza
  5. Dodaj obiekty klasy jako elementy słownika
  6. Aktualizuj element słownika obiektów klasy w formularzu

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wybrać odpowiednią bazę danych dla swojej firmy

  2. Wstawianie zbiorcze lub aktualizacja tabel z polami załączników

  3. Jakie są zalety systemu zarządzania danymi?

  4. Obsługa błędów na poziomie absolwenta

  5. Jak zaszyfrować podzieloną bazę danych w programie Access 2016