Crear consulta de anexar y borrar (para sacar registros de una tabla y pasarlos a otra)

Tengo dos tablas, una que se llama "Paciente" y la otra "Historial_Paciente". La tabla "Paciente" contiene los registros de los pacientes que se encuentran internados en la actualidad. La tabla "Historial_Paciente" quiero que se cargue con los registros de pacientes que se encontraban internados y que se fueron de alta, murieron, etc. Toda la info que va a la tabla "Paciente" se carga desde un formulario llamado "F_Paciente". Lo que yo quiero hacer es que en el formulario "F_Paciente", haya un botón que accione una consulta, o un código (no se que es mejor), que elimine de la tabla "Paciente" ese registro actual que estoy viendo, y lo inserte en la tabla "Historial_Paciente".

La utilidad de mi botón seria que el usuario pueda dar de baja de la tabla "Paciente", a los que ya se han ido de alta, así se va depurando esa tabla y se van guardando los registros en la tabla "Historial_Paciente".

PD: la clave principal de la tabla "Historial_Paciente" es el campo "id", (autonumeracion y sin duplicados). La clave principal de la tabla "Paciente" es el campo "DNI" (texto y sin duplicados).

1 respuesta

Respuesta
2

Esteban: En el Evento Click de Ese Botón pones

If MsgBox("¿Estás seguro de traspasar a Historico éste Registrtro y Borrarlo de la Tabla de Pacientes Actuales?", vbYesNo) = vbYes Then
   CurrentDb.Execute "INSERT INTO Hstorial_Paciente (DNI, CampoTexto1, FechaAlta, OtroDatoTexto) VALUES ('" & Me.DNI & "', '" & Me.CampoTexto1 & "'," & "#" & Format(Me.FechaAlta, "dd/mm/yyyy") & "#" & ", '" & Me.OtroDatoTexto & "')"     
   DoCmd. RunCommand acCmdDeleteRecord
   Me. Requery
End If

Como ves te pongo un Campo DNI, según tu referencia, un CampoText01 inventado, Una FechaAlta que supongo que habrá y otro campo de Texto inventado para que veas la estructura de anexado.

Mis saludos >> Jacinto

Hola Jacinto, no me funciona. No hace nada. El formulario esta basado en una consulta, que a su vez se basa en la tabla "Paciente", ¿sera por eso? Los campos, se llaman iguales en ambas tablas (DNI, Nombre_Apellido, Etc.). El formulario lo puse en editar:si. Aun así no logro que funciones. ¿Qué podrá ser?

Esteban: Hazme un favor. Cita aquí todo el código, con tus Nombres de Campos y cuadros de texto que has usado a ver si me da una pista. Mis saludos >> Jacinto

Private Sub cmdAlta_Click()
If MsgBox("¿Estás seguro de traspasar a Historico éste Registro y Borrarlo de la Tabla de Pacientes Actuales?", vbYesNo) = vbYes Then
CurrentDb.Execute "INSERT INTO Historial_Paciente (DNI, Nombre_Apellido, Cama, F_Nacimiento, Diagnostico, Obra_Social, Derivado, Tel_Contacto, F_Ingreso) VALUES ('" & Me.DNI & "', '" & Me.Nombre_Apellido & "','" & Me.Cama & "','" & Me.Obra_Social & "','" & Me.Derivado & "','" & Me.Tel_Contacto & "','" & Me.F_Ingreso & "','" & Me.Diagnostico & "','" & Me.F_Nacimiento & "')"
DoCmd.RunCommand acCmdDeleteRecord
Me.Requery
End Sub

Los cuadros de texto se llaman idénticos (respeto mayuscula/minuscula, no hay tildes).

Los Nombres de los campos en la tabla son también iguales.

Esteban: Sustituye el CurrentDb... por éste otro.

CurrentDb.Execute "INSERT INTO Historial_Paciente (DNI, Nombre_Apellido, Cama, F_Nacimiento, Diagnostico, Obra_Social, Derivado, F_Ingreso,Tel_Contacto) VALUES ('" & Me.DNI & "', '" & Me.Nombre_Apellido & "'," & Me.Cama & "," & "#" & Format(Me.F_Nacimiento, "dd/mm/yyyy") & "#" & ", '" & Me.Diagnostico & "','" & Me.Obra_Social & "','" & Me.Derivado & "'," & "#" & Format(Me.F_Ingreso, "dd/mm/yyyy") & "#" & ",'" & Me.Tel_Contacto & "')"

La idea base es: Texto >> Comilla Simple-Doble-Doble-Simple, Fecha entre # y Número entre Comillas dobles. Un saludo >> Jacinto

CurrentDb.Execute "INSERT INTO Historial_Paciente (DNI, Nombre_Apellido, Cama, F_Nacimiento, Diagnostico, Obra_Social, Derivado, F_Ingreso,Tel_Contacto) VALUES ('" & Me.DNI & "','" & Me.Nombre_Apellido & "'," & Me.Cama & "," & "#" & Format(Me.F_Nacimiento, "dd/mm/yyyy") & "#" & ",'" & Me.Diagnostico & "','" & Me.Obra_Social & "','" & Me.Derivado & "'," & "#" & Format(Me.F_Ingreso, "dd/mm/yyyy") & "#" & ",'" & Me.Tel_Contacto & "')"

Nada amigo, sera porque el formulario esta basado en una consulta y no en la tabla "Paciente"?

Ni si quiera me arroja el mensaje de aviso que escribiste

Esteban: Para el mensaje es indiferente que el Origen de Datos sea una Consulta o una Tabla.

Mira que realmente tengas activado el Procedimiento del Botón.

Propiedades >> Eventos >> Al hacer Click >> [Procedimiento de evento]

Si te diera algún error lo entendería pero el que no haga nada resulta extraño. Saludos >> Jacinto

Cree una base de datos nueva y el código funciona, no se por que sera que en mi caso no. Lo importante es que el código ya lo tengo, desde ya te agradezco mucho. Lo conservo y voy a tratar de descubrir por que no funciona en mi base de datos.

Esteban: Además de todo lo comentado, ten en cuenta que en las propiedades del Formulario, en la pestaña Datos, la línea que pone Permitir eliminación ha de estar en >>Si. Un saludo >> Jacinto

Esta permitido editar, esta permitido eliminar, y nada, cree de nuevo el botón, pego el código, lo mire y mire mil veces, esta correcto (pegue el mismo en otra bd y funciona) pero no va!

Pues sinceramente Esteban no tengo idea de dónde puede venir la anomalía. Si has probado en una Base nueva y hace la función que debe, no se me ocurre una explicación. No debería de afectar la Consulta, pero una prueba más si es que puedes prescindir de algunos campos de la Consulta es que pongas como Origen de Datos, la tabla directa. Un saludo >> Jacinto

Efectivamente, el problema radica en que el formulario esta basado en una consulta. Esta hecho así porque en la consulta me calcula la edad exacta con una fórmula. Le he cambiado el origen del control al formulario, poniéndole la tabla "paciente" y funciona. Me has ayudado de buena manera, gracias! Veré como soluciono o adapto lo demás.

Esteban: Si esa Fórmula te va bien en la consulta, llevala al evento Form_Current del Formulario y te hará lo mismo ahorrándote la Consulta. Para hacerlo y como me imagino que en la consulta tendrás notaciones en ESpañol, para pasarla a VBA debes pasarlos al Inglés.

Una manera simple de partida es mirando esa consulta que tengas en Vista SQL y te deberá poner al final As Lo que sea. Si eso es la Edad entonces el VBa sería>>

Me.Edad = ........Lo que hay delante del As

Un saludo >> Jacinto

cual es el evento "form_Current"??

Esteban: Es Al Activar Registro. Propiedades >> Eventos >> La primera línea

Si lo generas con el asistente verás que te queda como

Private Sub Form_Current()

End Sub

Un saludo >> Jacinto

¡Gracias! Impecable! Como veras estoy incursionando en access, la verdad que tenia 20 millones de consultas en la base de datos, con el fin de calcular cosas. Mejor ahora lo haré de esta manera! Por cierto, ya funciona todo.

Hola jacinto, se me plantea una nueva duda: como hacer para que ese mismo botón saque datos de los campos de otra tabla y los pase a otra. O sea tengo la tabla "Paciente" a la cual ya le extraigo lo que deseo con el botón y lo pasa a "Historial_paciente". También me gustaría que extraiga la info de otra tabla que se llama "Evolucion" y los pase a la tabla "Historial_Evolucion".

El código actual empieza con "currentDB", no entiendo como explicarle que también actúe sobre otras tablas. ¿Muy complicado?!

Esteban: Has de cambiar la Tabla de destino >> Historial_Paciente por la que pretendes "llenar" o un poco más técnico en la que pretendes anexar. Una traducción no muy buena pero que se entiende del INSERT INTO ... sería Inserta en....

Además de cambiar cada Nombre de Campo y Control, teniendo en cuenta las reglas que te mencioné. Si ves que no te funciona, la pones aquí en bruto y miro de adaptarla.

Hay otras soluciones y si generas otra pregunta con un enunciado parecido a.. "Cómo insertar el Registro Actual del Formulario en una Tabla y borrar el Registro Origen", (ya que aquí hay mucho texto y creo que pocos lo van a leer), quizá recibas otra respuesta y así eliges la metodología que mas se adapte. Yo pondría también algo así como ..."Estoy usando éste código y me gustaría conocer si hay otra alternativa" . Mis saludos >> Jacinto

Private Sub cmdAlta_Click()

SQL = "INSERT INTO Historial_Paciente (DNI, Nombre_Apellido, Cama, etc, etc) VALUES ('" & Paciente.DNI & "','" & Paciente.Nombre_Apellido & "'," & Paciente.Cama & ",etc, etc)

Currentdb.Execute sql

SQL = "INSERT INTO Historial_Evolucion (DNI, Nombre_Apellido, Cama, etc, etc) VALUES ('" & Evolucion.DNI & "','" & Evolucion.Nombre_Apellido & "'," & Evolucion.Cama & ", etc, etc...)

Currentdb.Execute sql

End sub

¿Seria así?

Esteban: La verdad es que lo comentabas y ahora he reparado en ello, y es que quieres hacerlo en el mismo procedimiento, y no desde un Formulario.

Lógicamente cambia la operativa, ya que no puedes usar el VALUES y tienes que usar un SELECT.

Luego no podrás usar tampoco el DoCmd. RunCommand..., porque ese lo que hará será borrar el Registro actual del Formulario.

Una guia de los pasos a seguir la tienes en éste enlace para INSERTAR

https://msdn.microsoft.com/es-es/library/office/ff834799.aspx 

Y en éste otro para eliminar.

https://msdn.microsoft.com/es-es/library/office/ff195097.aspx 

Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas