Código para pasar registro a Tabla Histórico

Tengo una tabla de material, donde he creado un botón con el siguiente código:

Private Sub Imagen789_Click()
Dim respuesta As String
Dim cSql As String
respuesta = MsgBox("ELIMINARÁ EL REGISTRO ACTUAL,¿DESEA CONTINUAR?", vbYesNo, "CONFIRMAR")
If respuesta = 6 Then
DoCmd.RunSQL "INSERT INTO TAB_MATERIAL_HISTORICO (Modelo, NumeroSerie,Observaciones) VALUES ('" & Tipo.Value & "', '" & Modelo.Value & "', '" & Observaciones.Value & "')"
MsgBox ("LA FICHA ELIMINADA PASARÁ AL REGISTRO HISTÓRICO"), vbInformation, "PASO DE DATOS A HISTÓRICO COMPLETADO"
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.Close acForm, "MATERIAL", acSaveYes
DoCmd.OpenForm "MATERIAL_HISTORICO"
MsgBox ("REGISTRO ACTUAL ELIMINADO"), vbInformation, "REGISTRO ELIMINADO"
Else
MsgBox ("REGISTRO ACTUAL NO ELIMINADO"), vbInformation, "CANCELAR ELIMINACION"
End If
End Sub

La funcion basica del codigo es no eliminar definitivamente el registro en cuestion, sino mandarlo a una tabla historico de bajas.

Lo que necesito implementar dentro de este código es unas sentencias que automáticamente cuando el usuario clique e inmediatamente después del mensaje primero de "ELIMINARA EL REGISTRO ACTUAL" access muestre una ventana donde el usuario este obligado a poner la fecha de baja del material para continuar con el procedimiento

Además la base de datos tiene colocado también una tabla FPass con el usuario y contraseña de los distintos usuarios que trabajan con ella y me gustaría a ver si sabéis si se podría también implementar por código el que se registrase que usuario es el que realiza el procedimiento de baja de material y se anote en un campo de texto que crearía en la Tabla TAB_MATERIAL_HISTORICO

2 Respuestas

Respuesta
1

Oscar: Mi sugerencia es la siguiente.

En la Tabla añades, si es que no los tienes 2 Campos>>

FechaBaja y UserBaja.

En el Formulario 2 controloes, que pueden estar ocultos o no.

TxtFechaBaja y TxtUserBaja

El origen de Estos Controles, los Campos de la Tabla.

Entonces inserta estas líneas de Código. Creo que el sitio adecuado sería después de>>

DoCmd. RunCommand acCmdDeleteRecord

Me.TxtUserBaja = Environ("UserName")

Me.TxtFechaBaja = Now()

Y te quedará la constacia sin necesidad de ventanas emergentes.

Si aun así lo quieres escribir, debes usar un InputBox en lugar del Now()

Mis saludos >> Jacinto

Gracias Jacinto

Es otra manera de hacerlo, pero tengo una duda cuando dices añadir 2 campos: ¿FechaBaja y UserBaja te refieres a añadirlos en mi TAB_MATERIAL_HISTORICO? ¿O esos 2 campos tendría que añadirlos en la TAB_MATERIAL principal?

Yo los iba a crear en la TAB_MATERIAL_HISTORICO que es donde quiero que me aparezca esa información de fecha de baja y usuario que da la baja

La fecha si necesito que salga un campo de selección donde el usuario pueda poner la fecha que quiera, ya que no siempre la fecha de baja del material va a coincidir con el mismo día que se haga, puede darse el caso de que el material se diera de baja unos días antes y no se pudiera anotar entonces

¿Cómo lo tendría que poner exactamente si quito el Now()?

Muchas gracias

Oscar: Si la Fecha por lo que comentas puede o no coincidir on el Ahora >> Now(), entonces creo que la respuesta de Sveinbjorn es la aplicable.

Lógicamente los Campos van en la Tabla donde vas a escribir, que en éste caso es TAB_MATERIAL_HISTORICO.

En su respuesta Sveinbjorn te cita esos campos como >> FechaBaja y Usuario y las variables que tienen su valor como vFecha y vUser.

Mis saludos >> Jacinto

Respuesta
1

Sencillo:

Antes de ejecutar al SQL de datos anexados, creas una variable de tipo fecha y otra de tipo texto.

A la variable de fecha le asignas el valor que se introduzca en un inputbox por el usuario, y a la de texto, el user actual.

Luego modificas la SQL para añadir esos dos nuevos campos y valores y listo!

Algo así:

Private Sub Imagen789_Click()
Dim respuesta As String
Dim cSql As String

Dim vFecha As Date

Dim vUser as String
respuesta = MsgBox("ELIMINARÁ EL REGISTRO ACTUAL,¿DESEA CONTINUAR?", vbYesNo, "CONFIRMAR")
If respuesta = 6 Then

vFecha=InputBox("Introduzca la fecha de baja")

If StrPtr(vFecha)=0 Then 

'Aquí lo que quieras hacer si cancela el inputbox

End If

vUser=... 'Aquí recogerías el usuario actual. No sé como lo tienes montado, por eso te lo dejo a tí
DoCmd.RunSQL "INSERT INTO TAB_MATERIAL_HISTORICO (Modelo, NumeroSerie,Observaciones,FechaBaja,Usuario) VALUES ('" & Tipo.Value & "', '" & Modelo.Value & "', '" & Observaciones.Value & "',#" & Format(vFecha,"mm/dd/yyyy") & "#,'" & vUser & "')"
MsgBox ("LA FICHA ELIMINADA PASARÁ AL REGISTRO HISTÓRICO"), vbInformation, "PASO DE DATOS A HISTÓRICO COMPLETADO"
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.Close acForm, "MATERIAL", acSaveYes
DoCmd.OpenForm "MATERIAL_HISTORICO"
MsgBox ("REGISTRO ACTUAL ELIMINADO"), vbInformation, "REGISTRO ELIMINADO"
Else
MsgBox ("REGISTRO ACTUAL NO ELIMINADO"), vbInformation, "CANCELAR ELIMINACION"
End If
End Sub

Saludos!


Muchas gracias Sveinbjorn

Solo una duda, cuando dices poner:

vUser=... 'Aquí recogerías el usuario actual .....

¿Tendría que implentar yo alguna secuencia para cada usuario? Quiero decir, ¿no se podría poner una sentencia automática que detectase el usuario que esta elimando el registro en ese momento y que automáticamente lo grabe como tal junto con la fecha seleccionado por el usuario en la TAB_MATERIAL_HISTORICO?

En la Base de datos, el tema de los usuarios lo tengo montado con una tabla de nombre TPass con 2 registros: NomUser y Pass

Y en la Tabla y Formulario MATERIAL_HISTORICO voy a crear también dos campos que serian FechaBaja y UsuarioBaja (que debería grabar el registro NomUser que ha realizado el procedimiento del Histórico en cada momento)

Gracias

En esa linea tienes que poner la instrucción adecuada para recoger el nombre del usuario.

Dependiendo de cómo hagas el login a tu BD, así será la instrucción que tendrás que poner. Por ejemplo, si el usuario lo almacenas en una variable en FPass, simplemente sería coger el valor de esa variable. En la web de Neckkito tienes ejemplos sobre este tema.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas