Вы находитесь на странице: 1из 6

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 incorporado
En 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 guardada

El 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 OpenQuery
El 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 Execute
Mi 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:
CurrentDb.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 Prcticas
Me 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/ExecutingSQL-Statements-in-VBA-Code.htm

Вам также может понравиться