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 ;-)