Grabar un formulario al clic de un botón

Estoy teniendo problema con el Botón Grabar. Tengo un formulario de Inscripciones que posee campos visibles para el ingreso de datos y 3 campos ocultos (Torneo - Nro - Fecha) que se completan del formulario Competencias del que proviene. Ahora bien, agregué un botón GRABAR en el formulario de inscripciones según el asistente de diseño de Access 2010 para que se graben todos los campos en la Tabla Inscripciones y veo que aunque no use el botón GRABAR, al cerrar el formulario se graban los datos ocultos y si se ingresó datos en los campos visibles, también se graban. Mi idea es que SOLO se graben TODOS los campos al ejecutar el botón GRABAR en la Tabla Inscripciones.

1 respuesta

Respuesta
2

¿Cómo controlas que el usuario cambie de registro o alga del formulario? Si lo haces con botones programados en el formulario, como el de grabar, puedes hacer que se deshagan los cambios al cambiar de registro/salir del formulario.

Por ejemplo, si tienes un botón Salir, le puedes poner este código:

Private Sub Salir_Click()

Me. Undo 'Deshace los cambios en el registro

DoCmd. Close acForm, Me. Name

End Sub

Y lo mismo harías si tienes botones para ir a los registros anterior o siguiente.

Si quieres que avise al usuario de que se van a borrar los datos no guardados, le puedes usar algo así:

Añades un checkbutton oculto en el formulario (yo le llamaré chkGuardado), que nos chivará si hemos pulsado el botón Guardar o no. Los códigos y eventos a usar son los siguientes:

Al hacer click en el botón guardar:

Private Sub cmdGuardar_Click()
DoCmd.RunCommand acCmdSaveRecord
Me.chkGuardado.Value = True
End Sub

Al hacer click en el botón salir (Y/o cambiar de registro)
Private Sub cmdSalir_Click()
Dim resp As Integer
If Me.chkGuardado.Value = False Then GoTo Salida
resp = MsgBox("Se perderán los datos no guardados. ¿Quieres continuar?", vbInformation + vbYesNo, "AVISO")
If resp = vbNo Then Exit Sub
Salida:
Me.Undo
DoCmd.Close acForm, Me.Name
End Sub

Al Activar registro del formulario.
Private Sub Form_Current()
Me.chkGuardado.Value = False
End Sub

Para que esto funcione correctamente, tienes que poner en No las opciones del formulario de mostrar el botón cerrar y botones de desplazamiento.

Lamentablemente no logro que funcione. Los 3 campos ocultos se siguen grabando sin que haga click en el Botón Grabar, este botón sólo graba los datos ingresados en los campos visibles, no se puede hacer que lo campos ocultos se graben al click del botón grabar?

Igual, cree el botón Salir con el asistente de diseño de Access2010, para lo cual en el evento Al hacer Clic se generó la macro Cerrar Ventana, es por esto que fui a la hoja de visual basic, estando posicionada en el botón Salir y copie la instrucción que me pasaste (al botón lo nombre Salir)

Private Sub Salir_Click()
Me.Undo
DoCmd.Close acForm, Me.Name
End Sub

Esto lo que hace es salir del formulario, pero grabando los datos que tenga, es decir si complete los campos visibles, los graba en la tabla y si no, solo graba en la tabla los datos de los campos ocultos.

Deshabilité el Botón Cerrar, Botón Maximizar y Minimizar y Barras de desplazamiento

Desde ya muchas gracias.

Prueba con este otro método:

1º/ Elimina el origen del registro del formulario (vista diseño->pestaña datos)

2º/ Elimina el origen del control de todos los cuadros de texto, etc.. que tengas en el formulario.

Con esto dejamos el formulario "independiente" de cualquier tabla.

3º/ En el botón Guardar, le pones este código:

Dim miSQL as string

miSQL="INSERT INTO ..."

DoCmd.SetWarnings False
DoCmd.RunSQL miSQL
DoCmd.SetWarnings True

Lo que está en negrita es la sql de una consulta de datos anexados. Tienes que completarlo tú.

La estructura, en general de este tipo de consulta es:

INSERT INTO nomTabla(nomCampo1, …, nomCampoN) VALUES (valor1, …, valorN)

En tu caso, tendrás que cambiar valor1,..., valorN, por referencias a los campos de tu formulario, por ejemplo:

miSQL="INSERT INTO nomTabla(nomCampo1, …, nomCampoN) VALUES (" & Me.ID & ",'" & Me.txtNombre.Value &"'," & .... & ")"

Recuerda que los campos de texto los tienes que "encerrar" entre comillas simples y los de Fecha/Hora entre # #

Gracias!!! ya funciona!!!!, lo único que me falta es que no tire error si algún campo no trae el dato para grabar. Por ejemplo el campo Vto Antirrábica se carga en el formulario a partir de Reg FCA que trae los datos de la tabla PERROS, si en dicha tabla no se cargo la fecha de vto, en el formulario queda el campo en blanco, pero al grabar da error y no graba el registro. Quisiera que se pueda grabar igual.

El código del botón Grabar quedó de la siguiente forma:

Private Sub Grabar_Inscripto_Click() Dim miSQL As String miSQL = "INSERT INTO INSCRIPCIONES(Reg_FCA, Perros, Raza, Categoría, Grado, Vto_Antirrábica, Torneo, Nro_Fecha, Fecha, Guía, Agrupación, País, Localidad, Ranking, Perra_en_celo) VALUES ('" & Me.Reg_FCA.Value & "', '" & Me.Perros.Value & "', '" & Me.Raza.Value & "','" & Me.Categoria.Value & "','" & Me.Grado.Value & "',#" & Me.Vto_Antirrabica.Value & "#, '" & Me.Torneo.Value & "', '" & Me.Nro_Fecha.Value & "',#" & Me.Fecha.Value & "#,'" & Me.Lista_Guia.Value & "','" & Me.Agrupación.Value & "','" & Me.País.Value & "','" & Me.Localidad.Value & "','" & Me.Ranking.Value & "','" & Me.Perra_en_celo.Value & "')" DoCmd.SetWarnings False

DoCmd.RunSQL miSQL

DoCmd.SetWarnings True


'Para blanquear los campos luego de grabarlos agregué el siguiente código

Reg_FCA = ClearConntent

Perros = ClearConntent Raza = Null

Categoría = ClearConntent

Grado = ClearConntent

Vto_Antirrabica = Null

Perra_en_celo = ClearConntent

Lista_Guia = ClearConntent

Agrupación = ClearConntent

País = ClearConntent

Localidad = ClearConntent


End Sub

Saludo

¿De qué tipo de datos son los campos vacíos que te dan el error?

Solo pasa con el campo Vto Antirrábica que es tipo FECHA

Te doy dos opciones, la primera más simple (aunque no sé seguro si funcionará y la segunda que es más larga, pero funciona:

1ª Opción:

Dim miSQL As String

miSQL = "INSERT INTO INSCRIPCIONES(Reg_FCA, Perros, Raza, Categoría, Grado, Vto_Antirrábica, Torneo, Nro_Fecha, Fecha, Guía, Agrupación, País, Localidad, Ranking, Perra_en_celo) VALUES ('" & Me.Reg_FCA.Value & "', '" & Me.Perros.Value & "', '" & Me.Raza.Value & "','" & Me.Categoría.Value & "','" & Me.Grado.Value & "',#" & Nz(Me.Vto_Antirrabica.Value,"") & "#, '" & Me.Torneo.Value & "', '" & Me.Nro_Fecha.Value & "',#" & Me.Fecha.Value & "#,'" & Me.Lista_Guia.Value & "','" & Me.Agrupación.Value & "','" & Me.País.Value & "','" & Me.Localidad.Value & "','" & Me.Ranking.Value & "','" & Me.Perra_en_celo.Value & "')"

DoCmd.SetWarnings False
DoCmd.RunSQL miSQL

DoCmd.SetWarnings True

2ª Opción: consistiría en evaluar previamente si el campo Vto Antirrábica está vacío o no, y actuar a través de un If:

Dim miSQL As String

If Isnull(Me.Vto_Antirrabica) Then

miSQL = "INSERT INTO INSCRIPCIONES(Reg_FCA, Perros, Raza, Categoría, Grado, Torneo, Nro_Fecha, Fecha, Guía, Agrupación, País, Localidad, Ranking,Perra_en_celo) VALUES ('" & Me.Reg_FCA.Value & "', '" & Me.Perros.Value & "', '" & Me.Raza.Value & "','" & Me.Categoría.Value & "','" & Me.Grado.Value & "', '" & Me.Torneo.Value & "', '" & Me.Nro_Fecha.Value & "',#" & Me.Fecha.Value & "#,'" & Me.Lista_Guia.Value & "','" & Me.Agrupación.Value & "','" & Me.País.Value & "','" & Me.Localidad.Value & "','" & Me.Ranking.Value & "','" & Me.Perra_en_celo.Value & "')"

Else
miSQL = "INSERT INTO INSCRIPCIONES(Reg_FCA, Perros, Raza, Categoría, Grado,Vto_Antirrábica, Torneo, Nro_Fecha, Fecha, Guía, Agrupación, País, Localidad, Ranking,Perra_en_celo) VALUES ('" & Me.Reg_FCA.Value & "', '" & Me.Perros.Value & "', '" & Me.Raza.Value & "','" & Me.Categoría.Value & "','" & Me.Grado.Value & "',#" & Me.Vto_Antirrabica.Value & "#, '" & Me.Torneo.Value & "', '" & Me.Nro_Fecha.Value & "',#" & Me.Fecha.Value & "#,'" & Me.Lista_Guia.Value & "','" & Me.Agrupación.Value & "','" & Me.País.Value & "','" & Me.Localidad.Value & "','" & Me.Ranking.Value & "','" & Me.Perra_en_celo.Value & "')"

End If
DoCmd.SetWarnings False
DoCmd.RunSQL miSQL

DoCmd.SetWarnings True

Es decir, en la primera parte del if, que será la que se ejecute si el campo está en blanco, la SQL la construyes sin incluir el campo Vto_Antirrabica, y en la segunda, que se ejecuta en el caso contrario, la que ya tenías, con todos los campos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas