Performance de Consultas Access docmd. Runsql

tengo varias consultas las cuales van llenando una tabla llamada [Export_Salary]

Con comando docmd. Runsql funciona a la perfección. Por ejemplo:

strSQLInsert = "INSERT INTO [Export_Salary] SELECT [abfrage21].* FROM [abfrage21]"

If Form_Selection.cboxfirm1.Value <> "" Or Form_Selection.cboxlob1.Value <> "" Or Form_Selection.cboxrestrictionlob1.Value <> "" Or Form_Selection.cboxcity1.Value <> "" Or Form_Selection.cboxrestriction1.Value <> "" Or Form_Selection.cboxconfirm1.Value <> "" Then
DoCmd. RunSQL strSQLInsert

Pero la ejecución de la consulta se vuelve muy lenta por lo que intente con

CurrentDb. Execute strSQLInsert, dbFailOnError

Pero me ocasiona un error 3061.

Quizás me podrían decir que estoy haciendo mal, o si es que hay alguna otra forma de poder hacer que la consulta se ejecute más rápido.

4 respuestas

Respuesta
2

Daniel: Ignoro si el error solo se presenta con Execute.

Bajo mi punto de vista, espera algún parámetr en una condición WHERE, o algo parecido.

En principio creo que se puede descartar el que haya nombres de campo distintos en Export_Salary y en Abfrage21, pero podría ser.

Me inclino a pensar que espera algún tipo de WHERE Id de la Tabla sea el Id Del Formulario, o algo así. Mis saludos >> Jacinto

Daniel: Una explicación más amplia y técnica de la que te comento, puedes encontrarla en éste enlace.

http://www.utteraccess.com/wiki/index.php/RunSQL_vs_Execute 

Mis saludos >> Jacinto

Gracias por la explicación, bueno es que me pide 6 parámetros.

Bueno lo que olvide decir es que [Abfrage21] es una consulta la cual es filtrada por 6 campos combinados y después del filtrado inserto (INSERT...) el resultado en una tabla para exportar en excel.

Bueno los nombres de los campos en las dos, Consulta y tabla son iguales.

Entonces significa que si quiero utilizar CurrentDb. Execute strSQLInsert, dbFailOnError, necesito colocar WHERE y los campos combinados en INSERT? ¿De los cuales ya antes ha sido filtrado antes? ¿O no he entendido bien?

Bueno no tengo problemas con docmd. Runsql ahí no tengo problemas, el sql es ejecutado pero dura a veces mucho. Por lo que leyendo sobre el tema leí que currentdb.execute se ejecuta mucho más rápido que docmd. Runsql.

¿Tienen alguna idea?

Y gracias por el comentario

Daniel: Si ya tienes la consulta, simplemente conviertela en una de Datos anexados y la ejecutas.

CurrentDb. Execute "Abfrage21Anexa", dbFailOnError

Te he cambiado el nombre para que destaque, pero puedes dejar el que hay.

Si es que así te falla, es que algún campo no está en el formato adecuado. Mis saludos >> Jacinto

Gracias Jacinto: bueno lo que quiero ejecutar es un String el cual inserta la consulta en una tabla, Disculpa mi impresicion, pero a que te  refieres a convertirla a Datos anexados?

o como se convierte a datos anexados?

y gracias por la ayuda

Daniel: Mi primera sugerencia es que hagas una copia de tu BD, por si acaso.

Pon la consulta Abfrage21 en vista de diseño. Pulsa en Diseño y elige Anexar

Te saldrá una ventana emergente, pidiéndote el nombre de la Tabla a la que quieres anexar los Datos. En tu caso le pones Export_Salary.

En la Parrilla de abajo de la Consulta, deben aparecer los mismos campos, en la línea de "Anexar a:"

Si ejecutas la Consulta, te anexará "Insertará", los registros de esa Consulta en la Tabla que has señalado Export_Salary. Mis saludos >> Jacinto

Respuesta
2

Prueba con

docmd.setwarnings false

if not isnull([cboxfirm1]) or not isnull([cboxlob1]) or.....then

docd.runsql"insert into export_salary select * from abfrage21"

end if

Si los nombres de los controles o lo quesea es continuo(no hay espacios) no es necesario encerrarlos entre corchetes

No te había comentado que, lógicamente, para que esa instrucción funciones tienen que llamarse igual los campos. Si no fuera así, tendrías que ponerla como:

DoCmd.RunSQL "insert into export_salary (uncampo, otrocampo) select nombrecompañia,nombrecontacto from abfrage21"

Gracias por tu respuesta, bueno no tengo problemas al ejecutar docmd. Runsql, el único problema seria que tarda en ejecutar la acción sql. Pero por ahí leí que utilizando currentdb.exe es mucho más rápido que la anterior antes mencionada, El problema es que espera 6 parámetros más.

Bueno Abfrage21 es una consulta la cual es filtrada por seis campos combinados. Pero lo que no entiendo es que espera currendb si es que la consulta ya fue filtrada.

Lo único que se me ocurre es que se ralentice por tener que ir comprobando los criterios de la consulta, y que sean muchos registros. Pero no tengo forma de comprobarlo, porque de las tablas que tengo, la que más registros tiene es la de Clientes de la base Neptuno, y son 91.

Bueno si la diferencia es grande, inserta alrededor de 5000 líneas.

Son unas cuantas, no es extraño. Ten en cuenta que va "recorriendo" uno a uno los registros de abfrage y lo va insertando en export_salary. Y si, tiene muchos campos, pues más.

Respuesta

Este error podría producirse por varias razones. Habría que ver que la estructura de las tablas sea la misma, aunque es extraño porque el sql corre bien con RunSQL.

Respuesta

El error lo tienes aquí:

- esta haciendo un insert, por lo que es necesario que le digas la tabla [TablaA] y el campo [CampoA]

- insertas un Select * from [TablaB], el * te dará todos los campo de la tabla B

¿Los valores de qué campo de la Tabla B tiene que meter en el CampoA de la TablaA?

Tienes que estar seguro de que el resultado del select que insertas tiene un sólo campo para insertar en el campo.

Construye el SELECT que te quede con un sólo campo: SELECT CampoB as CampoAInsertar from TablaB WHERE .... El resultado será un select de un sólo campo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas