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

Módulo MS-Access Class y VBA

Introducción.

Las últimas semanas hemos aprendido a usar el tipo definido por el usuario (UDT) mediante la creación de una estructura de datos compleja y conocemos la fortaleza o debilidad de UDT, más o menos ahora. Si no ha leído esos artículos, puede visitarlos. Utilice los siguientes enlaces:

  • Tipo de datos definido por el usuario-2
  • Tipo de datos definido por el usuario-3

En Microsoft Access, hay dos tipos de módulos VBA.

  1. Módulos estándar
  2. Módulos de clase

Hemos trabajado con Módulos de Clase en Formularios e Informes de Microsoft Access. Los programas del módulo de clase de formulario/informe son en su mayoría pequeñas rutinas impulsadas por eventos (clics de botón, actualización previa, evento actual de formulario/informe, etc.).

Los programas de procesamiento de datos más serios se escribirán en módulos estándar. Se pueden escribir varios programas, no necesariamente relacionados, en un módulo estándar, para realizar diferentes tareas.

Los módulos de clase son diferentes. Se usan para crear objetos personalizados y un módulo de clase se usa solo para un objeto.

Conceptos básicos del módulo de clase independiente.

Vamos a crear un módulo de clase simple desde cero y aprender los conceptos básicos.

  1. Inicie Microsoft Access y abra una base de datos o cree una nueva. Si es una nueva base de datos, guárdela en la ubicación de confianza existente (carpeta) o agregue la nueva ubicación a la lista de ubicaciones de confianza. Haga clic en el Botón de Office ->Opciones de acceso—> Centro de confianza ->Configuración del Centro de confianza. Agregue la carpeta de la base de datos a la lista y haga clic en Aceptar.
  2. Abra la ventana de edición de VBA (Alt+F11).
  3. Haga clic en Insertar Menú y seleccione el Módulo de clase de la lista. Se inserta un nuevo módulo de clase.

  • En el panel izquierdo, hay un Nombre control con el nombre Class1.
  • Cambiar el nombre Class1 a ClsArea . Este es el nombre de nuestro objeto personalizado.

  • Nota: El nombre de la clase:ClsArea convertirse en el nombre del objeto. Eso significa que, donde sea que usemos este objeto, será como una declaración de variable normal:Dim xyz As ClsArea . Escribimos una declaración similar para las declaraciones de tipos de datos definidos por el usuario.

    A continuación, agregaremos tres Propiedades (Variables) del Objeto (para Descripción, Longitud, y Ancho ) en la parte superior del módulo, debajo de la Base de datos de comparación de opciones y Opción explícita líneas. Escriba las siguientes líneas en el Módulo de clase.

    Option Compare Database
    Option Explicit
    
    Public p_Desc as String
    Public p_Length as Double
    Public p_Width as Double
    

    Estas variables se identifican como propiedades del objeto de clase personalizada de VBA. Guarde el módulo de clase.

    Nota: Nuestro objeto de módulo de clase y las líneas de código no serán tan simples. Sufrirá cambios con varias líneas de código. Es mejor estar preparado para seguirlos paso a paso, sin perder de vista cada etapa de cambios. Esta es una clase de cálculo de área simple (área =largo * ancho ), así de sencillo. Gradualmente sufrirá cambios para que sepas por qué esos cambios se vuelven necesarios.

    Escribiremos un pequeño programa en un módulo estándar para probar nuestro nuevo módulo de clase. Inserte un módulo estándar desde el menú Insertar. Puede escribir o copiar y pegar el siguiente código en el módulo estándar, sobrescribiendo la línea existente en el módulo:

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    oArea.
    
    Set oArea = Nothing
    
    End Function
    

    El Dim declara una variable como lo hacemos con una variable normal, como Dim Desc as String. Pero, esta no es una variable ordinaria, estamos configurando una referencia a nuestro objeto de módulo de clase ClsArea . Dado que es un objeto, una declaración de Dimensión simple por sí sola no es suficiente porque no asignará ningún espacio de memoria para almacenar valores en nuestro Objeto oArea definido localmente. Propiedades.

    El conjunto declaración en la siguiente línea con el Nuevo palabra clave necesaria para crear una instancia de un objeto a partir de ClsArea en memoria, con el nombre de instancia de objeto oArea . Podemos abrir varias instancias del mismo objeto de clase en la memoria de esta manera si es necesario (lo aprenderemos en las próximas semanas) para que podamos almacenar valores en sus propiedades (p_Desc, p_Length, p_Width). El p_ prefijo a las variables es un indicador de que el Alcance de las variables es Privado, es decir, las Variables no son visibles fuera del Módulo de Clase si la variable se declara con la palabra clave Privado, pero ahora se declara como Público. El nombre de la variable puede ser cualquier nombre válido.

    Nota: Todavía no lo hemos declarado como Privado. Estamos en el camino hacia ese cambio.

    Inmediatamente después de la palabra clave Establecer el nombre del objeto local (puede elegir el nombre adecuado que prefiera, pero debe ajustarse a las reglas normales de nombres de variables) seguido de un signo igual y la palabra clave Nuevo y el nombre del módulo de clase (ClsArea) para crear una instancia del Objeto clsArea en memoria con todas sus Propiedades (Variables).

    Hay un atajo para este código de dos líneas. Las acciones de estas dos líneas de código se pueden lograr con una declaración como se muestra a continuación:

    Dim oArea As ClsArea
    Set oArea = New ClsArea
    
    'the shortcut to the above two statements
    Dim oArea As New ClsArea
    
    

    Cuando escribe la siguiente línea oArea seguido de un punto (. ) separador, aparecerá la siguiente pantalla para mostrar la lista de propiedades de objetos personalizados disponibles para seleccionar.

    Si no aparece, vaya al cuadro de diálogo Opciones desde el cuadro de menú Herramientas y coloque una marca de verificación en Lista automática de miembros en la pestaña Editor.

    Antes de salir de la función, la última instrucción debe ser Set oArea =Nothing . Esta declaración libera explícitamente la memoria ocupada por la instancia del objeto personalizado, de modo que haya más memoria disponible para otros programas. Esta es una operación de limpieza responsable de nuestro programa.

    Todo lo que hagamos con el objeto personalizado instanciado debe codificarse entre el primer y el último conjunto. declaraciones.

    El programa de prueba de objetos de clase ClsArea.

    El código del programa de prueba de clase completo se proporciona a continuación:

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    oArea.p_Desc = "Carpet"
    oArea.p_Length = 25
    oArea.p_Width = 15
    
    Debug.Print "Description", "Length", "Width"
    
    Debug.Print oArea.p_Desc, oArea.p_Length, oArea.p_Width
    
    Set oArea = Nothing
    
    End Function
    

    Haga clic en algún lugar en el medio del Código y presione F5 para ejecutar el programa. La ejecución del programa se proporciona a continuación como referencia.

    Description   Length        Width
    Carpet         25            15 

    Ámbito público|privado de las propiedades del objeto.

    Nuestro objeto de módulo de clase simple tiene algunos inconvenientes y vamos a corregirlos.

    La primera es que hemos declarado todas las Variables (o Propiedades) con Public Alcance. Por eso, son visibles para otros programas de VBA y pueden cambiar su valor directamente. El segundo problema es que aceptará valores no válidos, como valores negativos o cero, que no son adecuados para nuestro objeto de clase. Tenemos que incorporar algunas comprobaciones de validación antes de aceptar los valores en las variables.

    El primer problema lo podemos resolver fácilmente cambiando las declaraciones de variables de Public a Private . Cuando hacemos eso, deberíamos tener algún método indirecto para almacenar y recuperar valores de las variables privadas. Ese es el propósito de Get y Dejar Procedimientos de Propiedad, para cada Propiedad del Objeto. Hagamos estos cambios en el Módulo de Clase.

    Abra el Class Module ClsArea. Cambie la palabra Public a Private para las tres variables.

    Creación de procedimientos de propiedad

    Seleccione Procedimiento de Insertar Menú, escriba strDesc en el Nombre control de texto, seleccione Propiedad en el Tipo Grupo de opciones y Público en el Alcance grupo de opciones Haga clic en Aceptar para insertar los Procedimientos de propiedad para el Private p_Desc Variable (Propiedad).

    Option Compare Database
    Option Explicit
    
    Private p_Desc As String
    Private p_Length As Double
    Private p_Width As Double
    
    Public Property Get strDesc() As String
      strDesc = p_Desc 'return the value from p_Desc
    End Property
    
    Public Property Let strDesc(ByVal strNewValue As String)
      p_Desc = strNewValue ‘store the value into p_Desc
    End Property
    

    Tanto el Obtener Procedimiento y Let El procedimiento se declara como Público . Ambos nombres de procedimientos son iguales strDesc. De forma predeterminada, el devuelto el tipo de datos es Variante en el Obtener El procedimiento y el tipo de datos de parámetro también se insertan como variante en Let Procedimiento. Estos podemos cambiarlos a tipos específicos según sea necesario, lo cual hicimos y cambiamos a String tipo. Las tres primeras letras str en strDesc le da al usuario una pista de que la propiedad espera un valor de tipo de datos de cadena. Cambiar el Dejar Propiedad Procedimiento Parámetro Nombre de variable vNuevoValor a cadenaNuevoValor

    Cuando insertamos el Procedimiento de propiedad, siempre se insertan con Get y Dejar Pares de procedimientos para una variable.

    Ahora, fíjate bien en la expresión que hemos escrito dentro del Get Procedimiento. El lado izquierdo del = Firme el nombre del procedimiento Get strDesc actúa como una variable para devolver el valor copiado de la variable privada p_Desc al programa de llamada.

    El Dejar Procedimiento strDesc acepta el valor de cadena en el parámetro Variable strNewValue . El valor de entrada se transfiere a nuestra variable privada p_Desc.

    El punto a tener en cuenta aquí es que no hay acceso directo a nuestra variable privada p_Desc al mundo exterior. Transporte de valores Desde/Hacia la variable (propiedad) p_Desc siempre se enruta a través de Get/Let Solo procedimientos de propiedad y sujeto a comprobaciones de validación (aún no implementado). Más adelante introduciremos verificaciones de validación en la entrada de valores (Procedimiento Let) en la Propiedad.

    El Obtener/Dejar Los procedimientos se ejecutan automáticamente según lo que hagamos con la propiedad Objeto en una expresión en Programas VBA.

    El Obtener El procedimiento se ejecuta cuando usamos el Nombre de propiedad en una expresión de la siguiente manera:

    ‘ Reads the value from p_Desc to Print
    
    Debug.Print oArea.strDesc
    
    OR
    
    ‘ Reads the value from p_Desc and assigns it to the variable X
    
    X = oArea.strDesc
    
    

    El Dejar El procedimiento de propiedad se ejecuta cuando intentamos asignar un valor al nombre de la propiedad. Consulte la expresión de ejemplo en nuestro programa de prueba a continuación:

    oArea.strDesc = “Carpet”
    
    

    En libros anteriores de BASIC Language, puede ver el uso de la palabra clave LET.

    LET X = 25 ‘ LET is optional
    
    

    Como era opcional, la instrucción funciona sin ella y dejó de usarse.

    Aquí, si solo estás leyendo algún valor de una variable y no almacenar nada en ella directamente, entonces puede omitir el procedimiento Let y usar solo Get Procedimiento.

    Esta regla se aplica también al procedimiento Let. Solo puede usar Let Procedimiento, si está asignando algún valor en una variable privada pero no lee nada de la misma variable y luego omite el procedimiento de obtención.

    El Obtener y Dejar Los procedimientos se ejecutarán uno tras otro si nuestra expresión es algo como lo siguiente:

    oArea.strDesc = oArea.strDesc & “ – King Size.”
    
    

    En la expresión anterior, obtendremos el valor existente de la variable privada p_Desc y modifique la descripción y guárdela de nuevo en la misma variable. En resumen en una expresión si usa el nombre de la propiedad a la derecha del signo igual (= ) el Obtener Se llama al procedimiento y Let El procedimiento se ejecuta cuando el nombre del procedimiento de propiedad del objeto aparece a la izquierda del igual (= ) firmar.

    Inserte dos conjuntos de procedimientos de propiedad para las variables p_Length y p_Ancho. Cuando proporciona los nombres de Procedimiento en el Nombre control dar el nombre dblLength y dblAncho para dar una pista al usuario de que estas propiedades esperan números de doble precisión como entrada.

    Objeto de clase ClsArea con sus procedimientos de propiedad.

    El código completo hasta ahora con los procedimientos de propiedad dblLength y dblWidth se proporciona a continuación como referencia y para actualizar su código.

    Option Compare Database
    Option Explicit
    
    Private p_Desc As String
    Private p_Length As Double
    Private p_Width As Double
    
    Public Property Get strDesc() As String
      strDesc = p_Desc 'copy the value from p_Desc
    End Property
    
    Public Property Let strDesc(ByVal strNewValue As String)
      p_Desc = strNewValue
    End Property
    
    Public Property Get dblLength() As Double
      dblLength = p_Length
    End Property
    
    Public Property Let dblLength(ByVal dblNewValue As Double)
      p_Length = dblNewValue
    End Property
    
    Public Property Get dblWidth() As Double
      dblWidth = p_Width
    End Property
    
    Public Property Let dblWidth(ByVal dblNewValue As Double)
      p_Width = dblNewValue
    End Property
    

    El programa de prueba con cambios.

    Si ha terminado de completar el código anterior, permítanos hacer cambios en nuestro programa de prueba, para reflejar los cambios que hicimos aquí. El código de ejemplo modificado se proporciona a continuación.

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    ‘Property Let procedures called here
    
    oArea.strDesc = "Carpet"
    oArea.dblLength = 25
    oArea.dblWidth = 15
    
    Debug.Print "Description", "Length", "Width"
    
    ‘Property Get Procedures called here to print
    Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth
    
    Set oArea = Nothing
    
    End Function
    
    

    Cuando ingresa un punto (.) inmediatamente después del nombre del objeto oArea (oArea.), VBA IntelliSense muestra la lista de nombres de procedimientos de propiedad y puede seleccionar el requerido de la lista sin escribirlo manualmente.

    El propósito de este objeto de clase es calcular el área de algo, como el área de la habitación, la alfombra, la loseta del piso o cualquier material, que tenga valores de largo y ancho. Eso significa que necesitamos una función pública para calcular el área de los valores de longitud, ancho y descripción de cualquier elemento ingresados ​​en el objeto de clase.

    Método de objeto ClsArea:Area()

    Aquí está el Código para la Función Pública:

    Public Function Area() As Double
       Area = Me.dblLength * Me.dblWidth
    End Function
    

    Puede insertar esta función desde Insertar Menú entrando en Área en el Nombre Control, seleccionando Función del Tipo grupo de opciones y Público como Alcance en el módulo de clase ClsArea. Complete la función ingresando la línea en el medio.

    Podemos abordar directamente las variables p_Length y p_Width (porque la función Area() forma parte del Módulo de Clase) en la expresión para el cálculo del Área. Pero estamos tomando la ruta adecuada y llamamos a los procedimientos Get dblLength y dblWidth para el cálculo. Es posible que hayas notado la referencia Yo. utilizado para calificar los procedimientos de obtención de dblLength, dblWidth, como solíamos escribir en los módulos de clase de formulario/informe, para hacer referencia al objeto actual en la memoria y sus propiedades. Como dije anteriormente, nuestro Objeto de clase personalizado puede tener varias instancias de Objeto abiertas en la memoria al mismo tiempo y el Yo La palabra clave se refiere a la instancia actual a la que pertenece el Área de funciones().

    La función de prueba con modificación.

    Modifique nuestra función de prueba ClassTest1() para incorporar la salida de la función Area() como se muestra a continuación:

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    oArea.strDesc = "Carpet"
    oArea.dblLength = 25
    oArea.dblWidth = 15
    
    Debug.Print "Description", "Length", "Width", "Area"
    Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth, oArea.Area
    
    Set oArea = Nothing
    
    End Function
    

    El cambio es solo en las declaraciones Debug.Print. Ejecute el código y consulte la ventana de depuración para ver el resultado.

    Se requieren dos procedimientos de eventos en los módulos de clase personalizados:Class_Initialize() y Class_Terminate() .

    Métodos de ejecución automática.

    El Class_Initialize() programa se ejecuta automáticamente cuando instanciamos un Objeto con el Nuevo Palabra Clave. Este programa se puede utilizar para establecer valores predeterminados en variables o instanciar otros objetos en la memoria. Un Objeto de Clase puede usar otras Clases como objeto(s) secundario(s) y necesita ser instanciado. Este aspecto lo exploraremos más a fondo y aprenderemos a hacerlo más adelante.

    El Class_Terminate() El programa se ejecuta cuando intentamos borrar el objeto de la memoria cuando Nada la palabra clave se ejecuta en la sentencia Set oArea =Nothing . Cuando finaliza el programa que utiliza el objeto de clase, la instancia del objeto en la memoria se elimina de forma predeterminada. Pero es una buena práctica de programación que usemos Set oArea =Nothing declaración como la última declaración ejecutable en nuestros programas para borrar el objeto de la memoria.

    Agregaremos los programas anteriores en nuestro módulo de clase. Agregue el siguiente código al final de su módulo de clase:

    Private Sub Class_Initialize()
       p_Length = 0
       p_Width = 0
    
       'MsgBox "Initialize.", vbInformation, "Class_Initialize()"
    End Sub
    
    Private Sub Class_Terminate()
       'MsgBox "Terminate.", vbInformation, "Class_Terminate()"
    End Sub
    
    

    Si desea probar estas dos subrutinas, elimine el símbolo de comentario y active MsgBox. Ejecute su programa de prueba una vez más. Encontrará Inicializar aparece un mensaje al principio (haga clic en Aceptar para continuar) y el mensaje Terminar Aparece un mensaje al final del programa de prueba.

    Sé lo que estás pensando ahora, como "tanto código para multiplicar dos variables juntas". Es cierto en esa perspectiva, pero es muy probable que hayamos escrito código para resolver problemas similares repetidamente cada vez, duplicando el código para las comprobaciones de validación y para otras salvaguardas de errores lógicos.

    Aquí, no estamos escribiendo un Programa ordinario, sino desarrollando un Objeto personalizado que se puede usar muchas veces o puede ser parte de otros Objetos, donde sea que lo necesitemos sin preocuparnos de cómo funciona, desde el punto de vista del usuario. Microsoft Access tiene muchos Objetos/Funciones integrados que usamos todo el tiempo sin preocuparnos de cómo funciona, configurando sus Propiedades o Parámetros y haciendo el trabajo.

    Tenemos un problema más del que ocuparnos, la validación verifica los valores ingresados ​​en dblNewValue Parámetro en Let Procedimientos de propiedad de dblLength() y dblWidth(), para asegurarse de que se asignan valores válidos a las propiedades del objeto p_Length y p_Ancho .

    Los valores negativos o cero ingresados ​​se consideran inválidos y debemos tomar precauciones para asegurarnos de que el usuario ingrese el valor correcto.

    Realización de comprobaciones de validación.

    El Let modificado Los segmentos de código de procedimiento de propiedad se dan a continuación. Realice los cambios en su código en consecuencia.

    Public Property Let dblLength(ByVal dblNewValue As Double)
       Do While dblNewValue <= 0
          dblNewValue = InputBox("Negative/0 Values Invalid:", "dblLength()", 0)
       Loop
    
       p_Length = dblNewValue
    End Property
    
    
    Public Property Let dblWidth(ByVal dblNewValue As Double)
       Do While dblNewValue <= 0
           dblNewValue = InputBox("Negative/0 Values Invalid:", "dblwidth()", 0)
       Loop
    
       p_Width = dblNewValue
    End Property
    
    

    El Hacer Mientras. . . Bucle se ejecuta repetidamente hasta que se ingresa un valor válido (mayor que 0) en dblNewValue por el Usuario

    Comprobaciones de validación en el método público:Area()

    Necesitamos una verificación de validación más en el Area() Función. Si el usuario llama a la función Area() sin ingresar valores válidos para la longitud y el ancho primero, entonces el usuario debe ser informado al respecto. Comprobaremos si las variables p_Length y p_Width tienen valores válidos antes de ejecutar la expresión para el cálculo del área. Aquí está el código:

    Public Function Area() As Double
      If (Me.dblLength > 0) And (Me.dblWidth > 0) Then
            Area = Me.dblLength * Me.dblWidth
      Else
            Area = 0
            MsgBox "Error: Length/Width Value(s) Invalid., Program aborted."
      End If
    End Function
    

    El código completo del objeto ClsArea.

    El código completamente completado de nuestro Class Module ClsArea se proporciona a continuación:

    Option Compare Database
    Option Explicit
    
    Private p_Desc As String
    Private p_Length As Double
    Private p_Width As Double
    
    Public Property Get strDesc() As String
        strDesc = p_Desc 'copy the value from p_Desc
    End Property
    
    Public Property Let strDesc(ByVal strNewValue As String)
        p_Desc = strNewValue
    End Property
    
    Public Property Get dblLength() As Double
       dblLength = p_Length
    End Property
    
    Public Property Let dblLength(ByVal dblNewValue As Double)
        Do While dblNewValue <= 0
           dblNewValue = InputBox("Negative/0 Values Invalid:", "dblLength()", 0)
        Loop
    
        p_Length = dblNewValue
    End Property
    
    Public Property Get dblWidth() As Double
       dblWidth = p_Width
    End Property
    
    Public Property Let dblWidth(ByVal dblNewValue As Double)
        Do While dblNewValue <= 0
           dblNewValue = InputBox("Negative/0 Values Invalid:", "dblwidth()", 0)
        Loop
    
        p_Width = dblNewValue
    End Property
    
    Public Function Area() As Double
    
       If (Me.dblLength > 0) And (Me.dblWidth > 0) Then
           Area = Me.dblLength * Me.dblWidth
       Else
           Area = 0
           MsgBox "Error: Length/Width Value(s) Invalid., Program aborted."
       End If
    
    End Function
    
    Private Sub Class_Initialize()
       p_Length = 0
       p_Width = 0
     'MsgBox "Initialize.", vbInformation, "Class_Initialize()"
    End Sub
    
    Private Sub Class_Terminate()
       'MsgBox "Terminate.", vbInformation, "Class_Terminate()"
    End Sub
    

    Procedimientos y métodos de propiedad de prueba.

    Puede probar nuestro objeto de clase personalizado ingresando valores negativos o 0 como entrada para las propiedades dblLength, dblWidth.

    En el programa de prueba, comente las líneas (oArea.dblLength=25 y oArea.dblWidth=15) para probar la función Area(). Debería mostrar el mensaje de error que hemos escrito dentro de la función.

    Nuestro módulo de clase de cálculo de área ahora se considera completo y lo hemos probado y encontramos que funciona correctamente. Puede probarlo más en busca de errores lógicos que haya pasado por alto. Si encuentra algo que no anticipé, compártalo conmigo.

    Plan futuro para las pruebas.

    Hemos probado el objeto de clase para un solo elemento. Necesitamos calcular el área de varios elementos (por ejemplo, el área de 5 dormitorios o 10 alfombras de diferentes tamaños, etc. Se nos dice que una vez que se desarrolla un objeto, podemos instanciarlo varias veces en la memoria asignando un conjunto diferente de valores en cada instancia del Objeto y puede trabajar con ellos.

    Además de eso, este objeto se puede usar como parte de otros objetos que desarrollamos con menos código porque parte de nuestro nuevo objeto de clase ya está desarrollado en el módulo de clase ClsArea.

    La próxima semana aprenderemos a crear una matriz de objetos personalizados para calcular el área de varios elementos.

    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