Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CAPÍTULO 11
Índice de contenido
CAPÍTULO 1.......................................................................................................................................1
INTRODUCCIÓN................................................................................................................................2
¿POR QUÉ ESTE CURSO?............................................................................................................2
CONFESIONES ÍNTIMAS.............................................................................................................2
Y EN ESTE PRIMER CAPÍTULO.................................................................................................3
EL LENGUAJE SQL...........................................................................................................................3
RÁPIDAMENTE... ¿QUÉ ES?.......................................................................................................3
TIPOS DE DATOS..........................................................................................................................4
DATOS TIPO TEXTO................................................................................................................4
DATOS TIPO MEMO.................................................................................................................5
DATOS TIPO NÚMERO............................................................................................................6
DATOS TIPO FECHA/HORA....................................................................................................7
DATOS TIPO MONEDA............................................................................................................8
DATOS TIPO AUTONUMÉRICO.............................................................................................8
DATOS SÍ/NO (DATOS BOOLEANOS)...................................................................................8
DATOS OBJETO OLE...............................................................................................................8
DATOS BINARIOS....................................................................................................................9
CUADRO RESUMEN................................................................................................................9
ALGUNOS COMPONENTES DE SQL.......................................................................................10
COMANDOS............................................................................................................................10
CLÁUSULAS...........................................................................................................................11
PREDICADOS..........................................................................................................................11
OPERACIONES.......................................................................................................................11
OPERADORES........................................................................................................................12
FUNCIONES AGREGADAS...................................................................................................12
PREPARACIÓN Y EXPLICACIONES VARIAS PARA SEGUIR EL RESTO DEL CURSO.........13
PARA FINALIZAR ESTE CAPÍTULO.............................................................................................18
1
Visítame en http://bit.ly/NckAccess
INTRODUCCIÓN
Entonces se enciende una bombilla en eso que llaman cerebro y pienso: “¿por qué no hacer un
curso para que los sufridos usuarios de Access puedan entender qué están haciendo?”
Y, como diría Aristóteles, de la potencia al acto: de ahí que ahora los “afortunados” tengáis en
vuestras manos este curso (modestia aparte, claro... je, je...).
Como habréis podido intuir, y quienes me conocéis un poco ya habréis adivinado, la idea de
este curso no es meterse a fondo en teoría sobre SQL; mi intención es darle un carácter
práctico, y el objetivo final es que al ver una sentencia SQL sepáis qué está haciendo, además
de poder construiros vosotros mismos vuestras propias instrucciones para “esos códigos que
tan bien funcionan en nuestras BD's”.
Finalmente lo que se explicará en este curso sobre SQL está enfocado, principalmente, a su
funcionamiento con Access. Cierto es que SQL es un lenguaje estándar, pero bueno, digamos
que cada sistema gestor de bases de datos puede tener sus propias particularidades. Sin
embargo, e insisto en ello, el enfoque que se dé será siempre de cara a su desarrollo para
Access.
Doy por supuesto que el lector tiene un cierto control sobre VBA para Access, dado que los
ejemplos van a estar basados prácticamente en este lenguaje de programación. Aunque
intentaré explicar qué estoy haciendo hay cosas que se darán por sabidas. Si tenemos dudas
siempre podemos consultar este fantástico manual sobre VBA para Access (je, je...)
Espero que este curso os sea útil. Y, si encontráis algún error o “desastre”, además de pedir
disculpas por adelantado, os rogaría que me lo comunicarais para poder “enmendar la pifia”.
¡Suerte!
CONFESIONES ÍNTIMAS
No me considero un “monstruo” de SQL. De hecho, a mis efectos, diría que soy un neófito en
esto de SQL. ¿Por qué? Porque Access nos facilita muchísimo el trabajo de construcción de
SQL's que son las que, generalmente, nos funcionan perfectamente en nuestras BD's.
2
Visítame en http://bit.ly/NckAccess
Supongo que por esta “falta de necesidad” no se me ha ocurrido profundizar hasta las entrañas
“más oscuras” de SQL. En fin...
Como casi todo en la vida no se puede empezar la casa por el techo. Por ello este primer
capítulo será un poco (mucho) teórico. De hecho, pienso que es mejor un sólo capítulo (este)
fundamentalmente teórico que no teoría por aquí, teoría por allá...
Por eso os pido un poco de paciencia, puesto que es imprescindible sentar las bases de
terminología, conceptos y “otros chascarrillos” antes de meternos de lleno en temas prácticos.
Pero tranquilos, que ya sabéis que a mí me gusta más la práctica que la teoría, por lo que
intentaré ser 3B: bueno, bonito y breve.
En cuanto a la preparación de los datos la idea es crearse una BD de ejemplo y que con ella
seamos capaces de desarrollar todas las diferentes explicaciones que se llevarán a cabo en los
siguientes capítulos. Sé que también es un esfuerzo, pero estoy convencido de que el mismo
tendrá una buena recompensa.
Evidentemente se puede seguir el curso sin realizar la parte práctica, pero si en alguna parte
nos perdemos y no hemos seguido los ejemplos probablemente este esfuerzo que hacemos al
principio lo tengamos que realizar tarde o temprano si queremos entender bien qué estamos
haciendo. En definitiva, que es una decisión personal de cada uno.
Finalmente, recordad que todos los contenidos estarán basados en la aplicación de sentencias
SQL dentro de VB para Access. No debemos perder de vista lo anterior.
EL LENGUAJE SQL
<<El lenguaje de consulta estructurado o SQL (por sus siglas en inglés structured query language) es
2 [http://es.wikipedia.org/wiki/SQL ]. Consulta en línea el 21/04/12
3
Visítame en http://bit.ly/NckAccess
un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de
operaciones en estas. Una de sus características es el manejo del álgebra y el cálculo relacional permitiendo
efectuar consultas con el fin de recuperar -de una forma sencilla- información de interés de una base de
datos, así como también hacer cambios sobre ella.>>
– Un lenguaje de programación...
– para bases de datos relacionales... (¡Caramba!
Access es un GBDR3)
– que a través de unos instrumentos...
– nos permite efectuar consultas...
– para extraer información de la base de datos.
Se utiliza SQL porque es un lenguaje estándar de una gran aceptación y que, salvo honrosas
excepciones, nos permite manipular bases de datos independientemente del sistema gestor. Es
decir, que en principio nos da igual si es Access quien gestiona la BD, SQL-Server, Oracle o
phpMyAdmin, entre otros.
Otra de las ventajas de SQL es su relativa sencillez, de manera que con el conocimiento de
unas pocas palabras “claves” podemos efectuar potentes consultas para conseguir la
información necesaria.
Finalmente, nuestro “querido” VBA acepta la implementación de SQL dentro del código, con lo
que si sabemos programar en VBA y SQL podemos obtener una sinergia importante para una
mejor utilización de nuestra BD.
Como ya comentaba en la introducción, a partir de aquí las referencias que se hagan serán
todas referidas a su utilización en Access y en VBA para Access (insisto en que lo anterior no
excluye su uso, en un alto porcentaje, en otros sistemas de gestión). Veremos cómo
complementar estos dos lenguajes de programación para conseguir las sinergias que
comentábamos antes.
TIPOS DE DATOS
Vamos a partir, para este epígrafe, de lo “conocido” para llegar a lo “desconocido”. Y Access
será nuestra “luz y guía” para ello.
4
Visítame en http://bit.ly/NckAccess
Que un dato sea de longitud variable o fija tiene su repercusión en el tamaño de
almacenamiento en bites del dato. Eso quiere decir que:
– Si el texto es de longitud fija el tamaño de almacenamiento
será el doble del tamaño definido
– Si el texto es de longitud variable el tamaño de
almacenamiento será el doble del tamaño real.
Para que nos entendamos: si yo defino un campo con un
tamaño máximo de 25 caracteres de longitud y el valor que
hay dentro de ese campo tiene 15 caracteres mis tamaños
de almacenamiento en bites serán los siguientes:
– Si el texto es fijo: 25*2=50
– Si el texto es variable: 15*2=30
Conclusión: si sabemos de antemano que los valores que vamos a introducir en ese campo van
a tener todos una longitud similar sería mejor utilizar un texto fijo; al contrario, si esa longitud
va a ser dispar utilizaríamos un texto variable.
Más cosas: ¿qué tipo de texto utiliza Access? Access utiliza por defecto, un tamaño variable. ¿Y
cómo podemos saber “visualmente” qué tipo de texto se está utilizando? Pues abriendo la
tabla en vista hoja de datos y mirando qué selección (marcado en negro) se hace del valor del
campo. Si vemos que se selecciona sólo el valor estaremos ante un texto variable; si se
selecciona todo el campo será un texto fijo4.
Es decir:
¿Cómo definimos uno y otro en SQL? Pues utilizando las “palabras reservadas” que tenemos
para ello. Disponemos de varias palabras reservadas en algunos casos (es decir, como si fueran
sinónimos). La siguiente tabla muestra de qué opciones disponemos:
4 Como habréis imaginado esta definición de tipo dato no se puede establecer a través de la interface de Access, sino que debemos
hacerlo a través de una SQL. En capítulos posteriores veremos cómo realizar esta operación.
5
Visítame en http://bit.ly/NckAccess
Para definir un campo como memo utilizamos:
VALORES DECIMALES
– Tenemos un tipo de datos, denominados “de coma flotante de precisión simple”, que
abarcan un intervalo de valores positivos y negativos que va desde/hasta:
– Para valores negativos: -3.402823E38 y -1,401298E-45
– Para valores positivos: 1,401298E-45 y 3,402823E38
Es lo que en VB conocemos somo SINGLE
– Tenemos otro tipo de datos, denominados “de coma flotante de precisión doble”, que
6
Visítame en http://bit.ly/NckAccess
abarcan un intervalo de valores positivos y negativos que va desde/hasta:
– Para valores negativos: -1,79769313486231E308 y
-4,940656458441247E-324
– Para valores positivos: 4,940656458441247E-324 y
1,79769313486231E308
Es lo que en VB conocemos como DOUBLE
– Tenemos otro tipo de valores, que denominamos “datos
decimales”, en los que no profundizaremos en este capítulo,
debido a sus características “especiales”. Para que nos
entendamos, y por decirlo de alguna manera, a no ser que
desarrollemos una base de datos para la NASA, en la que
necesitemos un factor de precisión decimal altísimo (¡pero
que muy muy alto!), mejor no utilizar este tipo de datos.
creo que “tenemos de sobra”.
Para definir estos tipos de datos en SQL tenemos:
En SQL tendríamos:
7
Visítame en http://bit.ly/NckAccess
TIPO DATO VB SQL
Date DATETIME / DATE / TIME / TIMESTAMP
8
Visítame en http://bit.ly/NckAccess
No hay una equivalencia exacta en VB para un objeto OLE. Si tuviéramos que almacenarlo
utilizaríamos un tipo VARIANT.
Y para definirlos en SQL tendríamos:
DATOS BINARIOS
Los he dejado para lo último porque este tipo de datos no se
puede definir desde la interfaz de Access (no tenemos la opción al
crear la tabla). ¿Y qué es un dato binario?
Un dato binario no es más que cualquier tipo de dato que se muestra en su formato nativo, sin
sufrir ninguna transformación por parte de Access. En pocas palabras, lo que se escribe es lo
que se muestra.
Hay que decir que los valores binarios son datos de longitud fija (echad un vistazo al apartado
de los datos de texto si no nos acordamos de qué significa “longitud fija”). Cierto es que se
pueden almacenar datos binarios de longitud variable, pero necesitaríamos utilizar ADO para
poder manipular este tipo de datos (no entraremos en esto, de todas maneras).
Para representar estos datos en SQL tenemos:
Binarios BINARY
CUADRO RESUMEN
Después de esta “disertación sobre tipos de datos” probablemente tengamos la cabeza más
que hinchada... Os pongo pues aquí un cuadro resumen con todo lo que acabamos de
comentar:
Texto – Longitud variable (String en VBA) ALPHANUMERIC / STRING / TEXT / TEXT (N) /
VARCHAR
Texto - Memo LONGTEXT / LONGCHAR / MEMO / NOTE
Numérico Byte (Byte en VBA) BYTE / INTEGER1
Numérico entero (Integer en VBA) SMALLINT / SHORT / INTEGER2
Númerico entero largo (Long en VBA) INTEGER / LONG / INT / INTEGER4
Numérico simple (Single en VBA) REAL / SINGLE / FLOAT4 / IEEESINGLE
Numérico doble (Double en VBA) FLOAT / DOUBLE / FLOAT8 / IEEEDOUBLE /
NUMBER
Numérico Id. de réplica GUID
Numérico decimal DECIMAL
Fecha/Hora (Date en VBA) DATETIME / DATE / TIME / TIMESTAMP
Moneda (Currency en VBA) MONEY / CURRENCY
Autonumérico COUNTER / AUTOINCREMENT
9
Visítame en http://bit.ly/NckAccess
Sí/No (Boolean en VBA) BIT / LOGICAL / LOGICAL1
COMANDOS
Si partimos de la base que una instrucción la definimos como una expresión de consulta SQL
generada por un comando y sus argumentos o parámetros podremos decir que un comando es
aquella instrucción que se puede ejecutar directamente en una consulta SQL.
En el lenguaje SQL podemos encontrar dos tipos de comandos:
– Los pertenecientes al lenguaje de definición de datos (DDL)
– Los pertenecientes al lenguaje de manipulación de datos (DML)
Los primeros permiten crear y definir tablas, campos, índices, procedimientos almacenados,
vistas, usuarios y grupos de trabajo.
De las anteriores acciones hay algunas que son exclusivas de trabajo en ADO. En este curso no
se van a ver estos comandos.
Los segundos permiten crear consultas para ordenar, filtrar y extraer datos de la BD.
Por ejemplo, entre los primeros tendríamos:
CREATE TABLE
ALTER TABLE
CREATE INDEX
DROP TABLE
DROP INDEX
SELECT
UPDATE
10
Visítame en http://bit.ly/NckAccess
INSERT
DELETE
CLÁUSULAS
Podríamos decir que las cláusulas son condiciones que
permiten la modificación la definición de los datos que
vamos a manipular o seleccionar.
Por ejemplo, son cláusulas:
AS
FROM
WHERE
GROUP BY
CONSTRAINT
HAVING
ORDER BY
PROCEDURE
PREDICADOS
Como predicados podríamos entender aquellas expresiones que, de alguna manera, modifican
la acción de los comandos en cuanto al resultado que se va obtener.
Serían predicados:
ALL
DISTINCT
DISTINCTROW
TOP
UNION
OPERACIONES
Mediante las operaciones definimos alguna “operación específica” (valga la redundancia) que
condiciona la ejecución de la SQL y, por extensión, los resultados mostrados.
Serían operaciones:
UNION
INNER JOIN
LEFT JOIN
RIGHT JOIN
11
Visítame en http://bit.ly/NckAccess
OPERADORES
Dentro de los operadores podemos encontrar dos tipos:
– Operadores lógicos
– Operadores matemáticos y de comparación
Dentro de los operadores lógicos tendríamos:
AND
OR
XOR
NOT
< >
<= >=
= <>
BETWEEN...AND IN
LIKE
FUNCIONES AGREGADAS
Las funciones agregadas permiten manipular grupos de registros con la finalidad de retornar
un sólo valor, que será el que defina la propia función.
12
Visítame en http://bit.ly/NckAccess
PREPARACIÓN Y EXPLICACIONES VARIAS PARA SEGUIR EL
RESTO DEL CURSO
Vamos a desarrollar el curso sobre un ejemplo de una base
de datos5, para poder ver aplicaciones prácticas de las
sentencias SQL.
Los ejemplos de sentencias SQL los vamos a ver
incardinados dentro de código VBA, de manera que, en la
mayoría de casos, no tendremos una SQL “directa”, sino
que la pasaremos por una variable, a los simples efectos de
poder ver con mayor claridad las diferentes estructuras de
las SQL.
Las consultas de acción no tienen mayor problema, en este aspecto, porque las vamos a
ejecutar y vamos a poder ver los resultados de manera directa o indirecta; para las consultas
de selección, sin embargo, no podemos apreciar directamente sus resultados. Para poder
verlos tendremos que convertir nuestra SQL en un objeto-consulta de Access, y ello nos
obligará a seguir la siguiente estructura en los códigos:
– Borramos el objeto-consulta por si existiera (si ya existe obtendríamos un error de
código)
– Creamos la SQL
– La convertimos en un objeto-consulta, para poder ver los resultados.
Para poder realizar lo anterior utilizaremos un módulo, que nos ejecutará el primer y el tercer
paso, dejando el segundo en el código del botón que programemos (las programaremos a
través de clicks de botón porque considero que es un proceso muy sencillo), lo cual nos
permitirá centrarnos en esta segunda parte, esto es, en la SQL propiamente dicha.
Para hacer lo anterior vamos a seguir estos pasos:
1.- Creamos una BD en blanco, y sacamos el editor de VB (ALT+F11)
2.- Insertamos un módulo (VBE menú → Insertar → Módulo)
3.- Guardamos ese módulo con el nombre de mdlProcesos
4.- En ese módulo escribimos los siguientes procedimientos6:
…
Public Sub eliminaConsulta(nomConsulta As String)
Dim qry As Object
For Each qry In CurrentData.AllQueries
If qry.Name = nomConsulta Then
DoCmd.DeleteObject acQuery, qry.Name
Exit For
End If
Next
End Sub
…
Public Sub creaConsulta(nomConsulta As String, laSql As String)
13
Visítame en http://bit.ly/NckAccess
Dim qryDef As DAO.QueryDef
Set qryDef = CurrentDb.CreateQueryDef(nomConsulta)
qryDef.SQL = laSql
End Sub
…
Vamos a seguir con nuestra BD. Vamos a crearnos una
tabla donde introduciremos los datos personales de los
trabajadores. A esta tabla la llamaremos TTrabPersonal. Le
daremos la siguiente estructura:
A continuación nos crearemos una segunda tabla, con los datos laborales de los trabajadores,
y la llamaremos TTrabLaboral, y tendrá la siguiente estructura:
Debemos tener en cuenta que el campo [IdTrab] lo hemos definido a través de un asistente
para búsquedas, que nos ha buscado, en la tabla TTrabPersonal, sus tres primeros campos en
este orden: [Id], [ApellTrab] y [NomTrab]; hemos ordenado por apellidos ascendente,
ocultando la clave principal.
Es decir, que aunque este campo nos muestre apellidos-nombre el valor que almacena es el
código del trabajador.
El mismo proceso se ha seguido para el campo [DependeDe]
Vamos a crearnos una tabla con los datos de los clientes de la empresa, que llamaremos
TClientes. Tendrá la siguiente estructura:
14
Visítame en http://bit.ly/NckAccess
Ahora vamos a crear una tabla de ventas donde reflejaremos las
ventas realizadas a los clientes. La llamaremos TVentas, y tendrá
la siguiente estructura:
Teniendo en cuenta que para el campo [IdCliVta] hemos utilizado el asistente para búsquedas,
que ha buscado en la tabla TClientes el nombre del cliente. Es decir, nos muestra el nombre del
cliente, pero almacena su código.
Si hemos realizado correctamente los pasos anteriores la ventana de relaciones nos debería
haber quedado así:
Vamos a crearnos seguidamente una tabla auxiliar, que llamaremos TMeses, que tendrá la
siguiente estructura (no vamos a poner ningún campo como clave principal):
15
Visítame en http://bit.ly/NckAccess
Finalmente crearemos una tabla muy simple, cuya idea es que nos recoja el usuario que está
operando en ese momento en la BD. Esta BD tendrá siempre un solo registro (el nombre del
usuario activo), que llamaremos TUsuarioAct, y la construiremos con esta simple estructura:
Ya tenemos las estructuras de las tablas preparadas. Ahora sólo hay que introducir datos.
Evidentemente podéis dar de alta los datos que queráis, pero como yo voy a mostrar los
resultados en base a la información que haya en estas tablas o bien os bajáis la BD de ejemplo
y anexáis los datos a vuestras tablas o bien operáis directamente con la BD de ejemplo...
Como siempre, a gusto del consumidor.
Yo os indico los registros que he dado de alta:
Para la tabla TClientes:
16
Visítame en http://bit.ly/NckAccess
Para la tabla TTrabLaboral
17
Visítame en http://bit.ly/NckAccess
escrito:
Creo que este capítulo ha sido interesante: hemos cogido dolor de cabeza al leer tanta teoría y
hemos cogido dolor de dedos al tener que prepararnos tantas tablas con datos. Como reza el
dicho: “Para lucir hay que sufrir”... je, je...
Sinceramente creo que era necesario realizar este esfuerzo inicial. En los próximos capítulos
veremos cómo sacar rendimiento a tantos “desvelos”.
Un saludo, y...
¡Suerte!
18
Visítame en http://bit.ly/NckAccess