16 ANEXOS
16.1 Resolución de
Problemas
16.1.1 Buscar Información
duplicada en un campo de una tabla.
Para generar este tipo de consultas lo más sencillo es utilizar
el asistente de consultas de Access, editar la sentencia SQL de la consulta
y pegarla en nuestro código. No obstante este tipo de consulta se
consigue de la siguiente forma:
SELECT DISTINCTROW Lista de Campos a Visualizar FROM
Tabla
WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda
FROM Tabla As psudónimo
GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER
BY CampoDeBusqueda;
Un caso práctico, si deseamos localizar aquellos empleados con
igual nombre y visualizar su código correspondiente, la consulta
sería la siguiente:
SELECT DISTINCTROW Empleados.Nombre,
Empleados.IdEmpleado
FROM Empleados WHERE
Empleados.Nombre In (SELECT
Nombre FROM
Empleados As Tmp GROUP
BY Nombre HAVING Count(*)>1)
ORDER BY Empleados.Nombre;
16.1.2 Recuperar Registros
de una tabla que no contengan registros relacionados en otra.
Este tipo de consulta se emplea en situaciones tales como saber que
productos no se han vendido en un determinado periodo de tiempo,
SELECT DISTINCTROW Productos.IdProducto,
Productos.Nombre FROM Productos
LEFT JOIN Pedidos ON
Productos.IdProducto = Pedidos.IdProduct WHERE
(Pedidos.IdProducto Is Null)
AND (Pedidos.Fecha Between
#01-01-98# And
#01-30-98#);
La sintaxis es sencilla, se trata de realizar una unión interna
entre dos tablas seleccionadas mediante un LEFT JOIN, establecimiendo como
condición que el campo relacionado de la segunda sea Null.
16.2 Utlizar SQL desde
Visual Basic
Existen dos tipos de consultas SQL: las consultas de selección
(nos devuelven datos) y las consultas de acción (aquellas que no
devuelven ningún registro). Ambas pueden ser tratadas en Visual
Basic pero de forma diferente.
Las consultas de selección se ejecutan recogiendo la información
en un recordset previamente definido mediante la instrucción openrecordset(),
por ejemplo:
Dim SQL as String
Dim RS as recordset
SQL = "SELECT * FROM Empleados;"
Set RS=MiBaseDatos.OpenRecordSet(SQL)
Si la consula de selección se encuentra almacenada en una consulta
de la base de datos:
Set RS=MiBaseDatos.OpenRecordset("MiConsulta")
Las consultas de acción, al no devolver ningún registro,
no las podemos asignar a ningún recordset, en este caso la forma
de ejecutarlas es mediante los métodos Execute y ExecuteSQL (para
bases de datos ODBC), por ejemplo:
Dim SQL as string
SQL = "DELETE * FROM Empleados WHERE Categoria =
'Ordenanza';"
MiBaseDatos.Execute SQL
16.3 Funciones de Visual
Basic utilizables en una Instrucción SQL
| Función |
Sintaxis |
Descripción |
| Now |
Variable= Now |
Devuelve la fecha y la hora actual del sistema |
| Date |
Variable=Date |
Devuelve la fecha actual del sistema |
| Time |
Variable=Time |
Devuelve la hora actual del sistema |
| Year |
Variable=Year(Fecha) |
Devuelve los cuatro dígitos correspondientes al año de
Fecha |
| Month |
Variable=Month(Fecha) |
Devuelve el número del mes del parámetro fecha. |
| Day |
Variable=Day(Fecha) |
Devuelve el número del día del mes del parámetro
fecha. |
| Weekday |
Variable=Weekday(Fecha) |
Devuelve un número entero que representa el día de la
semana del parámetro fecha. |
| Hour |
Variable=Hour(Hora) |
Devuelve un número entre 0 y 23 que representa la hora del parámetro
Hora. |
| Minute |
Variable=Minute(Hora) |
Devuelve un número entre 0 y 59 que representa los minutos del
parámetro hora. |
| Second |
Variable=Second(Hora) |
Devuelve un número entre 0 y 59 que representa los segundos
del parámetro hora. |
DatePart
Esta función devuelve una parte señalada de una fecha
concreta. Su sintaxis es:
DatePart(Parte, Fecha, ComienzoSemana, ComienzoAño)
Parte representa a la porción de fecha que se desea obtener,
los posibles valores son:
| Valor |
Descripción |
| yyyy |
Año |
| q |
Trimestre |
| m |
Mes |
| y |
Día del año |
| d |
Día del mes |
| w |
Día de la semana |
| ww |
Semana del año |
| h |
Hora |
| m |
Minutos |
| s |
Segundos |
ComienzoSemana indica el primer día de la semana. Los posibles
valores son:
| Valor |
Descripción |
| 0 |
Utiliza el valor pode efecto del sistema |
| 1 |
Domingo (Valor predeterminado) |
| 2 |
Lunes |
| 3 |
Martes |
| 4 |
Miércoles |
| 5 |
Jueves |
| 6 |
Viernes |
| 7 |
Sábado |
ComienzoAño indica cual es la primera semana del año;
los posibles valores son:
| Valor |
Descripción |
| 0 |
Valor del sistema |
| 1 |
Comienza el año el 1 de enero (valor predeterminado). |
| 2 |
Empieza con la semana que tenga al memos cuatro días en el nuevo
año. |
| 3 |
Empieza con la semana que esté contenida completamente en el
nuevo año. |
16.4 Evaluar valores
antes de ejecutar la Consuta.
Dentro de una sentencia SQL podemos emplear la función iif para
indicar las condiciones de búsqueda. La sintaxis de la función
iif es la siguiente:
iif(Expresion,Valor1,Valor2)
En donde Expresión es la sentencia que evaluamos; si Expresión
es verdadera entonces se devuelve Valor1, si Expresión es falsa
se devuelve Valor2.
SELECT * Total FROM
Empleados WHERE Apellido =
iff(TX_Apellido.Text
<> '', TX_Apellido.Text, *) ;
Supongamos que en un formulario tenemos una casilla de texto llamanda
TX_Apellido. Si cuando ejecutamos esta consulta la casilla contiene algún
valor se devuelven todos los empleados cuyo apellido coincida con el texto
de la casilla, en caso contrario se devuelven todos los empleados.
SELECT Fecha, Producto,
Cantidad, (iif(CodigoPostal>=28000 And
CodigoPostal <=28999,'Madrid','Nacional'))
AS Destino FROM
Pedidos;
Esta consulta devuelve los campos Fecha, Nombre del Producto y Cantidad
de la tabla pedidos, añadiendo un campo al final con el valor Madrid
si el código posta está dentro del intervalo, en caso contario
devuelve Nacional.
16.5 Un Pequeño Manual
de Estilo
Siempre es bueno intentar hacer las cosas de igual modo para que el
mantenimiento y la revisión nos sea una labor lo más sencilla
posible. En lo que a mi respecta utilizo las siguiente normas a la hora
de elaborar sentecias SQL:
-
Las cláusulas siempre las escribo con Mayúsculas.
-
Los operadores lógicos de sentencias siempre con Mayúsculas.
-
Las operaciones siempre la primera letra con mayúsculas y el resto
en minúsculas.
-
Los operadores lógicos incluidos en otros operadores la primera
letra con mayúsculas y el resto con minúculas.
Los Nombres de las Tablas, Campos y Consultas, los escribo siempre la primera
letra con mayúsculas y el resto con minúsculas, en algunos
casos utilizo el carácter "_" para definir mejor el nombre: Detalles_Pedidos.
Aunque con el motor Jet se pueden utilizar acentos y espacios en blanco
para nombrar los campos, las tablas y las consultas no los utilizo porque
cuando se exportar tablas a otros sistemas los acentos y los espacios en
blanco pueden producir errores innecesarios.
Recuerda siempre que si utilizas espacios en blanco para llamar tablas
o consultas cada vez que hagas referencias a ellos en una consulta debes
incluir sus nombres entre corchetes.
SELECT [ID de Pedido], [Nombre del Producto], Cantidad
FROM [Detalles del Pedido];
|