Cómo concatenar datos de un subformulario a otro campo de formulario

Soy nuevo en esto de las bases de datos y hay un problema que me lleva de cabeza:

En una base de datos de productos, tengo un formulario principal: PRODUCTOS, y un subformulario SUPERMERCADOS.

A cada registro de PRODUCTOS le corresponden uno o varios registros de SUPERMERCADOS.

Quisiera poder copiar TODOS los registros de SUPERMERCADOS, en el campo SUPERS, de PRODUCTOS, con caracteres entre los campos de SUPERMERCADOS.

Me explico:

La tabla o formulario de PRODUCTOS consta de los siguientes campos:

Fecha producto categoría supers

21/06 Manzanas Fruta

La tabla o subformulario SUPERMERCADOS, consta de los siguientes:

SUPERMERCADO PRECIO

Hipercor 12

Mercadona 10

Carrefour 11

La idea es que estos tres supermercados del subformulario SUPERMERCADOS, que corresponden al producto Manzanas, se copien en el campo SUPERS del formulario PRODUCTOS, de la siguiente manera:

HIPERCOR [12];MERCADONA[10]; CARREFOUR[11];

Como podéis ver, el campo precio está entre corchetes (que irían fijos en el procedimiento de evento, y los registros, uno detrás de otro, con un punto y coma de separación entre ellos).

Si un producto sólo tiene un supermercado asociado, sólo hay que asociar uno, pero si tiene varios, debería quedar como en el ejemplo de arriba.

Quisiera hacerlo con un procedimiento de evento, al actualizar el producto introducido.

2 respuestas

Respuesta
2

Suponiendo que tienes un campo IDProducto, que relaciona ambas tablas (si no, lo que pides es imposible), el código que necesitas es este:

Dim rst As DAO.Recordset
'Coges los registros de SUPERMERCADOS que coincidan con el producto actual
Set rst = CurrentDb.OpenRecordset("SELECT * FROM SUPERMERCADOS WHERE Producto=" & Me.IDProd)
'Si la consulta no devuelve registros, sales sin hacer nada
If rst.RecordCount = 0 Then GoTo Salida
'Si hay registros, entonces, los recoges en una variable (vSupers) para luego pasarlo al form/tabla
Dim vSupers As String
vSupers = "" 'Inicializas la variable como una cadena vacía
rst.MoveFirst
Do Until rst.EOF
 vSupers = vSupers & rst("Supermercado") & "[" & rst("Precio") & "];" 'Coges los valores, con el formato que deseas
 rst.MoveNext 'Te mueves al siguiente registro
Loop
'hay que quitar el último punto y coma
vSupers = Left(vSupers, Len(vSupers) - 1)
'Pasas la variable al campo
Me.Supers = vSupers
Salida:
'Cierras conexiones y liberas memoria
Rst. Close
 Set rst = Nothing

Este código, lo tendrás que colocar en el evento que veas más oportuno. Tu comentas en "Después de actualizar" del campo Producto, pero no creo que sea el más conveniente, pues lo lógico sería que primero crees el registro en PRODUCTOS y luego los de SUPERMERCADOS asociados, con lo que al actualizar Producto, no tendrás registros asociados en SUPERMERCADOS...

Hola Sveinbjorn...

Pues va a ser que no funciona...

Imagino que algo o todo lo estoy haciendo mal, porque no hace nada.

Cierto, en subformulario Supermercados, tengo un campo idproducto, que está relacionado con el campo ID del formulario productos.

Dónde colocarías tu el evento?. Teniendo en cuenta el tipo de formulario que he diseñado, y el orden de tabulación, creo que lo mejor sería colocarlo al salir del subformulario SUPERMERCADOS, pero, tampoco se hacerlo.

El orden de tabulación en el formulario es el siguiente:

FORMULARIO PRODUCTOS

1. Producto

2. Precio

3. Marca

4. Unidades

5. Subformulario supermercados

Hola Sveinbjorn...

Pues va a ser que no funciona...

Imagino que algo o todo lo estoy haciendo mal, porque no hace nada.

Cierto, en subformulario Supermercados, tengo un campo idproducto, que está relacionado con el campo ID del formulario productos.

Dónde colocarías tu el evento?. Teniendo en cuenta el tipo de formulario que he diseñado, y el orden de tabulación, creo que lo mejor sería colocarlo al salir del subformulario SUPERMERCADOS, pero, tampoco se hacerlo.

El orden de tabulación en el formulario es el siguiente:

FORMULARIO PRODUCTOS

1. Producto

2. Precio

3. Marca

4. Unidades

5. Subformulario supermercados (es donde yo pongo los datos)

5.a Supermercado

5.b Precio (y salimos del subformulario, volviendo al principal)

6. categoría

7. Código de barras

8. Supers. (ahí es donde quiero que me grabe los datos...)

He probado a poner el evento después de actualizar CATEGORÍA, pero nada.

Agradecido de antemano, espero tu respuesta.

Recibe un cordial saludo

¿Sería posible que me pasaras una copia de tu BD (no hace falta que tenga datos, ni que sea una copia completa, con que tenga las dos tablas y el formulario y subformulario, es suficiente)? Si no, al menos ponme los nombres de los campos de las dos tablas y su tipo, porque creo que no acerté con los nombres en el código que te puse.
El código lo puedes poner en el evento al recibir enfoque del campo Supers, para que cuando te coloques en el se rellene, en al perder enfoque del campo categoría... tienes muchas opciones...

Ningún problema en pasarte la BD, pero dónde?

Súbela a filebig.net, mega o web similar y me pones el enlace de descarga. Si usas dropbox o similar, puedes ponerme el enlace de descarga también.

cual es tu email?

Prefiero que me la pases por otro método, y no por mail... que luego me llegan preguntas directamente al mail y me lo saturan.

Vete a www.filebig.net , pulsas en "Seleccionar archivo", buscas tu BD y la eliges. Luego le das a "Start upload" y cuando acabe, copias el primer enlace y me lo pegas aquí.

http://filebig.net/files/6viUy3E4Dr

http://filebig.net/del.php?6viUy3E4DrUgKg7DupRy

http://filebig.net/files/6viUy3E4Dr

<b><a href="http://filebig.net/files/6viUy3E4Dr">http://filebig.net/files/6viUy3E4Dr</a></b>

Ahí va, espero que te sirva

Ya la tengo, en breve te digo algo

http://www.filebig.net/files/nnySHdiYVr

Como imaginaba, era problema de nombres:

Set rst = CurrentDb.OpenRecordset("SELECT * FROM Supermercados WHERE idproducto=" & Me.Id)

Te lo dejé en el mismo evento en que lo pusiste, porque funciona perfectamente.

Respuesta

Perdonad pero tengo una duda. El código funciona perfecto si la clave principal es numérica. Pero mi problema es que la clave es de tipo texto. ¿Cómo podría conseguir que funcionase siendo la clave principal tipo texto?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas