duda relaciones entre tablas (principiante)

Dudas sobre Tablas, Consultas, Formularios, Informes...
yavuka
Nivel 1
Mensajes: 12
Registrado: Jue Oct 17, 2019 5:30 am

Re: duda relaciones entre tablas (principiante)

Mensajepor yavuka » Mié Nov 06, 2019 12:54 am

He tratado de simular lo que tenía para productos pedidos con lotes productos en una base de datos simplificada, únicamente con tablas que contengan campos relacionados, pero tengo problemas al intentar relacionar los formularios/subformularios. Hago 3 consultas, cada una de ellas sin mezclar datos entre tablas (no es lo que buscaba, pero he optado por hacerlo para evitar problemas).
- La primera, consulta pedidos con campos codigo cliente y pedido (de tabla "pedidos") con formulario asociado (lo llamo formulario).
- La segunda, consulta productos con campos pedido y código de producto (de tabla "productos pedidos") con un formulario asociado (lo llamo subformulario).
- La tercera, consulta lotes con campos código de producto y lote asociado (de tabla "lote productos") con un formulario asociado (lo llamo subsubformulario).
- Hay una cuarta consulta que quizás debería hacer con lote y campos fecha y hora (de tabla "lotes") con otro formulario; o bien añadir estos dos campos a la tabla "lote productos" y borrar la tabla "Lotes". A esta fase aún no he llegado.

Al encajar los formularios, utilizo como formulario principal 1º formulario pedidos con campos de consulta pedidos, 2º,subformulario formulario productos con campos consulta productos y 3,º formulario (subsubformulario) lotes, con campos consulta lotes.

El problema es que al introducir los datos en el subformulario (que contiene lo productos), me aparece de una ventana donde indica que se requiere un registro relacionado de la tabla lotes-productos y no puedo continuar (envío pantallazo del mensaje de error).

Mi objetivo, como como comentaba en post anteriores, es hacer:
- un formulario primario donde aparezcan datos del cliente y pedidos. Si me muevo por el navegador de registros, me movería otro pedido con número de pedido distinto y con el mismo o distinto código de cliente (un cliente puede hacer varios pedidos).
- En el subformulario, con el número de pedido y el número de cliente, debo poder incluir tantos productos como quiera, al moverme por el navegador de registros, tendría que cambiar de un codigo de producto a otro (dentro del mismo pedido cambian los productos).
- En el subsubformulario, para un mismo producto debo incluir tantos lotes como quiera que se diferenciarían entre sí por el campo hora. Y al moverme por el navegador de registros de este subsubformulario debería quedar fijo el código del producto (hasta que cambie de producto en el subformulario) e ir cambiando el lote + día+ la hora (este último campo debería ser el clave, puesto que se puede repetir el lote y el día en diferentes registros).

Llevo ya un tiempo atascado con la configuración de la base de datos, pero no consigo que me funcione como me gustaría.
Adjunto imágentes de la tabla relacional entre las bases de datos y el error que me aparece. Recalco que cada consulta para crear los formularios tienen todos los campos correspondientes a una misma tabla. En esta ocasión no incluyo campos de varias tablas para cada una de las 3 consultas para evitar problemas de consultas bloqueadas o en blanco. Aunque lo ideal es que para el subformulario recoja la información del pedido+cliente (ya en el formulario principal)+productos y para el subsubformulario aparezca el campo cliente+pedido+productos(ya en el subformulario principal+formulario secundario)+lote+fecha+hora para que quien lo utilice sepa en todo momento a qué cliente corresponde el pedido y de qué pedido se trata.

Si alguien es tan amable de ayudarme y probar la base de datos se lo agradecería enormemente. Dejo la base de datos prueba en el siguiente enlace.

https://www.filebig.net/files/NVfUaKYd43

Gracias

EDITO: en las pruebas que he hecho con la base de datos definitiva también he encontrado algún problema con el campo clave "código de producto" de la tabla "Productos pedidos". Al unirlo con la tabla "lotes productos" no me deja duplicar el código producto (índice con duplicados en la tabla), para poder hacer la relación me exige un índice sin duplicados para el campo "código de producto" en la tabla "productos pedidos". Pero necesitaría tener códigos duplicados porque para distintos pedidos se puede pedir un mismo producto.
Adjuntos
relaciones entre tablas simpl.png
error formularios enlazados.png

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1122
Registrado: Sab Oct 24, 2015 10:12 pm

Re: duda relaciones entre tablas (principiante)

Mensajepor Sveinbjorn » Jue Nov 07, 2019 11:30 am

El problema, según yo lo veo, está en un diseño "deficiente" de las tablas (al menos en las imágenes que pones, la BD no la puedo abrir en este momento por la versión de Access), que provoca que las relaciones no vayan en el sentido que deben ir, y de ahí todos los errores que te saltan.

Por ejemplo, entre las tablas Lote y LotesProductos, la relación, por lógica tendría que ser de Lote (1) a LotesProductos (Varios), porque un lote contendrá uno o varios productos, y no como la tienes ahora de LotesProductos (1) a Lote (Varios).

Lo mismo, creo, se podría señalar para ProductosPedidos y LotesProductos, que tendría que ir en esa dirección (de ProductosPedidos a LotesProductos) y no al revés como tienes ahora, porque un pedido puede tener varios lotes, pero un lote no puede estar en varios pedidos.

Las "deficiencias" que veo en el diseño de las tablas son:
Tabla ProductosPedidos: falta un campo clave autonumérico que identifique inequívocamente el registro, y quitar la clave combinada. Ese campo clave será el que se enlace con la tabla LotesProductos
Tabla LotesProductos: falta un campo clave autonumérico que identifique inequívocamente el registro, y quitar la clave combinada. También falta un campo para vincularla con el campo clave de ProductosPedidos.
Tabla Lote: falta un campo clave autonumérico que identifique inequívocamente el registro, y quitar la clave combinada. Este campo clave será el que se relacione con el campo Lote de LotesProductos.
Sveinbjorn El Rojo

yavuka
Nivel 1
Mensajes: 12
Registrado: Jue Oct 17, 2019 5:30 am

Re: duda relaciones entre tablas (principiante)

Mensajepor yavuka » Jue Nov 07, 2019 1:15 pm

De acuerdo, he añadido los campos clave autonuméricos en las 3 tablas. Además, en la tabla lotes productos he añadido un campo numérico que se llama "enlace" y que une las tablas productos pedidos y lotes. Adjunto la captura de pantalla. Ahora las relaciones van de 1 (tabla productos pedidos) a varios (tabla lotes productos) y de 1 (tabla lote) a varios (tabla lotes productos), acordes a lo que me indicas.

He construido los subformularios, pero esta vez me aparece el error ("you cannot add or change a record because a related record is requiered in TABLE "LOTE") en el siguiente subformulario, en el subsubformulario lotes productos (antes me aparecía en el subformulario productos pedidos). Adjunto la captura de pantalla del error. Es como si hubiera avanzado un paso, pero aún no puedo individualizar por fecha y hora en el subsubsubformulario lotes.

NOTA: ¿qué versión necesitarías para ver el archivo? He intentado guardarlo como versión 2003, pero no me lo permite. Si necesitas ver la base de datos y me indicas la versión, puedo intentar crear la base de datos en esa versión.
Adjuntos
error subsubformulario.png
relaciones entre tablas con autonumeración.png

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1122
Registrado: Sab Oct 24, 2015 10:12 pm

Re: duda relaciones entre tablas (principiante)

Mensajepor Sveinbjorn » Jue Nov 07, 2019 2:26 pm

No me acabas de entender con el diseño de las tablas, jejeje...

A ver,
.- En ProductosPedidos: el campo Id, bien.
.- En LotesProductos: el campo Id, bien. El campo CodigoProducto no tiene sentido, bórralo. El campo Enlace no tiene sentido que lo relaciones con las dos tablas ProductosPedidos y Lote. Bórralo. Añade un campo Pedido (o PedidoProducto) y lo relacionas con el Id de ProductosPedidos. El campo Id de Lote lo relacionas con el campo Lote de LotesProductos.
Sveinbjorn El Rojo

yavuka
Nivel 1
Mensajes: 12
Registrado: Jue Oct 17, 2019 5:30 am

Re: duda relaciones entre tablas (principiante)

Mensajepor yavuka » Jue Nov 07, 2019 4:31 pm

Vale, lo he cambiado de nuevo. Adjunto captura de pantalla.

He creado el campo numérico pedido-producto en la tabla lotes productos y he borrado los campos código producto y enlace. He vuelto a crear las uniones tal y como me indicas. De todos modos, pensaba que se podría usar como vínculo código producto para las tablas productos pedidos y lotes productos, el problema que me surge es que se trata de un campo tipo texto y no casa con el autonumérico de productos pedidos.

He vuelto a rehacer los formularios enlazados, uno dentro de otro, pero me sigue saliendo la misma ventana de aviso en el mismo punto. Al tratar de guardar el número de lote en el subsubformulario productos lotes, me pide un registro relacionado en la tabla lote.
Adjuntos
RELACIONES v3.png

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1122
Registrado: Sab Oct 24, 2015 10:12 pm

Re: duda relaciones entre tablas (principiante)

Mensajepor Sveinbjorn » Jue Nov 07, 2019 5:41 pm

Dos cosas:

1º/ Los dos campos que intervienen en una relación tienen que ser del mismo tipo: número con número, texto con texto, fecha con fecha... pero nunca, nunca puedes relacionar dos tablas por campos de distinto tipo...

2º/ Añadir subformularios "a lo loco" y esperar que te funciona, es mucho esperar.... Los subformularios, para que funcionen, además de estar correctamente relacionados con su formulario "padre", deberían seguir el sentido de las relaciones entre las tablas.
En la última imagen que muestras de formularios con subformularios, el formularios de lotes (parte 1 de la relación) está como subformulario del formulario LotesPedidos (parte muchos de la relación), luego es normal que al añadir un registro en ese formulario LotesPedidos te pida un registro relacionado en Lotes, siempre que el Lote no exista previamente.
Con esto quiero decir que el orden lógico sería primero meter el lote, luego el pedido-producto (o a la inversa), y por último el lote que corresponde a cada pedido. Pero meter primero el pedido, luego el lote que le corresponde al pedido y por último definir el lote, no...

Tampoco es necesario que hagas un subformulario con cada tabla, puedes haces consultas para las tablas ProductosPedidos (con ésta y Productos) y LotesProductos (con ésta y Lotes) y así mostrar datos de las dos. Algo así: https://drive.google.com/file/d/1xqQmpM ... sp=sharing

Pero siempre teniendo en cuenta que los datos de las tablas que son la parte 1 de la relación tienen que tener datos antes de cubrir un registro en la otra tabla de la relación. En el ejemplo he dejado todos los campos visibles, para que te sea fácil identificar de dónde vienen, pero en un aplicación normal, habría que ocultar muchos de ellos.
Sveinbjorn El Rojo

yavuka
Nivel 1
Mensajes: 12
Registrado: Jue Oct 17, 2019 5:30 am

Re: duda relaciones entre tablas (principiante)

Mensajepor yavuka » Jue Nov 07, 2019 7:52 pm

Te agradezco mucho las aclaraciones y el archivo ejemplo que me envías, pero hay un problema importante. Si tengo que especificar en primer lugar el lote, entonces estoy planteando mal la estructura de las tablas porque la mayoría de las veces se tiene toda la información (productos, cliente, etc.), excepto el día que se va a poder fabricar (que determina el lote) y se necesitan tener las órdenes de fabricación (pedidos) preparadas con algunos días de antelación a la espera de que haya "hueco" para fabricar y lanzarlas a producción.

Había colocado en ese orden los formularios y subformularios para que se asemejara a la realidad.La secuencia de trabajo habitual es la siguiente:

- En una primera fase, el encargado de logística crea la orden de fabricación. Al generar la orden, se crea en primer lugar el número de pedido automáticamente, después se especifica el cliente, ubicación del cliente y se incluyen los datos de logística y ubicación de mercancía. Formulario pedidos.
- En una segunda fase, encargado de logística elabora una relación de productos y cantidades para su preparación y se transfiere la orden de pedido a fábrica, colocándola en cola de envasado por fecha y hora de carga del día (esta información estaría indicada en el formulario pedidos), y se notifica para que se fabrique. Subformulario productos pedidos
- En una tercera fase, el producto asignado a ese pedido, tras pasar por varias fases del proceso productivo, llega al área de envasado y se asigna un lote que se rige por la fecha y hora de etiquetado. Antes del paletizado se pincha con una pistola el código de barras y se registra en la base de datos (en ese momento se de termina lote por el código de barras de la etiqueta, fecha y hora). Subsubformularios lotes productos y subsubsubformulario lotes

Adjunto un boceto de cómo sería más o menos el aspecto final (lo he comprimido para que quepa en la pantalla). Se cumplimentaría de arriba abajo. La primera fase sería el tercio superior (órdenes de fabricación), segunda fase sería el tercio central (listado de productos de la orden de fabriación), ambas partes serían cumplimentadas por el encargado de logística, y la fase 3º estaría en el tercio inferior cumplimentada por el personal de envasado. El esquema es compatible hasta el momento en el que tengo que individualizar por cada palet y por producto (cada registro del formulario lote sería un palet con un lote, fecha y hora concretos que es lo realmente interesante), pero una vez llegado a este punto, no sé cómo continuar, por eso estaba probando esta estructura que hemos estado revisando.
Adjuntos
boceto.png

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1122
Registrado: Sab Oct 24, 2015 10:12 pm

Re: duda relaciones entre tablas (principiante)

Mensajepor Sveinbjorn » Vie Nov 08, 2019 11:37 am

Entonces, según lo que explicas ahora (y si yo lo he entendido bien), el planteamiento de la BD es más sencillo. Te explico los cambios sobre el archivo de ejemplo:

Opción 1:
1º/ Elimina la tabla Lotes
2º/ En la tabla LotesProductos elimina el campo Lote actual y créalo de nuevo como texto, o número, según tus necesidades (o sea, según cómo denomines a cada lote).
3º/ En la tabla LotesProductos añade también los campos Fecha, Hora, y aquellos otros que necesites.
4º/ Tendrías un formulario Pedidos, con un subformulario ProductosPedidos y éste a su vez con un subformulario LotesProductos
Ejemplo

Opción 2:
1º/ Elimina las tablas Lotes y LotesProductos
2º/ Crea una nueva tabla LotesPedidos, con un campo ID autonumérico, un campo Pedido (que lo relacionarás con el campo Pedido de la tabla Pedidos), un campo Producto (que lo relacionarás con el campo Producto de ProductosPedidos), y los campos Lote, Fecha, Hora.... ¡Ojo! El campo Producto de esta tabla no lo puedes crear como asistente de búsqueda, sino que has de hacer la relación "a mano" en la ventana de relaciones.
3º/ Con este planteamiento tendrías un formulario de Pedidos con dos subformularios, uno para los productos que incluye el pedido (subformulario de PedidosProductos) y otro para los lotes (subformulario PedidosLotes). En el subformulario de los lotes, elegirías de los productos del pedido aquellos que llevan asociado un lote, y cubrirías los datos de ese lote.
Ejemplo

A ver si alguna te sirve, porque me quedo sin ideas.... :roll:
Sveinbjorn El Rojo

yavuka
Nivel 1
Mensajes: 12
Registrado: Jue Oct 17, 2019 5:30 am

Re: duda relaciones entre tablas (principiante)

Mensajepor yavuka » Vie Nov 08, 2019 1:21 pm

Funcionan!!, cualquiera de las dos me sirve!! Era lo que necesitaba. Al final la tabla de enlace lotes-productos sobraba y lo complicaba todo.

Con lo del asistente de búsqueda, me doy aún más cuenta de que hay cosas que están ahí y desconozco (había oído hablar de ello, pero jamás lo he usado). Siempre creo campos y relaciones a mano.

Me estaba fallando que no estaba utilizando los campos ID únicos en ninguna tabla. Pensaba que con relacionar los códigos de cliente, pedido, etc era suficiente. Me lo apunto para el futuro, pues ya veo que son esenciales.

Eres grande, Svein!!! :D

Mil gracias, por tu esfuerzo y por tu tiempo.

EDITO: he estado implementando el código este fin de semana y me surgen 2 dudas:

- La relación entre el campo producto de la tabla lotes productos y el campo producto de la tabla productos pedidos tiene una relación indeterminada (creo que era lo que me advertías en tu anterior mensaje, Svein), me gustaría saber qué inconvenientes puede tener (en el futuro crearé algún keyword search para buscar productos basándome en el número de lote y que me devuelva productos y sus cantidades).
- En la lista desplegable del combobox en el que se selecciona el producto del formulario lotes me aparecen todos los productos que contiene el subformulario productos pedidos, para todos los pedidos. Pero me gustaría que aparecieran sólo los productos que hay para ese pedido concreto (por ejemplo, los productos que hay para el pedido nº 2). Se me ocurre que debería modificar la consulta que configura el combobox (el combobox se llama Productocbo) producto del subformulario lote (campo record source) y poner en el campo criterio de productos algo así:

=where Forms![LOTES]![PEDIDO] = Forms![PEDIDOS]![IdPedidos]


+ La expresión de código en el evento "on change":

sub Productocbo_afterupdate()
Productocbo.requery
end sub


Pero al hacer esto me pide introducir parámetro al abrir y se me queda el combobox en blanco.

NOTA: me he leído algún documento de neckkito sobre tablas y relaciones que me ha gustado, pero me gustaría profundizar más al respecto porque tengo lagunas. ¿Alguna otra fuente de información donde pueda encontrar ejemplos prácticos explicados con distintas casuísticas, explicación de problemas, etc. para entenderlo mejor?


Volver a “Objetos Access”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado