¿Como generar registros masivos desde formulario en base al valor de un cuadro combinado?

Tengo una tabla "T_Recibos_Cuota" con los campos ID, Año, DNI, Nombre, Apellidos,... Etc.- Y dos formularios, uno dependiente de esa tabla "F_Ficha_Cuota" donde se va generando el registro anual de cada socio y otro (Formulario Principal)"F_Gestión_Cuotas_Socios", que es desde donde gestiono todo lo relacionado con las cuotas de socios. Este formulario tiene diversos controles y dos subformularios.

La idea, si ello es posible, sería poder generar de forma masiva todos los registros correspondientes a un año. Por ejemplo, codificar un control en el formulario principal "F_Gestión_Cuotas_Socios" para que, en el evento "al hacer clic" se generen todos los recibos correspondiente al año que previamente haya declarado el usuario en un combobox "Año"

Espero haber plasmado la idea de forma que sea comprensible

Ahí lo dejo.

1 respuesta

Respuesta
1

Lo puedes hacer de mil formas, por lo que voy a suponer. Supongamos que tengo una tabla Clientes, con entre otros NombreCliente y Cuota que le corresponde. También tengo una tabla Cuotas con nombrecliente, año y cuota. Con ella hago un formulario continuo En un formulario, me ha parecido que decías que era independiente tines un combinado ElegirAño y el formulario Cuotas como subformulario, de forma que si elijo un año

Elijo 2020 y

Son 92 registros pero mi pantalla no da para más.

El código del evento Después de actualizar del combinado ElegirAño es

Private Sub ElegirAño_AfterUpdate()
If DCount("*", "cuotas", "año=" & Me.ElegirAño & "") >= 1 Then
MsgBox "Ese año ya ha sido contabilizado", vbOKOnly + vbExclamation, "Te jod..."
Exit Sub
Else
DoCmd.SetWarnings False
DoCmd.RunSQL "insert into cuotas(nombrecliente,cuota) select nombrecliente,cuota from clientes"
DoCmd.RunSQL "update cuotas set año=" & Me.ElegirAño & " where año is null"
Me!Cuotas.Form.RecordSource = "select * from cuotas where año=" & Me.ElegirAño & ""
End If
End Sub

Primero cuenta que si en ese año ya se han "creado" las cuotas. Si es así, te avisa con el mensaje y no hace nada, ya que si no, repetiría registros. Y si todavía no han sido creados lo hace y te lo muestra.

Buenos días Julian.

Te comento:

He adaptado el código a mi BD y resulta que funcionar, funciona. 

A ver. Me genera los registros para el año declarado en el combo, pero me da este error

Pero cuando miro en la tabla, resulta que los registros están generados. Como Podría solucionar ese error?

También Pienso que tendría que afinar esto un poco más en el sentido de que cuando el usuario  vaya a generar los recibos  de  forma masiva, el sistema le pregunte si realmente desea hacerlo, y también  seria bueno, de igual forma, poder hacer la eliminación de registros, es decir, en función del años declarado. 

Como podría hacer esto?

Es difícil decir porqué sin saber como está construido el formulario y el subformulario. Además, verás que mis cuotas son más caras, se ve que debo ser del Sevilla. Probablemente, sea porque como en mi ejemplo, el subformulario tiene los mismos campos que la tabla, el Select * funciona. Si tu subformulario no tiene exactamente(el idloquesea no cuenta) todos los campos de la tabla T_Recibos_cuotas tendrás que probar con

....="select año, Nº...,nombre,apellidos,cuota,.... from T_recibos_cuotas....

Por otro lado, en vista diseño del formulario "Principal", mira si el subformulario se llama así.

O quizá el valor año que aparece en el combinado es texto, cuando yo lo puse numérico

Para lo de confirmar que quiere hacerlos, puedes poner( esta mañana había borrado el código del ejemplo, así que te lo abrevio lo que continua igual). También podría ser porque el combinado año, tenga, quizá, dos columnas. O quizá el valor año que aparece en el combinado es texto, cuando yo lo puse numérico

If dcount...

msgbox

exit sub

else

dim respuesta as byte

respuesta=msgbox("¿Esta seguro de que quiere crear las cuotas?",vbyesno+vbquestion,"Luego no te quejes"

if respuesta=vbno then

exit sub

elseif respuesta=vbyes then

docmd.set...

domcd..runsql"Insert..."

docmd.runsql"update..."

me!cuota...

end if

end if

Para eliminar las cuotas de un año, puedes hacerlo de muchas formas

1º Creando un combinado con los años y en el evento Después de actualizar poner

dim aviso as byte

aviso=msgbox("¿Está seguro de querer eliminar las cuotas de este año",vbyesno+vbexclamation,"Las culpas a José María"

if aviso=vbno then

docmd.cancelevent

elseif aviso=vbyes then

docmd.runsql" delete * from T_recibos_cuotas where año=" & me.nombredelcombo & ""

end if

2º O puedes hacerlo poniendo un botón y en sus propiedades-eventos-al hacer clic poner

docmd.runsql"delete * from T_recibos_cuotas where año=[Escriba el año a eliminar]"

Así, cuando pulsaras el botón te pediría que escribieras el año que quieres eliminar. Lo escribes, aceptas y listo.

De todas formas, si quieres, repito, si quieres haz una copia sólo con el formulario y subformulario y me la envías a [email protected]

Si lo haces, en el asunto del mensaje pon tu alias José María, ya que si no sé quien me escribe ni los abro.

He revisado el tipo de datos y creo que todo está correcto. Le he dado mil vueltas y no consigo ver donde esta el problema.

Te he enviado  los objetos  por correo electrónico.

Julian, he seguido tus indicaciones y he eliminado el campo "datos adjuntos" para las fotos, lo he puesto como campo  de texto para poner la ruta de la imagen y adelgazar la BD.- le he puesto este código:


Public Function buscaArchivo() As String
Dim fDialog As Office.FileDialog
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar el archivo"
.InitialFileName = Application.CurrentProject.Path
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "All files", "*.*"
If .Show = True Then
buscaArchivo = .SelectedItems(1)
Else
MsgBox "Ha pulsado el botón <Cancelar>."
End If
End With
End Function

Private Sub Form_socios_Current()
If Not IsNull([Foto]) Then
ImagenFoto.Picture = Foto
Else
ImagenFoto.Picture = ""
End If
If Not IsNull([Fecha_nac]) Then
Edad = Fix((Date - Fecha_nac) / 365.24)
Else
Edad = ""
End If
End Sub
Private Sub Foto_Click()
Foto = buscaArchivo
ImagenFoto.Picture = Foto
End Sub

Y se me plantean los siguientes problemas:

1.- Al hacer clic en el campo foto, busca la foto y la muestra en el control imagenfoto, pero usa la misma imagen para todos los registros.

2.- No guarda la foto, osea, que si cierro el formulario, cuando lo abro de nuevo, no se muestra la imagen.

He revisado una y otra vez  el código comparándolo con el tuyo y no soy capaz de ver en que me he equivocado.

Por favor, iluminame  un poco

Por lo que dices, me da la impresión de que el control Foto del formulario no tiene origen de control. Mira en sus propiedades-Datos-Origen del control

Miras, si en el formulario Socios, hago clic en el control Foto, se abre el "explorador" y voy a elegir una foto

Cuando pulso Seleccionar 

Me voy al siguiente registro y pongo el cursor en Foto y

Y me los ha guardado en la tabla Socios

De todas formas, tienes mi correo a tu disposición

¡Gracias! Julián, era eso. Me faltó definir el origen del control.  ahora funciona perfectamente

Me lo apunto para futuras ocasiones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas