Access - Código VBA para casilla de verificación

 
Vista:

Código VBA para casilla de verificación

Publicado por Pedro (1 intervención) el 03/08/2019 12:29:24
Estoy intentando crear el siguiente código para una casilla de verificación. Dicha casilla lo que quiero que permita es la copia y combinación de los registros ubicados SEDES y MATERIAL en la tabla BAJASEDE y una vez copiado dicho registro, elimine el registro ubicado en las tablas SEDES y MATERIAL.

1
2
3
4
5
6
7
8
9
10
Dim BTBaja As String
 
DoCmd.RunSQL "INSERT INTO BAJASEDE SELECT Sedes.IdSede, Sede.Sede, Sede.Provincia, Material.Ordenador, Material.Impresora FROM Sedes UNION Material  WHERE IdSede= " & Me.IdSede& ""
 
DoCmd.RunSQL "DELETE * FROM Sedes WHERE Sedes.IdSede= " & Me.IdSede& "", dbFailOnError
 
'Cierra el formulario
DoCmd. Close
'Refresca el formulario principal
DoCmd. Requery (ForDeleg)

Indicar que las tablas SEDES y MATERIAL tienen un valor en común, IdSede. En la tabla SEDES es un valor autonumerico y en la tabla MATERIAL es valor número pero asociado a la tabla SEDES.

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

Código VBA para casilla de verificación

Publicado por Anonimo (3316 intervenciones) el 03/08/2019 19:51:37
Si las tablas 'sedes' y 'material' no tienen el mismo numero y tipo de campos … has llegado a un muro muy alto, tendrás que cambiar de estrategia.
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
Imágen de perfil de miguel
Val: 501
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Código VBA para casilla de verificación

Publicado por miguel (306 intervenciones) el 05/08/2019 11:08:28
la estructura de la tabla sedes se supone que contendra todos los campos de ambas tablas que vas a eliminar.

puedes añadir los datos con una consulta de datos agregados y eliminarlos con dos consultas de eliminacion cuyas referencia sea el campo idsede seleccionado.
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

Código VBA para casilla de verificación

Publicado por Anonimo (3316 intervenciones) el 06/08/2019 01:26:06
Cualquier consulta de selección en la que intervenga mas de una tabla, solo puede utilizar la clausula ' UNION' si ambas (todas las que intervengan sean tablas o consultas) son totalmente compatibles, el resto es escribir para ver si por casualidad se acierta.

La clausula 'UNION' no se debería intentar utilizar para relacionar tablas, su funcionalidad es aunar conjuntos parejos pero dispersos, por ejemplo: aunar los hijos de diferentes familias

.- los alumnos de un colegio lo conforman la unión de hijos de diversas familias, pero solo se crea el conjunto con los hijos, los padres … están relacionados cada uno con sus hijos, pero no van -normalmente- al mismo colegio, curso u aula que sus hijos, aunque también estén formándose o a lo sumo formando un conjunto diferente como asociación de padres.
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
Val: 2
Ha disminuido su posición en 15 puestos en Access (en relación al último mes)
Gráfica de Access

Código VBA para casilla de verificación

Publicado por Manrod65 (1 intervención) el 06/08/2019 15:22:18
Tienes varios errores en la primera sentencia SQL.

Te faltan los campos que tienes que añadir a la nueva tabla BAJASEDE
Como tienes un campo en olas dos tablas para relacionarlas utiliza un INNER JOIN con ese campo.
Te falta el ";" de cierre de la sentencia SQL

Quedaria así:
DoCmd.RunSQL "INSERT INTO BAJASEDE ( IdSede, Sede, Provincia, Ordenador, Impresora ) SELECT Sedes.IdSede, Sedes.Sede, Sedes.Provincia, Material.Ordenador, Material.Impresora
FROM Sedes INNER JOIN Material ON Sedes.IdSede = Material.IdSede WHERE Sedes.IdSede= " & Me.IdSede & ";"


DoCmd.RunSQL "DELETE * FROM Sedes WHERE Sedes.IdSede= " & Me.IdSede & ";", dbFailOnError

Tienes que borrar tambien de la tabla Material
DoCmd.RunSQL "DELETE * FROM Material WHERE Material.IdSede= " & Me.IdSede & ";", dbFailOnError


Espero que te sirva
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

Código VBA para casilla de verificación

Publicado por Anonimo (3316 intervenciones) el 06/08/2019 18:56:58
La solución aportada es correcta y confirma que la original estaba mal encaminada.

Pero en lo que no puedo estar de acuerdo es el la exigencia del punto y coma final en las SQLs aportadas, pues solo lo necesita (por cuestiones internas) Access para definir donde acaba la SQL cuando se genera y utiliza con el editor grafico ….. en las expuestas y ejecutadas desde VBA, es una opción que solo hace la función de florero.
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
Imágen de perfil de miguel
Val: 501
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Código VBA para casilla de verificación

Publicado por miguel (306 intervenciones) el 06/08/2019 22:05:00
He creado las tablas con los campos que dices, he hecho un formulario que me enseña los registros de la tabla sedes y le he puesto una casilla de verificacion (tambien lo he probado con un boton y en el evento al actualizar he puesto los codigos para añadir los datos a la tabla bajasede y despues elimino los datos de la tabla sede y material con la condicion de que el idsede sea igual al que hay en ese momento en pantalla y el codigo funciona perfectamente:

DoCmd.RunSQL "INSERT INTO BAJASEDE ( IDSEDE, SEDE, PROVINCIA, ORDENADOR, IMPRESORA ) SELECT SEDES.IDSEDE, SEDES.SEDE, SEDES.PROVINCIA, MATERIAL.ORDENADOR, MATERIAL.IMPRESORA FROM SEDES LEFT JOIN MATERIAL ON SEDES.IDSEDE = MATERIAL.IDSEDE WHERE (((SEDES.IDSEDE)=[Formularios]![SEDES]![IDSEDE]));"

DoCmd.RunSQL "DELETE MATERIAL.IDSEDE, MATERIAL.ORDENADOR, MATERIAL.IMPRESORA FROM MATERIAL WHERE (((MATERIAL.IDSEDE)=[Formularios]![SEDES]![IDSEDE]));"

DoCmd.RunSQL "DELETE SEDES.IDSEDE, SEDES.SEDE, SEDES.PROVINCIA FROM SEDES WHERE (((SEDES.IDSEDE)=[Formularios]![SEDES]![IDSEDE]));"
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

Código VBA para casilla de verificación

Publicado por Anonimo (3316 intervenciones) el 07/08/2019 11:47:25
La opción DoCmd, tiene un efecto colateral, o se le desactivan los mensajes o pedirá permiso para ejecutarse, quizás la opción Execute le permita mejor transparencia.

En la tabla destino, generaría un índice único para evitar que se puedan repetir registros (ataques de dedo nervioso) y si dispongo de una consulta que devuelve los datos que han de ser insertados en la tabla destino, lo haría asi:

1
CurrentDb.Execute "Insert Into BajaSede Select …… aquí la consulta …. Where IDSede = " & Me.IdSede

Las de eliminación también se pueden (y deben) de simplificarse, no se puede borrar un campo individualmente (eso solo lo se puede hacer rediseñando la tabla) lo máximo permitido es modificar su valor, por lo que el borrado ha de ser 'de todo el registro', mencionar todos los campos funciona, pero si se modifica la tabla (un nombre, un nuevo campo, un campo menos) dejara de funcionar

Lo idóneo (a titulo de ejemplo):
1
CurrentDb.Execute "Delete * From  ??? Where IDSede = " & Me.IdSede
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