Consulta o módulo para anexar registros sin duplicados

Tengo tres tablas: TGastos.- Registros= IdGastos, FechaMov, DescripMov, GastosMov; TVentas .- Registros= idVentas FechaMov-DescripMov e IngresosMov; y TMovimientos.-Registros= IdMovimientos, FechaMov; DescripMov, IngresosMov y GastosMov. La tabla TMovimientos debe de estar recibiendo información continuamente de las otras dos sin que se dupliquen los datos. Lo he intentado con "Anexar" y con "Unión" y no soluciona el problema. Lo he intentado sin éxito con la siguiente consulta :

INSERT INTO TMovimientos
SELECT FechaMov AS FechaMov, DescripMov AS DescripMov, GastoMov AS GastoMov
FROM TGastos
WHERE NOT EXISTS (SELECT TMovimientos.FechaMov, TMovimientos.DescripMov,TMovimientos, GastoMov FROM TMovimientos) AND FechaMov<>FALSE AND
DescripMov <>FALSE AND GastoMov<>FALSE;

Los alias los ha unido Access. He utilizado solo TGastos y TMovimientos para no liarla. Soy novato y no encuentro la solución aunque hay alguna respuesta que pudiera ser, no la entiendo.

1 Respuesta

Respuesta
2

Te digo una forma muy fácil de hacerlo, añadiendo un campo nuevo a tu tabla TGastos y a TIngresos.

Como te decía, a esas tablas les añades un campo de tipo Sí/No, llamado, por ejemplo Traspasado. A los registros que ya tengas en TMovimientos, ese campo lo marcas como Verdadero (si vacías la tabla TMovimientos y los cargas todos de nuevo desde TGastos y Tingresos, puedes hacer una consulta de actualización para poner esos campos a verdaderos de "una tacada", o lo mismo si ya los tienes todos en TMovimientos)

A medida que vas ingresando registros en TGastos o TIngresos, ese campo Traspasado estará en Falso y cuando quieras hacer el traspaso, simplemente has de anexar los registros que lo tengan en Falso, porque los otros ya estarán. Una vez hecho el traspaso, los marcas como Traspasados y a volver a empezar.

Las consultas serían:

Para el traspaso de TGastos:

INSERT INTO TMovimientos(FechaMov; DescripMov, GastosMov) SELECT FechaMov, DescripMov, GastosMov FROM TGastos WHERE Traspasado<>-1

Para actualizar TGastos:

UPDATE TGastos SET Traspasado=-1 WHERE Traspasado=0

Y para TIngresos:

INSERT INTO TMovimientos(FechaMov; DescripMov, IngresosMov) SELECT FechaMov, DescripMov, IngresosMov FROM TIngresosWHERE Traspasado<>-1

y

UPDATE TIngresos SET Traspasado=-1 WHERE Traspasado=0

¡Gracias!  Lo voy a probar y con lo que sea te lo comunicaré.

Me pongo en contacto otra vez, pues la consulta que me enviaste me da errores que no veo como solucionarlos seguro que mi inexperiencia algo se me pasa por alto.Te envío la pantalla y un saludo.

Gracias.

Lo que yo te mandé no es una consulta, son 4 que debes ejecutar una tras otra (hazlo sobre una copia de tu Bd, por lo que pueda pasar)

Saludos de nuevo. Lo primero, discúlpame pero no lo había entendido. primero paso los datos y luego actualizo , hasta ahí funciona perfectamente, incluso se actualizan los nuevos registros.

¿Pero, como integro la ejecución de estas 4 consultas en una aplicación? Lo ideal sería  mediante un solo botón o al abrir un formulario. Esta aplicación es para mi hija que es peluquera y dificultad=ya lo haré=no lo hago. Espero tu amable ayuda, y te reitero mi sincero agradecimiento

Es sencillo, pon un botón en un formulario, y a ese botón le asocias este código en el evento "al hacer clic":

CurrentDb.Execute "INSERT INTO TMovimientos(FechaMov, DescripMov, GastosMov) SELECT FechaMov, DescripMov, GastosMov FROM TGastos WHERE Traspasado<>-1"
CurrentDb.Execute "UPDATE TGastos SET Traspasado=-1 WHERE Traspasado=0"
CurrentDb.Execute "INSERT INTO TMovimientos(FechaMov, DescripMov, IngresosMov) SELECT FechaMov, DescripMov, IngresosMov FROM TIngresos WHERE Traspasado<>-1"
CurrentDb.Execute "UPDATE TIngresos SET Traspasado=-1 WHERE Traspasado=0"

Así te ejecutará las consultas una a una por código y no necesitas tenerlas como objetos Consulta.

¡Gracias! por tu eficiencia, atención y amabilidad

Mañana lo pruebo y te diré.

Recibe un Saludo.

!Saludos¡ Siento tener que volver a molestarte, pero no consigo que el Módulo que me has enviado funcione. Sale "Se ha producido el error 3061 en tiempo de ejecución: Pocos parámetros. Se esperaba 1.". Te ajunto pantalla:

Perdona mi ignorancia, pero no soy capaz de solucionarlo. No se que pasa

Gracias.

No hay nada que perdonar, nadie nace sabiendo...

Por el pantallazo no veo ningún error de sintaxis, lo único que te puedo sugerir es que revises los nombres de los campos por si tu tienes alguno diferente a los de mi código y los cambias (en el código). También imagino que habrás añadido a tus dos tablas el campo Traspasado.

Para que veas que sí funciona, te envío un mini-ejemplo: http://www.filebig.net/files/6W8t4wYPdj 

¡Gracias! 

Funciona correctamente.Problema solucionado. Tenías razón, un puñetero espacio en un campo es lo que daba el error. Espero seguir contando con tu inestimable ayuda.

Recibe un afectuoso saludo.

Por supuesto que puedes contar con mi ayuda para otras dudas de Access, aquí o en el foro: https://nksvaccessolutions.com/Foro/

Gracias a tu ejemplo "Cuadros combinados" he podido resolver un problema que tenía, pero a medias.He sustituido los campos por Nombre, Apellidos y DNI,y funciona correctamente, faltaría más, pero no encuentro la forma de que se imputen en la tabla desde el formulario. El primero es un cuadro combinado, el segundo contiene una función y el tercero es un cuadro de texto, como ya conoces.Desconozco si es sencillo o no. Espero que me puedas ayudar.

Recibe un afectuoso saludo

Para que los controles se guarden en la tabla de la que toma los datos el formulario, esos controles tienen que estar "asociados" a los campos de la tabla. Eso lo puedes ver/modificar si sacas las propiedades del cuadro de texto, combinado... vas a la pestaña Datos -> Origen del control.

Ahi debes tener el campo de la tabla donde quieres que te lo guarde. Si lo tienes en blanco, no te guardará nada (que supongo es lo que te pasa)

La otra forma es guardar los datos del formulario por código, pero ahí ya entran otros factores y no es tan sencillo...

¡Hola! de nuevo.

Ya había asignado los campos Nombre y DNI y sin incidencia, pero el problema viene en el registro Apellidos que en Origen del Control tiene asignada la función "=[CboNombre].[Column](1)"y no veo la manera de solucionarlo. De lo difícil se aprende más que de lo fácil. Espero tú ayuda.

Gracias y saludos

Cambia el origen del control de ese cuadro de texto al nombre del campo de la tabla (supongo que será Apellidos o algo así), y en el evento "después de actualizar" del cuadro combinado CboNombre, generas este código:

Me.Apellidos=Me.CboNombre.Column(1)

Donde el Apellidos de Me. Apellidos es el nombre de tu cuadro de texto

De nuevo saludos. Funciona correctamente, no se como darte las gracias. Tengo otro problema, en el formulario donde paso las ventas tengo un combinado con los cuatro porcentajes de IVA actuales que tomo de una tabla para que lo calcule en línea en la tabla de ventas. Como podría quedar fijo en el combo el porcentaje actual (21%) sin tener que buscarlo para cada transacción.

No deberías encadenar preguntas tan diferentes bajo un mismo título, pues así si algún otro usuario tiene una duda parecida, será imposible que vea la solución, por ejemplo a esta duda del combinado, bajo el título de "consulta o módulo para anexar..."

Dicho esto, y si interpreto bien tu duda, ponle ese 21% (o 0.21, según como tengas el valor) como valor predeterminado del combinado

¡Gracias! 

Es que no se la forma de que me contestes tu sin menospreciar a los demás que tan buena labor hacen. Soy nuevo hasta en los foros.Discúlpame

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas