Generación automática (y/o borrado automático) de registros conforme se van marcando varios check-box

Tengo una BD sencillita (ver imagen con 3 tablas relacionadas)

Se trata de llevar un control de la formación de las personas de una empresa. Para ello, además de la tabla Personas (que no necesita de explicación), tengo:

  • Tabla Necformativa (Necesidades Formativas que se van identificando y que es necesario planificar para que se cubran por parte de determinados trabajadores).
  • Tabla Formación (Se ha hecho "algo", que puede ser por ejemplo un curso que ha cubierto la necesidad formativa).

El problema viene cuando 1 mismo curso lo han realizado 50 trabajadores (en el formulario correspondiente tengo que cumplimentar 50 registros iguales (o muy similares), uno por cada trabajador.

Lo ideal sería que en el formulario donde meto esa información pudiese tener un listado de personas con un check-box en cada uno de ellos, ir seleccionando las personas que han hecho el curso y que se generen los 50 registros automáticamente.

¿Cómo lo haríais? ¿Alguna solución relativamente simple? (El código no es lo mío, aunque si toca picar código, pues se pica). Había pensado también (igual es más fácil) en generar un formulario continuo en el que al actualizar un campo determinado se "copiasen" los datos anteriores y solamente tendría que seleccionar una persona.

Finalmente, si por el mismo sistema se pudiese "des-checkear" para eliminar el registro (ha podido haber un error) sería la bomba.

1 respuesta

Respuesta
1

Alberto: Te sugiero lo siguiente >> Trabajar con Recordsets

1.- Crear una Tabla Temporal con todas las Personas y con tres campos.

IdPersona- (Numerico), NombPersona - (Texto), AltaCurso - (Si/No)

Esta tabla debe borrarse toda y recargarse con los valores que haya en la Tabla "Personas"

Borrar con DELETE * y Cargar con una Consulta de Anexar Datos INSERT INTO ..

Tomando como Tabla Origen Personas y como destino ésta que le vamos a llamar "PersonasTemp" >> Solo insertar 2 Campos, que serán el Id y el Nombre.

2.- Para dar las altas

1 Formulario Principal con Origen de Datos en la Tabla Formacion.

1 SubFormulario Continuo sin Vinculo con el Principal que llamaremos por ejemplo "FPersonasTemp" con Origen de Datos en la Tabla >> "PersonasTemp"

Marcas todos los ChecBox que quieras añadir a la Tabla Formacion.

Llegados a éste punto Necesitaremos 2 Recorsets y éste código en un botón que voy a llamar BtnInscripciones

Private Sub BtnInscripciones_Click()
Dim QryPers As String,QryForma As String
Dim RstPers As DAO.Recorset, RstForma As DAO.Recordset
QryPers = "SELECT * FROM PersonasTemp WHERE AltaCurso = -1"
Set RstPers = Currentdb.OpenRecordset(QryPers,dbopenSnapshot)
If Not RstPers.EOF And Not RstPers.BOF Then
      QryForma = "SELECT Trabajador FROM Formacion;"
      Set RstForma = Currentdb.OpenRecordset(QryForma,dbOpenDynaset)
      Do While Not RstPers.EOf
          RstForma.AddNew
             RstForma!Trabajador = RstPers!IdPersona
             'Aquí llenas los otros Campos de la Tabla. El Id supongo que es un Auto y se genera solo
              RstForma!FechaRegistro = Date()' O lo que quieras
          RstForma.Update
          RstPers.MoveNext
          DoEvents
      Loop
      RstForma.Close
      Set RstForma = Nothing
Else
      MsgBox "No has marcado ninguna Persona",vbCritical,"DATOS NO MARCADOS"
End If
RstPers.Close
Set RstPers = Nothing
'Aqui si quieres puedes borrar la Tabla Temporal. Si decides hacerlo aquí
Dim StrSQL As String
StrSQL = "DELETE * FROM PersonasTemp;"
StrSQL = ""
Me.FPersonasTemp.Visible = False 'Para ocultar el SubFormulario Continuo
End Sub

La carga de la Tabla Temporal, la has de hacer mediante algún Botón al Efecto o en algún código que ya tengas.

No he probado ese código porque lo he ido escribiendo sobre la marcha.

Ya me contarás. Saludos >> Jacinto

Saludos de nuevo Jacinto.

He de decirte que eres un crack! Aparte de que, conceptualmente la solución es PERFECTA, escribir ese código "a pelo" sin un solo error.... impresionante. Me ha forzado a leer sobre temas que desconocía y a aprender un poquito más sobre Access, así que CHAPÓ!.

El código funciona perfecto, salvo en dos pequeñas cositas en la parte del código que asigna los valores a los registros, que paso a consultarte a continuación:

1) En los campos que extraigo del formulario que tengo abierto me sale un: "Error 3265. No se encontró el elemento en esta colección"

2) En el campo del nombre del trabajador que extraigo de RstPers me sale un: "Error 3421. Error de conversión de tipos de datos".

En ambos casos, cuando accedo al depurador y paso el ratón por encima de la línea amarilla, el valor que coge es correcto (luego todo lo anterior funciona), pero parece que falla al asignarlo (ver imagen de ejemplo con la fecha).

A ver si hay suerte y puedes ver los errores fácilmente.

Muchísimas gracias de antemano.

Alberto: Te sugerí en mi código, después de la línea>>

RstForma. AddNew

 RstForma!Trabajador = RstPers!IdPersona

'Aquí llenas los otros Campos …….de la Tabla ……..

 RstForma!FechaRegistro = Date()' O lo que quieras

 RstForma.Update

Esto es incompatible con la consulta que te puse >>

QryForma = “SELECT Trabajador FROM Formacion;”

Para grabar más de un Campo, la Consulta debe ser>>

QryForma = “SELECT * FROM Formacion;”

Y ahora vamos a los Errores.

El primero es lógico ya que lo que no encuentra es ¡Fecha_registro en el Recordset, porque no lo habíamos seleccionado en la Consulta.

El segundo viene del valor que le estás pasando al Campo Trabajador.

Estás pasando un valor de texto a un Campo que es Numérico, según la relación que tienes en las Tablas.

RstForma!Trabajador = RstPers!NombPersona y debe de ser >>

RstForma!Trabajador = RstPers!IdPersona

Si tienes dificultades me comentas. Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas