Ejecutar SQL en Access.doc

7
Ejecutar SQL en Access Hay varias maneras de ejecutar el lenguaje de manipulación de datos (DML) de SQL en Microsoft Access, además del obvio proceso de crear una consulta de acción y hacer doble clic en su icono. Entender sus opciones con respecto a la ejecución de la SQL hará que su código sea más limpio, le dará más flexibilidad e incluso va a tener una característica de depuración grande como un bono adicional. El siguiente artículo, aunque no explorar todas las facetas y las opciónes, le muestra cómo ejecutar SQL utilizando los siguientes métodos: DoCmd.RunSQL DoCmd.OpenQuery [Querydef].Execute [Database].Execute dbFailOnError DoCmd.RunSQL Consultas guardadas contra SQL incorporado En aras de esta discusión, la diferenciación se hace entre una consulta guardada en Microsoft Access y una sentencia SQL. Cuando se lee la palabra consulta en el siguiente texto, entiendo que sea un objeto preparado y conservado, con el generador de consulta en Microsoft Access. Leer una SQL embebido en el código VBA. Esto es importante por las siguientes razones: El objeto RunSQL no puede ejecutar una consulta guardada El objeto OpenQuery no puede ejecutar una SQL solo una consulta guardada. El objeto Querydef requiere una consulta guardada El código para descargar la demo que incluye un formulario simple que muestra tanto la sentencia real SQL y el código VBA para ejecutarlo. La aplicación está diseñada para dejarlo en modo de depuración para que pueda seguir la ejecución en el código del módulo en sí. Las consultas guardadas se utilizan cuando sea necesario, pero usar SQL incorporado en todas partes es posible

Transcript of Ejecutar SQL en Access.doc

Ejecutar SQL en Access

Ejecutar SQL en Access

Hay varias maneras de ejecutar el lenguaje de manipulacin de datos (DML) de SQL en Microsoft Access, adems del obvio proceso de crear una consulta de accin y hacer doble clic en su icono. Entender sus opciones con respecto a la ejecucin de la SQL har que su cdigo sea ms limpio, le dar ms flexibilidad e incluso va a tener una caracterstica de depuracin grande como un bono adicional.

El siguiente artculo, aunque no explorar todas las facetas y las opcines, le muestra cmo ejecutar SQL utilizando los siguientes mtodos:

DoCmd.RunSQL

DoCmd.OpenQuery

[Querydef].Execute

[Database].Execute

dbFailOnError DoCmd.RunSQL

Consultas guardadas contra SQL incorporadoEn aras de esta discusin, la diferenciacin se hace entre una consulta guardada en Microsoft Access y una sentencia SQL. Cuando se lee la palabra consulta en el siguiente texto, entiendo que sea un objeto preparado y conservado, con el generador de consulta en Microsoft Access. Leer una SQL embebido en el cdigo VBA.

Esto es importante por las siguientes razones:

El objeto RunSQL no puede ejecutar una consulta guardada El objeto OpenQuery no puede ejecutar una SQL solo una consulta guardada. El objeto Querydef requiere una consulta guardadaEl cdigo para descargar la demo que incluye un formulario simple que muestra tanto la sentencia real SQL y el cdigo VBA para ejecutarlo. La aplicacin est diseada para dejarlo en modo de depuracin para que pueda seguir la ejecucin en el cdigo del mdulo en s. Las consultas guardadas se utilizan cuando sea necesario, pero usar SQL incorporado en todas partes es posible

Mtodo RunSQL

RunSQL es un mtodo del objeto DoCmd de Microsoft Access. Est diseado para DML de SQL, como UPDATE, INSERT y DELETE. No se puede "ejecutar" una consulta de SELECT con el mtodo RunSQL el mtodo fallar si se intenta pasar una instruccin de seleccin a la misma.

Como se mencion anteriormente, RunSQL requiere la actual sentencia SQL, no el nombre de una consulta guardada. La cadena SQL puede ser pasado como un literal o una variable a travs de la siguiente manera:

DoCmd.RunSQL "UPDATE titles SET price = price * 1.10

o ...

sSQL = "UPDATE titles SET price = price * 1.10

DoCmd.RunSQL sSQL

El efecto para el usuario es el mismo que si a un objeto de consulta se ha hecho doble clic. Si se habilitan las advertencias, el usuario ser informado de cuntos registros se vern afectados y teniendo en cuenta el informe de errores estndar en el caso de fallas. Vamos a discutir los errores con ms detalle en breve.

Una de las ventajas de este mtodo es que es una manera rpida, fcil de ejecutar una SQL para simples actualizaciones o eliminaciones. La desventaja es que algunas sentencias SQL, especialmente insertos, puede ser muy complicado muy rpidamente para que la variable sSQL se convierte en difcil de controlar y depurar. Adems, si usted no desea que los usuarios se molesten con los mensajes de alerta estndar de access, usted tendr que quitarlo y volver a poner las advertencias despus del procedimiento.

Mtodo OpenQueryEl mtodo OpenQuery resuelve el primero de los problemas antes mencionados: los insertos de sentencias SQL. Es muy fcil crear complejas consultas INSERT, UPDATE y DELETE en el generador de consulta (QBE) de Microsoft y guardarlos como un objeto en Consulta. Una vez guardado, puede ser ejecutado mediante el comando OpenQuery del objeto DoCmd.

DoCmd.OpenQuery "qMkTbl_sales_bkup"

Esto no significa, sin embargo, abordar la cuestin de las advertencias que requieren la intervencin del usuario para completar la transaccin de la consulta. Si quieres estar seguro de que la consulta se ejecuta sin que el usuario lo sepa o sea capaz de terminar, es necesario desactivar las advertencias, as ...

DoCmd.SetWarnings False

DoCmd.OpenQuery "qMkTbl_sales_bkup"

DoCmd.SetWarnings True

Ahora, hay un pequeo problema con este enfoque tambin. Se supone que las advertencias estn habilitadas. Qu pasa si el usuario ya ha apagado? Bueno, el cdigo anterior se les enciende, lo que podra irritar al usuario. Una vez escrib algo de cdigo para determinar si las advertencias fueron activadas y devolver el ajuste a su estado anterior despus de ejecutar, pero que es un cdigo adicional, y hay una forma ms fcil de manejar este problema

Mtodo Querydef Execute Al guardar la consulta, forma parte de lo que se llama la coleccin de consulta en Microsoft Access y se pueden manipular mediante el establecimiento de una referencia de objeto. Slo se necesitan unas pocas lneas de cdigo y es muy potente:

Dim qdf As DAO.Querydef

Set qdf = CurrentDB.Querydefs("qGeneric")

qdf.SQL = "SELECT * INTO titles_bkup

FROM titles;"

qdf.Execute

Este mtodo elimina el acceso a los mensajes de advertencia tpicas, tales como "Ests a punto de ejecutar una consulta que se ..." y los que se obtiene si hay algn registro que no, junto con una razn vaga por el fracaso. Sin embargo, tendr que controlar los errores de VBA, como el que se muestra a continuacin.

En este caso, trat de ejecutar una instruccin SELECT INTO, que produce un error porque la tabla ya existe. Sin embargo, el usuario no necesita ver este mensaje el controlador de errores est dispuesto a abordar las cuestiones previstas, tales como esta.

Mtodo Database ExecuteMi mtodo preferido de ejecucin de SQL, se ha guardado las consultas SQL o en bruto, es el mtodo Execute del objeto Database. Puede ejecutar una sentencia con una sola lnea, as:EscucharLeer fonticamenteCurrentDb.Execute "UPDATE titles SET price = price * 1.10"

En este caso, las referencias CurrentDB de la base de datos actualmente abierta. Como alternativa, puede crear y cargar una variable de objeto de base de datos, que le permitir lograr ms con este mtodo. Despus de ajustar la variable, puede ejecutar una consulta, el suministro de opciones adicionales y hasta leer el nmero de filas afectadas. Si bien esto tiene unas lneas ms, no es difcil hacerlo:

Dim dbs As DAO.Database, sql as String, iCount as Integer

Set dbs = CurrentDb

sql = "DELETE * FROM stores WHERE state='WY'"

'(No es que haya nada malo en Wyoming!) dbs.Execute sql, dbFailOnError

iCount = dbs.RecordsAffected

Cabe sealar que el mtodo RecordsAffected tambin trabaja con el objeto de definicin de consulta mencionado. Hay coincidencia entre los mtodos y el uso es probablemente ms una cuestin de preferencia que cualquier otra cosa. Algunas personas prefieren mantener todos sus SQL guardadas como consultas, que no es una mala idea cuando se trata de la depuracin, pero hace que la ventana de consulta sea muy desordenada.

Otra caracterstica muy grandes de estos dos mtodos de objeto para la ejecucin de SQL es la informacin de depuracin aadido que se obtiene al agregar la opcin simple, el argumento de dbFailOnError. Al aadir esta opcin, se fuerza el cdigo para detener y lanzar un mensaje de error, que por lo general proporciona informacin ms detallada que la que se obtendra con slo hacer doble clic en una consulta en la ventana de consulta.

Por ejemplo, he creado una consulta para insertar un nuevo registro en la tabla de ttulos, pero omit deliberadamente la columna de precios, la que se requiere. Haga doble clic en una Consulta de datos anexados creado para llevar a cabo esta tarea simple arroj el siguiente error:

De acuerdo con este mensaje, todo access sabe que hubo un error de validacin. Sin embargo, si modifica el cdigo dbs.Execute anterior, aadiendo el mensaje dbFailOnError despus de la instruccin SQL, aparece este mensaje:

Ahora, que sea til! En este caso, yo saba que era el campo de precio que estaba causando el problema porque lo dise de esa manera, pero qu pasa cuando se va a insertar miles de registros en una tabla con decenas de columnas y un campo de un registro contiene los datos errneos tipo o los datos que faltan? Cmo encontrar nunca se bas en el mensaje genrico que dice, "violacin de validacin de la regla?" Que prcticamente no se puede.

Por lo tanto, incluso si usted desea utilizar consultas guardadas, mantener este pequeo truco es muy til. Cuando usted recibe un mensaje de error crptico sobre la ejecucin de una consulta, pulse Ctl-G para abrir la ventana Inmediato y el tipo esta en ...

CurrentDb.Execute "qYourQueryHere", dbFailOnError

Mejores PrcticasMe encanta dar mejores consejo prctica, pero que simplemente no se aplica aqu. Hay, como hemos visto, los diferentes mtodos para ejecutar DML de SQL de Microsoft Access. Hay pros y contras, pero en ltima instancia depende de lo que usted necesita para llevarlo a cabo, la cantidad de errores de informacin que usted necesita y desea recoger y si usted prefiere mantener sus objetos de consulta a un mnimo. Dar a todos una oportunidad y es probable que se asientan en uno que te guste, pero mantener esa opcin dbFailOnError en el bolsillo trasero para las emergencias.http://www.databasejournal.com/features/msaccess/article.php/3505836/Executing-SQL-Statements-in-VBA-Code.htm