Access - Tabla no me muestra los dados de la columna dependiente

Tengo una BBDD con 3 tablas:

- Clientes: id, nombre y provincia.

- Productos: id, nombre y tipo.

- Pedidos: id, cliente, producto y cantidad.

Lo que quiero es que en la Tabla Pedidos me aparezca una lista desplegable en los campos Cliente y Producto, donde pueda escoger un cliente de los habidos en la Tabla Clientes, y un producto de los habidos en la Tabla Productos. Yo lo estoy haciendo mediante un Cuadro combinado escogiendo ambas tablas y diciéndoles a ambas tablas como Columna dependiente la 2, para que me al seleccionar un registro de la lista, me introduzca el nombre del cliente y del producto, pero me introduce el id.

¿Estoy haciendo algo mal, o es que funciona realmente así, que me deja visualizada la primera columna (el id) pero "internamente" me escoge la segunda columna (el nombre)?

1 respuesta

Respuesta
1

Creo que el planteamiento lo tienes mal: lo que debieras guardar en los campos cliente y producto de la tabla pedidos es el id del cliente/producto (para eso se usan los ids), aunque luego en el cuadro combinado muestres sólo el nombre. Para eso, tus campos de la tabla pedidos deberán ser numéricos, y los combos tener como columna dependiente la 1ª.

Dicho esto, me parece que tu problema está en que no tengas bien configurado el ancho de columnas del cuadro combinado. Comprueba lo siguiente: abre el formulario en vista diseño, haz click derecho sobre el cuadro combinado-> propiedades->pestaña formato->ancho de columnas, y comprueba que tienes dos valores separados por punto y coma (algo así: 0,101cm;6,9cm). Si quieres ocultar la columna del id (la primera), ponle el primer valor en 0 (así: o cm; 6,9 cm) y listo!.

No sé qué es eso de los combos.

En cuanto al planteamiento, tienes razón, debería ir el Id del cliente y del producto y no el nombre del cliente y del producto, pero entonces, ¿es que funciona así la Columna dependiente, cogiendo siempre la primera columna?, ¿qué sentido tiene entonces lo de Columna dependiente? porque perfectamente puedo tener como Clave principal en la Tabla Cliente el Nombre y no su Id (aunque esto sería ilógico). Creo que me faltan datos y por eso tiro de cosas que no tienen sentido para ti que entiendes de Access. Espero que me lo puedas aclarar.

No tengo ningún formulario creado, lo tengo en tablas. De igual forma, he probado con lo que dices y sí, me oculta la primera columna con el Id y me muestra el nombre, pero eso en la lista desplegable, en el propio formulario me aparece como contenido el Id, y yo lo que quiero es que me aparezca el nombre, cosa que no consigo con la Columna dependiente que CREO es lo que debería de hacer, tomarme el dato de la columna que le diga, y, si le digo 2, me debería de coger el Nombre y  la Id. Es lo que no entiendo.

Combo es la abreviatura de cuadro combinado (del inglés "combobox").

La propiedad "Columna dependiente", le indica que columna es de la que debe guardar el valor en la tabla. Por ejemplo, si tu cuadro combinado "Cliente" en la tabla "Pedidos" tiene este origen "SELECT Id, Nombre FROM Clientes", si le pones columna dependiente 1 te guardará en la tabla en el campo Cliente el Id, mientras que si le pones columna dependiente 2, te guardará el nombre del cliente, siempre que el tipo de dato sea el adecuado con el diseño de la tabla.

Otra cosa es el valor que se muestra, que lo controlas mediante la propiedad "ancho de columna". Si sólo pones un ancho (por ej., 2 cm), se verá siempre la primera columna, tanto en la tabla como al desplegar el cuadro combinado. Si le pones dos (2 cm; 4 cm), en la tabla se verá sólo la 1ª columna, la del Id, mientras que al desplegar el cuadro combinado verás las dos columnas (Id y nombre). Y por último, si pones la primera columna en 0 (o cm, 4 cm), tanto en la tabla como al desplegar el cuadro, sólo verás la segunda columna (el nombre del cliente).

Lo que comentas del formulario, que sólo se ve el id, imagino que es porque tienes un cuadro de texto y no uno combinado sobre el campo cliente de la tabla pedidos. Para que te muestre el nombre del cliente (o producto), puedes convertir el cuadro de texto en uno combinado, y le pones las mismas opciones que tienes en la tabla. Es la forma más fácil.
Tienes otra opción, que es poner un cuadro de texto independiente (es decir, no basado en ningún campo de la tabla), y en su origen de control, le pones esto:
=DBúsq("[Nombre]";"[Clientes]";"[Id]=" & [Formularios]![Pedidos]![Cliente])
A ver si esto te clarifica un poco las dudas, si no, te preparo un ejemplillo para que veas las diferencias.

Ese es el problema, que le tengo puesto al campo Nombre como Tipo de dato Texto, Columna dependiente 2, y, aunque en el desplegable me salgan los campos Id, Nombre y Provincia porque le tengo puesto Número de columnas 3, luego, en la lista desplegable sí que me salen las 3 columnas, pero al seleccionar un registro me guarda el Id y no el Nombre, es lo que no entiendo...

Con el Ancho de columna solo modifico el tamaño de la columna que aparece en la lista desplegable, pero no en el contenido que se me guardará en el campo de la Tabla, que es lo que quiero, guardar el Nombre.

Respecto al formulario, es lo que tengo, un Cuadro combinado. He hecho eso de un Cuadro de texto independiente pero me sale Error =/.

Estoy iniciándome con el Access, así que poco entiendo de esto ^^U.

Mira, te dejo un enlace con mi BBDD para que le eches un vistazoa ver si es que se me escapa algo que decirte: http://downloads.ziddu.com/download/23920534/Pruebas.rar.html 

Sí, es problema es el que te comentaba de los anchos: una cosa es el valor que te almacena (el de la propiedad Columna dependiente) y otra el que te muestra (propiedad ancho de columnas).

En la tabla pedidos, en tu campo id cliente, te muestra y guarda el id, porque le tienes puesto columna dependiente 1 y no tienes ningún ancho de columnas (por defecto access siempre muestra la primera columna). En el campo Cliente, te guarda el nombre (columna dependiente 2), pero te muestra el id porque no le tenías puesto el ancho adecuado a las columnas.

Además, si le cambias la propiedad "ancho de la lista" de "auto" a la suma de las columnas, al desplegar el cuadro combinado, verás las columnas completas.

En el formulario te ocurre lo mismo. Tienes que establecer a los cuadros combinados las propiedades ancho de columna a los valores adecuados.

En cuando al cuadro de texto independiente, en tu caso sería así:

=DBúsq("[Nombre]";"[Clientes]";"[Id Cliente]=" & [Formularios]![Pedidos]![Id Cliente])

Porque tus nombre son "Id Cliente" y no "Id" y "Cliente".

Con esto ya debieras resolver tu duda. Ahora bien, estás usando un mal sistema, pues estás duplicando información en la base de datos: Si ya tienes los datos de los clientes y productos en sus respectivas tablas, no es necesario que los guardes de nuevo en la de pedidos, con guardar el id es suficiente. Luego siempre puedes mostrar la otra información mediante cuadros de texto independientes, o si sólo te interesa el nombre del cliente/producto, en el propio cuadro combinado ocultas el id y muestras el nombre, según lo que te expliqué arriba.

Te dejo aqui tu BD modificada, para que veas (lo nuevo es la tabla Pedidos2 y el formulario Pedidos2): http://www.filebig.net/files/HNZS7M8hid

Vale por fin entendí el Ancho de columna y Ancho de lista. Lo que no llegaba a entender es que en el campo se mostrará el primer valor que sea visible en la lista, así, si le tengo puesto 0;0;2, por ejemplo, en el campo se me visualizara el primer valor visible en la lista, es decir, la Provincia, y, se almacenará el número de Columna dependiente que le diga, donde, si le digo 1, pues me almacenará el Id_Cliente. Eso era lo que no llegaba a entender.

Respecto a lo del formulario, ya entendiendo eso del Ancho de columna, he estado probando y he visto que si en la Tabla me sale como quiero, visualizando el Nombre del cliente pero almacenándome el Id_Cliente, en el Formulario me pasa igual, pero, como dices, si quiero visualizar el Id_Cliente y el Nombre del cliente, debería introducir un Cuadro de texto e introducir esa fórmula que me indicas, para que se introduzca automáticamente. ¿Eso también puede hacerse en una Tabla? ¿Me podrías explicar el funcionamiento de esa fórmula, cómo crearla?

Muchas gracias por tu ayuda.

Sí, la Función DBúsq (DLookup en inglés) tiene los siguientes argumentos:

1º/ El nombre del campo en el que quieres buscar, por ejemplo "Nombre"

2º/ La tabla/Consulta en la que está el campo, por ejemplo "Clientes"

3º/ El criterio o condición para hacer la búsqueda, por ejemplo, que el id Cliente sea igual al del cuadro combinado id cliente del formulario: "[Id Cliente]=" & [Formularios]![Pedidos]![Id Cliente]

Si buscas en la ayuda de access, te viene explicado con más ejemplos, pues la sintaxis es diferente si el criterio es de tipo numérico, de texto o fecha. Si es de texto, tiene que ir entre comillas simples, y si es de fecha, entre almohadillas, por ejemplo:

"Nombre='Juan'", o "Fecha=#01/01/2014#"
Para crearla, o lo haces directamente a mano, o usas el generador de expresiones que trae access, pulsando el botón de los 3 puntos que te aparece a la derecha de la fila "Origen del registro", aunque a mi personalmente no me gusta este método.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas