Access
 sql >> Base de Dados >  >> RDS >> Access

Transformação da funcionalidade da classe wrapper

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

  1. Abra seu banco de dados e exiba a janela de edição do VBA (Alt+F11).
  2. Selecione o Módulo de turma de Inserir Menu, para inserir um novo módulo de classe.
  3. Altere o valor da propriedade Name do módulo de classe de Class1 para ClsSales .
  4. 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.
  1. 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.

  2. Mantenha a janela de depuração aberta (Ctrl+G).
  3. 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.
  4. 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.

  1. Módulo de classe MS-Access e VBA
  2. Matrizes de objetos de classe VBA do MS-Access
  3. Classe base do MS-Access e objetos derivados
  4. Classe básica do VBA e objetos derivados-2
  5. Classe base e variantes de objetos derivados
  6. Ms-Access Recordset and Class Module
  7. Módulo de classe de acesso e classes wrapper
  8. Transformação da funcionalidade da classe wrapper

OBJETO DE COLEÇÃO.

  1. Noções básicas de Ms-Access e objetos de coleção
  2. Módulo de classe Ms-Access e objeto de coleção
  3. Registros de tabela em objeto e formulário de coleção

OBJETO DO DICIONÁRIO.

  1. Noções básicas de objetos do dicionário
  2. Noções básicas de objetos do dicionário-2
  3. Classificação de chaves e itens de objetos de dicionário
  4. Exibir registros do dicionário para o formulário
  5. Adicionar objetos de classe como itens de dicionário
  6. Atualizar item do dicionário de objetos de classe no formulário