Access - Insertar en tablas muchos a muchos desde formulario

 
Vista:
sin imagen de perfil

Insertar en tablas muchos a muchos desde formulario

Publicado por jose (15 intervenciones) el 07/07/2015 11:25:14
Hola. Tengo tres tablas: Personas (idpersona, nombreper), Idiomas(ididioma, nombreid) y la que hace la relacion muchos a muchos PersId (idpersona, ididioma). La tabla Idiomas ya tiene registros.
Quiero un formulario en el que introducir un nombreper, seleccionar varios idiomas en un control multiseleccion, y que al pulsar un boton me incluya los datos en sus tablas.
El formulario lo voy a usar yo solo por ahora, asi que no necesito aun control de errores.

Sé que no ha de ser dificil, pero ¡hace 10 años que no programo! ☺☺
¿Me echais una mano?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Insertar en tablas muchos a muchos desde formulario

Publicado por Enrique Heliodoro (1664 intervenciones) el 07/07/2015 11:59:41
Programar es como andar en bicicleta, nunca se olvida (o se aprendió 'de forma extraña')

.- Un combo para seleccionar a la persona (el asistente de Access ayuda a recordar)
.- Un cuadro de lista (con selección múltiple activada) para los idiomas
.- Un botón que 'recorra los ítems seleccionados en el cuadro de lista' y que por cada uno de ellos introduzca un nuevo registro con el valor del combo (persona) y el ítem que corresponda del cuadro de lista.

Para la inserción, se puede recurrir al generador de consultas y (creada la SQL básica, se retoca adaptándola al entorno real)

Comienza a recuperar la memoria y plantea las dudas que surjan al ir aplicando soluciones.

P.D.
Un índice en la tabla 'PersId' que impida la repetición del mismo conjunto Persona <-> Idioma evita duplicidades de forma automática
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Insertar en tablas muchos a muchos desde formulario

Publicado por Jose (15 intervenciones) el 07/07/2015 14:29:26
Gracias Enrique por tu rapida respuesta. Veras, la estructura del codigo la tenia clara. Lo q necesitaria es algo mas mascado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Insertar en tablas muchos a muchos desde formulario

Publicado por Enrique Heliodoro (1664 intervenciones) el 07/07/2015 14:54:45
Crear una consulta de inserción de datos con el generador de consultas, es tan sencillo como:
.- Iniciar una consulta nueva
Crear un alias:
Campo1: Forms.[el-formulario].[el objeto]

Se ejecuta y (si el formulario esta abierto y hay 'algo' en el objeto) mostrara su contenido
Si lo anterior 'funciona', se crean tantos alias como se necesiten

Ya con los 'alias' creados, se modifica a 'consulta de datos anexados', preguuntara a que tabla se desean insertar (y se elige la de destino deseado)
Aparecerá una nueva línea y 'bajo cada campo alias creado' en el combo se selecciona el destino (campo de la tabla que recibirá el dato) adecuado.

Si se ejecuta, en la tabla destino ... habrá un nuevo dato.

Ya se dispone de la/una consulta básica y perfectamente funcional de la cual se puede copiar su SQL y modificar a nuestro antojo para adaptarla al (supuesto) bucle que tendríamos y que recorrería los Ítems seleccionados

Crear un bucle ... es básico (y en teoría se sabe 'andar en bicicleta')

De cualquier forma, 'yo no trabajo para que tu disfrutes', puedo ayúdate a lograr tu objetivo, pero si comienzas a caminar (y no he visto trazas a momento actual).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Insertar en tablas muchos a muchos desde formulario

Publicado por jose (2 intervenciones) el 07/07/2015 16:32:30
Claro. Mira, voy a copiar el codigo que escribí antes de empezar este hilo y que no funciona. Cambia lo que hasta ahora he mencionado sobre una tabla Personas por una tabla Programas. El código sí inserta en la tabla Programas, pero no en ProgramasIdiomas.

Comando15 es el botón
ListaIdiomas es un cuadro de Lista independiente.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Dim cn As Connection
Dim rs As Recordset
Dim sql As String
 
Dim progidio As Recordset
Dim varPosition As Variant
 
 
 
 
 
Option Compare Database
 
 
 
 
 
 
Private Sub Comando15_Click()
    sql = "Insert Into Programas (nombre, precio, descripcion_corta, descripcion_larga) Values ('" & nombre.Text & "','" _
            & precio.Value & "','" & descripcion_corta.Text & "','" & descripcion_larga.Text & "')"
    Call Ejecutar_Comando(sql, cn)
 
    For Each varPosition In ListaIdiomas.ItemsSelected
        sql = "Insert Into ProgramasIdiomas Values ('" & cuadroIdProg.Text & "','" & ListaIdiomas.ItemData.varPosition & "')"
        Call Ejecutar_Comando(sql, cn)
    Next varPosition
 
    progidio.Open "ProgramasIdiomas", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    cn.BeginTrans
    progidio.Index
 
End Sub
 
Private Sub botonIns_Click()
 
End Sub
 
Private Sub Form_Load()
    Call Iniciar_Conexion
    Set rs = New Recordset
    With rs
        .cursorlocation = aduseclient
        .Open "Programas", cn, adopenstatic, adlockreadonly, adcmdtable
    End With
 
End Sub
Public Sub Ejecutar_Comando(sql As String, conexion As Connection)
    Dim Comando As New Command
    With Comando
        .activeconnection = cn
        .commadtext = sql
        .Execute
        Set Comando = Nothing
    End With
 
 
End Sub
 
Public Sub Iniciar_Conexion()
    If cn Is Nothing Then
        Set cn = New Connection
 
        With cn
            .cursorlocation = aduseclient
            .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                App.Path & "\db1.mdb" & ";Persist Security Info=False"
        End With
    End If
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Insertar en tablas muchos a muchos desde formulario

Publicado por Enrique Heliodoro (1664 intervenciones) el 07/07/2015 16:55:35
Utilizar ADO en Access (si se trabaja en el entorno Access) siempre me pareció una opción equivocada, SIEMPRE será mas rápido y eficaz trabajar con las herramientas y medios mas 'naturales' de la aplicación y ADO es una capa de abstracción para comunicarse con entorno ajenos a Access (con ese fin fue diseñada, con ese fin nació y será útil mientras no integre esa tecnología en el motor de Access, ahora 'ya' puede, antes no se lo autorizaban).

El error básico en ese código es utilizar la propiedad TEXT en Access y en ese lugar, TEXT es la propiedad que en Visual BAsic define al contenido del objeto, Access utiliza la propiedad VALUE y sin mencionarla ... también funciona.

La propiedad TEXT en Access solo 'existe' mientras el objeto tenga el foco, hacer referencia a ella fuera de esas circunstancias dará error (en el mejor de los casos).

Por cierto...
¿No hubiera sido mas 'cabal y ético' el comenzar el hilo publicando ese intento y solicitando colaboración para solventar el problema? o es que lo de 'mascado' seguía la línea de 'trabaja negrito para blanquito'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Solución: Insertar en tablas muchos a muchos desde formulario

Publicado por jose (2 intervenciones) el 16/07/2015 12:15:11
Al final he hecho este código. Seguro q no es muy eficiente pero funciona. Por si le sirve a alguien

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim codprog As Integer
 
Private Sub Form_BeforeUpdate(Cancel As Integer)
    codprog = Id.Value
End Sub
 
 
Private Sub Form_AfterUpdate()
    Dim i As Integer
    Dim sql As String
 
  For i = 0 To ListaIdiomas.ListCount - 1
        If ListaIdiomas.Selected(i) Then
            sql = "Insert into ProgramasIdiomas (IdPrograma, IdIdioma) values (" & codprog & ", " & i + 1 & ")"
            DoCmd.RunSQL sql
        End If
    Next
 
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar