Introdução.
Na semana passada, criamos uma nova classe wrapper ClsTiles, usando a classe ClsArea duas vezes no novo módulo de classe, uma instância para Floor valores de dimensão e a segunda instância para Floor-Tile dimensão, para calcular o número de telhas para a sala.
No novo Módulo Classe Wrapper, vamos transformar a Classe Volume (ClsVolume2) em Classe Sales (ClsSales). Com algumas mudanças cosméticas, vamos dar-lhe um face-lift total na classe Wrapper, ocultando sua verdadeira identidade como uma classe de cálculo de volume e usá-lo para calcular o preço de venda de produtos com desconto.
Isso mesmo, nossa classe ClsVolume2 tem todas as propriedades necessárias para inserir os valores de dados de vendas necessários, como Descrição, Quantidade, Preço unitário e Porcentagem de desconto, que irão para as Propriedades da classe de volume strDesc, dblLength, dblWidth, dblHeight respectivamente.
Não devemos esquecer que a classe ClsVolume2 é uma classe derivada , construído usando ClsArea como Classe Base.
Classe ClsVolume2 revisitada.
Mas, primeiro, o código VBA do módulo de classe ClsVolume2 (a classe base para nosso novo módulo de classe ClsSales) é reproduzido abaixo para referência:
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
O único problema que nos impede de usar a classe ClsVolume2 diretamente para as Vendas entrada de dados é que os nomes de Procedimento de Propriedade dblLength, dblWidth, dblHeight não correspondem aos valores de propriedade de Vendas Quantidade, Preço Unitário, Porcentagem de Desconto. Os tipos de dados numéricos da classe ClsVolume2 são todos números de precisão dupla e são adequados para nossa classe de vendas e podem ser usados sem alteração do tipo de dados. Os nomes das funções públicas Area() e Volume() também não são adequados, mas suas fórmulas de cálculo podem ser usadas para cálculos de vendas sem alterações.
a) Area =dblLength * dblWidth é adequado para TotalPrice =Quantity * UnitPrice
b) Volume =Area * dblHeight é bom para DiscountAmount =TotalPrice * DiscountPercentage
Aqui, temos duas opções para usar a classe ClsVolume2 como classe ClsSales.
- A maneira mais fácil é fazer uma cópia da classe ClsVolume2 e salvá-la em um novo módulo de classe com o nome ClsSales. Faça as alterações apropriadas no Procedimento de Propriedade e nos nomes de Função pública adequados para valores e cálculos de vendas. Adicione mais funções, se necessário, no novo módulo de classe.
- Crie uma classe wrapper usando ClsVolume2 como classe base e crie procedimentos de propriedade adequados e alterações de nome de função pública, mascarando os procedimentos de propriedade e nomes de função da classe base. Crie novas funções na classe wrapper, se necessário.
A primeira opção é um pouco direta e fácil de implementar. Mas, selecionaremos a segunda opção para aprender como abordar as Propriedades da Classe Base na nova Classe wrapper e como mascarar seus nomes de propriedades originais com novos.
A classe ClsVolume2 transformada.
- Abra seu banco de dados e exiba a janela de edição do VBA (Alt+F11).
- Selecione o Módulo de turma de Inserir Menu, para inserir um novo módulo de classe.
- Altere o valor da propriedade Name do módulo de classe de Class1 para ClsSales .
- Copie e cole o seguinte código VBA no módulo e salve o código:
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
O que fizemos na classe Wrapper? Criou uma instância da classe ClsVolume2 e alterou seus nomes de propriedades, nomes de funções e adicionou verificações de validação com mensagens de erro apropriadas e impediu de cair na verificação de validação da classe Base com mensagens de erro inadequadas, como 'Value in dblLength propriedade é inválida' pode aparecer na Classe de Volume.
Verifique as linhas que destaquei no código acima e espero que você consiga descobrir como os valores de propriedade são atribuídos/recuperados para/da classe base ClsVolume2.
Você pode passar primeiro pelo Módulo de Classe ClsArea e ao lado do Módulo de Classe ClsVolume2 – a Classe derivada usando a Classe ClsArea como Classe Base. Depois de passar por ambos os Códigos, você pode dar uma segunda olhada no Código nesta Classe Wrapper.
Programa de teste para classe ClsSales no módulo padrão.
Vamos escrever um programa de teste para experimentar a classe Wrapper.
- Copie e cole o seguinte código VBA em um módulo padrão.
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
Execute o código.
- Mantenha a janela de depuração aberta (Ctrl+G).
- Clique em algum lugar no meio do código e pressione F5 key para executar o código e imprimir a saída na janela de depuração.
- Você pode testar o código ainda mais inserindo qualquer um dos valores de entrada com um número negativo e executando o código para acionar a nova mensagem de erro. Desative qualquer uma das linhas de entrada, com um símbolo de comentário ('), execute o código e veja o que acontece.
Calcule preço/desconto para uma variedade de produtos.
O código de teste a seguir cria uma matriz de três valores de produtos e vendas digitando diretamente do teclado.
Copie e cole o seguinte código em um módulo padrão e execute para testar ainda mais a 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
Após a entrada bem-sucedida dos valores corretos no Array, os nomes dos produtos e os valores de vendas são impressos na janela Debug.
MÓDULOS DE CLASSE.
- Módulo de classe MS-Access e VBA
- Matrizes de objetos de classe VBA do MS-Access
- Classe base do MS-Access e objetos derivados
- Classe básica do VBA e objetos derivados-2
- Classe base e variantes de objetos derivados
- Ms-Access Recordset and Class Module
- Módulo de classe de acesso e classes wrapper
- Transformação da funcionalidade da classe wrapper
OBJETO DE COLEÇÃO.
- Noções básicas de Ms-Access e objetos de coleção
- Módulo de classe Ms-Access e objeto de coleção
- Registros de tabela em objeto e formulário de coleção
OBJETO DO DICIONÁRIO.
- Noções básicas de objetos do dicionário
- Noções básicas de objetos do dicionário-2
- Classificação de chaves e itens de objetos de dicionário
- Exibir registros do dicionário para o formulário
- Adicionar objetos de classe como itens de dicionário
- Atualizar item do dicionário de objetos de classe no formulário