Introduzione.
La scorsa settimana abbiamo creato una nuova classe Wrapper ClsTiles, utilizzando la classe ClsArea due volte nel nuovo modulo di classe, un'istanza per Floor valori di dimensione e la seconda istanza per Floor-Tile dimensione, per calcolare il numero di Tessere per la stanza.
Nel nuovo modulo Classe Wrapper, trasformeremo la Classe Volume (ClsVolume2) in Classe Sales (ClsSales). Con alcune modifiche estetiche, gli daremo un lifting totale nella Classe Wrapper, nascondendo la sua vera identità come Classe di calcolo del volume e la utilizzeremo per calcolare il prezzo di vendita dei prodotti con sconto.
Esatto, la nostra classe ClsVolume2 ha tutte le proprietà necessarie per inserire i valori dei dati di vendita richiesti come descrizione, quantità, prezzo unitario e percentuale di sconto, che andranno rispettivamente nelle proprietà della classe di volume strDesc, dblLength, dblWidth, dblHeight.
Non dobbiamo dimenticare che la classe ClsVolume2 è una Classe derivata , costruito utilizzando ClsArea come Classe Base.
Classe ClsVolume2 rivisitata.
Ma, prima, il codice VBA del modulo di classe ClsVolume2 (la classe base per il nostro nuovo modulo di classe ClsSales) è riprodotto di seguito come riferimento:
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
L'unico problema che ci impedisce di utilizzare ClsVolume2 Class direttamente per le Vendite l'immissione di dati è che i nomi della procedura della proprietà dblLength, dblWidth, dblHeight non corrispondono ai valori delle proprietà di vendita Quantità, Prezzo Unitario, Percentuale di sconto. I tipi di dati numerici di ClsVolume2 Class sono tutti numeri a doppia precisione e sono adatti alla nostra Classe di vendita e possono essere utilizzati senza modificare il tipo di dati. Anche i nomi delle funzioni pubbliche Area() e Volume() non sono adatti, ma la loro formula di calcolo può essere utilizzata per i calcoli delle vendite senza modifiche.
a) Area =dblLength * dblWidth è adatto per TotalPrice =Quantità * UnitPrice
b) Volume =Area * dblHeight va bene per DiscountAmount =TotalPrice * DiscountPercentage
Qui, abbiamo due scelte per utilizzare la classe ClsVolume2 come classe ClsSales.
- Il modo più semplice è fare una copia della Classe ClsVolume2 e salvarla in una nuova classe Modulo con il nome ClsSales. Apportare le modifiche appropriate alla procedura della proprietà e ai nomi delle funzioni pubbliche adatte ai valori e ai calcoli delle vendite. Aggiungi più funzioni, se necessario, nel nuovo modulo di classe.
- Crea una classe wrapper utilizzando ClsVolume2 come classe base e crea procedure di proprietà adeguate e modifiche pubbliche ai nomi delle funzioni, mascherando le procedure delle proprietà e i nomi delle funzioni della classe base. Crea nuove funzioni nella classe Wrapper, se necessario.
La prima opzione è piuttosto semplice e facile da implementare. Ma selezioneremo la seconda opzione per imparare come indirizzare le proprietà della classe base nella nuova classe wrapper e come mascherare i suoi nomi di proprietà originali con quelli nuovi.
La classe ClsVolume2 trasformata.
- Apri il tuo database e visualizza la finestra di modifica VBA (Alt+F11).
- Seleziona il Modulo del corso da Inserisci Menu, per inserire un nuovo Modulo Classe.
- Modifica il valore della proprietà Name del modulo di classe da Class1 a ClsSales .
- Copia e incolla il seguente codice VBA nel modulo e salva il codice:
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
Cosa abbiamo fatto nella classe Wrapper? Creata un'istanza della classe ClsVolume2 e modificata i suoi nomi di proprietà, nomi di funzione e aggiunti controlli di convalida con messaggi di errore appropriati e impedito di cadere nel controllo di convalida della classe Base con messaggi di errore inappropriati, come 'Value in dblLength la proprietà non è valida' potrebbe apparire dalla classe di volume.
Controlla le righe che ho evidenziato nel codice sopra e spero che sarai in grado di capire come vengono assegnati/recuperati i valori delle proprietà alla/dalla Classe Base ClsVolume2.
Puoi passare prima attraverso il modulo di classe ClsArea e accanto al modulo di classe ClsVolume2, la classe derivata che utilizza la classe ClsArea come classe base. Dopo aver esaminato entrambi questi codici, puoi dare una seconda occhiata al codice in questa classe wrapper.
Programma di test per la classe ClsSales nel modulo standard.
Scriviamo un programma di test per provare la classe Wrapper.
- Copia e incolla il seguente codice VBA in un modulo standard.
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
Esegui il codice.
- Tieni aperta la finestra di debug (Ctrl+G).
- Fai clic da qualche parte nel mezzo del codice e premi F5 per eseguire il codice e per stampare l'output nella finestra di debug.
- Puoi testare ulteriormente il codice inserendo uno qualsiasi dei valori di input con un numero negativo ed eseguendo il codice per attivare il nuovo messaggio di errore. Disattiva qualsiasi riga di input, con un simbolo di commento ('), esegui il codice e guarda cosa succede.
Calcola il prezzo/sconto per una serie di prodotti.
Il codice di test seguente crea una matrice di tre prodotti e valori di vendita immettendoli direttamente dalla tastiera.
Copia e incolla il codice seguente in un modulo standard ed esegui per testare ulteriormente la classe Wrapper.
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
Dopo aver inserito correttamente i valori corretti nell'array, i nomi dei prodotti e i valori di vendita vengono stampati nella finestra di debug.
MODULI DI CLASSE.
- Modulo di classe MS-Access e VBA
- Matrici di oggetti di classe VBA MS-Access
- Classe base MS-Access e oggetti derivati
- Classe base VBA e oggetti derivati-2
- Classe base e varianti di oggetti derivati
- Recordset Ms-Access e modulo di classe
- Accedi al modulo di classe e alle classi wrapper
- Trasformazione della funzionalità della classe wrapper
OGGETTO DA RACCOLTA.
- Nozioni di base su Ms-Access e Collection Object
- Modulo di classe Ms-Access e oggetto Collection
- Record di tabella nell'oggetto e nella forma della raccolta
OGGETTO DIZIONARIO.
- Nozioni di base sugli oggetti del dizionario
- Nozioni di base sugli oggetti del dizionario-2
- Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
- Visualizza record dal dizionario al modulo
- Aggiungi oggetti classe come elementi del dizionario
- Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo