Imprimir página | Cerrar ventana

Recorrer propiedades modulo de clase

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86853
Fecha de impresión: 26/Marzo/2026 a las 20:57


Tema: Recorrer propiedades modulo de clase
Publicado por: Sheerkhan
Asunto: Recorrer propiedades modulo de clase
Fecha de publicación: 03/Febrero/2024 a las 14:50
Hola, buenas.
Lo que pretendo hacer es desde un módulo de clase actualizar la tabla pasándole  las propiedades
de forma dinámica.
No sé si puede hacerse, pero ya he probado a construir la variable (Nomfld ) de muchas formas y
no consigo hacer que funcione.

Gracias de antemano por vuestro tiempo.
Sheerkhan

Private Sub GuardarconSlCase(rs As DAO.Recordset)
'Propósito: Guardar los valores de las propiedadades _
actualizadas en la tabla de la base de datos
'Esto funciona*******************************
With rs
    .Fields("codCliente").Value = Me.m_codCliente
    .Fields("Nombre").Value = Me.m_Nombre
    .Fields("CodPostal").Value = Me.m_CodPostal
    .Fields("Provincia").Value = Me.m_Provincia
End With
'Esto funciona*******************************

'Exit Sub
'PRUEBA************************************
'Conseguir pasarle la propiedad de forma dinámica
'Ej. Nombre de la propiedad = m_Nombre del campo

Dim fld As DAO.Field
Dim Nomfld As Variant

With rs
    For Each fld In .Fields
            
        Nomfld = "Me.m_" & fld.Name
 
        Select Case fld.Name
                    
            Case "IdCliente"
                'Autonumerico de la tabla
                        
            Case "CodCliente"
                .Fields(fld.Name).Value = 88888 ' Funcion Autonumerico en Mdl_Autonum
                
            Case "Nombre"
                .Fields("Nombre").Value = Me.m_Nombre

            Case Else
                '.Fields(fld.Name).Value = Nomfld
                'Aquí es donde no consigo que funcione ******************
        End Select

    Next
End With
End Sub





Respuestas:
Publicado por: xavi
Fecha de publicación: 03/Febrero/2024 a las 15:04
A ver...

En Nombre utilizas Me.m_Nombre  lo que entiendo devuelve el valor que hubiera en el control m_Nombre del formulario.

Entonces en el Else debes hacer lo mismo:

.Fields(fld.Name).Value = Me(Nomfld)

(tu estás pasando como valor el nombre del control, no su contenido)

Vamos, digo yo.

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Sheerkhan
Fecha de publicación: 03/Febrero/2024 a las 16:02
Hola Xavi, buenas tardes.
El código no está en un formulario sino en un módulo de clase y lo que intento pasarle son las propiedades del objeto creado, declaradas en el encabezamiento del mismo módulo de clase, no el contenido de algún control(combo, cuadro de texto etc)

.Fields("Provincia").Value -- Es el campo del recordset que quiero actualizar, esto funciona

= Me.m_Provincia --(Me.) Supongo que se refiere al objeto o clase, y el resto lo construyo a partir del nombre del campo.
Igual no se puede hacer así, si conoces otro modo que no sea uno a uno, estoy aprendiendo.

Perdona si no sé explicarme lo suficiente, es que acabo de empezar con los módulos de clase.

Tampoco funciona (acabo de probarlo),

Me(Nomfld)-- Resulta en (MeMem_CodPostal)

Gracias.


Publicado por: xavi
Fecha de publicación: 03/Febrero/2024 a las 16:09
Nada que perdonar. Tu por lo menos estas empezando con los módulos de clase. Para mi es una de esas "tareas pendientes" que aun no he tenido tiempo (ni necesidad) de abordar.

A ver si alguien con más experiencia nos ilustra sobre el tema.


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Sheerkhan
Fecha de publicación: 03/Febrero/2024 a las 16:10
Si hubiera alguna forma de meter las propiedades en una colección, array o similar ¿se podria hacer?

¿Alguna idea?

Gracias.


Publicado por: Mihura
Fecha de publicación: 03/Febrero/2024 a las 16:31
Que yo sepa no se puede ... y mira que lo busque Unhappy.

Las propiedades, en este caso el 'equivalente' del campo del Recordset no se pueden nombrar de manera indirecta.

Yo pensé en declarar un array de dos dimensiones o un objeto Collection (o Dictionary) metiendo en uno el nombre del campo y en otro el valor ... pero no me convenció nada de nada.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Sheerkhan
Fecha de publicación: 03/Febrero/2024 a las 16:56
Yo estoy igual, no sé por donde tirar, si dejarlo o qué.

Es una lástima, pues de poder hacerlo de forma dinámica nos ahorraría mucho código repetitivo.

Gracias.


Publicado por: Mihura
Fecha de publicación: 03/Febrero/2024 a las 17:07
Poderse se puede ... con un array / collection / dictionary ... la cuestión es ¿merece la pena?.

Hay algunos casos que si, por el hecho de tener los valores de un registro de un recordset 'a disposición' ... pero en la mayoría no.

También puedes tirar por el camino de crearte una función que te cree la clase con todas las variables que necesitas (a partir del TableDef lo consigues). Eso sí, cada vez que cambies la tabla te toca cambiar la clase.



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Sheerkhan
Fecha de publicación: 03/Febrero/2024 a las 17:33
Lo que no encuentro es como acceder a las propiedades de forma recursiva algo como

 for each

¿como puedo obtener el listado de los miembros de la clase? ¿se puede?


Publicado por: Mihura
Fecha de publicación: 03/Febrero/2024 a las 17:55
Lo que buscas no existe ... no hay una colección de propiedades de una clase.

Te la puedes crear tú.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Sheerkhan
Fecha de publicación: 03/Febrero/2024 a las 18:03
A eso me refiero, ¿como la puedo crear por medio de código sin tener que meterlas a mano?


Publicado por: Mihura
Fecha de publicación: 03/Febrero/2024 a las 18:12
Busca VBIDE.

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Sheerkhan
Fecha de publicación: 03/Febrero/2024 a las 18:16
Ok, voy a intentar aprender algo Cry
Gracias


Publicado por: javier.mil
Fecha de publicación: 04/Febrero/2024 a las 17:55
Buenas,

Para saber el nombre de todas las propiedades con su respectivo valor de todos los campos de todas la tablas puedes puedes hacerlo con el siguiente codigo

Copia y pega en un MODULO STANDARD ( No de Clase)


Private Function funTest()
      Call XecListarPropiedadesCamposTablas
      MsgBox "Fin"

      DoCmd.RunCommand acCmdAppMaximize      ' << aconsejable No obligatorio
      DoCmd.RunCommand acCmdDebugWindow
End Function



Public Sub XecListarPropiedadesCamposTablas()
'---------------------------------------------------------------------------------------
' Procedimiento: XecListarPropiedadesCamposTablas
' Fecha: 04/02/2024
' Autor: Javier Gomez ("Javier.Mil")
' WEB: www.accessdemo.info
' Proposito: Lista todas las propiedades con su respectivo valor de todos los campos de todas las tablas
'---------------------------------------------------------------------------------------

On Error Resume Next

      Dim tdf As DAO.TableDef
      Dim fld As DAO.Field
      Dim prp As DAO.Property


      For Each tdf In CurrentDb.TableDefs
            If Left(tdf.Name, 4) <> "MSys" Then
                  For Each fld In tdf.Fields
                        For Each prp In fld.Properties
                              Rem imprime nombre y valor de la propiedad
Debug.Print tdf.Name & " >>>> " & fld.Name & " >>>> " & prp.Name & " >>>> " & prp.Value
                        Next prp
                  Next fld
            End If
      Next tdf


End Sub


 


-------------
https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info





Publicado por: Sheerkhan
Fecha de publicación: 06/Febrero/2024 a las 00:35
Hola Javier.

Tienes toda la razón, no se me había ocurrido hacerlo por medio de la tabla, en mi caso es perfectamente aplicable,
pues las propiedades de la clase coinciden con los campos de la tabla.

Al final desistí, después pasar día y medio  leyendo y dándole vueltas, me dí cuenta que mis conocimientos no son suficientes y por obcecarme no estaba avanzando. Así que las metí "a piñón" y a otra cosa mariposa. Disapprove

De todas formas, bueno es saberlo.
Por mí se puede cerrar el hilo.

Muchas gracias. (a todos)



Imprimir página | Cerrar ventana