Campos multivalor en Accesss 2007
Los campos multivalor son esa novedad de Access 2007 que nadie había pedido y muy pocos van a apreciar. No parecen imprescindibles.
A primera vista, son un cuadro combinado especial que puede resultar útil en ciertas ocasiones y que es sencillo de usar en cuanto encuentras la explicación de cómo hacerlo
Sólo hay que definir el campo en la tabla como cualquier otro, asignarle las propiedades de búsqueda como haríamos para usar un cuadro combinado y poner «Sí» en la propiedad adecuada ¿La encuentras?
Ahí está. «Permitir varios Valores | Sí «. Es tan discreta, tan poquita cosa que uno tiene que leerse una y otra vez toda la ayuda para encontrarla. Decididamente, Office 2007 necesita una herramienta que, en español de España, podríamos llamar «Dónde coño está…»
Bueno, la novedad no es gran cosa, pero es tan sencillo que merece la pena usarla ¿Seguro? Seguramente sí, pero no es tan sencillo.
De entrada, un campo que contiene varios valores no encaja en una base de datos relacional, y esto es algo que no afecta sólo a los puristas; por ejemplo, en cuanto mostramos la tabla para realizar una consulta, nos encontramos con algo así:
Es decir, un campo del que cuelga otro campo. Entonces es cuando hay que leerse toda la ayuda al respecto y comprender la diferencia entre el campo enlazado y el campo mostrado…
Buscando «campos multivalor» en la ayuda, encontramos suficiente información para trabajar con ellos en las consultas, incluso bastanta para los recordsets ¡Ay, los recordsets!
La ayuda es bastante clara con su uso en recordsets de DAO, pero no dice que lo no dice no hay que suponerlo. En un recordset de DAO, un campo multivalor se comporta como un nuevo recordset, secundario, en el que podemos recorrer y añadir o quitar registros usando los métodos propios de DAO. Para crear una instancia de este recordset secundario, usamos la propiedad Value del campo multivalor. El recordset secundario tiene un sólo campo que se llama Value, cuya propiedad predeterminada es Value ¿Está claro, no?
Entonces uno piensa que se puede hacer algo así:
While Not !MiCampo.Value.EOF
msgbox MiCampo.Value.Value.Value
Wend
Más que nada por hacer un poco de cachondeo con el Value y, para cachondeo vale, pero en cuanto queremos usar Add o Edit.. nos empiezan a salir extraños mensajes sobre métodos que no son de VBA. Para crear una instancia del recordset secundario, es necesario dimensionar un nuevo recordset y asignarle la propiedad Value del campo multivalor; no lo dice la ayuda, pero usar ésta directamente da problemas.
Dim miRs as DAO.Recordset
Set miRs = !MiCampo.Value
While Not miRs.EOF
…
¿Tanta complicación merece la pena? Al parecer, los campos multivalor son imprescindibles para lograr una total compatibilidad con los tipos de datos de las listas de Sharepoint, y la compatibilidad con Sharepoint sí que merece la pena.
¿Pero merece la pena usarlos? Yo creo que sí, que los vamos a acabar manejando con soltura y por un motivo que me he guardado en la manga: Los campos de «Datos anexados» («Attached») son también campos multivalor, de manera que, aunque tienen algún método y propiedad añadidos, comparten con los campos multivalor muchas características, y los campos «Attached» sí que merecen la pena, pues, aunque sirvan para otras cosas, sobre todo solucionan los gravísimos problemas que tenía Access para almacenar imágenes.
Pero de los datos anexados hablaremos otro día 😉
10 Responsesso far
Me parece interesante. Lo veo como una tabla relacionada pero mas sencillo y claro de crear y gestionar.
Lo que no veo tan claro es como acceder. Como introducir valores a la hora de importar y exportar registros, etc.
Esa es precisamente la cuestión que, aunque es aparentemente muy sencillo, luego cuesto lo mismo que trabajar con una tabla relacionada, con la diferencia de que a eso estamos acostumbrados, pero a cómo se hace con los campos multivalor aún no.
Hola: esta opción me parece muy interesante y llevo buscando el modo de hacerlo varios días. El problema es que a mí no me aparece esa opción en las propiedades de búsqueda. Os lo agradecería si pudieseis darme un motivo o solución. Muchas gracias
Posiblemente estés usando un formato de base de datos anterior, un mdb.
Aunque Access 2007 permite usar muchas de sus características con archivos mdb, las específicas de datos, evidentemente, sólo se puede usar en el nuevo formato, el accdb.
Después de escribir este artículo, he estado trabajando con campos multivalor y, sinceramente, si vas a usarlos en programación, son un auténtico dolor de cabeza. Muy interesantes si sólo se trata de crear una tabla y un formulario, pero de la que uno se mete en profundidades…
hola; bueno esto esta interesante heeeeeeeeeee
Todavía no he usado Access 2007 pero creo que estos campos sirven para algo que yo necesitaba en formularios y ejecutar consultas, evitando tener que poner casillas de verificación en una tabla para seleccionar las opciones que uno desea de manera independiente. Voy a probarlos!
NO ME SALE ESA PROPIEDAD DE PERMITIR VARIOS VALORES
COMO PUEDO HACER QUE APAREZCA?
—————-
Muy buen trabajo Chea: Explicación sencilla y útil.
En cuanto a la utilidad de los campos multivalor, discrepo de la mayoría. Se sale fuera de norma de diseño de B. de D., y las normas están hechas para «que nos entendamos» entre todos. No sólo existe Access como base de datos, y si empezamos a utilizar atajos anárquicos, a la hora de exportar vamos a tener problemas. Me parece una implementación que es mejor no utilizar.
Sé que estos comentarios no van a gustar, pero es lo que pienso sobre el tema, y además lo argumento.
Si si, muy prácticos para usar en formularios pero generan una información que es muy dificil de manipular en programación, y lo que es peor; a la hora de realizar un informe, cosa que uno supone como utilidad de principiante. Por ejemplo: si yo tengo un form «Hoteles» que tiene un combo enlazado a un campo multivalor como ser «Servicios», la subtabla (la que no se vé) guardará un registro con el par Hotel-Servicio por cada servicio que yo marque pero en el campo «Servicios» de la tabla hoteles se verán todos los servicios (o los ID de esos servicios si la columna dependiente guarda este dato) que marqué separados por un «;». Este campo es solo ilustrativo. Si me sirve esta información bien y si no que Dios me ayude a la hora de «hacer» un informe a partir de una tabla o un formulario. Este será todo el dato que le podré sacar al famoso campo multivalor (a menos que empiece a programar, usar recordsets en el aire y cosas por el estilo antes de llamar al informe).
En fin, son un dolor de cabeza.
Saludos.