En Access 2003 ¿Cómo leo una tabla y obtengo sus registros relacionados en otra en tablas parciales?

En Access 2003 tengo una BD con dos tablas relacionadas por Id_Provincia. Una es, digamos, la tabla de datos generales y otra es la tabla de provincias. Lo que pretendo es desarrollar una consulta, que, de manera automática, es decir, no teniendo que cambiar cada vez el criterio, (="Alaba", ="Albacete", etc), me genere tablas parciales con los registros correspondientes a cada provincia.

La lógica sería leer la tabla de provincias, obtener sus registros relacionados en la tabla general, y guardar el resultado como una tabla con el nombre de su provincia. Al final se obtendrían 52 tablas parciales.

No controlo Access pero tengo bastante experiencia en desarrollo con otras herramientas.

1 respuesta

Respuesta
1

Esto lo tendrás que hacer mediante código, te cuento:

Supongo que la tabla se llama Provincias, con el campo Provincia (en este campo ne existirán duplicados), la otra tabla la llamaré General, con los campos Provincia y Detalle.

Vas a la pestaña módulos y abres uno nuevo, ahí crearemos una función que llamaremos, por ejemplo, CreaTablas, la función sería (el texto que va precedido de ' son comentarios):

Function CreaTablas()

' Declaramos la variables, para la base de datos bd, para el recordset rs y para el nombre de la provincia vProvincia

Dim db As Database

Dim rs As Recordset

Dim vProvincia As String

' Activamos la base de datos:

Set db = CurrentDb

' Creamos el recordset basado en la tabla Provincias (la sql sería: seleccioname el campo Provincia de la tabla Provincias)

Set rs = db.OpenRecordset("Select Provincia From Provincias")

' Con el bucle Do While ... Loop recorremos los registros de este recordset (EOF ---> final de fichero), es decir mientras no (NOT) sea final de fichero ---> mientras existan registros... hazme

Do While Not rs.EOF

' Igualamos la variable vProvincia al valor del campo Provincia del recordset

vProvincia = rs!Provincia

' Con el método DoCmd. RunSql ejecutamos una consulta de acción, en este caso la de creación de tabla. La sql es: Selecciona los campos Provincia y Detalle y anexalos (INTO) a una tabla, en este caso la tabla se llamará igual que la variable ---> el nombre de la provincia, de la tabla General (FROM)

Con la condición (WHERE) de que el campo Provincia de la tabla General sea igual al valor de la variable (vProvincia)

DoCmd.RunSQL "Select Provincia, Detalle Into [" & vProvincia & "] from [General] where [Provincia]='" & vProvincia & "'"

'Pasamos al siguiente registro del recordset

Rs. MoveNext

' Cerramos el blucle

Loop

End Function

Perdón por la burrada de "Alaba", En cuanto lo pruebe te digo algo. Gracias por tu ayuda

Perfecto, justo lo que quería. Muchas gracias.

Sólo unas puntualizaciones:

1) Cada vez que se crea una nueva tabla parcial "Alaba","Albacece",etc,se visualiza un mensaje de confirmación: 'Va a pegar & filas en una nueva tabla ..' Por defecto la respuesta será siempre SI, excepto en el caso 2) así que ¿como puedo evitar que aparezca el mensaje?

2) Cuando no encuentre ningún registro en la tabla General, no debe de crear la tabla

3) El objetivo final de toda la historia sería enviar automáticamente correos electrónicos a los delegados de cada provincia adjuntando su correspondiente tabla. Ya tengo una tabla relacionada por Id_Provincia con las direcciones. ¿Es ésto posible? En caso afirmativo pido humildemente ayuda.

Un saludo y muchas gracias

Perdón, se me ha olvidado decir que, al ser éste un proceso mensual, para organizar mejor las tablas, sería conveniente incluir en el nombre de las tablas creadas además del nombre de la provincia, el número del mes actual

Vuelvo a ser un burro con "Alaba"

Para activar/desactivar mensajes se utiliza el método:

DoCmd.SetWarnings True

DoCmd.SetWarnings False

Te aconsejo que los desactives al principio del código y al final del mismo los vuelvas a activar.

Para ver si hay registros o no utilizaremos otro recordset rs1 y lo abriremos con una consulta de selección, si el recordset devuelve registros (NOT rs1. EOF) entonces crearemos la tabla:

Function CreaTablas()

Dim db As Database

Dim rs As Recordset

Dim rs1 As Recordset

Dim vProvincia As String

DoCmd.SetWarnings False

Set db = CurrentDb

Set rs = db.OpenRecordset("Select Provincia From Provincias")

Do While Not rs.EOF

vProvincia = rs!Provincia

Set rs1 = db.OpenRecordset("Select Provincia from [General] where [Provincia]='" & vProvincia & "'")

If Not rs1.EOF Then

DoCmd.RunSQL "Select Provincia, Detalle Into [" & vProvincia & "] from [General] where [Provincia]='" & vProvincia & "'"

End If

rs.MoveNext

Loop

DoCmd.SetWarnings True

End Function

En cuanto a lo de los correos, la verdad es que no lo he utilizado nunca.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas