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

Indpakningsklasse funktionalitetstransformation

Introduktion.

I sidste uge har vi oprettet en ny Wrapper Class ClsTiles ved at bruge ClsArea Class to gange i det nye Class Module, en forekomst til Floor dimensionsværdier, og den anden instans for gulvfliser dimension, for at beregne antallet af fliser til rummet.

I det nye Wrapper Class Module vil vi transformere Volume Class (ClsVolume2) til Sales (ClsSales) Class. Med nogle kosmetiske ændringer vil vi give den et totalt ansigtsløft i Wrapper-klassen, skjule dens sande identitet som en volumenberegningsklasse og bruge den til at beregne salgsprisen på produkter med rabat.

Det er rigtigt, vores ClsVolume2 Class har alle de nødvendige egenskaber til at indtaste de nødvendige salgsdataværdier som Beskrivelse, Kvantitet, Enhedspris og Rabatprocent, som vil gå ind i Volume Class Properties hhv. strDesc, dblLength, dblWidth, dblHeight.

Vi bør ikke glemme, at ClsVolume2-klassen er en afledt klasse , bygget med ClsArea som basisklasse.

ClsVolume2 klasse genbesøgt.

Men først er VBA-koden for ClsVolume2 Class Module (Basisklassen for vores nye ClsSales Class Module) gengivet nedenfor til reference:

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

Det eneste problem, der forhindrer os i at bruge ClsVolume2 Class direkte til Salg dataindtastning er, at ejendomsprocedurenavnene dblLength, dblWidth, dblHeight ikke stemmer overens med salgsegenskabsværdierne Kvantitet, UnitPrice, Rabatprocent. De numeriske datatyper i ClsVolume2 Class er alle dobbeltpræcisionsnumre, og de er velegnede til vores salgsklasse og kan bruges uden datatypeændring. De offentlige funktioner Area() og Volume() navne er heller ikke egnede, men deres beregningsformel kan bruges til salgsberegninger uden ændringer.

a) Area =dblLength * dblWidth er egnet til TotalPrice =Quantity * UnitPrice

b) Volumen =Areal * dblHøjde er god for Rabatbeløb =Samlet pris * Rabatprocent

Her har vi to muligheder for at gøre brug af ClsVolume2 Class som ClsSales Class.

  1. Den nemmeste måde er at lave en kopi af ClsVolume2-klassen og gemme den i et nyt klassemodul med navnet ClsSales. Foretag passende ændringer af ejendomsproceduren og offentlige funktionsnavne, der er egnede til salgsværdier og beregninger. Tilføj flere funktioner, hvis det kræves, i det nye klassemodul.
  2. Opret en Wrapper-klasse ved hjælp af ClsVolume2 som basisklasse, og opret passende egenskabsprocedurer og ændringer af offentlige funktionsnavne, der maskerer basisklassens egenskabsprocedurer og funktionsnavne. Opret nye funktioner i Wrapper-klassen, hvis det er nødvendigt.

Den første mulighed er noget ligetil og nem at implementere. Men vi vil vælge den anden mulighed for at lære, hvordan man adresserer basisklassens egenskaber i den nye wrapper-klasse, og hvordan man maskerer dens oprindelige egenskabsnavne med nye.

Den transformerede ClsVolume2-klasse.

  1. Åbn din database, og vis VBA-redigeringsvinduet (Alt+F11).
  2. Vælg Klassemodulet fra Indsæt Menu, for at indsætte et nyt klassemodul.
  3. Skift klassemodulets navnegenskabsværdi fra Class1 til ClsSales .
  4. Kopiér og indsæt følgende VBA-kode i modulet og gem koden:
    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
     

Hvad lavede vi i Wrapper-klassen? Oprettede en forekomst af ClsVolume2-klassen og ændrede dens egenskabsnavne, funktionsnavne og tilføjede valideringstjek med passende fejlmeddelelser og forhindrede i at falde ind i valideringstjekket af basisklassen med upassende fejlmeddelelser, såsom 'Value in dblLength em> egenskaben er ugyldig' kan dukke op fra Volume Class.

Tjek linjerne, jeg har fremhævet i ovenstående kode, og jeg håber, du vil være i stand til at finde ud af, hvordan egenskabsværdierne er tildelt/hentet til/fra basisklassen ClsVolume2.

Du kan gå gennem ClsArea-klassemodulet først og ved siden af ​​ClsVolume2-klassemodulet – den afledte klasse ved at bruge ClsArea-klassen som basisklasse. Efter at have gennemgået begge disse koder, kan du tage et ekstra kig på koden i denne indpakningsklasse.

Testprogram for ClsSales Class i standardmodul.

Lad os skrive et testprogram for at prøve Wrapper-klassen.

  1. Kopiér og indsæt følgende VBA-kode i et standardmodul.
    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

    Kør koden.

  2. Hold fejlfindingsvinduet åbent (Ctrl+G).
  3. Klik et sted i midten af ​​koden, og tryk på F5 tasten for at køre koden og for at udskrive output i fejlfindingsvinduet.
  4. Du kan teste koden yderligere ved at indtaste en hvilken som helst af inputværdierne med et negativt tal og køre koden for at udløse den nye fejlmeddelelse. Deaktiver enhver af inputlinjerne med et kommentarsymbol ('), kør koden, og se, hvad der sker.

Beregn pris/rabat for en række produkter.

Følgende testkode opretter en række af tre produkter og salgsværdier ved at indtaste direkte fra tastaturet.

Kopiér og indsæt følgende kode i et standardmodul og kør for at teste wrapperklassen yderligere.

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

Efter vellykket indtastning af korrekte værdier i arrayet, udskrives produktnavne og salgsværdier i fejlfindingsvinduet.

KLASSEMODULER.

  1. MS-Access Class Module og VBA
  2. MS-Access VBA Class Object Arrays
  3. MS-Access Basisklasse og afledte objekter
  4. VBA-basisklasse og afledte objekter-2
  5. Basisklasse og afledte objektvarianter
  6. Ms-Access Recordset og klassemodul
  7. Adgang til klassemodul- og indpakningsklasser
  8. Wrapper Class Funktionalitet Transformation

SAMLINGSOBJEKT.

  1. Grundlæggende om Ms-Access og Collection Object
  2. Ms-Access klassemodul og samlingsobjekt
  3. Tabelposter i samlingsobjekt og -form

ORDBOG OBJECT.

  1. Grundlæggende om ordbogsobjekt
  2. Dictionary Object Basics-2
  3. Sortering af ordbogsobjektnøgler og -elementer
  4. Vis poster fra ordbog til formular
  5. Tilføj klasseobjekter som ordbogselementer
  6. Opdater Class Object Dictionary Element på formular

  1. Benchmarking Managed PostgreSQL Cloud Solutions - Del fire:Microsoft Azure

  2. Hybrid OLTP/Analytics Database Workloads:Replikering af MySQL-data til ClickHouse

  3. Sådan installeres SQLcl på en Mac

  4. Sådan erstattes null-værdier med ukendt i Select Statement i SQL Server - SQL Server / TSQL Tutorial Del 111