Código VBA para casilla de verificación

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.

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.

1 Respuesta

Respuesta
2

Sirve mi respuesta a tu otra pregunta (Código VBA para formulario de búsqueda):

DoCmd.RunSQL "INSERT INTO BAJASEDE SELECT Sedes.IdSede, Sede.Sede, Sede.Provincia, Material.Ordenador, Material.Impresora FROM Sedes JOIN Material ON Sedes.IdSede=Material.IdSede WHERE IdSede= " & Me.IdSede& ""

Un saludo.


Buenas noches Sveinbjorn El Rojo

He probado el código de la misma manera que en mi solicitud anterior (Código VBA para formulario de búsqueda) pero en este caso, cuando lo aplico, me salta el siguiente mensaje:

He probado con INNER JOIN, LEFT JOIN o RIGHT JOIN pero tampoco funciona, me sigue saltando el mismo error. 

No se me ocurre que hacer para solventarlo.

Gracias.

Al desconocer los elementos de tu BD, me es difícil sugerirte una solución adecuada, pero por intentarlo que no sea:

1º/ Comprueba que la parte del SELECT es correcta (nombres de campos, tablas...). Yo lo probaría en el diseñador de consultas a ver si te devuelve los resultados que esperas.

2º/ Comprueba que el número de campos que seleccionas en el SELECT son los mismos que tiene la tabla BAJASEDE, son del mismo tipo y van en el mismo orden.

3º/ Si la parte del SELECT te funciona, pero luego no la del INSERT, yo lo que haría sería crear la consulta con el diseñador de objetos (la guardas como CABorrar, por ejemplo), incluyendo el WHERE (haciendo referencia al control del formulario: Formularios! NombreFormulario! NombreControl), y luego en el código cambias la SQL del INSERT por:

DoCmd.RunSQL "INSERT INTO BAJASEDE SELECT * FROM CAborrar"

Buena tardes Sveinbjorn El Rojo

¿Podrías indicarme donde se encuentra el diseñador de consultas? Por más que lo busco no lo encuentro, no se si será por la versión de Office (Uso 2010).

Con respecto al código, por más que modifico las condiciones y realizo todos los pasos que me has indicado, no consigo dar con el problema.

Perdona las molestias y la demora en mi respuesta (He andado ocupado).

Muchas gracias de antemano.

La única diferencia notable es que la tabla SEDES tiene dos campos más que la tabla BAJASEDE, pero en la condición de antes le indico solamente aquellos campos que quiero copiar de la tabla SEDES y de la tabla MATERIAL.

No obstante, ¿puede ser el causante?

Gracias.

El diseñador de consultas está en la pestaña Crear, grupo Consultas, Diseño de Consulta. Luego, dentro del diseño de la consulta, cambias a vista SQL para probar lo que te decía.

El que una tabla tengas más campos que la otra, no influye para nada en el resultado cuando seleccionas los campos de destino..

Buenas,

He conseguido reparar el código. El error estaba en la parte del ON Sedes.IdSede=Material.IdSede, se había eliminado uno de los puntos y no lo había detectado... Hasta que lo he probado en el diseñador de consultas.

No obstante, ahora me salta este mensaje:

Si le digo SI, me salta lo siguiente:

Luego me salta otro mensaje indicando si deseo eliminar la fila seleccionada y si le digo que sí se elimina. Pero cuando me dirijo a la tabla BAJASEDE, no está el registro que se ha eliminado...

No se que puede faltar en el código, que arreglado queda de esta manera:

DoCmd.RunSQL "INSERT INTO BAJASEDE SELECT Sedes.IdSede, Sede.Sede, Sede.Provincia, Material.Ordenador, Material.Impresora FROM Sedes JOIN Material ON Sedes.IdSede=Material.IdSede WHERE IdSede= " & Me.IdSede& ""

'Tras la copia, elimina el registro seleccionado de la tabla Sedes.

DoCmd.RunSQL "DELETE * FROM sede WHERE IdSede= " & Me.IdSede& ""

Muchas gracias de antemano.

Un saludo.

El primer mensaje es normal que te salga al ejecutar una consulta de acción si lo haces con DoCmd. RunSQL. Hay dos formas de evitarlos, poniendo en la linea antes un DoCmd. SetWarnings False, con lo que si hay algún problema (como es tu caso) no te enteras, o usando CurrentDb. Execute en vez del DoCmd. RunSQL.

El segundo mensaje te señala que hay un error y no se pueden añadir los registros a la tabla BAJASEDE por una infracción de claves, lo que viene a ser que estás intentando repetir en los nuevos registros claves únicas que ya existen en la tabla. Ahí no te puedo ayudar más, porque no sé lo que tienes montado ni los datos...

Buenas

¿Y si te enviará una copia de mi BBDD podrías averiguar porque ocurre la infracción de claves?

Realmente no entiendo lo que pasa.... He revisado el código y lo he modificado cientos de veces y no comprendo porque no funciona.

Muchas gracias de antemano.

Sube una copia a filebig.net, dropbox o similar y pon aquí el enlace de descarga. Eso sí, deja solo las tablas y formularios que intervienen en la consulta, y que la copia no tenga datos "privados", con que tenga 5 o 6 registros inventados, debería ser suficiente

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas