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
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
Para la Segunda Opción.
Y aquí tienes varias líneas de Ejemplos.
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!!!!!
- Compartir respuesta