Crear tabla con cuadros combinados relacionados

Tengo una tabla llamada FICHAS DE PLATO con los campos IdPlato (autonumérico), NombrePlato (texto), Ingrediente1 (texto), Ingrediente2 (Texto)... Ingrediente15 (texto).

He creado una consulta llamada C_Elaboración en la que he recogido el IdPlato, NombrePlato y un campo llamado ingredientes con estos datos

Ingredientes: [Ingrediente1] & " " & [Ingrediente2] & " " & [Ingrediente3] & " " & [Ingrediente4] & " " & [Ingrediente5] & " " & [Ingrediente6] & " " & [Ingrediente7] & " " & [Ingrediente8] & " " & [Ingrediente9] & " " & [Ingrediente10] & " " & [Ingrediente11] & " " & [Ingrediente12] & " " & [Ingrediente13] & " " & [Ingrediente14] & " " & [Ingrediente15]

Ahora quiero crear una tabla llamada PREPARACIÓN que lleve IdPreparacion (autonumérico), Fecha (fecha/hora), PlatoPreparado (Combo que cojo de la tabla FICHAS DE PLATO, queda como numérico pero me permite escoger un plato) e IngredientesPlato (AQUÍ LO QUE QUIERO ES QUE AL SELECCIONAR EL PlatoPreparado de FICHAS DE PLATO automáticamente me rellene este campo que esta en el mismo registro de la tabla FICHAS DE PLATO

Como lo podría diseñar, luego esta información la quiero para hacer listados de lo que se ha elaborado ese día

No se si me habré explicado bien.

3 Respuestas

Respuesta
2

Le preparé este ejemplo:

TABLAS

DISEÑO DE LA CONSULTA

En la consulta utilizo una función a nivel de formulario para concatenar ya que ésta me permite controlar el retorno de línea.

RESULTADO DE LA CONSULTA

Observe como aparece en cada línea un ingrediente.

FORMULARIO PARA CREAR PLATOS

CÓDIGO DE LA FUNCIÓN STRUNIDO()

Public Function strUnido(ParamArray avarArray() As Variant) As String
'Retorna una cadena, en una linea o varias
'Esta función evita crear consultas de UNION
 Dim varElemento As Variant
 Dim strTemp As String
'NOTA: Retire y agregue apostrofes de acuerdo con su necesidad
' Por defecto la dejé para incluir un campo por cada línea
' Si quiere que los campos queden en una sola linea separados
 ' por coma (,), quite los apostrofes y antepongalos en las
 ' otras líneas
'
'
 For Each varElemento In avarArray
   '  strTemp = strTemp & varElemento & ","
    strTemp = strTemp & varElemento & vbCrLf
 Next
 '  strUnido = Mid(strTemp, 1, Len(strTemp) - 1)
   strUnido = strTemp
End Function

Observe que esta función evita crear consultas de UNION y buscar con DLOOKUP(). Si quiere el ejemplo lo puede solicitar a [email protected]

Olvidé adicionar la imagen del reporte:

Respuesta
1

Si lo que se desea obtener es lo mismo que se obtiene en la consulta 'C_Elaboración ' en la que en un campo se concatenan los ingredientes, este dato (la lista de los ingredientes) se puede obtener con un DLookup sobre esa consulta, utilizando como condición el ID del plato.

Estoy de acuerdo en que la construcción de ese tabla 'en vertical' es mas eficiente que la actual 'en horizontal'

La primera ventaja es que se utilizaran los recursos imprescindibles (ni sobraran campos ni faltaran campos), permite añadir características (precio, cantidades, valores proteínicos, cantidad de gluten...) por cada elemento, algo que es útil a la hora de crear las recetas (conocer su composición)

-Ateniéndose a lo que ya existe-

Los métodos para concatenar ese conjunto de datos:

.- EL clásico: una función (hay muchos ejemplos publicados)
.- Una alternativa: La consulta de unión
.- Otra alternativa: la funcion DLookup (el uso abusivo puede enlentecer la aplicación).

Un ejemplo de DLookup reutilizando lo que esta publicado:

= DLookup ("[Ingrediente1] & ', ' & [Ingrediente2] & ....... & ', ' & [Ingrediente15]"; "[ FICHAS DE PLATO]"; "IdPlato =" & [IdPlato ])

Respuesta
1

Si me permites un consejo, creo que te sería más fácil hacer una tabla, por ejemplo, Platos con, por ejemplo, IdPlato( auto numérico), NombrePlato,... y otra tabla, por ejemplo, Ingredientes con IdPlato, producto, etc. Ya que creo que es mejor UN plato VARIOS Ingredientes y te evitas el tener que concatenar 15 campos.

Si la tabla Platos con los 15 campos Ingrediente1, Ingrediente2,... ya la tuvieras rellena siempre podrías usar una consulta de unión tipo

Select IdPlato,ingrediente1 from Platos

union select

IdPlato,Ingrediente2 from platos

union select

...

De todas formas te mando vía Email un ejemplo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas