Access. Consulta "Crear Tabla"; definir Tipo de Datos de la tabla creada para los campos con Fórmulas

Me encuentro optimizando una rutina con una base de 3 consultas muy complejas (en teoría podría ser 1 sola pero he tenido que dividirlo en 3 porque he sobrepasado los límites de Access en nº de campos y complejidad)

Mediante código VBA hago varias consultas filtradas a cada una de ellas mediante DAO dbopenrecordset para obtener los datos que voy necesitando; entiendo que lo que hace que mi programa dure más de la cuenta es que por cada consulta filtrada Access actualiza toda la información de las 3 consultas y de todas las que les afecten.

Para esto una idea que he usado en otras ocasiones es realizar una Consulta de Creación de Tabla de cada una de las 3 consultas anteriores ya que mi programa necesita utilizar la "foto" de cada consulta al inicio del mismo; de esta manera, al acceder a estas tablas no se inicia ningún proceso de actualización interna del Access al cargar el Recordset.

Hasta aquí bien y hasta ahora me funcionaba de lujo con otras rutinas más sencillas y para informes; el problema lo tengo cuando el dato que se vuelca a la tabla creada proviene de una fórmula hecha directamente en la consulta ya que Access interpreta el mejor "tipo de dato" que le va bien al campo; el tema está en que mediante vba consulto valores y los almacenos en variables definidas, y muchas veces me da incompatibilidad de tipo de datos.

Un ejemplo: tengo un campo calculado que me devuelve un Si/No (no hay null), pero Access lo define en la tabla creada como Texto. Una de estas fórmulas sería;

[USE: SiInm([Sect_mm2]<[Ranges_Smin] O [Sect_mm2]>[Ranges_Smax] O EsNulo([Sect_mm2]);Falso;SiInm([Sect_mm2]<[Ranges_S_Single_and_Higher] Y [Calc_Multicore]=Verdadero Y [Calc_NoPhases]=1;Verdadero;SiInm([Sect_mm2]>=[Ranges_S_Single_and_Higher] Y [Calc_Singlecore]=Verdadero;Verdadero;Falso)))]

Otro ejemplo: me pasa lo mismo muchas veces con campos que son números pero Access define como texto en la tabla creada:

FUNC_k0: SiInm([Ckt_Iadm_k_Defaults]=Falso;Nz([Ckt_Iadm_k0];1);Nz([LoadType_Default_Iadm_k0];1))

Además las longitudes de los textos los define de 255 caracteres, cuando me podría valer sólo 5 caracteres (menos espacio en memoria).

He intentado definir el formato del campo con la fórmula en "Hoja de Propiedades" de la consulta pero entiendo que es simplemente referido a la visualización del dato, no a su definición.

¿Alguién podría echarme un cable para definir estos campos de las nuevas tablas que provienen de campos calculados de la consulta?

De no ser posible definirlos antes de la creación de la tabla, ¿se podrían definir a posteriori con VBA?

Cualquier indicación al respecto sería de mucha ayuda

Respuesta
2

Si la consulta siempre es la misma y la tabla también no necesitas crearla cada vez.

Borra el contenido de la tabla e inmediatamente inserta en ella los datos que tiene la consulta.

Un Procedimiento Publico en Módulo Estandar, para borrar la Tabla e insertar los datos desde la Consulta. Ojo que el nombre no tenga espacios, ni acentos...

Sub InsertaDatos(ObjetoOrigen As String, ObjetoDestino As String)
'Para que se ejecute ésta consulta de Anexado, los Campos de ObjetoOrigen y destino han de ser los mismos y con el mismo Nombre, en el mismo orden..
'Primero borra los Registros que haya en ObjetoDestino
StrSQL = "DELETE * FROM " & ObjetoDestino & ";"
CurrentDB.Execute StrSQL, dbFailOnError
'Después inserta los datos del ObjetoOrigen
StrSQL = "INSERT INTO " & ObjetoDestino & " SELECT * FROM " & ObjetoOrigen & ";"
CurrentDB.Execute StrSQL, dbFailOnError   'Ejecución de la Consulta de Anexar Datos
End Sub   'InsertaDatos(ObjetoOrigen, ObjetoDestin

Para realizar las dos operaciones, desde un Botón de comando o al abrir un Formulario....

Call InsertaDatos("NombreDeTuConsulta","NombreDeTuTabla")

Un saludo >> Jacinto

En el siguiente ejemplo, me preocupa que la base de datos se haga muy pesada ya que no puedo hacer compactar y reparar cada vez debido a que es un programa con backend en red;

cada consulta tiene 1000 registros (cada vez que actualizo las tablas borro los 1000 anteriores y vuelvo a cargar los 1000 nuevos) y ejecuto la rutina 500 veces (es decir lo anterior x500)...

Para otra rutina que maneja menos volúmen de info como es para temas de reportes el Anexar Datos me viene fenomenal, pero ¿cómo lo ves para este caso?

Pretendía usar Crear Tabla ya que cada vez que la genera, si existe, elimina la tabla anterior de la memoria de Access y genera una nueva e independiente (en otras palabras, el autonumérico y los datos asociados se reinician)

Bueno en mi opinión es igual o "más costoso" eliminar una Tabla, crearla nueva y redefinir el tipo de Datos que Borrar el contenido e insertar, pero claro está que ignoro tu operativa.

Lo de 1000 registros lo veo "pequeño", y lo que no sé es lo de ejecutarlo 500 veces.

El tema del autonumérico puede solventarse numerando con un Recordset o algo similar, pero todo ésto te lo comento con la propia reserva de no saber tu estructura de datos.

Ciertamente me choca un poco lo de 500 veces que citas en tu aclaración. Un saludo >> Jacinto

La rutina sobre la que estoy trabajando es un proceso de cálculo de manera que se ejecuta tantas veces como elementos o pruebas se quiera hacer. Normalmente por proyecto son entre unos 500 y unos 5000 elementos a calcular.

Realmente la solución de Anexar Tabla es una solución muy buena, lo único que me preocupa es la semilla que se queda en Access al eliminar datos, por lo que podría resultar en un fichero accbd muy grande pero con demasiada información "innecesaria" (semillas). Desde mi ignorancia, lo veo más como un problema de volumen que de rendimiento frente a Crear Tabla.

En una plataforma multiusuario y con backend en red, ¿Has encontrado alguna vez solución a este tema? 

Muchísimas gracias de nuevo Jacinto

Solo en un caso similar al que expones en las que voy borrando los datos de 2 Tablas de unos 10.000 y 15.000 registros, pero también com poca frecuencia 1 o 2 veces al mes.

No tienen autonumérico y son pocos usuarios.

Al no dedicarme ni ahora ni antes al soft comercial, quizá ha contribuido a que cuestiones similares a ésta no me hayan ocurrido.

En cuanto a compactación del BackEnd mira éste enlace que trata el tema y habrá muchos más.

http://www.mvp-access.com/foro/compactar-otra-bd_topic81259.html 

Para el enlace del ejemplo de Neckkito, ten en cuenta que ahora no tiene esa Web.

Ahora está en:

http://neckkito.xyz/nck/index.php/ejemplos/17-seguridad/140-backup-bd-dividida-en-tiempo-de-ejecucion 

No he mirado el ejemplo que cita del Buho de "Usuarios fuera". Saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas