Cómo desde un Subformulario, Abrir un Formuario Oculto fitrado por un registro nuevo o uno ya existente y Actualizar sus datos?

Estoy intentando abrir un formulario de manera oculta y filtrado por el nro de documento pero me resulta imposible.

Tengo un “FormMatriculas” en donde matriculo alumnos de una academia. Contiene 3 campos:

1 – dni : es el nro de documento del alumno

2 – Apellido y nombre: contiene los nombres de los alumnos.

Dentro de éste formulario, inserté un Subformulario “SubFMatricula, en donde introduzco datos sobre las materias a cursar, sus precios y el importe a abonar por mes. Los datos que necesito trasladar desde este SUBFORMULARIO al formulario oculto son

1 – cuota mensual, 2 – dni del alumno 3 – año lectivo

El procedimiento consiste que al SALIR del Formulario “FormMatriculas”, Se pueda ABRiR DE MANERA OCULTA otro formulario denominado “FCuotas” filtrado por el numero de dni del Subformulario “SubFMatricula” de manera que SI NO EXISTE ME CREE EL NUEVO REGISTRO y actualice los datos “CuotaMensual” y “AñoLectivo”. Y en caso de existir, LO ABRA Y ACTUALICE SOLO el registro “Cuota Mensual”.

Lo he intentado de todas maneras posible a mi reducido entender y nadaaa. Si me echan una mano se los agradecería infinitamente.

1 Respuesta

Respuesta

Ignoro tu diseño de la Base de datos, pero en ningún momento (con tu explicación), veo la necesidad de abrir ningún formulario oculto, para actualizar ( o en su caso añadir) un dato que debes tener en una Tabla, que pueda llamarse TblCuotas, u otro nombre que no citas.

Mi sugerencia es que en el Evento (Después de Actualizar), AfterUpdate del Control >> CuotaMensual del SubFormulario >> SubFMatricula, pongas algo así.

Private Sub CuotaMensual_AfterUpdate()
If Nz(DCount("*","TblCuotas","DNI = '" & Me.DNI & "' & " AND AñoLectivo = " & Me.AñoLectivo),0) > 0 Then
  'Aquí una Consulta de Actualización de la Cuota de ese año
  CurrentDB.Execute "UPDATE......
Else
  'Aquí una consulta de inserción (Anexado), de DNI, AñoLectivo y Cuota
   CurrentDB.Execute " INSERT INTO .....
End If
End Sub

Para la Primera Opción

https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/update-statement-microsoft-access-sql 

Para la Segunda Opción.

https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql 

Y aquí tienes varias líneas de Ejemplos.

https://docs.microsoft.com/es-es/office/vba/access/concepts/structured-query-language/insert-update-and-delete-records-from-a-table-using-access-sql 

Un saludo >> Jacinto

Hola, disculpa la demora en notificarme ...te comento que intenté aplicarlo pero no funciona, ergo no lo hice bien. Me parece que el problema puede ser que el subformulario se llama "SubFMatriculas" y cada vez que introduzco ése nombre en la instrucción, Access me cambia automáticamente la letra mayúscula "F" por "f" minúscula del nombre del Subformulario. Podrías orientarme porqué sucede ésto o cómo soluccionarlo?? Muchas Gracias

Esa transformación viene de que tu SubFormulario, realmente se llama o se ha llamado en alguna ocasión >> Subf..., en lugar de SubF..., pero no creo que eso afecte a la actualizaciín o añadidura de Datos en la Tabla. Si me pones aquí el código con el que estás intentando hacer esa operación y los Objetos que intervienen quizá pueda ayudarte. Los objetos son Tablas, Campos de la Tabla, Nombres de Conroles del Formulario, etc.

Mis saludos >> Jacinto

Aqui te envio las instrucciones que escribí. Gracias Nuevamente

Private Sub ActualizaTCuotas_Click()
If Nz(DCount("*","TPagoCuotas","DNICuotas = '" & Me.DNIDatos & "' & " AND AñoLectivoCuota = " & Me.AñoMatricula),0) > 0 Then
'Aquí una Consulta de Actualización de la Cuota de ese año
'CurrentDb.Execute "UPDATE......"
Update TPagoCuotas
SET ImporteCuota = 'Me.ImpCuotaMensual'
Else
'Aquí una consulta de inserción (Anexado), de DNI, AñoLectivo y Cuota
'CurrentDb.Execute " INSERT INTO ....."
CurrentDb.Execute INSERT INTO TPagoCuotas ([DNICuota], [AñoLecticoCuota], [ImporteCuota])
VALUES (DNIDatos, 'AñoMatricula', 'ImpCuotaMensual')
End If
End Sub

Espero acertar con tus Nombres y Tipos de campo, que por intuación supongo que son:

DNICuota >> Texto, AñoLectivoCuota >> Número Entero, ImporteCuota Número Doble

De ese Modo tendríamos el Código:

Private Sub ActualizaTCuotas_Click()
If Nz(DCount("*","TPagoCuotas","DNICuotas = '" & Me.DNIDatos & "' & " AND AñoLectivoCuota = " & Me.AñoMatricula),0) > 0 Then
    'Aquí una Consulta de Actualización de la Cuota de ese año
     CurrentDb.Execute "UPDATE TPagosCuotas SET ImporteCuota = " & Me.ImpCuotaMensual & " WHERE DNICuota = '" & Me.DNIDatos & "'" & " AND AñoLectivoCuota = " Me.AñoMatricula
Else
    'Para evitar el Error de la coma(,) al Insertar una Cantidad si es que tiene decimales >> Te pongo una variable
    Dim LaCuota As String
    LaCuota = Replace(Me.ImpCuotaMensual, ",", ".") 
    CurrentDb.Execute "INSERT INTO TPagoCuotas ([DNICuota], [AñoLectivoCuota], [ImporteCuota]) VALUES ('" & Me.DNIDatos & "', " & Me.AñoMatricula & "," & LaCuota & ")"
End If
End Su

Si te dá algún error me comentas el Tipo y en la línea que te detiene el Código.

Confirma los Nombres y Tipo de Campo, porque en uno tienes >> AñoLecticoCuota y yo he puesto >> AñoLectivoCuota. Un saludo >> Jacinto

Hola nuevamente, te comento que DNIDatos,  AñoLectivoCuota e ImporteCuota son Numerico Entero Largo, sin decimales.

Al escribirlos la línea correspondiente  a 

If Nz(DCount......    QUEDA EN COLOR  ROJO CON EL SIQUIENTE MENSAJE:  SE ESPERABA SEPARADOR DE LISTAS O )
LA LINEA
CurrentDb.Execute "UPDATE TPagosCuotas SET ImporteCuota = " & Me.Im.....
QUEDA EN ROJO Y NO LLEGA A COMPILARSE

                    

Si todos los datos son Enteros, ya sean long o Integer pon ésto.

Private Sub ActualizaTCuotas_Click()
If Nz(DCount("*","TPagoCuotas","DNICuotas = " & Me.DNIDatos & " & " AND AñoLectivoCuota = " & Me.AñoMatricula),0) > 0 Then
    'Aquí una Consulta de Actualización de la Cuota de ese año
     CurrentDb.Execute "UPDATE TPagosCuotas SET ImporteCuota = " & Me.ImpCuotaMensual & " WHERE DNICuota = " & Me.DNIDatos & " & " AND AñoLectivoCuota = " Me.AñoMatricula
Else
    'Para evitar el Error de la coma(,) al Insertar una Cantidad si es que tiene decimales >> Te pongo una variable
    CurrentDb.Execute "INSERT INTO TPagoCuotas ([DNICuota], [AñoLectivoCuota], [ImporteCuota]) VALUES (" & Me.DNIDatos & ", " & Me.AñoMatricula & "," & Me.ImpCuotaMensual & ")"
End If
End Sub

En mi anterior contestación  el End Sub final estaba incompleto >> Faltaba la "b" final. Saludos >> Jacinto

Sólo me sale error de sintaxis en:

If Nz(DCount("*","TPagoCuotas","DNICuotas = " & Me.DNIDatos & " & " AND AñoLectivoCuota = " & Me.AñoMatricula),0) > 0 Then
    

Vamos a trocear el problema y lo ejecutas paso a paso par ver si falla.

Dim FiltroDNI As String, FiltroAño As String, FiltroTotal As String
FiltroDNI = "DNICuotas = " & Me.DNIDatos
FiltroAño = "AñoLectivoCuota = " & Me.AñoMatricula
FiltroTotal = FiltroDNI & " AND " & FiltroAño
If Nz(DCount("*","TPagoCuotas",FiltroTotal),0) > 0 Then

Me comentas como va. Un saludo >> Jacinto

Sólo me sale error :  NO SE ENCONTRO EL METODO O EL DATO MIEMBRO en..

FiltroAño = "AñoLectivoCuota = " & Me.AñoMatricula.   

el campo ME.AñoMatricula corresponde al Subformulario insertado en el formulario FTMatricula. 

Dicho campo tiene la propiedad VISIBLE: NO

Tendrá algo que ver????

Por visible o no, no es, pero si el Formulario donde tienes ese valor es distinto del que usas para llamarlo, lógicamente te da error y te lo dará en el resto del Código.

Citas un FTMatricual que antes no habías mencionado.

Hoy ya es muy tarde aquí y voy a dormir, pero si me dices ese Formulario dónde está, si como subformulario, o Principal, mañana lo miro y te comento. Al sacar ese Nombre nuevo me has despistado. Un saludo >> Jacinto

Desde ya muchas gracias por tu tiempo y disculpa lo mal que redacto mis preguntas. 

El Formulario se llama "FTMatriculas" y tiene el campo "DNIDatos" en su Encabezado. Este campo pertenece a un registro de la tabla "TDatosAlumnos".

En el detalle (de FTMatriculas") se encuentra insertado el subformulario SubFTMatriculas", que tiene los campos "DNIMatricula", "AñoMatricula" e "ImpCuotaMensual". Estos campos pertenecen a un registro de la tabla "TMatriculas". 

Aclaro que "DNIDatos" está viculado (1 a varios)  con "DNIMatricula"

El formulario "FTPagoCuotas" contiene el campo: "DNICuota" en su Encabezado. Este campo pertenece a un registro de la tabla "TDatosAlumnos".

En el detalle (de "FTPagoCuotas") se encuentra insertado el subformulario "SubFTPagoCuotas", que tiene los campos "DNICuota", "AñoLectivoCuota" e "ImporteCuota". Estos campos pertenecen a un registro de la tabla "TPagoCuotas". 

Aclaro que "DNIDatos" está viculado (1 a varios)  con "DNICuota"

Ahora bien, En un botón comando denominado "cmdActualizo"", insertado en el encabezado del formulario "FTMatriculas" intento actualizar los los campos:

1) "DNICuota" de  la tabla "TPagoCuotas"....tomando el valor del campo "DNIDatos" del encabezado del formulario "FTMatriculas"

2) "AñoLectivoCuota" de la de  la tabla "TPagoCuotas"....tomado el valor del campo "AñoMatricula" del subformulario "SubFTMatriculas"

3)  "ImporteCuota" de la de  la tabla "TPagoCuotas"....tomado el valor del campo "ImpCuotaMensual" del subformulario "SubFTMatriculas"

De esta manera (pienso) podría luego abrir el formulario "FTPagoCuotas" filtrado por los campos "DNICuota" y "AñoLectivoCuota" y ya tendría el valor del campo "ImporteCuota".

Espero haber sido más didáctico. Nuevamente Gracias por tu predisposición para ayudarme.

," AñoLectivoCuota" e "ImporteCuota". Estos campos pertenecen 

Deseo abrir el 

Veamos si adelantamos. Vuelvo a mi sugerencia inicial de pasar los datos a la Tabla TPagosCuotas en el Evento Después de actualizar del Control >> "ImpCuotaMensual" del SubFMatriculas. No veo la razón de botones extras.

Lo que si te sugiero es que asegures que los "tres" datos base están con valores.

El DNIMatricula no debe haber problema, ya que con el alta de un nuevo registro toma el valor del DNIDatos.

Para asegurar que AñoMatricula tiene valor la idea sería que en el Evento Al recibir el Foco de ImpCuotaMensual valides que el AñoMatricula está completado. Algo así.

Private Sub ImpCuotaMensual_GotFocus()
If Not IsNumeric(Me.AñoMatricula) Then
   MsgBox "Antes has de llenar ael Año",vbCritical,"FALTA DATO"
   Me.AñoMatricula.SetFocus
End If
End Sub

Y en el Evento AfterUpdate de ImpCuotaMensual >>

Private Sub ImpCuotaMensual_AfterUpdate()
If Nz(DCount("*","TPagoCuotas","DNICuota = " & Me.DNIMatricula & " & " AND AñoLectivoCuota = " & Me.AñoMatricula),0) > 0 Then
   CurrentDb.Execute "UPDATE TPagosCuotas SET ImporteCuota = " & Me.ImpCuotaMensual & " WHERE DNICuota = " & Me.DNIMatricula & " & " AND AñoLectivoCuota = " Me.AñoMatricula
Else
   CurrentDb.Execute "INSERT INTO TPagoCuotas ([DNICuota], [AñoLectivoCuota], [ImporteCuota]) VALUES (" & Me.DNIMatricula & ", " & Me.AñoMatricula & "," & Me.ImpCuotaMensual & ")"
End If
End Sub

No entro en el análisis de la estructura de tus tablas y datos, porque imagino que tus razones tendrás para hacerlo así. Un saludo >> Jacinto

¡Gracias!  Muchas Gracias por tu colaboración y paciencia. Funciona a la perfección. Has ayudado a un abuelo amateur en access para quedar bien con su hija. Ella es profesora de danzas y tiene una academia. Tengo la pretensión de darle una mano en la parte administrativa ya que acabo de jubilarme. Recién empiezo con esto de Access. Nuevamente GRACIAS!!!!!

Pues vamos de jubilado a jubilado, aunque en mi caso ya hace años que lo estoy.

Si quieres que le de una a la estructura de esa BBD antes de que tengas mucho construido me la envías a jtrilloj@gmail.com

Un cordial saludo >> jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas