** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Recorrer propiedades modulo de clase
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoRecorrer propiedades modulo de clase

 Responder Responder
Autor
Mensaje
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Tema: Recorrer propiedades modulo de clase
    Enviado: 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


Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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


Editado por xavi - 03/Febrero/2024 a las 15:04
Xavi, un minyó de Terrassa

Mi web
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 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.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 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.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 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?
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 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?
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 03/Febrero/2024 a las 18:12
Busca VBIDE.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 03/Febrero/2024 a las 18:16
Ok, voy a intentar aprender algo Cry
Gracias
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4856
Enlace directo a este mensaje Enviado: 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


 


Editado por javier.mil - 04/Febrero/2024 a las 18:05
Arriba
Sheerkhan Ver desplegable
Asiduo
Asiduo


Unido: 01/Octubre/2011
Estado: Sin conexión
Puntos: 284
Enlace directo a este mensaje Enviado: 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)
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable