sql >> Base de Datos >  >> RDS >> Access

Clase base de MS-Access y objetos derivados

Introducción.

Si no ha visto las Publicaciones anteriores en el Módulo de clase de Microsoft Access, revíselas antes de continuar, los enlaces se proporcionan a continuación.

  1. Módulo de clases de MS-Access y VBA.
  2. Matriz de objetos de clase MS-Access VBA.

El ClsArea La clase puede funcionar como una clase base en otro objeto de clase, el cálculo realizado por la clase base se puede usar como parte de los cálculos del nuevo objeto. Por ejemplo, puede ser parte de un Objeto que calcula el Volumen de algo,

El dbl en dblLength y dblAncho Nombres de procedimientos de propiedad para Get/Let Los procedimientos son simplemente una indicación de que el objeto de clase espera los valores de longitud y anchura en números de doble precisión. De manera similar, si cambiamos los nombres de los procedimientos de propiedad a cantidad y precio unitario, el primer valor multiplicado por el segundo valor nos da el precio total de algún artículo.

Simplemente significa que puede usar ClsArea Class como clase base, siempre que necesite el resultado del primer valor multiplicado por el segundo valor, como Precio total * Tasa de impuestos para calcular el monto del impuesto o Precio total * Tasa de descuento para encontrar el monto del descuento y así.

Aunque hemos desarrollado un módulo de clase simple, puede ser parte de muchas otras clases derivadas. Las posibilidades están abiertas a tu imaginación y creatividad.

Nuestra clase ClsArea calcula el área de materiales, habitaciones o elementos similares solo con propiedades de longitud y anchura. No calcula el área del Triángulo o Círculo. Pero, puede ser parte de un nuevo objeto de clase que calcula el volumen de habitaciones, almacenes para encontrar la capacidad de almacenamiento. Para eso, necesitamos un valor más de Altura de Habitación, Almacén, etc.

La clase de volumen:ClsVolume.

Vamos a crear un nuevo módulo de clase ClsVolume, utilizando ClsArea como clase base. Inserte un módulo de clase y cambie su nombre Propiedad de ClsVolume . Escriba o copie y pegue el siguiente código en el módulo de clase.

Option Compare Database
Option Explicit

Private p_Area As ClsArea
Private p_Height As Double

Private Sub Class_Initialize()
    Set p_Area = New ClsArea
End Sub

Private Sub Class_Terminate()
    Set p_Area = Nothing
End Sub

Public Property Get dblHeight() As Double
    dblHeight = p_Height
End Property 

Public Property Let dblHeight(ByVal dblNewValue As Double)
   Do While Val(Nz(dblNewValue, 0)) <= 0
      dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0)
    Loop
    p_Height = dblNewValue
End Property

Public Function Volume() As Double

If (p_Area.Area() > 0) And (p_Height > 0) Then
    Volume = p_Area.Area * p_Height
Else
    MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume"
End If

End Function

El código del objeto de clase ClsVolume aún no está completo. Examinemos el código línea por línea. En la tercera línea declarada como Propiedad Privada p_Area del objeto de clase ClsArea.

La siguiente línea declara una propiedad privada con el nombre p_Height de tipo de dato Doble.

Las subrutinas Class_Initialize() y Class_Terminate().

Las siguientes dos subrutinas (Inicializar() y Terminar() ) son muy importantes aquí.

El Inicializar() ejecuta e instancia el objeto ClsArea en memoria cuando usamos e instanciamos la ClsVolume Class Objeto en nuestro programa Módulo Estándar.

Cuando ejecutamos la Declaración Set ClsVolume =Nothing en el programa Módulo estándar, para borrar el objeto ClsVolume de la memoria, Terminate() La subrutina se ejecuta y libera el espacio de memoria ocupado por el objeto ClsArea.

La propiedad Obtener dblHeight El procedimiento devuelve el valor de p_Height Propiedad al Programa llamante.

La propiedad Let dblHeight El procedimiento valida el valor pasado al NewValue parámetro y lo asigna a la propiedad privada p_Height .

La función pública Volume() calcula el Volumen llamando a p_Area.Area() Función y el valor del área devuelta se multiplica por p_Altura para calcular el Volumen, con la expresión:Volumen =p_Area.Area * p_Altura. Pero, antes de ejecutar esta declaración, estamos realizando una verificación de validación para garantizar que la función p_Area.Area() devuelva un valor mayor que cero, lo que indica que las propiedades p_Area.dblLength, p_Area.dblWidth tienen valores válidos y el valor de la propiedad p_Height es mayor que cero.

Nota: Dado que, el p_Area El objeto de la clase ClsArea se define como privado Propiedad de Clase ClsVolume tenemos que hacer sus Propiedades (strDesc, longituddbl dblAncho y Área() función) visible para el mundo exterior para Get/Let Operaciones y para devolver el Valor del Área. Eso significa que tenemos que definir los procedimientos de propiedad Get/Let para strDesc, dblLength, dblWidth Properties y la función Area() del objeto de clase ClsArea en el módulo de clase ClsVolume también.

Los procedimientos de propiedad Let/Get.

Agregue la siguiente propiedad Get/Let Procedimientos y Área() función al código del módulo de clase ClsVolume:

Public Property Get strDesc() As String
   strDesc = p_Area.strDesc
End Property

Public Property Let strDesc(ByVal NewValue As String)
   p_Area.strDesc = NewValue
End Property

Public Property Get dblLength() As Double
   dblLength = p_Area.dblLength
End Property

Public Property Let dblLength(ByVal NewValue As Double)
   p_Area.dblLength = NewValue
End Property

Public Property Get dblWidth() As Double
   dblWidth = p_Area.dblWidth
End Property

Public Property Let dblWidth(ByVal NewValue As Double)
   p_Area.dblWidth = NewValue
End Property

Public Function Area() As Double
    Area = p_Area.Area()
End Function

Compruebe los procedimientos de propiedad strDesc() Get/Let líneas de código. El uso del nombre del procedimiento strDesc es simplemente una cuestión de elección, si desea utilizar un nombre diferente, es bienvenido. Pero, el nombre de propiedad original que hemos usado en la clase ClsArea es strDesc. Usar ese nombre original aquí nos recuerda la relación con el objeto de clase ClsArea original.

En el siguiente procedimiento de propiedad Get dblLength(), la expresión a la derecha de = firmar p_Area.dblLength lee el valor de dblLength almacenado en el objeto de clase ClsArea y vuelve al programa de llamada.

El procedimiento Let Property asigna el valor del parámetro en la variable NewValue a la propiedad p_Area.dblLength del objeto de clase ClsArea. Aquí, no estamos ejecutando ninguna verificación de validación en el valor recibido en la variable de parámetro NewValue. La comprobación de Validación se realizará dentro de la propia Clase ClsArea cuando asignemos el valor a p_Area.dblLength propiedad.

De manera similar, los procedimientos de propiedad Get/Let también se agregan para la propiedad p_Area.dblWidth,

A continuación, el p_Area.Area() La función se hace visible a través del objeto de clase ClsVolume para el programa que llama.

El código del módulo de clase derivado de ClsVolume.

El código completo del módulo de clase ClsVolume se proporciona a continuación.

Option Compare Database
Option Explicit

Private p_Area As ClsArea
Private p_Height As Double

Private Sub Class_Initialize()

‘Open ClsArea Object in Memory with the name p_Area
    Set p_Area = New ClsArea 

End Sub

Private Sub Class_Terminate()

‘Removes the Object p_Area from Memory
    Set p_Area = Nothing ‘
End Sub

Public Property Get dblHeight() As Double
    dblHeight = p_Height
End Property

Public Property Let dblHeight(ByVal dblNewValue As Double)

Do While Val(Nz(dblNewValue, 0)) <= 0
      dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0)
    Loop
     p_Height = dblNewValue

End Property

Public Function Volume() As Double

If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then
    Volume = p_Area.Area * Me.dblHeight
Else    

MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume"
End If

End Function

‘ClsArea Class Property Procedures and Method are exposed here

Public Property Get strDesc() As String
   strDesc = p_Area.strDesc
End Property 

Public Property Let strDesc(ByVal NewValue As String)
   p_Area.strDesc = NewValue
End Property

Public Property Get dblLength() As Double
   dblLength = p_Area.dblLength
End Property

Public Property Let dblLength(ByVal NewValue As Double)
   p_Area.dblLength = NewValue
End Property

Public Property Get dblWidth() As Double
   dblWidth = p_Area.dblWidth
End Property

Public Property Let dblWidth(ByVal NewValue As Double)
   p_Area.dblWidth = NewValue
End Property

Public Function Area() As Double
    Area = p_Area.Area()
End Function

Sé lo que está pensando ahora:como "esto es un trabajo doble, sería bueno si podemos, de alguna manera, omitir estos pasos de repetir los procedimientos de propiedad ClsArea nuevamente en la clase ClsVolume". O digamos, podríamos haber agregado la propiedad dblWidth en el propio ClsArea y ejecutar los métodos Area() y Volume() desde allí, ¿verdad?

El punto aquí es cómo un objeto de clase base puede convertirse en parte del diseño de otro objeto de clase.

Recuerde, la idea general de diseñar un objeto de módulo de clase reutilizable es que los programas principales, que utilizan el objeto de clase, serán simples y las complejidades integradas en el objeto de clase permanecerán ocultas.

Sí, podemos hacerlo de más de una manera, también con un código compacto. Los exploraremos más adelante, pero por ahora, continuemos con nuestro plan original.

El programa principal que usa la clase ClsVolume.

Probemos nuestra nueva clase ClsVolume en el programa principal en el módulo estándar. El código de muestra se proporciona a continuación.

Public Sub TestVolume()
Dim vol As ClsVolume

Set vol = New ClsVolume

vol.strDesc = "Warehouse"
vol.dblLength = 25
vol.dblWidth = 30
vol.dblHeight = 10

Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume"

With vol
    Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume()
End With
End Sub

¿Puedes ver lo simple que es el programa principal, sin las líneas de impresión?

Copie y pegue el código en un módulo estándar. Presione las teclas Ctrl+G para mostrar la ventana de depuración si aún no está abierta. Haga clic en algún lugar en el medio del Código y presione F5 Clave para ejecutar el Código. El resultado de muestra en la ventana de depuración se muestra a continuación.

Description   Length        Width         Height        Area          Volume
Warehouse      25            30            10            750           7500 

Descripción Largo Ancho Alto Área Volumen
Almacén 25 30 10 750 7500

Pruebas de rendimiento de las comprobaciones de validación.

Ejecutaremos pruebas para ver que la verificación de validación del valor de entrada de la clase base ClsArea Class funciona cuando se le pasan valores a través de la clase ClsVolume. También hemos realizado algunas comprobaciones de validación en las funciones Area() y Volume().

Intentémoslos uno por uno:

Primero, pasaremos un valor negativo a la propiedad ClsArea.dblLength a través de la clase ClsVolume. Debería activar el mensaje de error y abrir la función Inputbox() dentro del ciclo Do While… para ingresar el valor correcto.

1. Reemplace el Valor 25, en la línea Vol.dblLength =25 , con –5 y presiona F5 Clave para ejecutar el Código.

La verificación de validación activará el error y solicitará un valor mayor que cero. Ingrese un valor mayor que 0. Luego restaure el valor 25 en la línea, reemplazando –5.

2. Deshabilite la línea Vol.dblHeight =10 insertando un símbolo de comentario (') al comienzo de la línea como se muestra:'Vol.dblHeight =10 . Después del cambio, presione la tecla F5 para ejecutar el Código.

Dado que no se pasa ningún valor de entrada a la propiedad, la función Vol.Volume() generará un error que indica que las tres propiedades:dblLength, dblWidth y dblHeight, deben tener valores para ejecutar la función de volumen.

Del mismo modo, también puede comprobar el rendimiento de la función Vol.Area().

Podemos crear una función de impresión de datos y pasar el objeto ClsVolume como parámetro a la función e imprimir los valores en la ventana de depuración.

El código modificado de los programas principales.

El código modificado para ambos programas se proporciona a continuación:

Public Sub TestVolume()
Dim Vol As ClsVolume

Set Vol = New ClsVolume

Vol.strDesc = "Warehouse"
Vol.dblLength = 25
Vol.dblWidth = 30
Vol.dblHeight = 10

Call CVolPrint(Vol)

Set Vol = Nothing

End Sub
Public Sub CVolPrint(volm As ClsVolume)

   Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume"  
With volm
    Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume
End With

End Sub

La próxima semana construiremos el objeto de clase de volumen con menos código.

Los enlaces de todas las páginas sobre este tema.

  1. Módulo de clase MS-Access y VBA
  2. Matrices de objetos de clase VBA de MS-Access
  3. Clase base de MS-Access y objetos derivados
  4. Clase base de VBA y objetos derivados-2
  5. Variantes de clase base y objeto derivado
  6. Conjunto de registros y módulo de clase Ms-Access
  7. Módulo de clase de acceso y clases contenedoras
  8. Transformación de la funcionalidad de la clase contenedora
  9. Conceptos básicos de Ms-Access y objetos de colección
  10. Módulo de clase Ms-Access y objeto de colección
  11. Registros de tabla en objeto y formulario de colección
  12. Conceptos básicos de objetos de diccionario
  13. Conceptos básicos de objetos de diccionario-2
  14. Ordenar elementos y claves de objetos del diccionario
  15. Mostrar registros del diccionario al formulario
  16. Agregar objetos de clase como elementos de diccionario
  17. Actualizar elemento del diccionario de objetos de clase en el formulario