SQL & Visual Basic Manual Completo
SQL & Visual Basic Manual Completo
SQL &
Visual Basic
NIVEL AVANZADO
INCLUYE EJEMPLO APLICADOS A VISUAL BASIC
** MODULOS **
Manual de SQL
Visual Basic, Conceptos
SQL, Ejemplos y Consultas Inteligentes
Visual Basic, Ejemplos y Trucos Avanzados
Visual Basic, Programación Avanzada
Pendientes
Edición: 2023/12/08/1904
Manual de SQL
INDICE
1. Introducción. 3
2. Consultas de Selección. 8
3. Criterios de Selección. 11
4. Agrupamiento de Registros. 16
5. Consultas de Acción. 19
6. Tipos de Datos. 22
7. Subconsultas. 24
8. Consultas de Referencias Cruzadas. 26
9. Consultas de Unión Internas. 30
10. Consultas de Unión Externas. 36
11. Estructuras de las Tablas. 37
12. Consultas con Parámetros. 42
13. Bases de Datos Externas. 44
14. Omitir los Permisos de Ejecución. 45
15. La Cláusula PROCEDURE. 46
16. Anexos. 47
17. Límites de SQL. 55
18. Funciones de Visual Basic. 61
19. Función de Formato. 145
20. Listado Completo de Códigos ACSII. 156
21. Constantes de Código Clave. 167
22. Resumen de Palabras Clave. 171
24. Resumen. 177
1. INTRODUCCIÓN.
El lenguaje SQL se puede considerar como una de las principales razones del éxito comercial de las bases de
datos relacionales. Como se convirtió en un estándar para estas últimas, los usuarios perdieron el miedo a
migrar sus aplicaciones de base de datos desde otros tipos de sistemas de bases de datos (por ejemplo,
sistemas de red o jerárquicos) a los sistemas relacionales, porque aunque estuvieran satisfechos con el
producto DBMS relacional que estaban utilizando, no esperaban que la conversión a otro producto DBMS
relacional fuera caro y consumiera mucho tiempo, ya que ambos sistemas seguían los mismos estándares en
cuanto al lenguaje. En la práctica, por supuesto, hay muchas diferencias entre los distintos paquetes DBMS
relacionales comerciales. Sin embargo, si el usuario sólo utiliza las funciones que forman parte del estándar, y
si ambos sistemas relacionales soportan fielmente el estándar, la conversión entre los dos sistemas es mucho
más sencilla. Otra ventaja de disponer de un estándar es que los usuarios pueden escribir sentencias en una
aplicación de base de datos para acceder a los datos almacenados en dos o más DBMSs relacionales sin tener
que cambiar el sublenguaje de base de datos (SQL), siempre y cuando esos DBMS soporten el SQL estándar.
Historia de SQL
La historia de SQL empieza en 1974 con la definición, por parte de Donald Chamberlin y de otras personas que
trabajaban en los laboratorios de investigación de IBM, de un lenguaje para la especificación de las
características de las bases de datos que adopta el modelo relacional. Este lenguaje se llamaba SEQUEL
(Structured English Query Language) y se implementó en un prototipo llamado SEQUEL-XRM entre 1974 y
1975. Las experimentaciones con ese prototipo condujeron, entre 1976 y 1977, a una revisión del lenguaje
(SEQUEL/2), que a partir de ese momento cambió de nombre por motivos legales, convirtiéndose en SQL.
El prototipo (System R), basado en este lenguaje, se adoptó y utilizó internamente en IBM y lo adoptaron algunos
de sus clientes elegidos. Gracias al éxito de este sistema, que no estaba todavía comercializado, también otras
compañías empezaron a desarrollar sus productos relacionales basados en SQL. A partir de 1981, IBM comenzó
a entregar sus productos relacionales y en 1983 empezó a vender DB2. En el curso de los años ochenta,
numerosas compañías (por ejemplo, Oracle y Sybase, sólo por mencionar algunos) comercializaron productos
basados en SQL, que se convierte en el estándar industrial que respecta a las bases de datos relacionales. En
1986, el ANSI (American National Standards Institute) adoptó SQL como estándar para los lenguajes
relacionales y en 1987 se transformó en estándar ISO (International Standards Organization).
En los años siguientes, SQL ha sufrido diversas revisiones que han conducido primero a la versión SQL/89,
posteriormente la versión SQL/92, y la SQL/1999, y la actual SQL/2016. El hecho de tener un estándar
definido por un lenguaje para bases de datos relacionales abre potencialmente el camino a la Inter
comunicabilidad entre todos los productos que se basan en él. En general cada productor adopta e implementa
en la propia base de datos sólo el corazón del lenguaje SQL, extendiéndose de manera individual según la propia
visión que cada cual tenga del mundo de las bases de datos.
SQL.
El nombre SQL significa Lenguaje de Consulta Estructurado (Structured Query Language). Es un lenguaje de
bases de datos global, cuenta con sentencias para definir datos, consultas y actualizaciones. Además, dispone
de características para definir vistas en la base de datos, especificar temas de seguridad, autorización, definir
restricciones de integridad y especificar controles de transacciones. También tiene reglas para incrustar
sentencias de SQL en un lenguaje de programación de propósito general, como Java, C/C++, entre otros.
El SQL moderno ha evolucionado hasta ser un estándar utilizado ampliamente en bases de datos relacionales
y se define por la norma ANSI. La mayoría de las implementaciones de SQL tienen pocas variaciones respecto
al estándar, incluyendo la versión admitida por el motor de base de datos Jet. Estas diferencias se contemplan
más adelante en este capítulo, pero la estructura y el funcionamiento generales del lenguaje son muy coherentes
entre los distintos fabricantes. Si ha utilizado alguna implementación de SQL, no tendrá dificultad en realizar la
transición a la versión de Microsoft Jet.
Microsoft Jet. SQL se utiliza para crear objetos QueryDef, como el argumento de origen del método
OpenRecordSet y como la propiedad RecordSource del control de datos. También se puede utilizar con el
método Execute para crear y manipular directamente las bases de datos Jet y crear consultas SQL de paso a
través para manipular bases de datos remotas cliente - servidor.
con más frecuencia para describir el funcionamiento de los comandos SQL. Para evitar confusiones, ambos
conjuntos de términos se usan indistintamente en este capítulo. Recuerde simplemente que una fila es un
registro y una columna un campo.
1.2 Comandos
Al igual que los métodos de desplazamiento de DAO, SQL proporciona comandos del lenguaje de definición de
datos (DDL) y del lenguaje de manipulación de datos (DML). Aunque existen algunas áreas solapadas, los
comandos DDL permiten crear y definir nuevas bases de datos, campos e índices, mientras que los comandos
DML le permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
• los DLL que permiten crear y definir nuevas bases de datos, campos e índices.
• los DML que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
Comandos DLL
Comando Descripción
Comandos DML
Comando Descripción
INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
UPDATE Utilizado para modificar los valores de los campos y registros especificados
DELETE Utilizado para eliminar registros de una tabla de una base de datos
1.3 Cláusulas
Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o
manipular.
Cláusula Descripción
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
Utilizada para especificar las condiciones que deben reunir los registros que se van a
WHERE
seleccionar
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo
Operador Uso
Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas
AND
son ciertas.
Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las
OR
dos es cierta.
Operador Uso
<> Distinto de
= Igual que
Función Descripción
SUM Utilizada para devolver la suma de todos los valores de un campo determinado
2. CONSULTAS DE SELECCIÓN.
Las consultas de selección se utilizan para indicar al motor de datos que devuelva información de las bases de
datos, esta información es devuelta en forma de conjunto de registros que se pueden almacenar en un objeto
recordset. Este conjunto de registros es modificable.
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo:
SELECT Nombre, Telefono FROM Clientes;
Esta consulta devuelve un recordset con el campo nombre y teléfono de la tabla clientes.
Se pueden ordenar los registros por más de un campo, como, por ejemplo:
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY CodigoPostal, Nombre;
Incluso se puede especificar el orden de los registros: ascendente mediante la cláusula (ASC -se toma este valor
por defecto) o descendente (DESC)
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY CodigoPostal DESC , Nombre ASC;
Predicado Descripción
ALL
Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de datos selecciona todos los
registros que cumplen las condiciones de la instrucción SQL. No se conveniente abusar de este predicado ya
que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que
contiene, es mucho más rápido indicar el listado de campos deseados.
SELECT ALL FROM Empleados;
SELECT * FROM Empleados;
TOP
Devuelve un cierto número de registros que entran entre al principio o al final de un rango especificado por una
cláusula ORDER BY. Supongamos que queremos recuperar los nombres de los 25 primeros estudiantes del
curso 1994:
SELECT TOP 25 Nombre, Apellido FROM Estudiantes ORDER BY Nota DESC;
Si no se incluye la cláusula ORDER BY, la consulta devolverá un conjunto arbitrario de 25 registros de la tabla
Estudiantes. El predicado TOP no elige entre valores iguales. En el ejemplo anterior, si la nota media número 25
y la 26 son iguales, la consulta devolverá 26 registros. Se puede utilizar la palabra reservada PERCENT para
devolver un cierto porcentaje de registros que caen al principio o al final de un rango especificado por la cláusula
ORDER BY. Supongamos que en lugar de los 25 primeros estudiantes deseamos el 10 por ciento del curso:
SELECT TOP 10 PERCENT Nombre, Apellido FROM Estudiantes ORDER BY Nota DESC;
El valor que va a continuación de TOP debe ser un Integer sin signo. TOP no afecta a la posible actualización
de la consulta.
DISTINCT
Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada
campo listado en la instrucción SELECT se incluyan en la consulta deben ser únicos.
Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si dos registros
contienen López en el campo Apellido, la siguiente instrucción SQL devuelve un único registro:
SELECT DISTINCT Apellido FROM Empleados;
Con otras palabras, el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la cláusula
SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y
no refleja los cambios subsiguientes realizados por otros usuarios.
DISTINCTROW
Devuelve los registros diferentes de una tabla; a diferencia del predicado anterior que sólo se fijaba en el
contenido de los campos seleccionados, éste lo hace en el contenido del registro completo independientemente
de los campos indicados en la cláusula SELECT.
SELECT DISTINCTROW Apellido FROM Empleados;
Si la tabla empleados contiene dos registros: Antonio López y Marta López el ejemplo del predicado DISTINCT
devuelve un único registro con el valor López en el campo Apellido ya que busca no duplicados en dicho campo.
Este último ejemplo devuelve dos registros con el valor López en el apellido ya que se buscan no duplicados en
el registro completo.
2.4 Alias
En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto
devuelto, otras veces por simple capricho o por otras circunstancias. Para resolver todas ellas tenemos la
palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Tomado como
referencia el ejemplo anterior podemos hacer que la columna devuelta por la consulta, en lugar de llamarse
apellido (igual que el campo devuelto) se llame Empleado. En este caso procederíamos de la siguiente forma:
SELECT DISTINCTROW Apellido AS Empleado FROM Empleados;
3. CRITERIOS DE SELECCIÓN.
En el capítulo anterior se vio la forma de recuperar los registros de las tablas, las formas empleadas devolvían
todos los registros de la mencionada tabla. A lo largo de este capítulo se estudiarán las posibilidades de filtrar
los registros con el fin de recuperar solamente aquellos que cumplan unas condiciones preestablecidas.
Antes de comenzar el desarrollo de este capítulo hay que recalcar tres detalles de vital importancia. El primero
de ellos es que cada vez que se desee establecer una condición referida a un campo de texto la condición de
búsqueda debe ir encerrada entre comillas simples; la segunda es que no se posible establecer condiciones de
búsqueda en los campos memo y; la tercera y última hace referencia a las fechas. Las fechas se deben escribir
siempre en formato mm-dd-aa en donde mm representa el mes, dd el día y aa el año, hay que prestar atención
a los separadores -no sirve la separación habitual de la barra (/), hay que utilizar el guion (-) y además la fecha
debe ir encerrada entre almohadillas (#). Por ejemplo, si deseamos referirnos al día 3 de Septiembre de 1995
deberemos hacerlo de la siguiente forma; #09-03-95# ó #9-3-95#.
Si a cualquiera de las anteriores condiciones le anteponemos el operador NOT el resultado de la operación será
el contrario al devuelto sin el operador NOT.
El último operador denominado Is se emplea para comparar dos variables de tipo objeto <Objeto1 Is <Objeto2.
este operador devuelve verdad si los dos objetos son iguales
SELECT * FROM Empleados WHERE Edad 25 AND Edad < 50;
SELECT * FROM Empleados WHERE (Edad 25 AND Edad < 50) OR Sueldo = 100;
SELECT * FROM Empleados WHERE NOT Estado = 'Soltero';
SELECT * FROM Empleados WHERE (Sueldo 100 AND Sueldo < 500) OR (Provincia = 'Madrid' AND Estado =
'Casado');
En este caso la consulta devolvería los registros que contengan en "campo" un valor incluido en el intervalo
valor1, valor2 (ambos inclusive). Si anteponemos la condición Not devolverá aquellos valores no incluidos en el
intervalo.
Distinto de un dígito '[!0-9]' 'A', 'a', '&', '~' '0', '1', '9'
3.4 El Operador In
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. Su
sintaxis es:
expresión [Not] In(valor1, valor2, . . .)
SELECT * FROM Pedidos WHERE Provincia In ('Madrid', 'Barcelona', 'Sevilla');
SELECT Id_Pedido, Fecha_Pedido FROM Pedidos WHERE Fecha_Pedido Between #1-1-94# And #30-6-
94#;
SELECT Apellidos, Nombre, Ciudad FROM Empleados WHERE Ciudad In ('Sevilla', 'Los Angeles', 'Barcelona');
4. AGRUPAMIENTO DE REGISTROS.
4.1 GROUP BY
Combina los registros con valores idénticos, en la lista de campos especificados, en un único registro. Para
cada registro se crea un valor sumario si se incluye una función SQL agregada, como por ejemplo Sum o Count,
en la instrucción SELECT. Su sintaxis es:
SELECT campos FROM tabla WHERE criterio GROUP BY campos del grupo
GROUP BY es opcional. Los valores de resumen se omiten si no existe una función SQL agregada en la
instrucción SELECT. Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los
valores Null no se evalúan en ninguna de las funciones SQL agregadas.
Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar, y la cláusula HAVING para filtrar
los registros una vez agrupados.
A menos que contenga un dato Memo u Objeto OLE , un campo de la lista de campos GROUP BY puede referirse
a cualquier campo de las tablas que aparecen en la cláusula FROM, incluso si el campo no está incluido en la
instrucción SELECT, siempre y cuando la instrucción SELECT incluya al menos una función SQL agregada.
Todos los campos de la lista de campos de SELECT deben o bien incluirse en la cláusula GROUP BY o como
argumentos de una función SQL agregada.
SELECT Id_Familia, Sum(Stock) FROM Productos GROUP BY Id_Familia;
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la
cláusula GROUP BY que satisfaga las condiciones de la cláusula HAVING.
HAVING es similar a WHERE, determina qué registros se seleccionan. Una vez que los registros se han agrupado
utilizando GROUP BY, HAVING determina cuales de ellos se van a mostrar.
SELECT Id_Familia Sum(Stock) FROM Productos GROUP BY Id_Familia HAVING Sum(Stock) 100 AND
NombreProducto Like BOS*;
4.2 AVG
Calcula la media aritmética de un conjunto de valores contenidos en un campo especificado de una consulta.
Su sintaxis es la siguiente
Avg(expr)
En donde expr representa el campo que contiene los datos numéricos para los que se desea calcular la media
o una expresión que realiza un cálculo utilizando los datos de dicho campo. La media calculada por Avg es la
media aritmética (la suma de los valores dividido por el número de valores). La función Avg no incluye ningún
campo Null en el cálculo.
SELECT Avg(Gastos) AS Promedio FROM Pedidos WHERE Gastos 100;
4.3 Count
Calcula el número de registros devueltos por una consulta.
Su sintaxis es la siguiente
Count(expr)
En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre
de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario,
pero no otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto.
Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de registros sin
tener en cuenta qué valores se almacenan en los registros. La función Count no cuenta los registros que tienen
campos null a menos que expr sea el carácter comodín asterisco (*). Si utiliza un asterisco, Count calcula el
número total de registros, incluyendo aquellos que contienen campos null. Count(*) es considerablemente más
rápida que Count(Campo). No se debe poner el asterisco entre dobles comillas ('*').
SELECT Count(*) AS Total FROM Pedidos;
Si expr identifica a múltiples campos, la función Count cuenta un registro sólo si al menos uno de los campos
no es Null. Si todos los campos especificados son Null, no se cuenta el registro. Hay que separar los nombres
de los campos con ampersand (&).
SELECT Count(FechaEnvio & Transporte) AS Total FROM Pedidos;
4.6 Sum
Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta. Su sintaxis es:
Sum(expr)
En donde expr representa el nombre del campo que contiene los datos que desean sumarse o una expresión
que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre
de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario,
pero no otras de las funciones agregadas de SQL).
SELECT Sum(PrecioUnidad * Cantidad) AS Total FROM DetallePedido;
5. CONSULTAS DE ACCION.
Las consultas de acción son aquellas que no devuelven ningún registro, son las encargadas de acciones como
añadir y borrar y modificar registros.
5.1 DELETE
Crea una consulta de eliminación que elimina los registros de una o más de las tablas listadas en la cláusula
FROM que satisfagan la cláusula WHERE. Esta consulta elimina los registros completos, no es posible eliminar
el contenido de algún campo en concreto. Su sintaxis es:
DELETE Tabla.* FROM Tabla WHERE criterio
DELETE es especialmente útil cuando se desea eliminar varios registros. En una instrucción DELETE con
múltiples tablas, debe incluir el nombre de tabla (Tabla.*). Si especifica más de una tabla desde la que eliminar
registros, todas deben ser tablas de muchos a uno. Si desea eliminar todos los registros de una tabla, eliminar
la propia tabla es más eficiente que ejecutar una consulta de borrado.
Se puede utilizar DELETE para eliminar registros de una única tabla o desde varios lados de una relación uno a
muchos. Las operaciones de eliminación en cascada en una consulta únicamente eliminan desde varios lados
de una relación. Por ejemplo, en la relación entre las tablas Clientes y Pedidos, la tabla Pedidos es la parte de
muchos por lo que las operaciones en cascada solo afectaran a la tabla Pedidos. Una consulta de borrado
elimina los registros completos, no únicamente los datos en campos específicos. Si desea eliminar valores en
un campo especificado, crear una consulta de actualización que cambie los valores a Null.
Una vez que se han eliminado los registros utilizando una consulta de borrado, no puede deshacer la operación.
Si desea saber qué registros se eliminarán, primero examine los resultados de una consulta de selección que
utilice el mismo criterio y después ejecute la consulta de borrado. Mantenga copias de seguridad de sus datos
en todo momento. Si elimina los registros equivocados podrá recuperarlos desde las copias de seguridad.
DELETE * FROM Empleados WHERE Cargo = 'Vendedor';
5.3 UPDATE
Crea una consulta de actualización que cambia los valores de los campos de una tabla especificada basándose
en un criterio específico. Su sintaxis es:
UPDATE Tabla SET Campo1=Valor1, Campo2=Valor2, ... CampoN=ValorN WHERE Criterio;
UPDATE es especialmente útil cuando se desea cambiar un gran número de registros o cuando éstos se
encuentran en múltiples tablas. Puede cambiar varios campos a la vez. El ejemplo siguiente incrementa los
valores Cantidad pedidos en un 10 por ciento y los valores Transporte en un 3 por ciento para aquellos que se
hayan enviado al Reino Unido.:
UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03 WHERE PaisEnvío = 'ES';
UPDATE no genera ningún resultado. Para saber qué registros se van a cambiar, hay que examinar primero el
resultado de una consulta de selección que utilice el mismo criterio y después ejecutar la consulta de
actualización.
UPDATE Empleados SET Grado = 5 WHERE Grado = 2;
UPDATE Productos SET Precio = Precio * 1.1 WHERE Proveedor = 8 AND Familia = 3;
Si en una consulta de actualización suprimimos la cláusula WHERE todos los registros de la tabla señalada
serán actualizados.
UPDATE Empleados SET Salario = Salario * 1.1
6. TIPOS DE DATOS.
Los tipos de datos SQL se clasifican en 13 tipos de datos primarios y de varios sinónimos válidos reconocidos
por dichos tipos de datos.
Tipos de datos primarios:
DATETIME 8 bytes Un valor de fecha u hora entre los años 100 y 9999.
BINARY VARBINARY
BYTE INTEGER1
COUNTER AUTOINCREMENT
CURRENCY MONEY
7. SUBCONSULTAS.
Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO,
INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta.
Puede utilizar tres formas de sintaxis para crear una subconsulta:
comparación [ANY | ALL | SOME] (instrucción sql) expresión [NOT] IN (instrucción sql) [NOT] EXISTS
(instrucción sql)
En donde:
comparación
Es una expresión y un operador de comparación que compara la expresión con el resultado de la subconsulta.
expresión
Es una expresión por la que se busca el conjunto resultante de la subconsulta.
instrucción sql
Es una instrucción SELECT, que sigue el mismo formato y reglas que cualquier otra instrucción SELECT. Debe
ir entre paréntesis.
Se puede utilizar una subconsulta en lugar de una expresión en la lista de campos de una instrucción SELECT
o en una cláusula WHERE o HAVING. En una subconsulta, se utiliza una instrucción SELECT para proporcionar
un conjunto de uno o más valores especificados para evaluar en la expresión de la cláusula WHERE o HAVING.
Se puede utilizar el predicado ANY o SOME, los cuales son sinónimos, para recuperar registros de la consulta
principal, que satisfagan la comparación con cualquier otro registro recuperado en la subconsulta. El ejemplo
siguiente devuelve todos los productos cuyo precio unitario es mayor que el de cualquier producto vendido con
un descuento igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE PrecioUnidad ANY (SELECT PrecioUnidad FROM DetallePedido WHERE
Descuento = 0 .25);
El predicado ALL se utiliza para recuperar únicamente aquellos registros de la consulta principal que satisfacen
la comparación con todos los registros recuperados en la subconsulta. Si se cambia ANY por ALL en el ejemplo
anterior, la consulta devolverá únicamente aquellos productos cuyo precio unitario sea mayor que el de todos
los productos vendidos con un descuento igual o mayor al 25 por ciento. Esto es mucho más restrictivo.
El predicado IN se emplea para recuperar únicamente aquellos registros de la consulta principal para los que
algunos registros de la subconsulta contienen un valor igual. El ejemplo siguiente devuelve todos los productos
vendidos con un descuento igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE IDProducto IN (SELECT IDProducto FROM DetallePedido WHERE
Descuento = 0.25);
Inversamente se puede utilizar NOT IN para recuperar únicamente aquellos registros de la consulta principal
para los que no hay ningún registro de la subconsulta que contenga un valor igual.
El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdad/falso para
determinar si la subconsulta devuelve algún registro.
Se puede utilizar también alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la
cláusula FROM fuera de la subconsulta. El ejemplo siguiente devuelve los nombres de los empleados cuyo
salario es igual o mayor que el salario medio de todos los empleados con el mismo título. A la tabla Empleados
se le ha dado el alias T1::
SELECT Apellido, Nombre, Titulo, Salario FROM Empleados AS T1 WHERE Salario = (SELECT Avg(Salario)
FROM Empleados WHERE T1.Titulo = Empleados.Titulo) ORDER BY Titulo;
En el ejemplo anterior , la palabra reservada AS es opcional.
SELECT Apellidos, Nombre, Cargo, Salario FROM Empleados WHERE Cargo LIKE "Agente Ven*" AND Salario
ALL (SELECT Salario FROM Empleados WHERE (Cargo LIKE "*Jefe*") OR (Cargo LIKE "*Director*"));
Obtiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor que el
de todos los jefes y directores.
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS (SELECT * FROM Pedidos AS O WHERE
O.ID_Empleado = E.ID_Empleado);
Selecciona el nombre de todos los empleados que han reservado al menos un pedido.
Una consulta de referencias cruzadas es aquella que nos permite visualizar los datos en filas y en columnas,
estilo tabla, por ejemplo:
Si tenemos una tabla de productos y otra tabla de pedidos, podemos visualizar en total de productos pedidos
por año para un artículo determinado, tal y como se visualiza en la tabla anterior.
La sintaxis para este tipo de consulta es la siguiente:
TRANSFORM función agregada instrucción select PIVOT campo pivot [IN (valor1[, valor2[, ...]])]
cruzada se crearían 12 columnas. Puede restringir el campo pivot para crear encabezados a partir de los valores
fijos (valor1, valor2) listados en la cláusula opcional IN.
También puede incluir valores fijos, para los que no existen datos, para crear columnas adicionales.
Ejemplos
TRANSFORM Sum(Cantidad) AS Ventas SELECT Producto, Cantidad FROM Pedidos WHERE Fecha Between
#01-01-98# And #12-31-98# GROUP BY Producto ORDER BY Producto PIVOT DatePart("m", Fecha);
Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por mes para un
año específico. Los meses aparecen de izquierda a derecha como columnas y los nombres de los productos
aparecen de arriba hacia abajo como filas.
TRANSFORM Sum(Cantidad) AS Ventas SELECT Compania FROM Pedidos WHERE Fecha Between #01-01-
98# And #12-31-98# GROUP BY Compania ORDER BY Compania PIVOT "Trimestre " & DatePart("q",
Fecha) In ('Trimestre1', 'Trimestre2', 'Trimestre 3', 'Trimestre 4');
Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por trimestre de
cada proveedor en el año indicado. Los trimestres aparecen de izquierda a derecha como columnas y los
nombres de los proveedores aparecen de arriba hacia abajo como filas.
Un caso práctico:
Se trata de resolver el siguiente problema: tenemos una tabla de productos con dos campos, el código y el
nombre del producto, tenemos otra tabla de pedidos en la que anotamos el código del producto, la fecha del
pedido y la cantidad pedida. Deseamos consultar los totales de producto por año, calculando la media anual de
ventas.
Estructura y datos de las tablas:
1. Artículos:
ID Nombre
1 Zapatos
2 Pantalones
3 Blusas
2. Pedidos:
Id Fecha Cantidad
1 11/11/1996 250
2 11/11/1996 125
3 11/11/1996 520
1 12/10/1996 50
2 04/05/1996 250
3 05/08/1996 100
1 01/01/1997 40
2 02/08/1997 60
3 05/10/1997 70
1 12/12/1997 8
2 15/12/1997 520
3 17/10/1997 1250
Comentarios a la consulta:
La cláusula TRANSFORM indica el valor que deseamos visualizar en las columnas que realmente pertenecen a
la consulta, en este caso 1996 y 1997, puesto que las demás columnas son opcionales.
SELECT especifica el nombre de las columnas opcionales que deseamos visualizar, en este caso Producto,
Código, Total y Media, indicando el nombre del campo que deseamos mostrar en cada columna o el valor de la
misma. Si incluimos una función de cálculo el resultado se hará en base a los datos de la fila actual y no al total
de los datos.
FROM especifica el origen de los datos. La primera tabla que debe figurar es aquella de donde deseamos extraer
los datos, esta tabla debe contener al menos tres campos, uno para los títulos de la fila, otros para los títulos
de la columna y otro para calcular el valor de las celdas.
En este caso en concreto se deseaba visualizar el nombre del producto, como la tabla de pedidos sólo figuraba
el código del mismo se añadió una nueva columna en la cláusula select llamada Producto que se corresponda
con el campo Nombre de la tabla de artículos. Para vincular el código del artículo de la tabla de pedidos con el
nombre del misma de la tabla artículos se insertó la cláusula INNER JOIN.
La cláusula GROUP BY especifica el agrupamiento de los registros, contrariamente a los manuales de
instrucción esta cláusula no es opcional ya que debe figurar siempre y debemos agrupar los registros por el
campo del cual extraemos la información. En este caso existen dos campos del cual extraemos la información:
pedidos.cantidad y artículos.nombre, por ellos agrupamos por los campos.
Para finalizar la cláusula PIVOT indica el nombre de las columnas no opcionales, en este caso 1996 y 1997 y
como vamos a el dato que aparecerá en las columnas, en este caso empleamos el año en que se produjo el
pedido, extrayéndolo del campo pedidos.fecha.
Las vinculaciones entre tablas se realizan mediante la cláusula INNER que combina registros de dos tablas
siempre que haya concordancia de valores en un campo común. Su sintaxis es:
SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2
El ejemplo siguiente muestra cómo podría combinar las tablas Categorías y Productos basándose en el campo
IDCategoria:
.
En el ejemplo anterior, IDCategoria es el campo combinado, pero no está incluido en la salida de la consulta ya
que no está incluido en la instrucción SELECT. Para incluir el campo combinado, incluir el nombre del campo
en la instrucción SELECT, en este caso, Categorias.IDCategoria.
También se pueden enlazar varias cláusulas ON en una instrucción JOIN, utilizando la sintaxis siguiente:
SELECT campos FROM tabla1 INNER JOIN tabla2 ON tb1.campo1 comp tb2.campo1 AND ON tb1.campo2
comp tb2.campo2) OR ON tb1.campo3 comp tb2.campo3)];
Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede
anidarse dentro de un LEFT JOIN o un RIGHT JOIN.
Ejemplo
SELECT DISTINCTROW Sum([Precio unidad] * [Cantidad]) AS [Ventas], [Nombre] & " " & [Apellidos] AS
[Nombre completo] FROM [Detalles de pedidos], Pedidos, Empleados, Pedidos INNER JOIN [Detalles de
pedidos] ON Pedidos.[ID de pedido] = [Detalles de pedidos].[ID de pedido], Empleados INNER JOIN Pedidos
ON Empleados.[ID de empleado] = Pedidos.[ID de empleado] GROUP BY [Nombre] & " " & [Apellidos];
Crea dos combinaciones equivalentes: una entre las tablas Detalles de pedidos y Pedidos, y la otra entre las
tablas Pedidos y Empleados. Esto es necesario ya que la tabla Empleados no contiene datos de ventas y la
tabla Detalles de pedidos no contiene datos de los empleados. La consulta produce una lista de empleados
y sus ventas totales.
Si empleamos la cláusula INNER en la consulta se seleccionarán sólo aquellos registros de la tabla de la que
hayamos escrito a la izquierda de INNER JOIN que contengan al menos un registro de la tabla que hayamos
escrito a la derecha. Para solucionar esto tenemos dos cláusulas que sustituyen a la palabra clave INNER, estas
cláusulas son LEFT y RIGHT. LEFT toma todos los registros de la tabla de la izquierda, aunque no tengan ningún
registro en la tabla de la izquierda. RIGHT realiza la misma operación, pero al contrario, toma todos los registros
de la tabla de la derecha aunque no tenga ningún registro en la tabla de la izquierda.
La sintaxis expuesta anteriormente pertenece a ACCESS, en donde todas las sentencias con la sintaxis
funcionan correctamente. Los manuales de SQL-SERVER dicen que esta sintaxis es incorrecta y que hay que
añadir la palabra reservada OUTER: LEFT OUTER JOIN y RIGHT OUTER JOIN. En la práctica funciona
correctamente de una u otra forma.
No obstante, los INNER JOIN ORACLE no es capaz de interpretarlos, pero existe una sintaxis en formato ANSI
para los INNER JOIN que funcionan en todos los sistemas. Tomando como referencia la siguiente sentencia:
Como se puede observar los cambios realizados han sido los siguientes:
Todas las tablas que intervienen en la consulta se especifican en la cláusula FROM.
Las condiciones que vinculan a las tablas se especifican en la cláusula WHERE y se vinculan mediante el
operador lógico AND.
Referente a los OUTER JOIN, no funcionan en ORACLE y además no conozco una sintaxis que funcione en los
tres sistemas. La sintaxis en ORACLE es igual a la sentencia anterior pero añadiendo los caracteres (+) detrás
del nombre de la tabla en la que deseamos aceptar valores nulos, esto equivale a un LEFT JOIN:
En SQL-SERVER se puede utilizar una sintaxis parecida, en este caso no se utiliza los caracteres (+) sino los
caracteres =* para el LEFT JOIN y *= para el RIGHT JOIN.
Consultas de Autocombinación
La autocombinación se utiliza para unir una tabla consigo misma, comparando valores de dos columnas con el
mismo tipo de datos. La sintaxis en la siguiente:
Por ejemplo, para visualizar el número, nombre y puesto de cada empleado, junto con el número, nombre y
puesto del supervisor de cada uno de ellos se utilizaría la siguiente sentencia:
Por ejemplo, para listar el grado salarial, nombre, salario y puesto de cada empleado ordenando el resultado por
grado y salario habría que ejecutar la siguiente sentencia:
Para listar el salario medio dentro de cada grado salarial habría que lanzar esta otra sentencia:
SELECT grados.grado, AVG(empleados.salario) FROM empleados, grados WHERE empleados.salario
BETWEEN grados.salarioinferior AND grados.salariosuperior GROUP BY grados.grado CROSS JOIN (SQL-
SERVER)
Se utiliza en SQL-SERVER para realizar consultas de unión. Supongamos que tenemos una tabla con todos los
autores y otra con todos los libros. Si deseáramos obtener un listado combinar ambas tablas de tal forma que
cada autor apareciera junto a cada título, utilizaríamos la siguiente sintaxis:
SELECT Autores.Nombre, Libros.Titulo FROM Autores CROSS JOIN Libros SELF JOIN
SELF JOIN es una técnica empleada para conseguir el producto cartesiano de una tabla consigo misma. Su
utilización no es muy frecuente, pero pongamos algún ejemplo de su utilización.
Supongamos la siguiente tabla (El campo autor es numérico, aunque para ilustrar el ejemplo utilice el nombre):
Código (Código del libro)
Como podemos observar, las parejas de autores se repiten en cada uno de los libros, podemos omitir estas
repeticiones de la siguiente forma
SELECT A.Codigo, A.Autor, B.Autor FROM Autores A, Autores B WHERE A.Codigo = B.Codigo AND A.Autor <
B.Autor
SELECT Emple.Nombre, Jefes.Nombre FROM Empleados Emple, Empleados Jefe WHERE Emple.SuJefe =
Jefes.Id
Se utiliza la operación UNION para crear una consulta de unión, combinando los resultados de dos o más
consultas o tablas independientes. Su sintaxis es:
[TABLE] consulta1 UNION [ALL] [TABLE] consulta2 [UNION [ALL] [TABLE] consultan [ ... ]]
En donde: consulta1, consulta2, consultan
Son instrucciones SELECT, el nombre de una consulta almacenada o el nombre de una tabla almacenada
precedido por la palabra clave TABLE. Puede combinar los resultados de dos o más consultas, tablas e
instrucciones SELECT, en cualquier orden, en una única operación UNION. El ejemplo siguiente combina una
tabla existente llamada Nuevas Cuentas y una instrucción SELECT:
TABLE [Nuevas Cuentas] UNION ALL SELECT * FROM Clientes WHERE [Cantidad pedidos] 1000;
SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE País = 'Brasil' UNION SELECT [Nombre de
compañía], Ciudad FROM Clientes WHERE País = "Brasil"
Recupera los nombres y las ciudades de todos proveedores y clientes de Brasil
SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE País = 'Brasil' UNION SELECT [Nombre de
compañía], Ciudad FROM Clientes WHERE País = 'Brasil' ORDER BY Ciudad
Recupera los nombres y las ciudades de todos proveedores y clientes radicados en Brasil, ordenados por el
nombre de la ciudad
SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE País = 'Brasil' UNION SELECT [Nombre de
compañía], Ciudad FROM Clientes WHERE País = 'Brasil' UNION SELECT [Apellidos], Ciudad FROM Empleados
WHERE Región = 'América del Sur'
Recupera los nombres y las ciudades de todos los proveedores y clientes de Brasil y los apellidos y las
ciudades de todos los empleados de América del Sur
TABLE [Lista de clientes] UNION TABLE [Lista de proveedores]
Recupera los nombres y códigos de todos los proveedores y clientes
Parte Descripción
campo1 Es el nombre del campo o de los campos que se van a crear en la nueva tabla. La
campo2 nueva tabla debe contener, al menos, un campo.
tamaño Es el tamaño del campo sólo se aplica para campos de tipo texto.
índice1 Es una cláusula CONSTRAINT que define el tipo de índice a crear. Esta cláusula en
índice2 opcional.
CREATE TABLE Empleados (Nombre TEXT (10), Apellidos TEXT, Fecha_Nacimiento DATETIME) CONSTRAINT
IndiceGeneral UNIQUE ([Nombre], [Apellidos], [Fecha_Nacimiento]);
Crea una nueva tabla llamada Empleados con un campo Nombre de tipo texto y longitud 10, otro con
llamado Apellidos de tipo texto y longitud predeterminada (50) y uno más llamado Fecha_Nacimiento de
tipo Fecha/Hora. También crea un índice único (no permite valores repetidos) formado por los tres campos.
CREATE TABLE Empleados (ID INTEGER CONSTRAINT IndicePrimario PRIMARY, Nombre TEXT, Apellidos
TEXT, Fecha_Nacimiento DATETIME);
Crea una tabla llamada Empleados con un campo Texto de longitud predeterminada (50) llamado Nombre
y otro igual llamado Apellidos, crea otro campo llamado Fecha_Nacimiento de tipo Fecha/Hora y el campo
ID de tipo entero el que establece como clave principal.
Parte Descripción
primarioN Es el nombre del campo o de los campos que forman el índice primario.
únicoN Es el nombre del campo o de los campos que forman el índice de clave única.
Es el nombre del campo o de los campos que forman el índice externo (hacen
refN
referencia a campos de otra tabla).
tabla externa Es el nombre de la tabla que contiene el campo o los campos referenciados en refN
campos Es el nombre del campo o de los campos de la tabla externa especificados por ref1,
externos ref2, ..., refN
Genera un índice de clave única. Lo que implica que los registros de la tabla no
UNIQUE
pueden contener el mismo valor en los campos indexados.
Genera un índice externo (toma como valor del índice campos contenidos en
otras tablas). Si la clave principal de la tabla externa consta de más de un
campo, se debe utilizar una definición de índice de múltiples campos, listando
todos los campos de referencia, el nombre de la tabla externa, y los nombres
FOREIGN KEY de los campos referenciados en la tabla externa en el mismo orden que los
campos de referencia listados. Si los campos referenciados son la clave
principal de la tabla externa, no tiene que especificar los campos referenciados,
predeterminado por valor, el motor Jet se comporta como si la clave principal
de la tabla externa fueran los campos referenciados.
Si se desea crear un índice para un campo cuando se está utilizando las instrucciones ALTER TABLE o CREATE
TABLE la cláusula CONTRAINT debe aparecer inmediatamente después de la especificación del campo
indexado.
Si se desea crear un índice con múltiples campos cuando se está utilizando las instrucciones ALTER TABLE o
CREATE TABLE la cláusula CONSTRAINT debe aparecer fuera de la cláusula de creación de tabla.
En donde:
Parte Descripción
Indica el orden de los valores de lso campos ASC indica un orden ascendente
ASC|DESC
(valor predeterminado) y DESC un orden descendente.
IGNORE NULL Excluye del índice los valores nulos incluidos en los campos que lo componen.
Asigna al índice la categoría de clave principal, en cada tabla sólo puede existir
PRIMARY un único índice que sea "Clave Principal". Si un índice es clave principal implica
que no puede contener valores nulos ni duplicados.
Se puede utilizar CREATE INDEX para crear un pseudo índice sobre una tabla adjunta en una fuente de datos
ODBC tal como SQL Server que no tenga todavía un índice. No necesita permiso o tener acceso a un servidor
remoto para crear un pseudo índice, además la base de datos remota no es consciente y no es afectada por el
pseudo índice. Se utiliza la misma sintaxis para la tabla adjunta que para las originales. Esto es especialmente
útil para crear un índice en una tabla que sería de sólo lectura debido a la falta de un índice.
CREATE INDEX MiIndice ON Empleados (Prefijo, Telefono);
Crea un índice llamado MiIndice en la tabla empleados con los campos Prefijo y Telefono.
En donde:
Parte Descripción
tamaño El tamaño del campo que se va a añadir (sólo para campos de texto).
Es el nombre del índice del campo (cuando se crean campos) o el nombre del índice
índice
de la tabla que se desea eliminar.
índice Es el nombre del índice del campo multicampo (cuando se crean campos) o el
multicampo nombre del índice de la tabla que se desea eliminar.
Operación Descripción
Se utiliza para añadir un nuevo campo a la tabla, indicando el nombre, el tipo de campo
ADD COLUMN
y opcionalmente el tamaño (para campos de tipo texto).
DROP COLUMN Se utiliza para borrar un campo. Se especifica únicamente el nombre del campo.
ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY (ID_Empleado) REFERENCES
Empleados (ID_Empleado);
Agrega un indice externo a la tabla Pedidos. El índice externo se basa en el campo ID_Empleado y se refiere
al campo ID_Empleado de la tabla Empleados. En este ejemplo no es necesario indicar el campo junto al
nombre de la tabla en la cláusula REFERENCES, pues ID_Empleado es la clave principal de la tabla
Empleados.
Las consultas con parámetros son aquellas cuyas condiciones de búsqueda se definen mediante parámetros.
Si se ejecutan directamente desde la base de datos donde han sido definidas aparecerá un mensaje solicitando
el valor de cada uno de los parámetros. Si deseamos ejecutarlas desde una aplicación hay que asignar primero
el valor de los parámetros y después ejecutarlas. Su sintaxis es la siguiente:
PARAMETERS nombre1 tipo1, nombre2 tipo2, ... , nombreN tipoN Consulta
En donde:
Parte Descripción
Puede utilizar nombre, pero no tipo de datos en una cláusula WHERE o HAVING.
PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime;
SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio Precio_Minimo AND FechaPedido =
Fecha_Inicio;
El ejemplo siguiente muestra cómo utilizar los parámetros en el programa de Visual Basic:
Public Sub GeneraConsulta()
Dim SQL As String
Dim Qd As QueryDef
Dim Rs As Recordset
SQL = "PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime; "
SQL = SQL & "SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio "
SQL = SQL & "Precio_Minimo AND FechaPedido = Fecha_Inicio; "
Set Qd = BaseDatos.CreateQueryDef(MiConsulta, SQL)
Qd.Parameters!Precio_Minimo = 2
Qd.Parameters!FechaInicio = #31/12/95#
Set Rs = Qd.OpenRecordset()
End Sub
Ejemplo:
PARAMETERS [Escriba los Apellidos:] Text; SELECT * FROM Empleados WHERE [Escriba los Apellidos:] =
[Apellidos];
La ejecución desde la base de datos solicita al usuario los apellidos del empleado y después muestra los
resultados.
Para el acceso a bases de datos externas se utiliza la cláusula IN. Se puede acceder a base de datos dBase,
Paradox o Btrieve. Esta cláusula sólo permite la conexión de una base de datos externa a la vez. Una base de
datos externa es una base de datos que no sea la activa. Aunque para mejorar los rendimientos es mejor
adjuntarlas a la base de datos actual y trabajar con ellas.
Para especificar una base de datos que no pertenece a Access Basic, se agrega un punto y coma (;) al nombre
y se encierra entre comillas simples. También puede utilizar la palabra reservada DATABASE para especificar
la base de datos externa. Por ejemplo, las líneas siguientes especifican la misma tabla:
En entornos de bases de datos con permisos de seguridad para grupos de trabajo se puede utilizar la cláusula
WITH OWNERACCESS OPTION para que el usuario actual adquiera los derechos de propietario a la hora de
ejecutar la consulta. Su sintaxis es:
Esta opción requiere que esté declarado el acceso al fichero de grupo de trabajo (generalmente system.mda o
system .mdw) de la base de datos actual.
Esta cláusula es poco usual y se utiliza para crear una consulta a la misma vez que se ejecuta, opcionalmente
define los parámetros de la misma. Su sintaxis es la siguiente:
En donde:
Parte Descripción
16. ANEXOS.
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.
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
w Día de la semana
h Hora
m Minutos
s Segundos
Valor Descripción
2 Lunes
3 Martes
4 Miércoles
5 Jueves
6 Viernes
7 Sábado
Comienzo Año indica cual es la primera semana del año; los posibles valores son:
Valor Descripción
2 Empieza con la semana que tenga al menos cuatro días en el nuevo año.
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.
labor lo más sencilla posible. En lo que a mí respecta utilizo las siguientes normas a la hora de elaborar
sentencias SQL:
Optimización de consultas
El tema de la optimización de bases de datos es muy extenso y completo. Algunos factores, como la
configuración de hardware y software, la instalación de Windows y el tamaño de memoria caché de disco, no
tienen nada que ver con las consultas, pero pueden afectar al rendimiento de la base de datos.
Otro factor importante es la utilización de tablas adjuntas en lugar de conexiones directas a bases de datos
remotas. Esto se explica detalladamente en el capítulo 7, "Acceso a datos externos". Otra consideración es elegir
el tipo apropiado de objeto Recordset para su uso particular. Los Recordset de tipo table, dynaset y snapshot
tienen consideraciones de rendimiento particulares, descritas en el capítulo 3, "Trabajo con registros y campos".
Esta sección presentará brevemente varias sugerencias de optimización específicas para la generación de
consultas y el aprovechamiento de la optimización de consultas Rushmore™ de Jet en la generación de consultas
SQL.
Nota Para obtener los mejores resultados, el valor de comparación de una expresión que usa el operador LIKE
debe comenzar con un carácter distinto del carácter comodín. Por ejemplo, puede optimizar LIKE "m*" pero no
LIKE "*m*".
Las consultas Rushmore trabajan con tablas de Microsoft Access, así como con tablas de Microsoft FoxPro y
dBASE (archivos .DBF). No puede utilizar Rushmore con orígenes de datos ODBC, ya que DAO envía estas
consultas al origen de datos ODBC en lugar de procesarlas localmente.
Puede optimizar índices de múltiples campos si consulta los campos indizados en el mismo orden en que
aparecen en la colección Indexes.Fields, comenzando por el primer campo indizado y continuando con los
campos adyacentes (hasta 10 campos inclusive). Por ejemplo, si tiene un índice de múltiples campos basado
en Apellido y Nombre, puede optimizar una consulta por Apellido o por Apellido y Nombre, pero no una consulta
basada en Nombre.
Principales diferencias
A continuación, se incluye una lista de las principales diferencias entre SQL de Jet y de ANSI:
✓ SQL de Jet y de ANSI tienen diferentes palabras clave y distintos tipos de datos.
✓ Se aplican diferentes reglas para la construcción BETWEEN...AND, que tiene la siguiente sintaxis:
expresión1 [NOT] BETWEEN expresión2 AND expresión3
✓ En SQL de Jet, expresión2 puede ser mayor que expresión3; en SQL de ANSI, expresión2 debe ser igual
Límites numéricos
• Valor INTEGER más pequeño −2 147 483 648
• Valor INTEGER máximo +2 147 483 647
• Valor BIGINT más pequeño −9 223 372 036 854 775 808
• Valor BIGINT máximo +9 223 372 036 854 775 807
• Valor SMALLINT mínimo −32 768
• Valor SMALLINT máximo +32 767
• Precisión decimal máxima 31
• Valor DOUBLE mínimo −1,79769E+308
• Valor DOUBLE máximo +1,79769E+308
• Valor DOUBLE positivo mínimo +2,225E−307
• Valor DOUBLE negativo máximo −2,225E−307
• Valor REAL mínimo −3,402E+38
• Valor REAL máximo +3,402E+38
• Valor REAL positivo mínimo +1,175E−37
• Valor REAL negativo máximo −1,175E−37
Límites de series
• Longitud máxima de CHAR (en bytes) 254
• Longitud máxima de VARCHAR (en bytes) 32 672
• Longitud máxima de LONG VARCHAR (en bytes) 32 700
• Longitud máxima de CLOB (en bytes) 2 147 483 647
• Longitud máxima de GRAPHIC (en caracteres) 127
• Longitud máxima de VARGRAPHIC (en caracteres) 16 336
• Longitud máxima de LONG VARGRAPHIC (en caracteres) 16 350
• Longitud máxima de DBCLOB (en caracteres) 1 073 741 823
• Longitud máxima de BLOB (en bytes) 2 147 483 647
• Longitud máxima de constante de caracteres 32 672
• Longitud máxima de constante gráfica 16 336
• Longitud máxima de series de caracteres concatenadas 2 147 483 647
• Longitud máxima de series gráficas concatenadas 1 073 741 823
• Longitud máxima de series binarias concatenadas 2 147 483 647
• Número máximo de dígitos de constante hexadecimal 16 336
• Tamaño máximo de un comentario del catálogo (en bytes) 254
• Instancia más larga de un objeto de una columna de tipo estructurado durante la ejecución 1 GB
• Número máximo de cláusulas SET en una sola sentencia UPDATE (7) 1 012
• Número máximo de columnas en una restricción UNIQUE (soportado a través de un índice UNIQUE)
16
• Longitud máxima combinada de las columnas de una restricción UNIQUE (soportada mediante un
índice UNIQUE) (en bytes) 1 024
• Número máximo de columnas de referencia en una clave foránea 16
• Longitud máxima combinada de columnas de referencia en una clave foránea (en bytes) 1 024
• Longitud máxima de una especificación de restricción de comprobación (en bytes) 65 535
• Número máximo de columnas en una clave de particionamiento (5) 500
• Número máximo de filas cambiadas en una unidad de trabajo almacenamiento
• Número máximo de paquetes almacenamiento
• Número máximo de constantes en una sentencia almacenamiento
• Número máximo de usuarios simultáneos del servidor (4) 64 000
• Número máximo de parámetros en un procedimiento almacenado 32 767
• Número máximo de parámetros en una función definida por el usuario 90
• Profundidad máxima en tiempo de ejecución de desencadenantes en cascada 16
• Número máximo de supervisores de sucesos activos simultáneamente 32
• Tamaño máximo de un espacio de tablas DMS normal (en gigabytes) (3)(7) 512
• Tamaño máximo de un espacio de tablas DMS largo (en terabytes) (3) 2
• Tamaño máximo de un espacio de tablas DMS temporal (en terabytes) (3) 2
• Número máximo de bases de datos por instancia en uso simultáneo 256
• Número máximo de usuarios simultáneos por instancia 64 000
• Número máximo de aplicaciones simultáneas por base de datos 1 000
• Profundidad máxima de desencadenantes en cascada 16
• Número de partición máximo 999 53 Número máximo de objetos de tabla en un espacio de tablas
DMS f 51 000
• Parte más larga de la clave de índice variable (en bytes) 255
• Número máximo de columnas en una vista o tabla de fuente de datos a la que se hace referencia
mediante un apodo 5 000
• Valor máximo de NPAGES en una agrupación de almacenamientos intermedios para emisiones de
32 bits 524 288
• Valor máximo de NPAGES en una agrupación de almacenamientos intermedios para emisiones de
64 bits 2 147 483 647
• Número máximo de niveles de anidamiento para procedimientos almacenados 16
• Número máximo de espacios de tablas en una base de datos 4096
• Número máximo de atributos en un tipo estructurado 4082
Notas:
(1) Este máximo puede conseguirse utilizando una unión en la sentencia CREATE VIEW. La selección de dicha
vista está sujeta al límite del número máximo de elementos de una lista de selección.
(2) Los datos reales para las columnas BLOB, CLOB, LONG VARCHAR, DBCLOB y LONG VARGRAPHIC no se
incluyen en esta cuenta. Sin embargo, la información acerca de la ubicación de los datos ocupa espacio en la
fila.
(3) Los números mostrados son límites y aproximaciones arquitectónicos. En la práctica los límites pueden
ser menores.
(4) El valor real será el valor del parámetro de configuración MAXAGENTS. Consulte el manual Administration
Guide para obtener información acerca de MAXAGENTS.
(5) Es un límite de arquitectura. El límite en la mayoría de las columnas de una clave de índice debe utilizarse
como un límite práctico.
(6) Los objetos de tabla incluyen datos, índices, columnas LONG VARCHAR/VARGRAPHIC y columnas LOB.
Los objetos de tabla que están en el mismo espacio de tablas que los datos de tabla no cuentan como
adicionales respecto al límite. No obstante, cada objeto de tabla que está en un espacio de tablas diferente de
los datos de tabla representa uno respecto al límite para cada tipo de objeto de tabla por tabla en el espacio
de tablas en que reside el objeto de tabla.
(7) Para conocer los valores específicos de tamaño de página, consulte la Tabla (Límites específicos de
tamaño de página del gestor de bases de datos).
Contenido
Funciones matemáticas
▪ Abs (Función)
▪ Atn (Función)
▪ Cos (Función)
▪ Exp (Función)
▪ Fix (Función)
▪ Int (Función)
▪ Log (Función)
▪ Rnd (Función)
▪ Sgn (Función)
▪ Sin (Función)
▪ Sqr (Función)
▪ Tan (Función)
La siguiente es una lista de funciones matemáticas no intrínsecas que pueden derivarse de funciones
matemáticas intrínsecas:
Abs (Función)
Devuelve un valor del mismo tipo que el que se pasó como parámetro y que especifica el valor absoluto
de un número.
Sintaxis: Abs(número)
El argumento número puede ser cualquier expresión numérica válida. Si número contiene Null, la función
devolverá Null; si es una variable no inicializada, devolverá cero.
Comentarios: El valor absoluto de un número es su magnitud sin signo. Por ejemplo, ABS(-1) y ABS(1)
devuelven 1.
Ejemplos
Dim MiNúmero
MiNúmero = Asc("A") ' Devuelve 65.
MiNúmero = Asc("a") ' Devuelve 97.
MiNúmero = Asc("Apple") ' Devuelve 65.
Atn (Función)
Devuelve un tipo Double que especifica el arco tangente de un número.
Sintaxis: Atn(número)
Comentarios: La función Atn toma la razón de dos lados de un triángulo rectángulo (número) y devuelve el
ángulo correspondiente en radianes. La razón es la longitud del lado opuesto al ángulo dividida por la longitud
del lado adyacente al ángulo.
El ángulo del resultado es -pi/2 a pi/2 radianes.
Para convertir grados en radianes, multiplique los grados por PI/180. Para convertir radianes en grados,
multiplique los radianes por 180/pi.
Nota Atn es la función trigonométrica inversa de Tan, que toma un ángulo y su argumento y devuelve la razón
de dos lados de un triángulo rectángulo. No confunda con la cotangente, que es el inverso de la tangente
(1/tangente).
Ejemplo
Dim pi
pi = 4 * Atn(1) ' Calcula el valor de pi.
Asc (Función)
Devuelve un tipo Integer que representa el código de carácter correspondiente a la primera letra de una cadena.
Sintaxis: Asc(cadena)
El argumento obligatorio cadena es una expresión de cadena válida. Si cadena no contiene caracteres, se
produce un error en tiempo de ejecución.
Comentarios: El intervalo del valor de retorno es entre 0 y 255 en sistemas que no sean DBCS, y entre –32768
y 32767 en sistemas DBCS.
Nota La función AscB se utiliza con bytes de datos contenidos en una cadena. En lugar de devolver el código
de carácter para el primer carácter, AscB devuelve el primer byte. La función AscW siempre devuelve el código
de carácter Unicode en plataformas donde no se admite Unicode, en cuyo caso, el comportamiento es idéntico
al de la función Asc.
Ejemplos: En este ejemplo se utiliza la función Asc para devolver el código de carácter correspondiente a la
primera letra de una cadena de caracteres.
Dim MiNúmero
MiNúmero = Asc("A") ' Devuelve 65.
MiNúmero = Asc("a") ' Devuelve 97.
MiNúmero = Asc("Apple") ' Devuelve 65.
Chr (Función)
Devuelve un tipo String que contiene el carácter asociado con el código de carácter especificado.
Sintaxis: Chr(códigocar)
Comentarios: Los números del 0 al 31 son los mismos que los códigos ASCII estándar no imprimibles. Por
ejemplo, Chr(10) devuelve un carácter de avance de línea. El intervalo normal de código car es 0–255. Sin
embargo, en sistemas DBCS, el intervalo real de código car es de -32768 a 65535.
Nota La función ChrB se utiliza con datos de byte incluidos en un tipo String. En lugar de devolver un carácter,
que puede ser de uno o de dos bytes, ChrB siempre devuelve un único byte. La función ChrW devuelve un tipo
String que contiene el carácter Unicode excepto en plataformas donde no se admite Unicode, en cuyo caso, el
comportamiento es idéntico al de la función Chr.
Ejemplos
Dim MiCar
MiCar = Chr(65) ' Devuelve A.
MiCar = Chr(97) ' Devuelve a.
MiCar = Chr(62) ' Devuelve >.
MiCar = Chr(37) ' Devuelve %.
Cos (Función)
Devuelve un tipo Double que especifica el coseno de un ángulo.
Sintaxis: Cos(número)
El argumento número es un tipo Double o cualquier expresión numérica válida que expresa un ángulo en
radianes.
Comentarios: La función Cos toma un ángulo y devuelve la razón de dos lados de un triángulo rectángulo.
La razón es la longitud del lado adyacente al ángulo dividida por la longitud de la hipotenusa.
El resultado está dentro del intervalo -1 a 1.
Para convertir grados en radianes, multiplique los grados por pi/180. Para convertir radianes en grados,
multiplique los radianes por 180/pi.
Ejemplo
Dim MiÁngulo, MiSecante
MiÁngulo = 1.3 ' Define el ángulo en radianes.
MiSecante = 1 / Cos(MiÁngulo) ' Calcula la secante.
Date (Función)
Devuelve un tipo Variant (Date) que contiene la fecha actual del sistema.
Sintaxis: Date
Ejemplo
Dim MiFecha
MiFecha = Date ' MiFecha contiene la fecha del sistema actual.
DateAdd (Función)
Devuelve un valor de tipo Variant (Date) con una fecha a la que se ha agregado un intervalo de tiempo
especificado.
Parte Descripción
fecha Valor de tipo Variant (Date) o literal que representa la fecha en la que se
Requerido. agregó el intervalo
Valor Descripción
yyyy Año
q Trimestre
m Mes
d Día
w Día de la semana
ww Semana
h Hora
n Minuto
s Segundo
Comentarios: Puede utilizar la función DateAdd para agregar o restar un intervalo de tiempo especificado de
una fecha. Por ejemplo, con DateAdd podría calcular una fecha 30 días posterior al día de hoy o una hora 45
minutos posterior a la actual.
Si desea agregar días a fecha, puede utilizar Día del año ("y"), Día ("d") o Día de la semana ("w").
La función DateAdd no devuelve nunca una fecha no válida. En el ejemplo siguiente se agrega un mes al 31 de
enero:
DateAdd("m", 1, "31-ene-95")
En este caso, DateAdd devuelve 28-feb-95 y no 31-feb-95. Si fecha es 31-ene-96, devolverá 29-feb-96, ya que
1996 es un año bisiesto.
Si la fecha calculada va a resultar inferior al año 100 (esto es, se restan más años que los que hay en fecha), se
produce un error.
Si número no es un valor de tipo Long se redondeará al número entero más cercano antes de ser evaluado.
Nota El formato del valor devuelto por DateAdd es determinado por la configuración del Panel de control, no
por el formato que se pasa en el argumento fecha.
DateSerial (Función)
Devuelve un tipo Variant (Date) para un año, mes y día especificados.
Parte Descripción
Comentarios: Para especificar una fecha, como el 31 de diciembre de 1991, el intervalo de números para cada
argumento de DateSerial debería estar en el intervalo normalmente aceptado para la unidad; es decir, 1–31 para
días y 1–12 para meses. Sin embargo, puede especificar fechas relativas para cada argumento, usando cualquier
expresión numérica que represente algún número de días, meses o años, antes o después de cierta fecha.
El ejemplo siguiente usa expresiones numéricas en lugar de números de fecha absoluta. Aquí la función
DateSerial devuelve una fecha que es el día antes del primer día del mes (1 - 1), dos meses antes de agosto (8
- 2), 10 años antes de 1990 (1990 - 10); en otras palabras, el 31 de mayo de 1980.
DateSerial(1990 - 10, 8 - 2, 1 - 1)
Para el argumento año, los valores entre 0 y 29, inclusive, se interpretan como los años 2000–2029. Los
valores entre 30 y 99, se interpretan como los años 1930–1999.Para el resto de los argumentos año se usa
un año con los cuatro dígitos (por ejemplo, 1800).
Cuando un argumento no esté incluido en el intervalo aceptado normalmente para él, se incrementa hasta la
siguiente unidad mayor, según convenga. Por ejemplo, si especifica 35 días, se evalúa como un mes y algunos
días, dependiendo de la parte del año donde se aplique. No obstante, si un solo argumento está fuera de su
intervalo -32.768 a 32.767 o si la fecha especificada por los tres argumentos, directamente o mediante
expresión, no se incluye en el intervalo aceptable de fechas, se produce un error.
Ejemplo
Dim MiFecha
' MiFecha contiene la fecha correspondiente al 12 de febrero de 1969.
MiFecha = DateSerial(1969, 2, 12) ' Devuelve una fecha.
DateValue (Función)
Devuelve un tipo Variant (Date).
Sintaxis: DateValue(fecha)
El argumento fecha es normalmente una expresión de tipo cadena (String) que representa una fecha del 1 de
enero del año 100, al 31 de diciembre de 9999. Sin embargo, fecha también puede ser cualquier expresión que
pueda representar una fecha, una hora o una fecha y una hora en ese intervalo.
Comentarios: Si fecha es una cadena que incluye solamente números separados por separadores de fecha,
DateValue reconoce el orden para mes, día y año de acuerdo al formato de Fecha abreviado que se haya
especificado para el sistema. DateValue también reconoce fechas claramente definidas que contengan nombres
de mes, en forma completa o abreviada. Por ejemplo, además de reconocer 30/12/1991 y 30/12/91,
DateValue también reconoce 30 de diciembre de 1991 y dic 31, 1991.
Si se omite la parte de año de fecha, DateValue usa el año actual de la fecha del sistema de su PC.
Si el argumento fecha incluye información de hora, DateValue no la devuelve. Sin embargo, si fecha incluye
información de hora no válida (tal como "89:98"), ocurrirá un error.
Ejemplo
Dim MiFecha
MiFecha = DateValue("12 de febrero de 1969")
' Devuelve una fecha.
Day (Función)
Devuelve el valor de tipo Variant (Integer) que especifica un número entero entre 1 y 31, inclusive, que representa
el día del mes.
Sintaxis: Day(fecha)
El argumento fecha es cualquier valor de tipo Variant, expresión numérica, cadena, o cualquier combinación que
pueda representar una fecha. Si fecha contiene Null, la función devolverá Null.
Ejemplo
Dim MiFecha, MiDía
MiFecha = #12 febrero 1969# ' Asigna una fecha.
MiDía = Day(MiFecha) ' MiDía contiene 12.
Exp (Función)
Devuelve un tipo Double que especifica e (la base de los logaritmos naturales) elevado a una potencia.
Sintaxis: Exp(número)
Comentarios: Si el valor de número es mayor que 709.782712893, se produce un error. El valor de la constante
e es 2.718282 aproximadamente.
Nota La función Exp complementa la acción de la función Log y a veces se llama antilogaritmo.
Ejemplo
Dim MiÁngulo, MiSenoH
' Define el ángulo en radianes.
MiÁngulo = 1.3
' Calcula el seno hiperbólico.
MiSenoH = (Exp(MiÁngulo) - Exp(-1 * MiÁngulo)) / 2
Hour (Función)
Devuelve un valor de tipo Variant (Integer) que especifica un número entero entre 0 y 23, inclusive, que
representa la hora del día.
Sintaxis: Hour(hora)
El argumento hora puede ser un valor de tipoVariant, una expresión numérica, expresión de tipo cadena o
cualquier combinación, que pueda representar una hora. Si hora contiene Null, la función devolverá Null.
Ejemplo
Dim MiTiempo, MiHora
MiTiempo = #4:35:17 PM# ' Asigna una hora.
MiHora = Hour(MiTiempo) ' MiHora contiene 16.
InputBox (Función)
Muestra un mensaje en un cuadro de diálogo, espera que el usuario escriba un texto o haga clic en un botón y
devuelve un tipoString con el contenido del cuadro de texto.
Parte Descripción
Comentarios: Cuando se especifica tanto helpfile como context, el usuario puede presionar F1 para ver el tema
de Ayuda correspondiente a context. Algunas aplicaciones host, por ejemplo, Microsoft Excel, también agregar
automáticamente un botón Ayuda al cuadro de diálogo. Si el usuario hace clic en Aceptar o presiona Entrar, la
función InputBox devuelve lo que haya en el cuadro de texto. Si el usuario hace clic en Cancelar, la función
devuelve una cadena de caracteres de longitud cero ("").
Nota Si desea especificar más que el primer argumento con nombre, debe utilizar InputBox en una
expresión. Si desea omitir algunos argumentos de posición, debe incluir el delimitador de coma
correspondiente.
Ejemplos: En este ejemplo se muestran distintas maneras de utilizar la función InputBox para indicar al usuario
que debe introducir un valor. Si se omiten las posiciones x e y, el diálogo se centra automáticamente según los
ejes respectivos. La variable MyValue contiene el valor introducido por el usuario, si éste hace clic sobre Aceptar
o presiona ENTER. Si el usuario hace clic sobre Cancelar, se devuelve una cadena de caracteres de longitud
cero.
InStr (Función)
Devuelve un tipo Variant (Long) que especifica la posición de la primera aparición de una cadena en otra.
Parte Descripción
Opcional.Expresión numérica que establece la posición inicial para cada
búsqueda. Si se omite, la búsqueda comienza en la posición del primer
start
carácter. Si inicio contiene un valorNull, se produce un error. El argumento
inicio se requiere si se especifica compare.
string1 Requerido.Expresión de cadena en la que se busca.
string2 Requerido. Expresión de cadena buscada.
Valores
Los valores del argumento compare son:
Valores devueltos
string2 no se encontró 0
Comentarios: La función InStrB se utiliza con los datos de byte contenidos en una cadena. En lugar de devolver
la posición del carácter de la primera aparición de una cadena en otra, InStrB devuelve la posición del byte.
Ejemplo: En este ejemplo se utiliza la función InStr para devolver la posición de la primera ocurrencia de una
cadena en otra.
La comparación es binaria por configuración predeterminada (si se omite el último argumento). MyPos =
Instr(SearchString, SearchChar) ' Devuelve 9.
MyPos = Instr(1, SearchString, "W") ' Devuelve 0.
InStrRev (Función)
Devuelve la posición de una aparición de una cadena dentro de otra, desde el final de la cadena.
Parte Descripción
Opcional. Una expresión númerica que establece la posición inicial para cada
búsqueda. Si se omite, se utiliza –1, que significa que la búsqueda empieza en la
Inicio
posición del último carácter. Si el inicio contiene Nulo, se produce un error.
Opcional. Un valor numérico que indica la clase de comparación que se utilizará
Valores
El argumento comparar puede tener los valores siguientes:
Valores de retorno
Si I nStrRev devuelve
cadena2 no se encuentra 0
Comentarios
Observe que la sintaxis para la función InstrRev no es la misma que la sintaxis para la función Instr.
El argumento número es un tipo Double o cualquier expresión numérica válida. Si número contiene Null, la
función devolverá Null.
Comentarios: Las funciones Int y Fix eliminan la fracción de un número y devuelven el valor entero resultante.
La diferencia entre Int y Fix es que si el número es negativo, Int devuelve el primer entero negativo menor o
igual a número, mientras que Fix devuelve el primer entero negativo mayor o igual a número. Por ejemplo,
Int convierte -8.4 en -9 y Fix convierte -8.4 a -8.
Sgn(número) * Int(Abs(número))
Ejemplo: Este ejemplo muestra cómo las funciones Int y Fix devuelven la parte entera de los números. En el
caso de que el argumento sea un número negativo, la función Int devuelve el primer número entero negativo
menor o igual que el número; la función Fix devuelve el primer entero negativo mayor o igual que el número.
Dim MiNúmero
MiNúmero = Int(99.8) ' Devuelve 99.
MiNúmero = Fix(99.2) ' Devuelve 99.
MiNúmero = Int(-99.8) ' Devuelve -100.
MiNúmero = Fix(-99.8) ' Devuelve -99.
MiNúmero = Int(-99.2) ' Devuelve -100.
MiNúmero = Fix(-99.2) ' Devuelve -99.
IsDate (Función)
Devuelve un valor de tipo Boolean que indica si una expresión se puede convertir en una fecha.
Sintaxis: IsDate(expresión)
El argumento expresión requerido, es un tipo de datos Variant que contiene una expresión de fecha o una
expresión de cadena reconocible como una fecha o una hora.
Comentarios: La función IsDate devuelve True si la expresión es una fecha o se puede reconocer como una
fecha válida; en caso contrario, devuelve False. En Microsoft Windows, el intervalo de fechas válidas va desde
el 1 de enero de 100 D. de C. hasta el 31 de diciembre de 9999 D.de C.; los intervalos varían de un sistema
operativo a otro.
Ejemplo
Dim MiFecha, TuFecha, SinFecha, MiPrueba
MiFecha = "12 febrero 1969": TuFecha = #2/12/69#: SinFecha = "Hola"
MiPrueba = IsDate(MiFecha) ' Devuelve True.
MiPrueba = IsDate(TuFecha) ' Devuelve True.
MiPrueba = IsDate(SinFecha) ' Devuelve False.
IsEmpty (Función)
Devuelve un valor de tipo Boolean que indica si una variable ha sido inicializada.
Sintaxis: IsEmpty(expresión)
El argumento expresión requerido es un tipo de datos Variant que contiene una expresión de cadena o una
expresión numérica. Sin embargo, ya que la función IsEmpty se utiliza para determinar si las variables
individuales están inicializadas, el argumento expresión es generalmente un único nombre de variable.
Comentarios: La función IsEmpty devuelve True si la variable no está inicializada o está explícitamente
configurada a Empty; en cualquier otro caso, devuelve False. Se devuelve False siempre que expresión contenga
más de una variable. La función IsEmpty solamente devuelve información significativa para datos de tipo
Variant.
Ejemplo
Dim MiVar, MiPrueba
MiPrueba = IsEmpty(MiVar) ' Devuelve True.
MiVar = Null ' Asigna Null.
MiPrueba = IsEmpty(MiVar) ' Devuelve False.
MiVar = Empty ' Asigna Empty.
MiPrueba = IsEmpty(MiVar) ' Devuelve True.
IsNumeric (Función)
Devuelve un valor de tipo Boolean que indica si una expresión se puede evaluar como un número.
Sintaxis: IsNumeric(expresión)
El argumento expresión requerido, es un tipo de datos Variant que contiene una expresión numérica o una
expresión de tipo cadena.
Comentarios: La función IsNumeric devuelve True si la expresión completa se reconoce como un número; en
otro caso, devuelve False.
La función IsNumeric devuelve False si expresión es una expresión de fecha.
Ejemplo
Dim MiVar, MiPrueba
MiVar = "53" ' Asigna un valor.
MiPrueba = IsNumeric(MiVar) ' Devuelve True.
MiVar = "459.95" ' Asigna valor.
MiPrueba = IsNumeric(MiVar) ' Devuelve True.
MiVar = "45 Help" ' Asigna valor.
MiPrueba = IsNumeric(MiVar) ' Devuelve False.
LCase (Función)
Devuelve un tipo String que se ha convertido a minúsculas.
Sintaxis : LCase(cadena)
El argumento cadena es cualquier expresión de cadena válida. Si string contiene Null, se devuelve Null.
Comentarios: Sólo se convierten a minúsculas las letras mayúsculas. Las letras minúsculas o los caracteres
que no son letras no sufren cambios.
Ejemplo
Dim UpperCase, LowerCase
Uppercase = "Hola Mundo 1234" ' Cadena a convertir.
Lowercase = Lcase(UpperCase) ' Devuelve "hola mundo 1234".
Left (Función)
Devuelve un tipo Variant (String) que contiene un número especificado de caracteres del lado izquierdo de
una cadena.
Parte Descripción
Ejemplo
Dim UnaCadena, MiCadena
UnaCadena = "Hola Mundo" 'Define la cadena.
MiCadena = Left(UnaCadena, 1) ' Devuelve "H".
MiCadena = Left(UnaCadena, 6) ' Devuelve "Hola M".
MiCadena = Left(UnaCadena, 10) ' Devuelve "Hola Mundo".
Len (Función)
Devuelve un tipo Long que contiene el número de caracteres en una cadena o el número de bytes necesarios
para almacenar una variable.
Parte Descripción
Comentarios: Se deben especificar uno (y sólo uno) de los dos argumentos posibles. Con tipos definidos por el
usuario, Len devuelve el tamaño como se escribirá en el archivo.
Nota:
Utilice la función LenB con datos de byte incluidos en una cadena, como en los lenguajes del conjunto de
caracteres de doble byte (DBCS). En lugar de devolver el número de caracteres en una cadena, LenB devuelve
el número de bytes utilizados para representar esa cadena. Con tipos de datos definidos por el usuario, LenB
devuelve el tamaño en memoria, incluyendo cualquier relleno entre código que utiliza LenB, vea el segundo
ejemplo en el tema de ejemplo.
Nota: Puede que Len no sea capaz de determinar el número real requerido de bytes de almacenamiento
cuando se utiliza con cadenas de longitud variable en tipos de datos definidos por el usuario.
Ejemplo: En este ejemplo se utiliza la función Len para devolver el número de caracteres en una cadena o el
número de bytes requeridos para almacenar una variable. El bloque Type...End Type que define
RegistroCliente debe ir precedido por la palabra clave Private si aparece en un módulo de clase. En un módulo
estándar, una instrucción Type puede ser Public.
End Type
Este segundo ejemplo utiliza LenB y una función definida por el usuario (LenMbcs) para devolver el número de
carácteres byte en una cadena si se utiliza ANSI para representar la cadena.
LoadPicture (Función)
Carga un gráfico en un objeto Picture, un control PictureBox o un control Image.
Parte Descripción
Valores
Los valores para tamaño son:
de vídeo.
vbLPMonochrome 1 2 colores.
vbLPVGAColor 2 16 colores.
Comentarios: Los formatos gráficos reconocidos por Visual Basic incluyen archivos de mapas de bits (.bmp),
archivos de iconos (.ico), archivos de cursor (.cur), archivos de longitud codificada (.rle), metarchivos (.wmf),
metarchivos mejorados (.emf), archivos GIF (.gif) y archivos JPEG (.jpg).
Es posible limpiar los gráficos de formularios, cuadros de imagen y controles de imagen si asigna LoadPicture
sin argumentos.
Para cargar gráficos para presentarlos en un control PictureBox, en un control Image o como fondo de un
formulario, el valor devuelto por LoadPicture debe asignarse a la propiedad Picture del objeto en el que se
quiere presentar la imagen.
Por ejemplo:
Set Picture = LoadPicture("FIESTA.BMP")
Set Image1.Picture = LoadPicture("FIESTA.BMP")
Para asignar un icono a un formulario, establezca el valor devuelto por la función LoadPicture a la propiedad
Icon del objeto Form:
Los iconos también pueden asignarse a la propiedad DragIcon de todos los controles excepto los controles
Timer y Menu.
Por ejemplo:
Set Command1.DragIcon = LoadPicture("MIICONO.ICO")
Para cargar gráficos en el Portapapeles del sistema se usa LoadPicture de la forma siguiente:
Clipboard.SetData LoadPicture("FIESTA.BMP")
Log (Función)
Devuelve un tipo Double que especifica el logaritmo natural de un número.
Sintaxis: Log(número)
El argumento número es un tipo Double o cualquier expresión numérica válida mayor que cero.
El ejemplo siguiente ilustra una función personalizada (Function) que calcula logaritmos en base 10:
Static Function Log10(X)
Log10 = Log(X) / Log(10#)
End Function
Ejemplo
Dim MiÁngulo, MiLog
' Define el ángulo en radianes.
MiÁngulo = 1.3
' Calcula el seno hiperbólico inverso.
MiLog = Log(MiÁngulo + Raíz(MiÁngulo * MiÁngulo + 1))
El argumento cadena obligatorio es cualquier expresión de cadena válida. Si cadena contiene Null, se
devuelve Null.
Ejemplo
Dim MiCadena, CadenaCorte
MiCadena = " <-Cortar-> " ' Inicializa la cadena.
CadenaCorte = LTrim(MiCadena) ' CadenaCorte = "<-Cortar-> ".
CadenaCorte = RTrim(MiCadena) ' CadenaCorte = " <-Cortar->".
CadenaCorte = LTrim(RTrim(MiCadena)) ' CadenaCorte = "<-Cortar->".
' El uso de la función Trim por sí sola logra el mismo resultado.
CadenaCorte = Trim(MiCadena) ' CadenaCorte = "<-Cortar->".
Mid (Función)
Devuelve un tipo Variant (String) que contiene un número especificado de caracteres de una cadena.
Parte Descripción
Nota Utilice la función MidB con datos de byte incluidos en una cadena, como en los lenguajes de conjunto
de caracteres de doble byte. En lugar de especificar el número de caracteres, los argumentos especifican el
número de bytes. Para ver código de ejemplo que utiliza MidB, vea el segundo ejemplo en el tema de ejemplo.
Ejemplo: En este ejemplo se utiliza la función Mid para devolver un número especificado de caracteres de una
cadena.
Este segundo ejemplo utiliza MidB y una función definida por el usuario (MidMbcs) para devolver también
caracteres de una cadena. La diferencia en este ejemplo es que la cadena de entrada es ANSI y la longitud
en bytes.
Function MidMbcs(ByVal str as String, start, length)
MidMbcs = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode)
End Function
Dim MiCadena
MiCadena = "AbCdEfG"
' Donde "A", "C", "E", y "G" son DBCS y "b", "d",
' y "f" son SBCS.
MiNuevaCadena = Mid(MiCadena, 3, 4)
' Devuelve ""CdEf"
MiNuevaCadena = MidB(MiCadena, 3, 4)
' Devuelve ""bC"
MiNuevaCadena = MidMbcs(MiCadena, 3, 4)
' Devuelve "bCd"
Minute (Función)
Devuelve un valor de tipo Variant (Integer) que especifica un número entero entre 0 y 59, inclusive, que
representa el minuto de la hora.
Sintaxis: Minute(hora)
El argumento hora es cualquier valor de tipoVariant, una expresión numérica, expresión de tipo cadena o
cualquier combinación que pueda representar una hora. Si hora contiene Null, la función devolverá Null.
Ejemplo: En este ejemplo se utiliza la función Minute para obtener los minutos de una hora especificada. En el
entorno de desarrollo, el literal de hora se presentará en formato abreviado, utilizando la configuración regional
del código.
Month (Función)
Devuelve un valor de tipo Variant (Integer) que especifica un número entero entre 1 y 12, inclusive, que
representa el mes del año.
Sintaxis: Month(fecha)
El argumento fecha es cualquier valor de tipo Variant, una expresión numérica, expresión de tipo cadena o
cualquier combinación, que pueda representar una fecha. Si fecha contiene Null, la función devolverá Null.
Ejemplo
Dim MiFecha, MiMes
MiFecha = #12 febrero 1969# ' Asigna una fecha.
MiMes = Month(MiFecha) ' MiMes contiene 2.
MonthName (Función)
Devuelve una cadena que indica el mes especificado.
Parte Descripción
MsgBox (Función)
Muestra un mensaje en un cuadro de diálogo, espera a que el usuario haga clic en un botón y devuelve un
tipo Integer correspondiente al botón elegido por el usuario.
Parte Descripción
Valores
El argumento buttons tiene estos valores:
El primer grupo de valores (0 a 5) describe el número y el tipo de los botones mostrados en el cuadro de
diálogo; el segundo grupo (16, 32, 48, 64) describe el estilo del icono, el tercer grupo (0, 256, 512) determina
el botón predeterminado y el cuarto grupo (0, 4096) determina la modalidad del cuadro de mensajes. Cuando
se suman números para obtener el valor final del argumento buttons, se utiliza solamente un número de cada
grupo.
Nota Estas constantes las especifica Visual Basic for Applications. Por tanto, el nombre de las mismas
puede utilizarse en cualquier lugar del código en vez de sus valores reales.
Valores devueltos
vbOK 1 Aceptar
vbCancel 2 Cancelar
vbAbort 3 Anular
vbRetry 4 Reintentar
vbIgnore 5 Ignorar
vbYes 6 Sí
vbNo 7 No
Comentarios: Cuando se proporcionan tanto helpfile como context, el usuario puede presionar F1 para ver el
tema de Ayuda correspondiente al context. Algunas aplicaciones host, por ejemplo, Microsoft Excel, también
agregan automáticamente un botón Ayuda al cuadro de diálogo.
Si el cuadro de diálogo cuenta con un botón Cancelar, presionar la tecla ESC tendrá el mismo efecto que
hacer clic en este botón. Si el cuadro de diálogo contiene un botón Ayuda, se suministra ayuda interactiva
para ese cuadro de diálogo. Sin embargo, no se devuelve valor alguno hasta que se hace clic en uno de estos
botones.
Nota; Si desea especificar más que el primer argumento con nombre, debe utilizar MsgBox en una expresión.
Si desea omitir algún argumento de posición, debe incluir el delimitador de coma correspondiente.
Ejemplo: En este ejemplo se utiliza la función MsgBox para mostrar un mensaje de error crítico en un cuadro de
diálogo con botones Sí y No. El botón No se considera la respuesta predeterminada. El valor devuelto por la
función MsgBox depende del botón elegido por el usuario. En este ejemplo, se supone que DEMO.HLP es un
archivo de Ayuda que contiene un tema con un número de contexto igual a 1000.
Now (Función)
Devuelve un valor de tipo Variant (Date) que especifica la fecha y hora actuales de acuerdo con la
configuración de la fecha y la hora del sistema de su equipo.
Sintaxis: Now
Ejemplo
Dim Hoy
Hoy = Now ' Obtiene la fecha y la hora del sistema actual.
QBColor (Función)
Devuelve un tipo Long que representa el código de color RGB correspondiente al número de color
especificado.
Sintaxis: QBColor(color)
El argumento color es un número entero entre 0-15.
Valores
El argumento color toma los siguientes valores:
0 Negro 8 Gris
Comentarios: El argumento color representa los valores de color que utilizan otras versiones de Basic (como
Microsoft Visual Basic para MS-DOS y Basic Compiler). Comenzando por el byte menos significativo, el valor
devuelto especifica los valores de rojo, verde y azul necesarios para establecer el color correspondiente en el
sistema RGB que utiliza Visual Basic para Aplicaciones.
Ejemplo: Este ejemplo utiliza la función QBColor para cambiar la propiedad BackColor del formulario transferido
como MiFormulario al color indicado por CódigoColor. QBColor acepta valores enteros entre 0 y 15.
Sub CambiarColorFondo (CódigoColor As Integer, MiFormulario As Form)
MiFormulario.BackColor = QBColor(CódigoColor)
End Sub
Replace (Función)
Devuelve una cadena en la que se reemplazó una subcadena especificada con otra subcadena un número
especificado de veces.
Parte Descripción
Valores
El argumento comparar puede tener los valores siguientes:
basada en el texto.
Valores de retorno
La función Replace devuelve los valores siguientes:
Si Reemplazar devuelve
Comentarios: El valor de retorno de la función Replace es una cadena con sustituciones hechas que comienza
en la posición especificada por inicio y concluye al final de la cadena expresión. No es una copia de la cadena
original desde el inicio al final.
RGB (Función)
Devuelve un número entero tipo Long que representa un valor de color RGB.
Parte Descripción
Comentarios: Los métodos de aplicación y las propiedades que aceptan una especificación de color esperan
que ésta sea un número que represente un valor de color RGB. Un valor de color RGB especifica la intensidad
relativa de rojo, verde y azul que hacen que se muestre un color determinado.
El valor de cualquier argumento para la función RGB que sea superior a 255 se considerará como 255.
La siguiente tabla muestra algunos colores estándar y sus valores de rojo, verde y azul:
Negro 0 0 0
Azul 0 0 255
Verde 0 255 0
Rojo 255 0 0
Ejemplo: Este ejemplo muestra cómo se utiliza la función RGB para devolver un número entero que representa
un valor de color RGB. Se utiliza por aquellos métodos y propiedades de aplicación que aceptan una
especificación de color. El objeto MiObjeto y su propiedad se utilizan sólo como ejemplo. Si MiObjeto no existe
o si no tiene una propiedad Color, se produce un error.
Right (Función)
Devuelve un tipo Variant (String) que contiene un número especificado de caracteres del lado derecho de
una cadena.
Parte Descripción
Nota: Utilice la función RightB con datos de byte incluidos en una cadena. En lugar de especificar el número
de caracteres para devolver, longitud especifica el número de bytes.
Ejemplo
Dim UnaCadena, MiCadena
UnaCadena = "Hola Mundo" ' Define una cadena.
MiCadena = Right(UnaCadena, 1) ' Devuelve "o".
MiCadena = Right(UnaCadena, 6) ' Devuelve "Mundo".
MiCadena = Right(UnaCadena, 20) ' ' Devuelve "Hola Mundo".
Rnd (Función)
Devuelve un tipo Single que contiene un número aleatorio.
Sintaxis: Rnd[(número)]
Valores devueltos
Comentarios: La función Rnd devuelve un valor menor que 1 pero mayor o igual que cero.
El valor de número determina cómo la función Rnd genera un número aleatorio:
Para cualquier valor de semilla inicial se genera la misma secuencia de números. Esto es debido a que cada
llamada sucesiva a la función Rnd usará el número anterior como valor de semilla para el siguiente número
de la secuencia.
Antes de llamar a la función Rnd, utilice la instrucción Randomize sin argumento para inicializar el generador
de números aleatorios con un valor de semilla basado en el reloj del sistema.
Ejemplo: En este ejemplo se utiliza la función Rnd para generar un valor entero aleatorio de 1 a 6. Dim MiValor
Randomize (Instrucción)
Inicializa el generador de números aleatorios.
Si no utiliza la instrucción Randomize, la función Rnd (sin argumentos) utiliza el mismo número como valor
de semilla la primera vez que se la invoca, usando después como valor
de semilla el último número generado.
Nota: Para repetir secuencias de números aleatorios, llame a la función Rnd con un argumento negativo
antes de utilizar la instrucción Randomize con un argumento numérico. Al utilizar la instrucción Randomize
con el mismo valor de número no se repite la secuencia anterior.
Ejemplo
Dim MiValor
Randomize ' Inicializa el generador de números aleatorios.
MiValor = Int((6 * Rnd) + 1) ' Genera valores aleatorios entre 1 y 6.
Round (Función)
Devuelve un número redondeado en el número especificado de lugares decimales.
Parte Descripción
Second (Función)
Devuelve un valor de tipo Variant (Integer) que especifica un número entero entre 0 y 59, inclusive, que
representa un segundo.
Sintaxis: Second(hora)
El argumento hora es cualquier valor de tipo Variant, una expresión numérica, expresión de tipo cadena o
cualquier combinación, que pueda representar una hora. Si hora contiene Null, la función devolverá Null.
Ejemplo
Dim MiTiempo, MiSegundo
MiTiempo = #4:35:17 PM# ' Asigna una hora.
MiSegundo = Second(MiTiempo) ' MiSegundo contiene 17.
Sgn (Función)
Devuelve un tipo Variant (Integer) que indica el signo de un número.
Sintaxis: Sgn(número)
Valores devueltos
Igual a cero 0
Comentarios: El signo del argumento número determina el valor devuelto por la función Sgn.
Ejemplo
Dim MiVar1, MiVar2, MiVar3, MiSigno
MiVar1 = 12: MiVar2 = -2.4: MiVar3 = 0
MiSigno = Sgn(MiVar1) ' Devuelve 1.
MiSigno = Sgn(MiVar2) ' Devuelve -1.
MiSigno = Sgn(MiVar3) ' Devuelve 0.
Sin (Función)
Devuelve un tipo Double que especifica el seno de un ángulo.
Sintaxis: Sin(número)
El argumento número es un tipo Double o cualquier expresión numérica válida que expresa un ángulo en
radianes.
Comentarios: La función Sin toma un ángulo y devuelve la razón de dos lados de un triángulo rectángulo. La
razón es la longitud del lado opuesto al ángulo dividido por la longitud de la hipotenusa.
Para convertir grados en radianes, multiplique los grados porpi/180. Para convertir radianes en grados,
multiplique los radianes por 180/pi.
Ejemplo
Dim MiÁngulo, MiCosecante
MiÁngulo = 1.3 ' Define el ángulo en radianes.
MiCosecante = 1 / Sin(MiÁngulo) ' Calcula la cosecante.
Space (Función)
Devuelve un tipo Variant (String) que consiste en un número especificado de espacios.
Sintaxis: Space(número)
El argumento número es el número de espacios que se desea incluir en la cadena.
Comentarios: La función Space es útil para dar formato a la salida y para borrar datos en cadenas de longitud
fija.
Ejemplo
Dim MiCadena
' Devuelve una cadena con 10 espacios.
MiCadena = Space(10)
' Inserta 10 espacios entre 2 cadenas.
MiCadena = "Hola" & Space(10) & "Mundo"
Sqr (Función)
Devuelve un tipo Double que especifica la raíz cuadrada de un número.
Sintaxis: Sqr(número)
El número argumento es un tipo Double o cualquier expresión numérica válida mayor o igual a cero.
Ejemplo
Dim MiRaíz
MiRaíz = Sqr(4) ' Devuelve 2.
MiRaíz = Sqr(23) ' Devuelve 4.79583152331272.
MiRaíz = Sqr(0) ' Devuelve 0.
MiRaíz = Sqr(-4) ' Genera un error en tiempo de ejecución.
Str (Función)
Devuelve en un tipo Variant (String) la representación de cadena de un número.
Sintaxis: Str(número)
El argumento número necesario es un tipo Long que contiene una expresión numérica válida.
Utilice la función Format para convertir valores numéricos en valores con formato de fecha, hora, moneda o
en otros formatos definidos por el usuario. A diferencia de Str, la función Format no incluye un espacio a la
izquierda para el signo del número.
Nota: La función Str sólo reconoce el punto (.) como separador decimal válido. Cuando exista la posibilidad
de que se pueda utilizar un separador decimal diferente (por ejemplo, en aplicaciones internacionales), se
debe utilizar CStr para convertir un número a una cadena.
Ejemplo
Dim MiCadena
MiCadena = Str(459) ' Devuelve " 459".
MiCadena = Str(-459.65) ' Devuelve "-459,65".
MiCadena = Str(459.001) ' Devuelve " 459,001".
StrComp (Función)
Devuelve un tipo Variant (Integer) que indica el resultado de una comparación de cadena.
Parte Descripción
Valores
Los valores de la instrucción compare son los siguientes:
Valores devueltos
La función StrComp devuelve los siguientes valores:
Ejemplo
Dim MiCadena1, MiCadena2, MiComp
MiCadena1 = "ABCD": MiCadena2 = "abcd" ' Define las variables.
MiComp = StrComp(MiCadena1, MiCadena2, 1)' Devuelve 0.
MiComp = StrComp(MiCadena1, MiCadena2, 0)' Devuelve -1.
MiComp = StrComp(MiCadena2, MiCadena1) ' Devuelve 1.
StrConv (Función)
Devuelve un tipo Variant (String) que se convierte como se especifica.
Parte Descripción
Valores
Los valores del argumento conversión son:
Nota: Estas constantes están especificadas por Visual Basic for Applications. Como resultado, se pueden
utilizar en cualquier parte de su código en lugar de los valores reales. La mayoría se pueden combinar, por
ejemplo, vbUpperCase + vbWide, excepto cuando se excluyen mutuamente, por ejemplo, vbUnicode +
vbFromUnicode. Las constantes vbWide, vbNarrow, vbKatakana y vbHiragana originan errores en tiempo de
ejecución cuando utilizan configuraciones regionales donde no se aplican.
Los siguientes son separadores de palabras válidos para mayúsculas/minúsculas:Null (Chr$(0)), tabulador
horizontal (Chr$(9)), avance de línea (Chr$(10)), tabulador vertical (Chr$(11)), avance de página (Chr$(12)),
retorno de carro (Chr$(13)), espacio (SBCS) (Chr$(32)). El valor real de espacio varía por el país para DBCS.
Comentarios: Cuando se convierte una cadena de matriz Byte a formato ANSI, se debe utilizar la función StrConv.
Cuando se convierte una matriz en formato Unicode, utilice una instrucción de asignación.
Ejemplo
MiCadena = StrConv(“el perro no ladra”, vbProperCase) ' Devuelve "El Perro No Ladra "
MiCadena = StrConv(“el perro no ladra”, 3) ' Devuelve "El Perro No Ladra "
String (Función)
Devuelve un tipo Variant (String) que contiene una cadena de caracteres que se repite de la longitud
especificada.
Parte Descripción
Comentarios: Si se especifica para character un número mayor que 255, String convierte el número en un
código de carácter válido utilizando la fórmula:
character Mod 256
Ejemplo
Dim MiCadena
MiCadena = String(5, "*") ' Devuelve "*****".
MiCadena = String(5, 42) ' Devuelve "*****".
MiCadena = String(10, "ABC") ' Devuelve "AAAAAAAAAA".
StrReverse (Función)
Devuelve una cadena en la que se invierte el orden de carácter de una cadena especificada.
Sintaxis: StrReverse(cadena1)
El argumento cadena1 es la cadena cuyos caracteres se invierten. Si cadena1 es una cadena de longitud cero
(""), se devuelve una cadena de longitud cero. Si es Null, se produce un error.
Tan (Función)
Devuelve un tipo Double que especifica la tangente de un ángulo.
Sintaxis: Tan(número)
El argumento número es un tipoDouble o cualquier expresión numérica válida que expresa un ángulo en
radianes.
Comentarios: La función Tan toma un ángulo y devuelve la razón de dos lados de un triángulo rectángulo. La
razón es la longitud del lado opuesto al ángulo, dividida por la longitud del lado adyacente al ángulo.
Para convertir grados en radianes, multiplique los grados porpi/180. Para convertir radianes en grados,
multiplique los radianes por 180/pi.
Ejemplo
Dim MiÁngulo, MyCotangente
MiÁngulo = 1.3 ' Define el ángulo en radianes.
MyCotangente = 1 / Tan(MiÁngulo) ' Calcula la cotangente.
Time (Función)
Devuelve un valor de tipo Variant (Date) indicando la hora actual del sistema.
Sintaxis: Time
Comentarios
Use la instrucción Time para establecer la hora del sistema.
Ejemplo
Dim MiTiempo
MiTiempo = Time ' Devuelve la hora del sistema actual.
Timer (Función)
Devuelve un tipo Single que representa el número de segundos transcurridos desde la medianoche.
Sintaxis: Timer
Ejemplo: En este ejemplo se utiliza la función Timer para detener la aplicación. El ejemplo también utiliza
DoEvents para pasar el control a otros procesos durante la pausa.
TimeSerial (Función)
Devuelve un tipo Variant (Date) que contiene la hora actual para una hora, minuto y segundo específicos.
Parte Descripción
Comentarios: Para especificar una hora, como 11:59:59, el intervalo de números para cada argumento de
TimeSerial debería estar en el intervalo normalmente aceptado para la unidad; es decir, 0–23 para horas y 0–
59 para minutos y segundos. Sin embargo, puede especificar horas relativas para cada argumento, usando
cualquier expresión numérica que represente algunas horas, minutos o segundos antes o después de cierta
hora. El ejemplo siguiente usa expresiones en lugar de números de hora absoluta. La función TimeSerial
devuelve una hora que es 15 (-15) minutos menos que seis horas antes del mediodía (12 - 6), ó 5:45:00 a.m.
TimeSerial(12 - 6, -15, 0)
Cuando algún argumento supera el intervalo normalmente aceptado para él, se incrementa hasta la siguiente
unidad mayor. Por ejemplo, si especifica 75 minutos, se evalúa como una hora y 15 minutos. No obstante, si
un solo argumento está fuera del intervalo -32.768 a 32.767 o si la hora especificada por los tres
argumentos, directamente o mediante expresión, hace que la fecha quede fuera del intervalo aceptable de
valores, se produce un error.
Ejemplo
Dim MiTiempo
MiTiempo = TimeSerial(16, 35, 17) ' MiTiempo contiene la hora '
correspondiente a 4:35:17 PM.
TimeValue (Función)
Devuelve un tipo Variant (Date) que contiene la hora.
Sintaxis: TimeValue(hora)
El argumento hora es normalmente una expresión de tipo cadena que representa una hora desde las 0:00:00
(12:00:00 a.m.) a las 23:59:59 (11:59:59 p.m.), inclusive. Sin embargo, hora también puede ser cualquier
expresión que pueda representar una hora en ese intervalo. Si hora contiene Null, la función devolverá Null.
Comentarios: Puede introducir horas válidas usando un reloj de 12 horas o de 24 horas. Por ejemplo, "2:24
p.m." y "14:24" son argumentos válidos de hora.
Si el argumento hora contiene información de fecha, TimeValue no devuelve esta información. Sin embargo,
si hora incluye información no válida de fecha, ocurrirá un
Ejemplo
Dim MiHora
MiHora = TimeValue("4:35:17 PM") ' Devuelve la hora.
TypeName (Función)
Devuelve una cadena (String) que proporciona información acerca de una variable.
Sintaxis: TypeName(nombrevariable)
El argumento nombre variable requerido, es un tipo de datos Variant que contiene cualquier variable excepto
una variable de un tipo definido por el usuario.
Comentarios: La cadena devuelta por la función TypeName puede ser cualquiera de las siguientes:
Integer Un entero
Empty No inicializado
Object Un objeto
Si nombre variable es una matriz, la cadena devuelta puede ser cualquiera de las posibles (o Variant) con un
paréntesis vacío añadido. Por ejemplo, si nombre variable es una matriz de números enteros, la función
TypeName devuelve "Integer()".
Ejemplo
Declara variables.
Dim VarNull, MiTipo, VarCad As String, VarEnt As Integer, VarMon As Currency
Dim VarMatriz (1 To 5) As Integer
VarNull = Null ' Asigna un valor Null.
MiTipo = TypeName(VarCad) ' Devuelve "String".
MiTipo = TypeName(VarEnt) ' Devuelve "Integer".
MiTipo = TypeName(VarMon) ' Devuelve "Currency".
MiTipo = TypeName(VarNull) ' Devuelve "Null".
MiTipo = TypeName(VarMatriz) ' Devuelve "Integer()".
UCase (Función)
Devuelve un tipo Variant (String) que contiene una cadena especificada que se ha convertido a mayúsculas.
Sintaxis: UCase(cadena)
El argumento cadena necesario es cualquier expresión de cadena válida. Si cadena contieneNull, se devuelve
Null.
Comentarios: Sólo se convierten a mayúsculas las letras minúsculas. Las letras mayúsculas o los caracteres
que no son letras no sufren cambios.
Ejemplo
Dim LowerCase, UpperCase
LowerCase = "Hola Mundo 1234" ' Cadena a convertir.
UpperCase = UCase(LowerCase) ' Devuelve "HOLA MUNDO 1234".
Val (Función)
Devuelve los números contenidos en una cadena como un valor numérico del tipo adecuado.
Sintaxis: Val(cadena)
Comentarios: La función Val deja de leer la cadena en el primer carácter que no puede reconocer como parte
de un número. Los símbolos y caracteres que se consideran a menudo parte de valores numéricos, como signos
de moneda y comas, no se reconocen. Sin embargo, la función reconoce los prefijos de base &O (para octal) y
&H (para hexadecimal). Los espacios en blanco, los tabuladores y los avances de línea se eliminan del
argumento.
En el código que se muestra a continuación, Val devuelve el valor decimal -1 correspondiente al valor
hexadecimal entre paréntesis:
Val("&HFFFF")
Nota La función Val sólo reconoce el punto (.) como separador decimal válido. Cuando se utilizan
separadores decimales diferentes, como en aplicaciones internacionales, debe utilizar CDbl para convertir
una cadena a un número.
Ejemplo
Dim MiValor
MiValor = Val("2457") ' Devuelve 2457.
MiValor = Val(" 2 45 7") ' Devuelve 2457.
MiValor = Val("24 y 57") ' Devuelve 24.
VarType (Función)
Devuelve un entero (Integer) que indica el subtipo de una variable.
Sintaxis: VarType(nombrevariable)
El argumento nombre variable requerido, es un tipo Variant que contiene cualquier variable excepto una
variable de un tipo definido por el usuario.
Valores devueltos
vbInteger 2 Entero
vbString 8 Cadena
vbObject 9 Objeto
Nota Estas constantes están especificadas por Visual Basic para aplicaciones. Los nombres se pueden
utilizar en cualquier posición en su código en lugar de los valores actuales.
Comentarios: La función VarType nunca devuelve por sí misma el valor para vbArray. Siempre se agrega a algún
otro valor para indicar una matriz de un tipo particular. La constante vbVariant solamente se devuelve junto con
vbArray para indicar que el argumento de la función VarType es una matriz del tipo Variant. Por ejemplo, el valor
devuelto por una matriz de enteros se calcula como vbInteger + vbArray, o 8194. Si un objeto tiene una
propiedad predeterminada, VarType (objeto) devuelve el tipo de la propiedad predeterminada del objeto.
Ejemplo
Dim VarEnt, VarCad, VarFecha, MiPrueba
' Inicializa las variables.
VarEnt = 459: VarCad = " Hola a todos ": VarFecha = #2/12/69# MiPrueba
= VarType(VarEnt) ' Devuelve 2. MiPrueba = VarType(VarFecha) ' Devuelve
7.
MiPrueba = VarType(VarCad) ' Devuelve 8.
Weekday (Función)
Devuelve un valor de tipo Variant (Integer) que contiene un número entero que representa el día de la semana.
Parte Descripción
Valores
El argumento primer día semana tiene estos valores:
vbMonday 2 Lunes
vbTuesday 3 Martes
vbWednesday 4 Miércoles
vbThursday 5 Jueves
vbFriday 6 Viernes
vbSaturday 7 Sábado
Valores devueltos
La función Weekday puede devolver cualquiera de estos valores:
vbSunday 1 Domingo
vbMonday 2 Lunes
vbTuesday 3 Martes
vbWednesday 4 Miércoles
vbThursday 5 Jueves
vbFriday 6 Viernes
vbSaturday 7 Sábado
WeekdayName (Función)
Devuelve una cadena que indica el día de la semana especificado.
Parte Descripción
Valores
El argumento primer Día De La Semana puede tener los valores siguientes:
vbMonday 2 Lunes.
vbTuesday 3 Martes.
vbWednesday 4 Miércoles.
vbThursday 5 Jueves.
vbFriday 6 Viernes.
vbSaturday 7 Sábado
Year (Función)
Devuelve un valor de tipo Variant (Integer) que contiene un número entero que representa el año.
Sintaxis: Year(fecha)
El argumento fecha es cualquier valor de tipo Variant, expresión numérica, expresión de tipo cadena o
cualquier combinación que puede representar una fecha. Si fecha contiene Null, la función devolverá Null.
Ejemplo
Dim MiFecha, MiAño
MiFecha = #12 febrero 1969#' Asigna una fecha.
MiAño = Year(MiFecha) ' MiAño contiene 1969.
Devuelve una variante (cadena) que contiene una expresión formateada de acuerdo con las instrucciones
contenidas en una expresión de formato.
Sintaxis
Formato ( Expresión , [ Formato ], [ Primer Día De La Semana ], [ Primera Semana Del Año ])
La sintaxis de la función Format tiene estas partes.
Parte Descripción
Expresión Requerido. Cualquier expresión válida.
Ajustes
El argumento del primer día de la semana tiene esta configuración.
Observaciones
Si está formateando una cadena numérica no localizada, debe usar un formato numérico definido por el usuario
para asegurarse de obtener el aspecto que desea.
Símbolos de fecha
Símbolo Rango
Símbolos de tiempo
Símbolo Rango
h 0-23 (1-12 con "AM" o "PM" adjunto) (Hora del día, sin cero inicial)
00-23 (01-12 con "AM" o "PM" adjunto) (Hora del día, con un cero
hh
inicial)
n 0-59 (minuto de hora, sin cero inicial)
nn 00-59 (minuto de hora, con un cero inicial)
m 0-59 (minuto de hora, sin cero inicial). Solo si va precedido de h o hh
00-59 (Minuto de la hora, con un cero inicial). Solo si va precedido
mm
de h o hh
s 0-59 (segundo de minuto, sin cero inicial)
ss 00-59 (segundo de minuto, con un cero inicial)
Ejemplo
Este ejemplo muestra varios usos de la función Format para formatear valores usando formatos con nombre y
formatos definidos por el usuario. Para el separador de fecha ( / ), el separador de hora ( : ) y el literal AM/PM,
la salida con formato real que muestra su sistema depende de la configuración regional en la que se ejecuta el
código. Cuando se muestran horas y fechas en el entorno de desarrollo, se utilizan el formato de hora breve y
el formato de fecha breve de la configuración regional del código. Cuando se muestra mediante el código en
ejecución, se utilizan el formato de hora breve y el formato de fecha breve de la configuración regional del
sistema, que pueden diferir de la configuración regional del código. Para este ejemplo, se supone inglés/EE. UU.
MyTimeyMyDatese muestran en el entorno de desarrollo utilizando la configuración de tiempo corto y la
configuración de fecha corta del sistema actual.
' Returns current system time in the system-defined long time format.
MyStr = Format(Time, "Long Time")
' Returns current system date in the system-defined long date format.
MyStr = Format(Date, "Long Date")
Si utiliza El resultado es
Si utiliza El resultado es
Solo una sección El formato se aplica a todos los datos de cadena.
General
Muestra el número sin separador de miles.
Number
Character Descripción
Marcador de posición de carácter. Mostrar un carácter o un espacio. Si
la cadena tiene un carácter en la posición donde aparece el símbolo de
arroba ( @ ) en la cadena de formato, muéstrelo; de lo contrario,
@
muestra un espacio en esa posición. Los marcadores de posición se
rellenan de derecha a izquierda a menos que haya un signo de
exclamación ( ! ) en la cadena de formato.
Marcador de posición de carácter. Mostrar un carácter o nada. Si la
cadena tiene un carácter en la posición donde aparece el ampersand (
& & ), muéstrelo; de lo contrario, no mostrar nada. Los marcadores de
posición se rellenan de derecha a izquierda a menos que haya un signo
de exclamación ( ! ) en la cadena de formato.
Forzar minúsculas. Muestra todos los caracteres en formato
<
minúsculas.
Forzar mayúsculas. Muestra todos los caracteres en formato de
>
mayúsculas.
Forzar el relleno de izquierda a derecha de los marcadores de posición.
! El valor predeterminado es llenar los marcadores de posición de
derecha a izquierda.
Character Descripción
Separador de tiempo. En algunas configuraciones regionales , se pueden
usar otros caracteres para representar el separador de tiempo. El
separador de tiempo separa las horas, los minutos y los segundos cuando
(:)
se formatea los valores de tiempo. El carácter real utilizado como
separador de tiempo en la salida formateada está determinado por la
configuración de su sistema.
Separador de fechas . En algunas configuraciones regionales, se pueden
usar otros caracteres para representar el separador de fecha. El separador
(/) de fecha separa el día, el mes y el año cuando se formatea los valores de
fecha. El carácter real utilizado como separador de fecha en la salida
formateada está determinado por la configuración de su sistema.
Mostrar la fecha como dddddy mostrar la hora como ttttt, en ese orden.
Muestra solo la información de la fecha si no hay una parte fraccionaria
c
en el número de serie de la fecha; mostrar solo información de tiempo si
no hay una parte entera.
d Muestre el día como un número sin un cero inicial (1–31).
dd Muestre el día como un número con un cero inicial (01–31).
ddd Muestra el día como una abreviatura (Dom–Sáb). localizado.
dddd Muestra el día como un nombre completo (Domingo–Sábado). localizado.
Muestre la fecha como una fecha completa (que incluye día, mes y año),
ddddd formateada de acuerdo con la configuración de formato de fecha corta de
su sistema. El formato de fecha corta predeterminado es m/d/yy.
Muestre un número de serie de fecha como una fecha completa (que
incluye día, mes y año) formateada de acuerdo con la configuración de
dddddd
fecha larga reconocida por su sistema. El formato de fecha larga
predeterminado es mmmm dd, yyyy.
Muestra el día de la semana como un número (1 para el domingo a 7 para
w
el sábado).
ww Muestre la semana del año como un número (1–54).
Muestre el mes como un número sin un cero inicial (1–12). Si msigue
m
inmediatamente ho hh, se muestra el minuto en lugar del mes.
Muestre el mes como un número con un cero inicial (01–12). Si msigue
mm
inmediatamente ho hh, se muestra el minuto en lugar del mes.
mmm Muestre el mes como una abreviatura (enero-diciembre). localizado.
Muestre el mes como un nombre de mes completo (enero-diciembre).
mmmm
localizado.
q Muestre el trimestre del año como un número (1–4).
y Muestre el día del año como un número (1–366).
yy Muestra el año como un número de 2 dígitos (00–99).
yyyy Muestra el año como un número de 4 dígitos (100–9999).
h Muestra la hora como un número sin un cero inicial (0–23).
hh Muestre la hora como un número con un cero inicial (00–23).
n Muestre el minuto como un número sin un cero inicial (0–59).
nn Muestre el minuto como un número con un cero inicial (00–59).
s Muestre el segundo como un número sin un cero inicial (0–59).
ss Muestre el segundo como un número con un cero inicial (00–59).
Muestre una hora como una hora completa (incluyendo hora, minuto y
ttttt
segundo), formateada usando el separador de hora definido por el formato
Character Descripción
None Muestra el número sin formato.
Marcador de posición de dígitos. Muestra un dígito o un cero. Si la
expresión tiene un dígito en la posición donde aparece el 0 en la cadena de
formato, muéstrelo; de lo contrario, muestre un cero en esa posición. Si el
número tiene menos dígitos que ceros (a cada lado del decimal) en la
0
expresión de formato, muestre ceros iniciales o finales. Si el número tiene
más dígitos a la derecha del separador decimal que ceros a la derecha del
separador decimal en la expresión de formato, redondee el número a tantos
decimales como ceros haya. Si el número tiene más dígitos a la izquierda
El acrónimo ASCII significa American Standard Code for Information Interchange o Código estándar americano
para el intercambio de información.
Este es el nombre elegido para indicar el sistema de codificación de caracteres de siete bits utilizado
inicialmente en los calculadores. El Código ASCII fue diseñado en 1961 por Bob Bemer, un ingeniero de IBM, y
publicado en 1968 por el ANSI (American National Standards Institute).
El sistema basado en siete bits permitió la representación de 128 caracteres y la posibilidad de enviar
comandos al ordenador.
Para satisfacer necesidades más complejas, se agregó un bit que permitió extender el código ASCII a 256
caracteres. El sistema de ocho bits se conoce como ASCII extendido.
Actualmente, el sistema de codificación más utilizado a nivel mundial es el Unicode, que representa la evolución
del código ASCII. Es un código que se puede programar con variables de 32, 16 y 8 bits. A diferencia del código
ASCII, Unicode puede codificar todos los idiomas y permite insertar no solo símbolos matemáticos, sino también
caracteres del alfabeto Braille, ideogramas y emojis. UFT-8 es el código designado como sucesor del ASCII,
cubre todos los caracteres alfabéticos de casi todos los idiomas del mundo.
El código ASCII estándar consta de 128 caracteres, no todos alfanuméricos. De hecho, los primeros 32
caracteres se utilizan para enviar comandos. Los procesos de un ordenador se basan en el sistema binario: 1 y
0 determinan los procesos.
El código ASCII se funda en este sistema. Al estar basado en siete bits, cada carácter corresponde a una
secuencia de siete dígitos de 0 y 1. El código extendido se basa en ocho bits, el bit adicional se utilizaba
principalmente para fines de verificación y para agregar otros caracteres al código. Los caracteres ASCII
estándar se dividen en cuatro grupos:
Caracteres de comando: de 0 a 31, 127. Estos son caracteres que no se imprimen y se utilizan para enviar
comandos al ordenador. Un ejemplo es el comando para mover el cursor un espacio atrás. El código de siete
bits en este caso es 0001000. Se puede enviar el mismo comando manteniendo presionada la tecla ALT del
teclado y presionando sucesivamente los números 0 y 8. Actualmente no usamos el código binario ni la
combinación de teclas indicadas, solo presionamos la tecla retroceso (backspace).
Caracteres especiales: de 32 a 47, de 58 a 64, de 91 a 96 y de 123 a 126. Son caracteres especiales
imprimibles que no se corresponden con números ni letras. Son los signos de puntuación. Este grupo también
incluye el espacio que, aunque no sea visible, es imprimible. Y es por esta razón que no forma parte del grupo
de caracteres de comando.
Para cifras: de 48 a 57. Incluyen 10 dígitos árabes del 0 al 9.
Para letras: de 65 a 90 las mayúsculas, y de 97 a 122 las minúsculas.
Veamos ahora cómo insertar todos esos caracteres y símbolos que no están presentes en el teclado del
ordenador. Estos atajos se basan en el sistema de codificación más utilizado a nivel mundial que es el
Unicode. Este contiene los caracteres del código ASCII pero también incluye a otros.
Con el sistema operativo Windows, se pueden insertar caracteres que no están presentes en el teclado
usando el mapa de caracteres.
Hay que hacer clic en el botón ‘Inicio’, escribir la palabra ‘charmap’ en el campo de búsqueda y hacer clic en
el resultado propuesto.
El mapa de caracteres de Windows aparecerá en la pantalla, completo con todos los caracteres alfanuméricos
y símbolos cargados en el sistema.
Para insertar los símbolos seleccionados, se pueden copiar y pegar. Además de abrir el mapa, también se
pueden usar atajos para insertar los caracteres especiales: presionando la tecla ALT + el código numérico.
Con la codificación Unicode, también se pueden incluir los emojis.
Aparecerá un teclado. Si se presiona la tecla shift (Mayús), aparecen los caracteres en mayúscula, mientras que,
si presiona ‘Alt’, se ven los caracteres especiales.
Si el carácter especial que se desea agregar en el texto no aparece en el teclado o si se quiere añadir un emoji,
hay que pinchar en el símbolo en la parte superior derecha y luego en ‘Visor de caracteres’. A la izquierda
encontrarás todos los símbolos y caracteres disponibles.
69 E Letra E mayúscula
70 F Letra F mayúscula
71 G Letra G mayúscula
72 H Letra H mayúscula
73 I Letra I mayúscula
74 J Letra J mayúscula
75 K Letra K mayúscula
76 L Letra L mayúscula
77 M Letra M mayúscula
78 N Letra N mayúscula
79 O Letra O mayúscula
80 P Letra P mayúscula
81 Q Letra Q mayúscula
82 R Letra R mayúscula
83 S Letra S mayúscula
84 T Letra T mayúscula
85 U Letra U mayúscula
86 V Letra V mayúscula
87 W Letra W mayúscula
88 X Letra X mayúscula
89 Y Letra Y mayúscula
90 Z Letra Z mayúscula
91 [ Abre corchetes
92 \ Barra invertida, contra barra, barra inversa
93 ] Cierra corchetes
94 ^ Intercalación, acento circunflejo
95 _ Guion bajo, subrayado, subguion
96 ` Acento grave
97 a Letra a minúscula
98 b Letra b minúscula
99 c Letra c minúscula
100 d Letra d minúscula
101 e Letra e minúscula
102 f Letra f minúscula
103 g Letra g minúscula
Las siguientes constantes se pueden usar en cualquier parte de su código en lugar de los valores reales:
Conversión.
Valor ANSI a cadena. Chr
Cadena a minúsculas o a mayúsculas. Format, LCase, UCase
Fecha a número de serie. DateSerial, DateValue
Número decimal a otra base. Hex, Oct
Número a cadena. Format, Str
Un tipo de dato a otro. CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, CStr, CVar, CVErr, Fix, Int
Fecha a día, mes, día de la semana o año. Day, Month, Weekday, Year
Hora a hora, minuto o segundo. Hour, Minute, Second
Cadena a valor ASCII. Asc
Cadena a número. Val
Hora a número de serie. TimeSerial, TimeValue
Directorios y archivos.
Cambiar el directorio o la carpeta. ChDir
Cambiar la unidad. ChDrive
Copiar un archivo. FileCopy
Crear un directorio o una carpeta. MkDir
Quitar un directorio o una carpeta. RmDir
Cambiar el nombre de un archivo, un directorio o una carpeta. Name
Devolver la ruta de acceso actual. CurDir
Devolver la fecha y la hora del archivo. FileDateTime
Devolver los atributos de un archivo, directorio o etiqueta. GetAttr
Devolver el tamaño del archivo. FileLen
Devolver el nombre del archivo o la etiqueta de volumen. Dir
Establecer la SetAttr
Entrada y salida.
Tener acceso o crear un archivo. Open
Cerrar archivos. Close, Reset
Controlar la apariencia del resultado. Format, Print, Print #, Spc, Tab, Width #
Copiar un archivo. FileCopy
Obtener información de un archivo. EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek
Administrar archivos. Dir, Kill, Lock, Unlock, Name
Leer un archivo. Get, Input, Input #, Line Input #
Devolver el tamaño de un archivo. FileLen
Establecer u obtener los atributos de un archivo. FileAttr, GetAttr, SetAttr
Establecer la posición de lectura y escritura en un archivo. Seek
Escribir en un archivo. Print #, Put, Write #
Errores.
Generar errores en tiempo de ejecución. Clear, Error, Raise
Obtener mensajes de error. Error
Proporcionar información del error. Err
Devolver un tipo Variant de Error. CVErr
Interceptar errores en tiempo de ejecución. On Error, Resume
Comprobar el tipo. IsError
Fechas y horas.
Obtener la fecha o la hora actuales. Date, Now, Time
Realizar cálculos de fechas. DateAdd, DateDiff, DatePart
Devolver una fecha. DateSerial, DateValue
Devolver una hora. TimeSerial, TimeValue
Establecer la fecha o la hora. Date, Time
Medir el tiempo de un proceso. Timer
Financieras
Calcular la depreciación. DDB, SLN, SYD
Calcular el valor futuro. FV
Calcular la tasa de interés. Rate
Calcular la tasa interna de retorno. IRR, MIRR
Calcular el número de pagos. NPer
Calcular los pagos. IPmt, Pmt, PPmt
Calcular el valor presente. NPV, PV
Flujo de control.
Bifurcar. GoSub...Return, GoTo, On Error, On...GoSub, On...GoTo
Salir o hacer una pausa en la ejecución de un programa. DoEvents, End, Exit, Stop
Realizar bucles. Do...Loop, For...Next, For Each...Next, While...Wend, With
Tomar decisiones. Choose, If...Then...Else, Select Case, Switch
Utilizar procedimientos. Call, Function, Property Get, Property Let, Property Set, Sub
Manipulación de cadenas.
Comparar dos cadenas. StrComp
Convertir cadenas. StrConv
Convertir a minúsculas o mayúsculas. Format, LCase, UCase
Crear una cadena de caracteres repetidos. Space, String
Averiguar el tamaño de una cadena. Len
Dar formato a una cadena. Format
Justificar una cadena. LSet, RSet
Matemáticas
Derivar funciones trigonométricas. Atn, Cos, Sin, Tan
Realizar cálculos generales. Exp, Log, Sqr
Generar números aleatorios. Randomize, Rnd
Obtener el valor absoluto. Abs
Obtener el signo de una expresión. Sgn
Realizar conversiones numéricas. Fix, Int
Matrices.
Comprobar una matriz. IsArray
Crear una matriz. Array
Cambiar el límite inferior predeterminado. Option Base
Declarar e inicializar una matriz. Dim, Private, Public, ReDim, Static
Encontrar los límites de una matriz. LBound, UBound
Reinicializar una matriz. Erase, ReDim
Objeto Collection
Crear un objeto Collection. Collection
Agregar un objeto a una colección. Add
Quitar un objeto de una colección. Remove
Hacer referencia a un objeto de una colección. Item
Operadores.
Realizar operaciones aritméticas. ^, –, *, /, \, Mod, +, &, =
Realizar comparaciones. =, <>, <, >, <=, >=, Like, Is
Realizar operaciones lógicas. Not, And, Or, Xor, Eqv, Imp
Registro.
Eliminar configuraciones del programa. DeleteSetting
Leer configuraciones del programa. GetSetting, GetAllSettings
Guardar configuraciones del programa. SaveSetting
Tipos de datos.
Convertir entre tipos de datos. CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, CStr, CVar, CVErr, Fix,
Int
Establecer tipos de datos intrínsecos. Boolean, Byte, Currency, Date, Double, Integer, Long, Object, Single,
String, Variant (predeterminado)
Comprobar los tipos de datos. IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject
Variables y constantes.
Asignar un valor. Let
Declarar variables o constantes. Const, Dim, Private, Public, New, Static
Declarar un módulo como privado. Option Private Module
Obtener información sobre un tipo Variant. IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric,
IsObject, TypeName, VarType
Hacer referencia al objeto actual. Me
Solicitar declaraciones explícitas de variables. Option Explicit
Establecer un tipo de datos predeterminado. Deftipo
23. RESUMEN.
'Instrucción SELECT: Recupera un grupo de registros y los sitúa en una dynaset o tabla
SELECT [predicado] FieldList [INTO NombreTabla] FROM TableList [Relaciones de tabla] [Opciones de rango]
[opciones de ordenación] [opciones de grupo]
'FieldList -> definición de los campos a incluir en el recordset de salida pueden ser campos de una tabla, de
varias o campos calculados basados en otros de la tabla. El formato es:
[TableName.]Field1 [AS Alias1][, [TableName.]Field2 [AS Alias2]]...
TableList -> Se usa para indicar la o las tablas de donde se va a coger la información. El formato es:
FROM Tabla1 [IN DataBase1] [AS Alias1][, Tabla2 [IN DataBase2] [AS Alias2]]...
La parte IN de la cláusula se usa para especificar la base de datos donde está la tabla.
Usando la parte AS de la cláusula se puede asignar un alias la tabla para usarlo en el resto de las clausulas
Predicado -> Se usa para especificar si se desean todos los registros que cumplan las condiciones o determinar
valores únicos para los campos. El formato es:
Usando el predicado ALL, que se coge por defecto, se seleccionan todos los registros para la consulta. Con
DISTINCT el motor de DB recupera solo un registro con un conjunto especificado de valores de campo
(independientemente de cuantos duplicados haya); o sea, para que un registro sea rechazado debe de tener los
valores de todos los campos seleccionados iguales a los de otro registro. El predicado DISTINCTROW compara
los valores de todos los campos de la tabla, estén o no seleccionados.
Relaciones de tabla -> Se usa para poder especificar las relaciones entre las diferentes tablas que configuran la
consulta. Existen dos formas de especificar las relaciones: JOIN y WHERE. Mediante el uso de WHERE se genera
un recordset de solo lectura.
JOIN: Combina dos tablas en base al contenido de campos específicos de cada una y el tipo de JOIN. Su formato
es:
Al usar INNER, de ambas tablas solo se cogen aquellos registros que tengan correspondencia con la otra tabla.
Mediante LEFT, de la tabla de la izquierda se cogen todos los registros y de la tabla de la derecha solo los que
WHERE: Se usa para filtrar los registros devueltos por una consulta, pero se puede emplear para emular una
INNER JOIN WHERE [Tabla1].Field1 = [Tabla2].Field2
La cláusula WHERE funciona igual que INNER JOIN. El recodset obtenido es de solo lectura
Opciones de rango -> Se usa para especificar el rango de los registros a procesar. El formato es:
Existen cuatro tipos de predicados (de expresiones lógicas) que se pueden usar con la cláusula WHERE:
Predicado de comparación: Compara un campo con un valor dado.
Los operadores que se pueden usar son < <= = >= > <>
Expresion1 Comparador Expresion2
Predicado LIKE: Compara un campo con un modelo. Los patrones se pueden hacer con * (equivale a múltiples
caracteres), ? (un carácter), # (un digito), [lista] (un carácter de la lista; por ejemplo, [c-f] para c, d, e y f), [!lista]
(para un carácter que no esté en la lista), o una combinación de los anteriores.
Opciones de ordenación -> Se usa para determinar el orden en que han de aparecer los registros en la dynaset
de salida.
Empleando la palabra clave ASC se especifica que la ordenación va a ser ascendente, mientras que con DESC
la ordenación será descendente (por defecto se toma ascendente)
Opciones de grupo -> Permite generar un recordset que solamente tiene un registro por caso de unos campos
especificados. Su formato es:
Esta cláusula indica que se han de agrupar las filas de la tabla, de tal manera que todas las que tengan iguales
valores en las columnas de agrupamiento formen un grupo.
Mediante la cláusula HAVING se puede especificar cuáles de los registros seleccionados (mediante WHERE)
hay que visualizar.
NombreTabla -> permite especificar el nombre de una tabla donde se grabara la consulta obtenida. Su sintaxis
es:
INTO NombreTabla
La instrucción SELECT genera un synaset o un snapshot temporal, esto es, su contenido únicamente existe
mientras estén abiertos.
Mediante el uso de la cláusula INTO se especifica un nombre de una tabla y la consulta se guardará
permanentemente en esa tabla (si ya existía, la salida la reescribe)
Clausula WHERE -> Se usa para especificar un criterio a cumplir por los registros a borrar. En esta cláusula se
puede emplear cualquier predicado de comparación. Si se omite esta cláusula, se borran todos los registros de
la tabla
INSERT INTO NombreTabla [IN DataBase] [(Field1[, Field2]...)] { SELECT InstruccionSelect | VALUES (Value1[,
Value2]...) }
Field1, Field2,... -> Lista de nombres de columnas de la tabla que van a recibir los valores enviados. No hace
falta poner todas de las que consta la tabla ni ponerlas en el mismo orden en que han sido definidos. Si se omite,
se interpreta como si se especificara una lista incluyéndolas a todas y en dicho orden.
Instrucción SELECT -> Si es emplea, los datos a añadir a la tabla serán los que devuelva la consulta SELECT.
Clausula VALUES -> Si se emplea, se crea un registro en la tabla con los valores especificados con esta cláusula.
Instrucción UPDATE: Modifica los valores de campos específicos de la tabla
Clausula SET -> Especifica los campos a modificar y los nuevos valores.
Clausula WHERE -> Se usa para especificar un criterio a cumplir por los registros a modificar. En esta cláusula
se puede emplear cualquier predicado de comparación. Si se omite esta cláusula, se modifican todos los
registros de la tabla
Ejecuta la instrucción SQL en la base de datos indicada. Solo admite las instrucciones que son de acción, no las
de consulta que devuelven un recordset
Querydef.EXECUTE [Options]
Permite crear una consulta o una acción SQL en la base de datos para después ejecutarla. Esta instrucción SQL
se almacén en la base de datos junto con las tablas
SQL
EJEMPLOS PRACTICOS
Ejercicio - Viajeros
Dado el siguiente modelo relacional de una base de datos de una agencia de viajes
Consultas
SELECT * FROM lugar; (Listado de todos los lugares para viajar registrados en la base de datos)
SELECT p_nombre, p_apellido FROM pasajero; (Listado con el nombre y apellido de todos los pasajeros)
SELECT l_nombre, l_clima FROM lugar; (Seleccionar el nombre y el clima de todos los lugares)
SELECT DISTINCT clima FROM lugar ; (Listar los diferentes climas de los lugares)
SELECT DISTINCT p_perfil FROM pasajero ; (Listar los diferentes perfiles de los pasajeros)
SELECT DISTINCT p_apellido, p_perfil FROM pasajero ; (Listado de los diferentes apellidos y perfiles de los
pasajeros)
SELECT p_nombre, p_apellido FROM pasajero WHERE p_perfil = 'TURISTA'; (Seleccionar el nombre y el apellido
de todos los pasajeros de clase turista (perfil))
SELECT l_nombre FROM lugar WHERE L_ clima = 'TROPICAL'; (Listado de todos los lugares con clima tropical)
SELECT l_nombre, l_total_habitantes FROM lugar WHERE l_tipo = 'PAIS' AND l_total_ habitantes > 10000000;
(Listar todos los países con un total de habitantes que supere los 10 millones)
SELECT p_nombre, p_apellido, p_fecha_nacimiento FROM pasajero WHERE p_fecha_ nacimiento BETWEEN
'01-01-1970' AND '31-12-1980'; (Mostrar todos los pasajeros nacidos entre el 1970 y 1980)
SELECT l_nombre, l_clima FROM lugar WHERE l_clima <> 'MEDITERRANEO'; (Mostrar todos los lugares que
no tengan clima Mediterráneo)
SELECT l_nombre, l_apellido FROM pasajero WHERE l_nombre LIKE 'M%'; (Listado de todos los pasajeros cuyo
nombre empiece por la letra M)
SELECT l_nombre FROM lugar WHERE l_nombre LIKE '%A%' ; (Listado de todos los lugares cuyo nombre tenga
una letra A)
SELECT DISTINCT p_apellido FROM pasajero WHERE p_apellido LIKE 'M%EZ'; (Listar los diferentes apellidos
de los pasajeros que empiecen por la letra M y terminen en EZ)
SELECT l_nombre FROM lugar WHERE l_clima IS NOT NULL ; (Mostrar todos los lugares que tengan clima
registrado)
SELECT p_nombre, p_apellido FROM pasajero WHERE p_perfil IS NULL ; (Mostrar los pasajeros que no tengan
perfil de pasajero registrado)
SELECT p_nombre, p_apellido FROM pasajero WHERE p_nombre LIKE '%Y%' AND p_fecha_nacimiento
BETWEEN '01-01-1975' AND '31-12-1985'; (Listado de todos los pasajeros que contengan la letra “Y” en su
nombre y que hayan nacido entre el año 1975 y el 1985)
SELECT p_nombre, p_apellido FROM pasajero WHERE p_apellido = 'RUIZ' AND p_perfil = 'LOW_COST';
(Listado viajeros que tienen el perfil LOW_COST y tengan apellido Ruiz)
SELECT l_nombre, l_clima FROM lugar WHERE l_total_habitantes IS NULL AND L_nombre LIKE 'C%' AND
(l_clima IS NULL OR l_clima = 'MEDITERRANEO'); (Listado de los lugares que no tengan informado el número
total de habitantes, su nombre empiece por C, con clima desconocido o Mediterráneo)
SELECT l_nombre, l_clima, l_total_habitantes FROM lugar WHERE l_clima IS NULL AND (l_nombre LIKE
'%ciudad%' OR l_total_habitantes < 50000000); (Listado con los lugares de clima desconocido y que tengan
la palabra ciudad en su nombre o que el total de sus habitantes sea inferior a 5 millones)
SELECT p_nombre, p_apellido FROM pasajero WHERE p_nombre LIKE '%G%' AND fecha_nacimiento > '31-12-
1970' AND p_perfil = 'BUSINESS CLASS'; (Listar los pasajeros nacidos después de 1970 que viajen con el perfil
business class y que tenga una G en su nombre)
SELECT p.l_ nombre AS pais, c.l_nombre AS continente FROM lugar p, lugar c WHERE p.l_total_habitantes
NOT BETWEEN 50000000 AND 100000000 AND p.l_tipo = 'PAIS' AND p.l_nombre LIKE '%M%' AND
p.l_fk_lugar = c.l_codigo AND c.l_tipo = 'CONTINENTE' AND c.l_nombre IN ('EUROPA','ASIA'); (Mostrar los
países que no tengan entre 50 y 100 millones de habitantes y estén en Europa o Asia y además tengan una M
en su nombre)
SELECT l_nombre, l_total_habitantes FROM lugar WHERE l_tipo = 'PAIS' ORDER BY l_total_habitantes DESC ;
(Listado de países ordenados por su total de habitantes de mayor a menor)
SELECT p_apellido || ', ' || p_nombre AS 'Nombre y Apellido' FROM pasajero ORDER BY p_apellido; (Listar los
pasajeros por orden alfabético de su apellido, mostrarlos de la forma Apellido, Nombre y etiquetar la columna
como Nombre y Apellido)
SELECT l_nombre, l_clima FROM lugar WHERE l_clima = 'Tropical' ORDER BY l_nombre; (Mostrar los paises
con clima Tropical ordenados alfabéticamente)
SELECT DISTINCT l_nombre FROM lugar WHERE l_tipo = 'CONTINENTE' ORDER BY l_nombre ASC ; (Mostrar
los diferentes continentes ordenados alfabéticamente)
SELECT p_nombre, p_apellido, p_num_telefonico FROM pasajero WHERE p_perfil <> 'BUSINESS' ORDER BY
p_num_telefonico, p_apellido; (Seleccionar todos aquellos pasajeros que no usen clase business ordenados
por su número de teléfono y apellido)
SELECT p.p_apellido, p.p_nombre, p.p_perfil FROM pasajero as p , lugar as l WHERE p_apellido = 'FERNANDEZ'
AND p.p_fk_lugar_pais_residencia = l.l_codigo AND l.l_nombre <> 'COLOMBIA' AND l.l_tipo = 'PAIS' ORDER BY
p.p_perfil, p.p_nombre; (Mostrar todos los pasajeros apellidados Fernandez, que no vivan en Colombia,
ordenados por su perfil de pasajero y su nombre)
SELECT l_nombre, l_clima ,l_total_habitantes FROM lugar WHERE l_total_habitantes > 10000 AND l_clima IS
NOT NULL AND l_descripcion LIKE '%UBICADA%SUR%' ORDER BY l_nombre, l_total_habitantes; (Listar todos
los lugares con más de 10000 habitantes, de clima conocido y con las palabras "UBICADA" y "SUR" ordenados
por su nombre y su número de habitantes, de menor a mayor)
Ejercicio - Hospitales
Dado el DDL de la base de datos de hospitales:
CREATE TABLE sala(hospital_cod NUMBER(2) NOT NULL, sala_cod NUMBER(2), nombre VARCHAR(20),
num_cama NUMBER(3), CONSTRAINT sala_pk PRIMARY KEY (sala_cod), CONSTRAINT hospital_sala_fk
FOREIGN KEY (hospital_cod) REFERENCES hospital (hospital_cod));
CREATE TABLE plantilla(hospital_ cod NUMBER(2) NOT NULL, sala_cod NUMBER(2) NOT NULL, empleado_no
NUMBER(4), apellido VARCHAR(15), funcion CHAR(10), turno CHAR (1) , salario NUMBER(10), CONSTRAINT
empleado_pk PRIMARY KEY (empleado_no), CONSTRAINT hospital_fk FOREIGN KEY (hospital_cod)
REFERENCES hospital (hospital_cod), CONSTRAINT sala_fk FOREIGN KEY (sala_cod) REFERENCES sala
(sala_cod), CONSTRAINT turno_ch CHECK (turno in ('t','m','n')), CONSTRAINT salario_ch CHECK (salario > 0));
Consultas
SELECT apellido FROM plantilla WHERE apellido LIKE 'A%'; (Listado de todos los miembros del personal cuyo
nombre empiece por la letra 'A')
SELECT apellido FROM plantilla WHERE funcion IN ('ENFERMERO','ENFERMERA') AND turno IN ('T','M');
(¿Quiénes son las enfermeras y enfermeros que trabajan en turnos de Tarde o Mañana?)
SELECT apellido, salario FROM plantilla WHERE salario BETWEEN 2000000 AND 2500000 AND funcion =
'ENFERMERA'; (Listado de las enfermeras que ganan entre 2.000.000 y 2.500.000 Bs)
SELECT nombre, hospital_cod FROM hospital ORDER BY 1; (Mostrar, para todos los hospitales, el código de
hospital, el nombre completo del hospital y su nombre. Ordenar la recuperación por el nombre)
SELECT h.nombre, s.nombre, MAX (salario) FROM sala AS s, plantilla p, hospital AS h WHERE h.hospital_cod =
p.hospital_cod AND p.sala_cod = s.sala_cod GROUP BY h.nombre, s.nombre; (Se desea conocer el máximo
salario que existe en cada sala de cada hospital)
SELECT apellido, empleado_no FROM plantilla p WHERE salario > ( SELECT AVG (salario) FROM plantilla p2
WHERE p2.hospital_cod = p.hospital_cod ); (Recuperar el número (empleado_no) y nombre de las personas
que perciban un salario mayor que la media de su hospital)
INSERT INTO plantilla(hospital_cod, sala_cod, empleado_no, apellido, funcion, turno, salario) VALUES
(22,2,1234,'Garcia J.','ENFERMERO', 'M',3000000); (Solución 1: Insertar en la tabla Plantilla al enfermero García
J. con un sueldo de 3.000.000 Bs, y número de empleado 1234. Trabaja en el hospital 22, sala 2, turno
matutino)
UPDATE enfermo SET direccion = 'MADRID 411' WHERE inscripcion = 74835; (Cambiar al paciente (tabla
ENFERMO) número 74835 la dirección a MADRID 411)
UPDATE enfermo SET direccion = NULL ; (Actualizar todas las direcciones de la tabla ENFERMO a NULL)
UPDATE enfermo SET direccion = (SELECT dirección FROM enfermo WHERE inscripcion = 14024) WHERE
inscripcion = 10995; (Igualar la dirección del paciente número 10995 al valor correspondiente en la columna
almacenada para el paciente número 14024)
UPDATE hospitales SET num_cama = num_cama + (num_cama * 0.1); (En todos los hospitales del país se ha
recibido un aumento del presupuesto, por lo que se incrementará el número de camas disponibles en un 10%)
CREATE TABLE dept2(dept_no NUMBER(2), dnombre VARCHAR(14), loc VARCHAR(14), CONSTRAINT dpto_pk
PRIMARY KEY (dept_no));
CREATE TABLE emp(emp_no NUMBER(4), apellido VARCHAR(10) NOT NULL, oficio VARCHAR(10) NOT NULL,
dir NUMBER(4), fecha_alta DATE, salario NUMBER(10) NOT NULL, comisión NUMBER(10), dept_no
NUMBER(2), constraint mpleado_pk PRIMARY KEY (emp_no), CONSTRAINT dept2_fk FOREIGN KEY (dept_no)
REFERENCES dept2(dept_no));
Consultas
SELECT 'El departamento de' || dnombre || 'está en '||localización FROM dept2; (Se quiere un listado con el
siguiente formato: El departamento de CONTABILIDAD está en CARACAS)
SELECT oficio , apellido FROM emp WHERE apellido LIKE' %N%' ORDER BY apellido; (Para cada empleado cuyo
apellido contenga una "N", se quiere el oficio y apellido. La salida debe estar ordenada por apellido
ascendentemente)
SELECT apellido, (salario + comision) AS salario_total FROM emp ORDER BY 2 DESC , 1; (Listado de empleados
con su salario total (salario más comisión). La salida debe estar ordenada por el salario y el apellido
descendentemente)
SELECT apellido, oficio, salario + comision + (salario * 0.15) AS salario_total FROM emp WHERE comisión IS
NULL OR comisión > salario * 0.15 ORDER BY oficio, 3 DESC ; (Para cada empleado que no tenga comisión o
cuya comisión sea mayor que el 15% de su salario, se pide el salario total que tiene. Este será: salario más su
comisión más el 15% del salario. La salida deberá estar ordenada por el oficio y por el salario que le queda
descendentemente)
SELECT apellido, oficio,fecha_alt Alta FROM emp WHERE dept_no = 20 AND salario > 150000; (Listado con
el personal de alta, que indique el apellido, oficio y fecha de alta del personal del departamento número 20 que
ganan más de 150.000 Bs Mensuales)
SELECT apellido, oficio, fecha_alt AS Alta FROM emp WHERE fecha_alt > ' 31-12-2018' ORDER BY 2; (Se pide
el apellido, oficio y la fecha en que han sido dados de alta los empleados de la empresa, pero solo de aquellos
cuyo fecha de alta sea posterior al año 2018. Ordenado por oficio)
SELECT AVG (salario) AS SALARIO_MEDIO FROM emp WHERE oficio = 'ANALISTA'; (Encontrar el salario medio
de los empleados que son Analistas)
SELECT MAX (salario) maximo, MIN (salario) mínimo, MAX (salario) - MIN (salario) diferencia FROM emp;
(Encontrar el salario más alto y el salario más bajo de la tabla de empleados, así como la diferencia entre ambos)
SELECT COUNT ( DISTINCT oficio) tareas FROM emp WHERE dept_no IN (10,20); (Calcular el número de
oficios diferentes que hay en total, en los departamentos 10 y 20 de la empresa)
SELECT dept_no, oficio, COUNT (*) FROM emp GROUP BY dept_no, oficio; (Calcular el número de personas
que realizan cada oficio en cada departamento)
SELECT oficio, AVG (salario + comision) 'SALARIO MEDIO ANUAL' FROM emp WHERE oficio = 'VENDEDOR'
GROUP BY oficio; (Se desea saber el salario medio total (salario más comisión) anual de los vendedores de
nuestra empresa)
SELECT oficio, AVG (salario + comision) 'SALARIO MEDIO ANUAL' FROM emp WHERE oficio IN ('VENDEDOR',
'EMPLEADO') GROUP BY oficio; (Se desea saber el salario medio total (salario más comisión) anual, tanto de
los empleados como de los vendedores de nuestra empresa)
SELECT dept_no, oficio, SUM (salario) suma, MAX (salario) máximo FROM emp WHERE comisión IS NULL OR
comisión = 0 OR comisión < (0.25 * salario) GROUP BY dept_no, oficio HAVING SUM (salario) >= 0.5 * MAX
(salario); (Se desea saber para cada departamento y en cada oficio, el máximo salario y la suma total de salarios,
pero solo de aquellos departamentos y oficios cuya suma salarial supere o sea igual que el 50% de su máximo
salario. En el muestreo, solo se debe estudiar a aquellos empleados que no tienen comisión o la tengan menor
que el 25% de su salario)
SELECT e.apellido, e.oficio, e.dept_no, d.dnombre FROM emp e, dept2 d WHERE e.dept_no = d.dept_no; (Listar
el apellido de cada empleado, su oficio, su número de departamento y el nombre del departamento donde
trabajan)
SELECT e.apellido, e.oficio, d.loc FROM emp AS e, dept2 d WHERE e.dept_no = d.dept_no AND oficio =
'ANALISTA'; (Seleccionar los nombres, profesiones y localidades de los departamentos donde trabajan los
Analistas)
SELECT e.apellido, e.oficio FROM emp e, dept2 d WHERE d.loc = 'MADRID' AND e.dept_no = d.dept_no ORDER
BY e.oficio; (Se desea conocer el nombre y oficio de todos aquellos empleados que trabajan en Madrid. La salida
deberá estar ordenada por el oficio)
SELECT e.dept_no num_dep, d.dnombre departamento, COUNT (*) num_empleados FROM emp e, dept2 d
WHERE e.dept_no = d.dept_no GROUP BY e.dept_no, d.dnombre ORDER BY 3 DESC ; (Se desea conocer
cuántos empleados existen en cada departamento. Devolviendo una salida ordenada por el número de
empleados descendentemente)
SELECT d.dnombre, MAX (e.salario) maximo, MIN (e.salario) mínimo, AVG (e.salario) media, COUNT (*) n_empl
FROM emp e, dept2 d WHERE d.dnombre IN ('VENTAS', 'CONTABILIDAD') AND e.dept_no = d.dept_no GROUP
BY d.dnombre ORDER BY d.dnombre; (Se desea conocer, tanto para el departamento de VENTAS, como para
el de CONTABILIDAD, su máximo, su mínimo y su media salarial, así como el número de empleados en cada
departamento. La salida deberá estar ordenada por el nombre del departamento)
ALTER TABLE EMP ADD CONSTRAINT EMP_FK FOREIGN KEY (DIR) REFERENCES EMP(EMP_NO); (El atributo
DIR representa la relación entre un empleado y su jefe)
SELECT e.emp_no empleado, e.apellido nombre, e.oficio oficio, e.dir jefe, e2.apellido AS nombre_jefe, E2.oficio
AS oficio_jefe FROM emp e, emp e2 WHERE e.dir = e2.emp_no ORDER BY e.apellido; (Se desea un listado en
el que se presente el número, nombre y oficio de cada empleado de la empresa que tiene jefe, y lo mismo de
su jefe directo. La salida debe estar ordenada por el nombre del empleado)
SELECT apellido, dept_no, oficio FROM emp WHERE oficio IN ( SELECT oficio FROM emp WHERE dept_no =
20) AND oficio NOT IN ( SELECT oficio FROM emp e, dept2 d WHERE e.dept_no = d.dept_no AND d.dnombre
= 'VENTAS'); (Con el uso de subconsultas. Obtener el apellido, departamento y oficio de aquellos empleados
que tengan un oficio, que esté en el departamento 20 y que no sea ninguno de los oficios que está en el
departamento de VENTAS)
SELECT emp_no, dept_no, apellido FROM emp WHERE dept_no IN (20,30) AND salario > ( SELECT MIN
(salario) * 2 FROM emp) AND oficio <> 'PRESIDENTE'; (Con el uso de subconsultas. Obtener el número de
empleado, número de departamento y apellido de todos los empleados que trabajen en el departamento 20 o
30 y su salario sea mayor que dos veces el mínimo salario de la empresa. No queremos que el oficio sea
PRESIDENTE)
SELECT apellido, oficio, salario, dept_no FROM emp WHERE salario > ( SELECT MAX salario) FROM emp WHERE
dept_no = 30); (Queremos conocer el apellido, oficio, salario y departamento en el que trabajan, de todos los
individuos cuyo salario sea mayor que el mayor salario del departamento 30)
SELECT apellido, oficio FROM emp WHERE dept_no = 20 AND oficio IN ( SELECT oficio FROM emp e, dept2 d
WHERE dnombre = 'VENTAS' AND e.dept_no = d.dept_no); (Presentar los nombres y oficios de todos los
empleados del departamento 20, cuyo trabajo sea idéntico al de cualquiera de los empleados del departamento
de VENTAS)
SELECT apellido, oficio FROM emp WHERE salario <> ( SELECT MAX (salario) FROM emp) AND salario <> (
SELECT MIN (salario) FROM emp); (Se desea obtener todos los empleados de los departamentos que no ganan
ni el máximo ni el mínimo salarial de la empresa)
SELECT dept_no, MIN (salario) mínimo, MAX (salario) máximo FROM emp e WHERE apellido NOT IN ( SELECT
dnombre FROM dept2 d WHERE e.dept_no = d.dept_no) GROUP BY dept_no HAVING MAX (salario) - MIN
(salario) > ( SELECT AVG (salario) FROM emp); (Se desea obtener, para cada departamento, su mínimo y su
máximo salarial. Para ello, no se tendrá en cuenta a los empleados cuyo apellido, coincida con nombre del
departamento en que trabajan. Asimismo, se tendrá en cuenta a aquellos departamentos cuya diferencia entre
Consultas
SELECT * FROM provincias; (Mostrar las provincias)
SELECT codart, precio * 2 FROM articulos; (Mostrar el código de los artículos y el doble del precio de cada
artículo)
SELECT codfac, linea, cant * precio AS IMPORTE FROM lineas_fac; (Mostrar el código de la factura, número de
línea e importe de cada línea (sin considerar impuestos ni descuentos)
SELECT DISTINCT iva FROM facturas ; (Mostrar los distintos tipos de IVA aplicados en las facturas)
SELECT codpro, nombre FROM provincias WHERE codpro < 20; (Mostrar el código y nombre de aquellas
provincias cuyo código es menor a 20)
SELECT DISTINCT dto FROM facturas WHERE codven <= 50; (Mostrar los distintos tipos de descuento de
aplicados por los vendedores que cuyos códigos no superan el valor 50)
SELECT codart, descrip FROM artículos WHERE stock >= 50; (Mostrar el código y descripción de aquellos
artículos cuyo stock es igual o supera los 50
unidades)
SELECT codfac, fecha FROM facturas WHERE iva = 16 AND codcli = 100 ; (Mostrar el código y fechas de las
facturas con IVA 16 y que pertenecen al cliente de código 100)
SELECT codfac, fecha FROM facturas WHERE (iva = 16 OR dto = 20) AND codcli = 100; (Mostrar el código y
fechas de las facturas con IVA 16 o con descuento 20 y que pertenecen al cliente de código 100)
SELECT codfac, línea FROM lineas_fac WHERE cant * precio > 100; (Mostrar el código de la factura y el
número de línea de las facturas cuyas líneas superan 100 Bs sin considerar descuentos ni impuestos)
SELECT SUM ( cant * precio ) / COUNT ( DISTINCT codfac ), 2 ) FROM lineas_fac; (Importe medio por factura,
sin considerar descuentos ni impuestos. El importe de una factura se calcula sumando el producto de la
cantidad por el precio de sus líneas)
SELECT AVG (stock), MAX (stock), MIN (stock) FROM artículos WHERE stock_min > stock / 2 AND descrip
LIKE '_A%' ; (Stock medio, máximo, y mínimo de los artículos que contienen la letra A en la segunda posición
de su descripción y cuyo stock mínimo es superior a la mitad de su stock actual)
SELECT to_char(fecha, 'yyyy'), COUNT (*) FROM facturas GROUP BY to_char(fecha, 'yyyy'); (Número de
facturas para cada año. Junto con el año debe aparecer el número de facturas de ese año)
SELECT codcli, COUNT (*) FROM facturas GROUP BY codcli HAVING COUNT (*) > 15; (Número de facturas de
cada cliente, pero sólo se deben mostrar aquellos clientes que tienen más de 15 facturas)
SELECT codart, SUM (cant) FROM lineas_fac WHERE codart LIKE 'F%' GROUP BY codart ; (Cantidades totales
vendidas para cada artículo cuyo código empieza por “F”. La cantidad total vendida de un artículo se calcula
sumando las cantidades de todas sus líneas de factura)
SELECT codart FROM lineas_fac GROUP BY codart HAVING SUM (cant * precio) > 6000; (Código de aquellos
artículos de los que se ha facturado más de 6000 euros)
SELECT codcli, iva, COUNT (*) FROM facturas WHERE codcli BETWEEN 241 AND 250 GROUP BY codcli, iva;
(Número de facturas de cada uno de los clientes cuyo código está entre 241 y 250, con cada IVA distinto que
se les ha aplicado. En cada línea del resultado se debe mostrar un código de cliente, un IVA y el número de
facturas de ese cliente con ese IVA)
SELECT v.nombre FROM vendedores v INTERSECT SELECT c.nombre FROM clientes e; (Vendedores y clientes
cuyo nombre coincide (vendedores que a su vez han comprado algo a la empresa))
CREATE VIEW codigos_clientes AS SELECT DISTINCT codpostal FROM clientes WHERE codpostal LIKE '12%';
(Creación de una vista que muestre únicamente los códigos postales de los clientes que inicien con el número
12)
SELECT codcli, c.nombre FROM clientes e INNER JOIN pueblos p ON p.codpue = c.codpue WHERE p.codpro =
'12' AND ( SELECT COUNT ( DISTINCT p2.codpro ) FROM pueblos p2, vendedores v, facturas f WHERE
p2.codpue = v.codpue AND v.codven = f.codven f.codcli = c.codcli ) > 2 ORDER BY 2; (Mostrar el código y el
nombre de los clientes de Castellón (posee código 12) que han realizado facturas con vendedores de más de
dos provincias distintas. El resultado debe quedar ordenado ascendentemente respecto del nombre del cliente)
Ejercicio - Pedidos
Dado el DDL de la base de datos.
CREATE TABLE ordenes(ordenid NUMBER(8), empleadoid NUMBER(8) Not Null, clienteid Number(8) NOT
NULL, fechaorden DATE NOT NULL, descuento NUMBER(8) Null, Constraint pk_ordenes Primary
KEY(ordenid) );
CREATE TABLE clientes(clienteid NUMBER(8), CEDULA_ruc Varchar(10) Not Null, nombrecia VARCHAR(30)
NOT NULL, nombrecontacto VARCHAR(50) Not Null, direccioncli Varchar(50) Not Null, fax VARCHAR(12),
email Varchar(50), celular VARCHAR(12), fijo Varchar(12), Constraint pk_clientes PRIMARY KEY(clienteid) );
ALTER TABLE empleados ADD CONSTRAINT fk_empleado_reporta FOREIGN KEY (reporta_a) REFERENCES
empleados (empleadoid);
Consultas
UPDATE PRODUCTOS SET PRECIOUNIT = (PRECIOUNIT * 0.1) + PRECIOUNIT WHERE CATEGORIAID = (
SELECT CATEGORIAID FROM CATEGORIAS WHERE NOMBRECAT = 'CARNICOS'); (Actualizar el precio
unitario de los productos de la categoría CÁRNICOS, subiéndose en un 10%)
DELETE FROM PRODUCTOS WHERE DESCRIPCION ='YOGURT DE SABORES'; (Eliminar el producto YOGURT
DE SABORES)
Consultas
SELECT Nombre, Domicilio FROM Cliente WHERE Provincia = 'Misiones'; (Obtener el nombre y el domicilio de
los clientes que viven en la provincia de Misiones)
SELECT Nombre, Domicilio, Provincia FROM Cliente WHERE Provincia = 'Misiones' OR Provincia = 'Rio Negro';
(Obtener el nombre, domicilio y provincia de los clientes que viven en la provincia de Misiones o de Río Negro)
SELECT numero_factura, codigo_producto, (precio * cantidad) AS Total FROM item_ventas WHERE cantidad *
precio > 200; (Sobre la consulta 3, obtener solo el importe total para los registros cuyo importe total sea mayor
a 200)
SELECT MAX (cantidad) AS Cantidad FROM item_ventas; (Obtener la cantidad de unidades máxima)
SELECT SUM (cantidad) AS TOTAL FROM item_ventas WHERE codigo_producto = 'c'; (Obtener la cantidad
total de unidades vendidas del producto c)
Ejercicio - Ferretería
Dado el siguiente modelo relacional.
EMPLEADO ( numemp , nombre, edad, oficina , empleado, titulo, fechacontratado, jefe , cuota, ventas)
OFICINA ( oficina , ciudad, region, dir, objetivo, ventas)
CLIENTE ( numclie , nombre, repclie , limitecredito)
PRODUCTO ( idfab, idproducto , descripcion, precio, existencias)
PEDIDO ( codigo , numpedido, fechapedido, clie, rep, fab, producto , cant, importe)
Consultas
SELECT nombre, oficina, fechacontratado FROM empleado; (Listar el nombre, oficina y fecha de contrato de
todos los empleados)
SELECT nombre, numemp, fechacontratado FROM empleado ORDER BY fechacontratado DESC ; (Obtener un
listado de los empleados por orden de antigüedad en la empresa empezando por los más recientemente
incorporados)
SELECT nombre, numemp, ventas FROM empleado ORDER BY ventas DESC ; (Obtener un listado de los
empleados ordenados por volumen de ventas sacando primero los de mayores ventas)
SELECT region, ciudad, ventas FROM oficina ORDER BY region, ciudad; (Muestra las ventas de cada oficina ,
ordenadas por orden alfabético de región y dentro de cada región por ciudad)
SELECT region, ciudad, (ventas - objetivo) AS ganancia FROM oficina ORDER BY region, 3 DESC ; (Lista las
oficinas clasificadas por región y dentro de cada región por ganancia (ventas - objetivo) de modo que las de
mayor ganancia aparezcan las primeras)
SELECT nombre FROM empleado WHERE oficina = 12 AND edad > 30; (Lista el nombre de los empleados de
la oficina 12 que tengan más de 30 años)
SELECT numemp, nombre FROM empleado WHERE ventas > cuota; (Listar los empleados cuyas ventas
superan su cuota)
SELECT oficina FROM oficina WHERE ventas < objetivo * 0.8; (Lista las oficinas cuyas ventas estén por debajo
del 80% de su objetivo)
SELECT numemp, nombre FROM empleado WHERE ventas BETWEEN 100000 AND 500000; (Lista los
empleados cuyas ventas estén comprendidas entre 100.000 y 500.00)
SELECT numemp, nombre, oficina FROM empleado WHERE oficina IN (12,14,16); (Lista los empleados de las
oficinas 12, 14 y 16)
SELECT oficina, ciudad FROM oficina WHERE dir IS NULL ; (Lista las oficinas que no tienen director)
SELECT numemp, nombre FROM empleado WHERE nombre LIKE 'Luis%'; (Lista los empleados cuyo nombre
empiece por Luis)
SELECT idfab, idproducto, descripcion, precio, (precio * 1.16) AS iva_incluido FROM productos; (Obtener una
lista de todos los productos, indicando para cada uno su idfab, idproducto, descripción, precio y precio con IVA
SELECT numpedido, fab, producto, cant, (importe / cant) AS precio_unitario, importe FROM pedidos; (De cada
pedido se quiere saber el número de pedido, fab, producto, cantidad, precio unitario e importe)
SELECT * FROM oficinas ORDER BY region, ciudad, oficina DESC ; (Obtener las oficinas ordenadas por orden
alfabético de región y dentro de cada región por ciudad, si hay más de una oficina en la misma ciudad, aparecerá
primero la que tenga el número de oficina mayor)
SELECT * FROM pedidos ORDER BY fechapedido; (Obtener los pedidos ordenados por fecha de pedido)
SELECT TOP 4 * FROM pedidos ORDER importe DESC ; (Listar las cuatro líneas de pedido más caras (las de
mayor importe))
SELECT TOP 5 numpedido, fab, producto, cant, (importe / cant) AS precio_unitario, importe FROM pedidos
ORDER BY 5; (Obtener de los pedidos: fab, producto, cantidad, precio unitario e importe, pero sacando
únicamente las 5 líneas de pedido de menor precio unitario)
SELECT numemp FROM empleados WHERE oficina IS NOT NULL ; (Listar los números de los empleados que
tienen una oficina asignada)
SELECT oficina FROM oficinas WHERE dir IS NULL ; (Listar los números de las oficinas que no tienen director)
SELECT * FROM oficinas WHERE region IN ('norte','este') ORDER BY region DESC ; (Listar los datos de las
oficinas de las regiones del norte y del este (tienen que aparecer primero las del norte y después las del este))
SELECT * FROM empleados WHERE nombre LIKE 'Julia%'; (Listar los empleados de nombre Julia)
SELECT * FROM productos WHERE idproducto LIKE '%x'; (Listar los productos cuyo idproducto acabe en x)
SELECT oficinas.oficina, ciudad, numemp, nombre FROM oficinas INNER JOIN empleados ON oficinas.oficina =
empleados.oficina WHERE region = 'este'; (Listar las oficinas del este indicando para cada una de ellas su
número, ciudad, números y nombres de sus empleados. Hacer una versión en la que aparecen sólo las que
tienen empleados, y hacer otra en las que aparezcan las oficinas del este que no tienen empleados)
SELECT numpedido, importe, clientes.nombre AS cliente, limitecredito FROM pedidos INNER JOIN clientes ON
pedidos.clie = clientes.numclie; (Listar los pedidos mostrando su número, importe, nombre del cliente, y el límite
de crédito del cliente correspondiente (todos los pedidos tienen cliente y representante))
SELECT empleados.*, ciudad, región FROM empleados LEFT JOIN oficinas ON empleados.oficina =
oficinas.oficina; (Listar los datos de cada uno de los empleados, la ciudad y región en donde trabaja)
SELECT oficinas.*, nombre AS director FROM empleados RIGHT JOIN oficinas ON empleados.numemp =
oficinas.dir WHERE objetivo > 600000; (Listar las oficinas con objetivo superior a 600.000 Bs. indicando para
cada una de ellas el nombre de su director)
SELECT empleados.* FROM empleados INNER JOIN pedidos ON pedidos.rep = empleados.numemp WHERE
fechapedido = contrato; (Hallar los empleados que realizaron su primer pedido el mismo día en que fueron
contratados)
SELECT rep FROM pedidos WHERE importe > 10000 UNION SELECT numemp FROM empleados WHERE cuota
< 10000; (Listar los códigos de los empleados que tienen una línea de pedido superior a 10.000 Bs o que
tengan una cuota inferior a 10.000 Bs)
SELECT SUM (empleados.ventas), MAX (objetivo) FROM empleados LEFT JOIN oficinas ON empleados.oficina
= oficinas.oficina; (Obtener el importe total de ventas de todos los empleados y el mayor objetivo de las oficinas
asignadas a los empleados)
SELECT importe/cant , SUM (importe) FROM pedidos GROUP BY importe/cant; (Obtener de cada precio
unitario el importe total vendido)
SELECT AVG (cuota) AS cuota_media, AVG (ventas) AS ventas_media FROM empleados; (¿Cuál es la cuota
media y las ventas medias de todos los empleados?)
SELECT AVG (precio) AS p_medio_ACI FROM productos WHERE idfab = 'ACI'; (Hallar el precio medio de los
productos del fabricante ACI)
SELECT MIN (fechapedido) AS primer_pedido FROM pedidos ; (Hallar en la fecha en la que se realizó el primer
pedido (suponiendo que en la tabla de pedidos se tienen todos los pedidos realizados hasta la fecha))
SELECT COUNT (*) AS cuantos_pedidos_mayores FROM pedidos WHERE importe > 250000; (Hallar cuántos
pedidos hay de más de 250.000 Bs)
SELECT oficina, COUNT (*) AS cuantos_empleados FROM empleados GROUP BY oficina; (Listar cuántos
empleados están asignados a cada oficina, indicar el número de oficina y cuántos hay asignados)
SELECT numemp, nombre, clie AS cliente, SUM (importe) AS total_vendido FROM empleados INNER JOIN
pedidos ON pedidos.rep = empleados.numemp GROUP BY numemp, nombre, clie; (Para cada empleado,
obtener su número, nombre e importe vendido por ese empleado a cada cliente indicando el número de cliente)
SELECT rep, AVG (importe) AS importe_medio FROM pedidos GROUP BY rep HAVING SUM (importe) >
300000; (Para cada empleado cuyos pedidos suman más de 300.000 Bs, hallar su importe medio de pedidos.
En el resultado indicar el número de empleados y su importe medio de pedidos)
SELECT descripcion, precio, SUM (importe) AS total_pedido FROM productos INNER JOIN pedidos ON
pedidos.fab = productos.idfab AND pedidos.producto = productos.idproducto GROUP BY idfab, idproducto,
descripcion, precio, existencias HAVING SUM (importe) > existencias * 0.75 ORDER BY 3; (Listar de cada
producto, su descripción, precio y cantidad total pedida, incluyendo sólo los productos cuya cantidad total
pedida sea superior al 75% del stock y ordenado por cantidad total pedida)
SELECT COUNT (*) AS cuantas_oficinas FROM ( SELECT DISTINCT oficina FROM empleados WHERE ventas >
cuota); (¿Cuántas oficinas tienen empleados con ventas superiores a su cuota, no se quiere saber cuáles sino
cuántas hay?)
SELECT numemp, nombre FROM empleados WHERE contrato = ( SELECT MIN (fechapedido) FROM pedidos);
(Listar el número y nombre de los empleados cuya fecha de contrato sea igual a la primera fecha de todos los
pedidos de la empresa)
SELECT nombre FROM clientes WHERE repclie = ( SELECT numemp FROM empleados WHERE nombre =
'Alvaro Jaumes'); (Listar los nombres de los clientes que tienen asignado el representante Alvaro Jaumes
(suponiendo que no puede haber representantes con el mismo nombre))
SELECT numemp, nombre, oficina FROM empleados WHERE oficina IN ( SELECT oficina FROM oficinas WHERE
ventas > objetivo ); (1-Listar los vendedores (numemp, nombre, y nº de oficina) que trabajan en oficinas "buenas"
(las que tienen ventas superiores a su objetivo))
SELECT numemp, nombre, oficina FROM empleados WHERE EXISTS ( SELECT * FROM oficinas WHERE
empleados.oficina = oficinas.oficina AND ventas > objetivo ); (2-Listar los vendedores (numemp, nombre, y nº
de oficina) que trabajan en oficinas "buenas" (las que tienen ventas superiores a su objetivo))
SELECT numemp, nombre, oficina FROM empleados WHERE oficina = ANY ( SELECT oficina FROM oficinas
WHERE ventas > objetivo ); (3-Listar los vendedores (numemp, nombre, y nº de oficina) que trabajan en oficinas
"buenas" (las que tienen ventas superiores a su objetivo))
SELECT numemp, nombre, oficina FROM empleados WHERE oficina NOT IN ( SELECT oficina FROM oficinas
WHERE dir = 108); (Listar los vendedores que no trabajan en oficinas dirigidas por el empleado 108)
SELECT idfab, idproducto, descripción FROM productos WHERE NOT EXISTS ( SELECT * FROM pedidos WHERE
fab = idfab AND producto = idproducto AND importe >= 25000); (Listar los productos (idfab, idproducto y
descripción) para los cuales no se ha recibido ningún pedido de 25000 Bs o más)
SELECT numclie, nombre FROM clientes WHERE repclie IN ( SELECT numemp FROM empleados WHERE
nombre = 'Ana Bustamante' ) AND numclie NOT IN ( SELECT clie FROM pedidos WHERE importe > 3000 AND
clie IS NOT NULL ); (Listar los clientes asignados a Ana Bustamante que no han remitido un pedido superior a
3000 Bs)
SELECT * FROM oficinas WHERE EXISTS ( SELECT * FROM empleados WHERE empleados.oficina =
oficinas.oficina AND ventas > objetivo * 0.55); (Listar las oficinas en donde haya un vendedor cuyas ventas
representan más del 55% del objetivo de su oficina)
SELECT * FROM oficinas WHERE (objetivo * 0.5) <= ALL ( SELECT ventas FROM empleados WHERE
empleados.oficina = oficinas.oficina AND ventas IS NOT NULL); (Solución 1: Listar las oficinas en donde todos
los vendedores tienen ventas que superan al 50% del objetivo de la oficina)
SELECT * FROM oficinas WHERE (objetivo * .5) <= ( SELECT MIN (ventas) FROM empleados WHERE
empleados.oficina = oficinas.oficina); (Solución 2: Listar las oficinas en donde todos los vendedores tienen
ventas que superan al 50% del objetivo de la oficina)
SELECT * FROM oficinas WHERE objetivo > ( SELECT SUM (cuota) FROM empleados WHERE empleados.oficina
= oficinas.oficina); (Listar las oficinas que tengan un objetivo mayor que la suma de las cuotas de sus
vendedores)
UPDATE productos SET precio = precio * 1.05 WHERE idfab = 'ACI'; (Subir un 5% el precio de todos los productos
del fabricante ACI)
INSERT INTO oficinas ( oficina, region, ciudad, objetivo ) VALUES ( 30, 'centro','Madrid', 100000 ); (Solución 1:
Añadir una oficina para la ciudad de Caracas, con el número de oficina 30, con un objetivo de 100000 y región
Centro)
INSERT INTO oficinas (oficina,region,ciudad,dir,objetivo,ventas) VALUES (30, 'centro', 'Madrid', null, 100000,0) ;
(Solución 2: Añadir una oficina para la ciudad de Caracas, con el número de oficina 30, con un objetivo de
100000 y región Centro)
INSERT INTO oficinas VALUES (30, 'Madrid', 'centro', null, 100000,0) ; (Solución 3: Añadir una oficina para la
ciudad de Caracas, con el número de oficina 30, con un objetivo de 100000 y región Centro)
UPDATE empleados SET oficina = 30 WHERE oficina = 21; (Cambiar los empleados de la oficina 21 a la oficina
30)
DELETE FROM pedidos WHERE rep = 105; (Eliminar los pedidos del empleado 105)
DELETE FROM oficinas WHERE oficina NOT IN ( SELECT oficina FROM empleados WHERE oficina IS NOT NULL
) ; (Eliminar las oficinas que no tengan empleados)
INSERT INTO oficinas SELECT * FROM nuevaoficinas WHERE oficina NOT IN ( SELECT oficina FROM oficinas);
(Recuperar las oficinas borradas a partir de la tabla nuevaoficinas)
INSERT INTO pedidos SELECT * FROM nuevapedidos WHERE rep = 105; (Recuperar los pedidos borrados, a
partir de la tabla nuevapedidos)
UPDATE empleados SET oficina = 21 WHERE oficina = 30; (A los empleados de la oficina 30 asignarles la
oficina 21)
CREATE TABLE empleados (numemp INTEGER PRIMARY KEY, nombre VARCHAR(30) NOT NULL, edad
INTEGER, oficina INTEGER, titulo VARCHAR(20), contrato DATE NOT NULL, director INTEGER, cuota NUMERIC,
ventas NUMERIC); (Crear la tabla empleados)
CREATE TABLE oficinas (oficina INT PRIMARY KEY, ciudad VARCHAR(30), region VARCHAR(20), dir INTEGER
CONSTRAINT cf_dir REFERENCES empleados, objetivo NUMERIC, ventas NUMERIC ); (Crear la tabla oficinas y
establecer la relación con empleado director)
CREATE TABLE productos (idfab VARCHAR(10), idproducto VARCHAR(20), descripcion VARCHAR(30) NOT
NULL, precio NUMERIC NOT NULL, existencias INTEGER , CONSTRAINT cp PRIMARY KEY (idfab,idproducto) );
(Crear la tabla productos)
CREATE TABLE clientes (numclie INTEGER , nombre VARCAHAR(30) NOT NULL, repclie INT CONSTRAINT
cf_repclie REFERENCES empleados, CONSTRAINT cp PRIMARY KEY (numclie) ) ; (Crear la tabla clientes sin el
atributo limitecredito)
ALTER TABLE clientes ADD COLUMN limitecredito NUMERIC; (Añadir a la definición de clientes la columna
limitecredito)
CREATE INDEX i_region ON oficinas (region) ; (Definir un índice sobre la columna región de la tabla oficinas)
CREATE TABLE temple1 (nuempl CHAR(6) NOT NULL, nombre CHAR(12) NOT NULL, inicial CHAR(1) NOT NULL,
apellido CHAR(15) NOT NULL, dept CHAR(3) NOT NULL, tlfn CHAR(4), feching DATE NOT NULL, codtra
MALLINT NOT NULL, niveduc SMALLINT NOT NULL, sexo CHAR(1) NOT NULL, fechnac DATE NOT NULL, salario
DECIMAL(9,2) NOT NULL );
CREATE TABLE tdepar2 (numdep CHAR(3) NOT NULL, nomdep CHAR(36) NOT NULL, numdirec CHAR(6) NOT
NULL);
Consultas
1. Obtener una lista de todas las empleadas de los departamentos que empiecen por D o por E. La lista anterior
debe contener información sobre el número de personal, nombre, apellido y número de teléfono.
SELECT nuempl, nombre, apellido, tlfn , nomdep FROM temple1 INNER JOIN tdepar2 ON temple1.dept =
tdepar2.numdep WHERE sexo = 'F' AND (tdepar2.nomdep LIKE 'D%' OR tdepar2.nomdep LIKE 'E%');
2. Obtener un listado de todos los empleados (nombre y apellido) que ganan más de 2000 Bs al mes y que
entraron en la compañía después del 1 de Enero de 1975. También se quiere la información correspondiente a
su código de trabajo y al número de personal de sus directores.
SELECT nombre, apellido, codtra, numdirec FROM temple1 INNER JOIN tdepar2 ON temple1.dept =
tdepar2.numdep WHERE salario > 2000 AND feching > '01/01/1975';
3. Obtener una lista con el apellido, número de departamento y salario mensual de los empleados de los
departamentos ‘A00’, ‘B01’, ‘C01’ y ‘D01’. La salida se quiere en orden descendente de salario dentro de cada
departamento.
SELECT apellido, dept, salario FROM temple1 WHERE dept IN ( 'A00', 'B01', 'C01' , 'D01') ORDER BY dept, salario
DESC ;
4. Se pide una lista que recupere el salario medio de cada departamento junto con el número de empleados
que tiene. El resultado no debe incluir empleados que tengan un código de trabajo mayor que 54, ni
departamentos con menos de tres empleados. Se quiere ordenada por número de departamento.
Solución 1:
SELECT salario, numempl FROM (SELECT AVG (salario) as salario, COUNT (*) AS numempl, dept FROM temple1
WHERE codtra <= 54 GROUP BY dept ) AS result WHERE numempl > 2 ORDER BY dept ASC ;
Solución 2:
SELECT dept, AVG (salario), COUNT (*) FROM temple1 WHERE codtra <= 54 GROUP BY dept HAVING COUNT
(*) > 2 ORDER BY dept;
5. Seleccionar todos los empleados de los departamentos ‘D11’ y ‘E11’ cuyo primer apellido empiece por S.
SELECT * FROM temple1 WHERE dept IN ( 'D11', 'E11' ) AND apellido LIKE 'S%';
6. Obtener el nombre, apellido y fecha de ingreso de los directores de departamento ordenados por número de
personal.
Solución 1:
SELECT nombre, apellido, feching FROM temple1 WHERE nuempl IN ( SELECT numdirec FROM tdepar2);
Solución 2:
SELECT nuempl, nombre, apellido, feching FROM temple1 , tdepar2 WHERE temple1.nuempl =
tdepar2.numdirec ORDER BY nuempl;
7. Obtener un listado de las mujeres de los departamentos que empiecen por D y por E cuyo nivel de educación
sea superior a la media; en este caso también ordenados por número de personal.
SELECT nuempl, nombre, apellido, tlfn , nomdep FROM temple1 INNER JOIN tdepar2 ON (temple1.dept =
tdepar2.numdep) WHERE sexo = 'F' AND (tdepar2.nomdep LIKE 'D%' OR tdepar2.nomdep LIKE 'E%') AND
niveduc > ( SELECT AVG (niveduc) FROM temple1 ) ORDER BY nuempl;
8. Seleccionar todos los empleados cuyo nombre sea igual al de algunas personas del departamento D21 y
cuyo código de trabajo sea diferente de todos los del E21 (la lista debe contener el número de personal, nombre,
apellido, departamento y código de trabajo).
Solución 1:
SELECT * FROM temple1 WHERE nombre IN ( SELECT nombre FROM temple1 WHERE dept = 'D21') AND codtra
NOT IN ( SELECT codtra FROM temple1 WHERE dept = 'E21' ) AND dept <> 'D21';
Solución 2:
SELECT nuempl, nombre, apellido, dept, codtra FROM temple1 WHERE nombre = ANY ( SELECT nombre FROM
temple1 WHERE dept = 'D21') AND codtra <> ALL ( SELECT codtra FROM temple1 WHERE dept = 'E21') AND
dept <> 'D21';
9. Listar los empleados que no sean directores (la información que debe aparecer es el número de personal,
apellido y departamento).
SELECT * FROM temple1 WHERE nuempl NOT IN ( SELECT numdirec FROM tdepar2) ;
10. Seleccionar parejas de empleados (de sexo opuesto) que hayan nacido el mismo día (con información acerca
de apellido y fecha de nacimiento).
SELECT e1.apellido, e1.fechnac, e2.apellido, e2.fechnac FROM temple1 e1, temple1 e2 WHERE e1.fechnac =
e2.fechnac AND e1.sexo <> e2.sexo;
11. Obtener un listado de todos los empleados que pertenecen al mismo departamento que Tomás Soler.
SELECT * FROM temple1 WHERE dept = ( SELECT dept FROM temple1 WHERE nombre = 'TOMAS' AND apellido
= 'SOLER');
SQL
EJEMPLOS Y CONSULTAS
INTELIGENTES
© Gonzalo Bolaño
enguaje Stefanell – 2.023
Estructurado REGRESARa»»»»»»»
de Consulta), es un lenguaje bastante sencillo, principalmente orientado
Manual de SQL & Visual Basic Pág. 208
SQL (Structured Query Language o Lenguaje Estructurado de Consulta), es un lenguaje bastante sencillo,
principalmente orientado a bases de datos y, sobre todo, al manejo de consultas. Visual Basic incorpora esta
extensión junto a nuestras bases de datos, obteniendo potentes resultados. De hecho, las consultas que se
realizan en Access, están desarrolladas o basadas en este lenguaje, por lo que su implementación en Visual
Basic no es complicada.
El objetivo principal de SQL es la realización de consultas y cálculos con los datos de una o varias tablas.
DIM Db as Database
DIM Qd as QueryDef
Dim SQL as String
SQL = "DELETE FROM Titles WHERE ISBN IS NULL"
El lenguaje SQL está compuesto por una serie de sentencias y de cláusulas muy reducidas en número, pero
muy potentes en efectividad. De entre todas las palabras, existen cuatro que son las más utilizadas, estando
compuestas por una sentencia y por tres cláusulas:
SELECT lista_campos FROM lista_tablas [WHERE criterios [ORDER BY lista_campos]]
Consultas de Selección
Dentro de la sintaxis SQL se debe de usar comillas simples en vez de dobles, ejemplos:
Seleccionar todos los registros de una tabla con todos sus campos
SELECT * FROM Empleados WHERE (Edad 25 AND Edad < 50) OR Sueldo = 100;
SELECT * FROM Empleados WHERE (Sueldo 100 AND Sueldo < 500) OR (Provincia = 'Madrid' AND Estado =
'Casado');
SELECT * FROM Pedidos WHERE CodPostal Between 28000 And 28999; (Devuelve los pedidos realizados
en la provincia de Madrid)
SELECT IIf(CodPostal Between 28000 And 28999, 'Provincial', 'Nacional') FROM Editores; (Devuelve el
valor 'Provincial' si el código postal se encuentra en el intervalo, 'Nacional' en caso contrario)
SELECT Apellidos, Salario FROM Empleados WHERE Salario Between 200 And 300;
SELECT Apellidos, Salario FROM Empl WHERE Apellidos Between 'Lon' And 'Tol';
SELECT Id_Pedido, Fecha_Pedido FROM Pedidos WHERE Fecha_Pedido Between #1-1-94# And #30-6-
94#;
SELECT Apellidos, Nombre, Ciudad FROM Empleados WHERE Ciudad In ('Sevilla', 'Los Angeles', 'Barcelona');
SELECT column1, column2 FROM table_name WHERE condition1 AND condition2 AND condition3;
(Operador AND)
SELECT column1, column2 FROM table_name WHERE condition1 OR condition2 OR condition3; (Operador
OR)
SELECT column1, column2 FROM table_name WHERE NOT condition; (Operador NOT, muestra los
registros que no cumplen la condición)
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY Nombre; (Ordena la consulta por el
campo Nombre, ascendentemente)
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY CodigoPostal, Nombre; (Ordena por el
campo CodigoPostal y Nombre, ascendentemente)
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY CodigoPostal DESC , Nombre ASC;
(Ordena campos ascendente o descendentemente)
SELECT * FROM Clientes ORDER BY Apellido DESC, Nombre; (Selecciona los clientes ordenandolos por
apellido (de forma descendente) y por el nombre (de forma ascendente))
SELECT Articulo, Descripcion, [Precio Venta] FROM Ventas; (Los nombres de campo que contienen espacios
deben colocarse entre corchetes)
SELECT TOP 25 Nombre, Apellido FROM Estudiantes ORDER BY Nota DESC; (Selecciona los primeros 25
nombres con mejor nota)
SELECT TOP 10 PERCENT Nombre, Apellido FROM Estudiantes ORDER BY Nota DESC; (Selecciona el 10 por
ciento de los estudiantes con mejor nota )
SELECT * FROM Clientes WHERE Apellido = ‘Perez’; (Selecciona todos los campos de los clientes que se
apelliden Perez)
SELECT * FROM Articulos WHERE Fecha > #15/12/96#; (Selecciona todos los campos de los artículos
con fecha mayor que 15/12/96)
SELECT * FROM Clientes WHERE MID$(Apellido, 2, 1) LIKE ‘[a-c]’; (Selecciona todos los campos de los clientes
que tengan como segunda letra del apellido, una letra a, b o c)
SELECT * FROM Clientes WHERE LCASE$(Apellido) = "[!aeiou]?n*"; (Selecciona todos los campos de los
clientes que tengan un apellido que no empiece por una vocal y que la tercera letra sea una n)
SELECT * FROM Clientes WHERE Provincia IN (‘C’, ‘Lu’, ‘Or’, ‘Po’); (Selecciona todos los campos de los
clientes cuyo nombre de provincia se la inicial)
SELECT * FROM Clientes WHERE Fecha BETWEEN #1/01/97# AND #31/01/97#; (Selecciona los clientes
con fecha de enero de 1997)
SELECT * FROM Clientes WHERE Apellido NOT BETWEEN ‘M’ AND ‘P’; (Selecciona los clientes con apellidos
que no estén entre la M y la P)
SELECT * FROM Clientes WHERE Apellido = "Martinez" AND Provincia IN ("Po","OR"); (Selecciona los clientes
que se apelliden Martinez de Pontevedra y Orense)
SELECT column_names FROM table_name WHERE column_name IS NULL; (selecciona registros nulos)
SELECT Provincia, SUM(VentasTotales) FROM Clientes GROUP BY Provincia; (Obtiene el total de ventas de
las provincias)
SELECT Provincia, SUM(VentasTotales) FROM Clientes GROUP BY Provincia HAVING COUNT(*) > 10 AND
MAX(VentasTotales) < 1000; (Obtiene el total de ventas de las provincias que tengan más de 10 clientes y
la venta máxima a un solo cliente no sea superior a 1000)
SELECT Apellido & ", " & Nombre FROM Clientes; (Crea una consulta con el apellido y el nombre de los
clientes, separados por una coma, en un solo campo)
SELECT Cantidad AS Cant1, SQR(Cantidad) AS Cant2 FROM Ventas; (Crea una consulta compuesta de dos
campos, una cantidad y la raíz cuadrada de esa cantidad. A estos campos les asigna un nombre alternativo)
SELECT CS.Apellido & CS.Nombre AS Nombre, CP.Ciudad, CP.Provincia FROM CS, CP IN Codigos WHERE
CS.[Codigo Postal] = CP.[Codigo Postal]; (Lo mismo que el anterior ejemplo, pero usando un alias para las
tablas)
SELECT DISTINCTROW Articulo FROM Articulos, Ventas WHERE Articulos.Articulo = Ventas.Articulo; (No se
seleccionan los registros que tengas todos los campos en ambas tablas iguales)
SELECT CS.Apellido, CS.Nombre, VN.Apellido, VN.Nombre FROM Clientes AS CS, Vendedores AS VN CS LEFT
JOIN VN ON CS.Vendedor = VN.Vendedor; (Se genera un recordset con todos los registros de la tabla
Clientes, exista o no el vendedor asociado, en la que no saldrán reflejados los vendedores que no tienen
ningún cliente asignado)
SELECT CS.Apellido & ", " & CS.Nombre AS Nombre, CS.Direccion, CP.Ciudad, CP.Provincia, CS.[Codigo
Postal] INTO Correos FROM Clientes AS CS, [Codigo Postal] IN Codigos AS CP WHERE CS.[Codigo Postal]
= CP.[Codigo Postal]; (Obtiene una nueva tabla, Correos, con las direcciones de los clientes)
SELECT campos FROM tabla1 INNER JOIN tabla2 ON tb1.campo1 comp tb2.campo1 AND ON tb1.campo2
comp tb2.campo2) OR ON tb1.campo3 comp tb2.campo3)];
SELECT campos FROM tb1 INNER JOIN (tb2 INNER JOIN [( ]tb3 [INNER JOIN [( ]tablax [INNER JOIN ...)] ON
tb3.campo3 comp tbx.campox)] ON tb2.campo2 comp tb3.campo3) ON tb1.campo1 comp tb2.campo2;
Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede
anidarse dentro de un LEFT JOIN o un RIGHT JOIN.
Ejemplo
SELECT DISTINCTROW Sum([Precio unidad] * [Cantidad]) AS [Ventas], [Nombre] & " " & [Apellidos] AS
[Nombre completo] FROM [Detalles de pedidos], Pedidos, Empleados, Pedidos INNER JOIN [Detalles de
pedidos] ON Pedidos.[ID de pedido] = [Detalles de pedidos].[ID de pedido], Empleados INNER JOIN Pedidos
ON Empleados.[ID de empleado] = Pedidos.[ID de empleado] GROUP BY [Nombre] & " " & [Apellidos]; (Crea
dos combinaciones equivalentes: una entre las tablas Detalles de pedidos y Pedidos, y la otra entre las tablas
Pedidos y Empleados. Esto es necesario ya que la tabla Empleados no contiene datos de ventas y la tabla
Detalles de pedidos no contiene datos de los empleados. La consulta produce una lista de empleados y sus
ventas totales.)
Registros No Duplicados
SELECT DISTINCT Paises FROM Tabladatos; (Muestra todos los Países sin incluir duplicados, Con DISTINCT
se puede obtener los registros sin duplicados, es decir, se recuperan los registros que no tienen ningún repetido
y los que tienen repetidos solo se recuperan 1 única vez.)
SELECT Count(*) AS DistinctCountries FROM (SELECT DISTINCT Country FROM Customers); (Cuenta el
número de paises sin incluir los repetidos)
(Por Probar )
SELECT telefono, COUNT(*) as num_repeticiones FROM usuarios GROUP BY telefono HAVING COUNT(*)=1;
(Registros que no se repiten; Pues del mismo modo que se buscan los repetidos se puede saber los que no se
repiten, solo hay que cambiar <1 por =1 para tener los usuarios que se repiten 1 vez, es decir, que no se
repiten.)
Registros Duplicados
SELECT telefono FROM usuarios GROUP BY telefono HAVING COUNT(*)>1; (Teléfonos repetidos; Es decir, lo
que necesitamos es agrupar los registros por el valor para el que queremos buscar los repetidos y con HAVING
COUNT(*)>1 obtendremos todos los valores que estén al menos repetidos una vez. Se muestra solo una vez el
repetido.)
SELECT Mail FROM DatosPersonales GROUP BY Mail HAVING COUNT(*)>1; (Mails Repetidos en una
columna “campo”)
SELECT nombre, apellido, COUNT(*) as num_repeticiones FROM usuarios GROUP BY nombre, apellido
HAVING COUNT(*)>1; (Repetidos en más de una columna “campo”)
SELECT telefono, count(*) AS Total FROM usuarios GROUP BY telefono HAVING COUNT(*)>1; (Nº de veces
que esta repetido cada telefono ; Para saber además de los registros repetidos la cantidad de veces que se
repite cada uno simplemente hay que añadir el contador al resultado de la consulta, Telefono, Total)
SELECT COUNT(*) FROM usuarios WHERE telefono IN (SELECT telefono FROM usuarios GROUP BY
telefono HAVING COUNT(*)>1); (Número de usuarios con teléfonos repetidos; usando una subconsulta con
los registros repetidos podemos saber el número de usuarios del ejemplo que tienen un teléfono repetido)
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;
Sub Consultas
Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO,
SELECT * FROM Productos WHERE PrecioUnidad ANY (SELECT PrecioUnidad FROM DetallePedido WHERE
Descuento = 0 .25); (Devuelve todos los productos cuyo precio unitario es mayor que el de cualquier
producto vendido con un descuento igual o mayor al 25 por ciento. El predicado ALL se utiliza para recuperar
únicamente aquellos registros de la consulta principal que satisfacen la comparación con todos los registros
recuperados en la subconsulta. Si se cambia ANY por ALL en el ejemplo anterior, la consulta devolverá
únicamente aquellos productos cuyo precio unitario sea mayor que el de todos los productos vendidos con un
descuento igual o mayor al 25 por ciento. Esto es mucho más restrictivo. )
SELECT * FROM Productos WHERE IDProducto IN (SELECT IDProducto FROM DetallePedido WHERE
Descuento = 0.25); (Devuelve todos los productos vendidos con un descuento igual o mayor al 25 por
ciento.)
SELECT Apellido, Nombre, Titulo, Salario FROM Empleados AS T1 WHERE Salario = (SELECT Avg(Salario)
FROM Empleados WHERE T1.Titulo = Empleados.Titulo) ORDER BY Titulo; (Devuelve los nombres de los
empleados cuyo salario es igual o mayor que el salario medio de todos los empleados con el mismo título. A
la tabla Empleados se le ha dado el alias T1, la palabra reservada AS es opcional.)
SELECT Apellidos, Nombre, Cargo, Salario FROM Empleados WHERE Cargo LIKE "Agente Ven*" AND Salario
ALL (SELECT Salario FROM Empleados WHERE (Cargo LIKE "*Jefe*") OR (Cargo LIKE "*Director*"));
(Obtiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor que el
de todos los jefes y directores.)
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS (SELECT * FROM Pedidos AS O WHERE
O.ID_Empleado = E.ID_Empleado); (Selecciona el nombre de todos los empleados que han reservado al
menos un pedido.)
Consultas de Acción
Eliminar:
DELETE Tabla.* FROM Tabla WHERE criterio
Elimina Registros duplicados. Para borrar todos los registros repetidos basta con usar como condición de
borrado la consulta que nos devuelve los registros repetidos.
DELETE FROM usuarios WHERE telefono IN (SELECT telefono FROM usuarios GROUP BY telefono HAVING
COUNT(*)>1);
Adicionar:
Para insertar un único Registro:
INSERT INTO Tabla (campo1, campo2, .., campoN) VALUES (valor1, valor2, ..., valorN)
Para agregar un registro a una tabla, debe usar la lista de campos para definir en qué campos se colocarán los
datos y, luego, proporcionar los datos en una lista de valores. Para definir la lista de valores, use la
cláusula VALUES. Por ejemplo, la siguiente instrucción inserta los valores “1”, “Kelly” y “Jill” en los campos
CustomerID, Last Name y First Name, respectivamente.
INSERT INTO tblCustomers (CustomerID, [Last Name], [First Name]) VALUES (1, 'Kelly', 'Jill')
Puede omitir la lista de campos, pero solo si proporciona todos los valores que puede contener el registro.
INSERT INTO tblCustomers VALUES (1, Kelly, 'Jill', '555-1040', '[email protected]')
Ejemplo para VB
BDatos.Execute "INSERT INTO PERSONAS(campo1, campo2, campo3, campo4, campo5, campo6, campo7,
campo8, campo9, campo10, campo11) SELECT campo1, campo2, campo3, campo4, campo5, campo6,
campo7, campo8, campo9, campo10, campo11 FROM XSS ;"
En lugar de agregar registros existentes en otra tabla, se puede especificar los valores de cada campo en un
nuevo registro utilizando la cláusula VALUES. Si se omite la lista de campos, la cláusula VALUES debe incluir un
valor para cada campo de la tabla, de otra forma fallará INSERT.
INSERT INTO Clientes SELECT Clientes_Viejos.* FROM Clientes_Nuevos;
INSERT INTO Empleados (Nombre, Apellido, Cargo) VALUES ('Luis', 'Sánchez', 'Becario');
INSERT INTO Empleados SELECT Vendedores.* FROM Vendedores WHERE Fecha_Contratacion < Now() - 30;
Actualiza (añade nuevos registros) la tabla de direcciones de correo creada con la consulta SELECT INTO de
más arriba.
INSERT INTO Correo SELECT CS.Apellido & ", " & CS.Nombre, CS.Direccion, CP.Ciudad, CP.Provincia,
CS.[Codigo Postal] FROM Clientes AS CS, [Codigo Postal] IN Codigos AS CP WHERE CS.[Codigo Postal] =
CP.[Codigo Postal] AND CS.Fecha > UltimoMes
Agregar muchos registros a una tabla al mismo tiempo, los valores que se inserten deberán ser compatibles
con el tipo de campo que vaya a recibir los datos. La siguiente instrucción INSERT INTO inserta todos los valores
de los campos CustomerID, Last Name y First Name de la tabla tblOldCustomers en los campos
correspondientes de la tabla tblCustomers.
INSERT INTO tblCustomers (CustomerID, [Last Name], [First Name]) SELECT CustomerID, [Last Name], [First
Name] FROM tblOldCustomers
Si las tablas se definieron exactamente igual, puede omitir las listas de campos.
INSERT INTO tblCustomers SELECT * FROM tblOldCustomers
Ejemplo para VB
BDatos.Execute "INSERT INTO LogTransacciones (FECHA, HORA, USUARIO, REGISTRO) VALUES (#" &
Format(Date) & "#, #" & Format(Time, "hh:mm:ss") & "#, '" & XNombreUsuario & "', '" & TextLoG & "');"
Actualizar:
UPDATE tabla SET column1 = value1, column2 = value2, ... WHERE condicion;
UPDATE Customers SET ContactName = 'Alfred Schmidt', City= 'Frankfurt' WHERE CustomerID = 1;
UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03 WHERE PaisEnvío = 'ES';
UPDATE Productos SET Precio = Precio * 1.1 WHERE Proveedor = 8 AND Familia = 3;
UPDATE Empleados SET Salario = Salario * 1.1; (Si en una consulta de actualización suprimimos la cláusula
WHERE todos los registros de la tabla señalada serán actualizados)
'Modifica el identificador de vendedor para todos los clientes que tengan el vendedor Perez.
UPDATE Clientes SET Vendedor="GUTI" WHERE Vendedor="PEREZ"
Ejemplo para VB
BDatos.Execute "UPDATE Contratos SET Renovable = 'S' WHERE Renovable IS NULL ;"
Actualiza una tabla con datos de otra. TablaDestino la que se actualiza con la información de la TablaOrigen,
Campos a actualizar nombre y apellido. Siempre debe existir un campo común o índice que sirva para
comparar. (TablaDestino.Num= TablaOrigen.Num)
BDatos.Execute "UPDATE TablaDestino INNER JOIN TablaOrigen ON TablaDestino.Num= TablaOrigen.Num
SET TablaDestino.Nombre = TablaOrigen.Nombre, TablaDestino.Apellido = TablaOrigen.Apellido ;"
Crear:
Crea una nueva tabla con la información de otra.
BDatos.Execute "SELECT * INTO TablaNueva FROM TablaOrigen ;"
BDatos.Execute "SELECT * INTO TablaNueva FROM TablaOrigen WHERE Contrato=" + XNumeroContrato + ";"
Bases de Datos
(La operación Inner Join se utiliza para combinar registros de dos tablas, pero siempre y cuando en ellas existan
datos o valores coincidentes o iguales en algún campo en común entre las 2 tablas.)
(Muestra los registros que tienes valores que coinciden en ambas tablas)
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
Tabla1 y Tabla2 con la estructura ID, Campo1, Campo2 donde ID es la clave primaria.
(Encontrar los registros de Tabla1 que no existen en Tabla2)
SELECT [Tabla1].* FROM [Tabla1] LEFT JOIN [Tabla2] ON [Tabla1].[ID] = [Tabla2].[ID] WHERE [Tabla2].[ID] IS
NULL
(Encontrar los registros de Tabla1 y Tabla2 que, con la misma clave, tienen alguna diferencia en el valor de
alguno de los otros campos)
SELECT [Tabla1].*, [Tabla2].* FROM [Tabla1] INNER JOIN [Tabla2] ON [Tabla1].[ID] = [Tabla2].[ID] WHERE
[Tabla1].[Campo1] <> [Tabla2].[Campo1] OR [Tabla1].[Campo2] <> [Tabla2].[Campo2]
(Crear nueva tabla o consulta con información de 2 tablas escogiendo los campos específicos.)
"SELECT Contratos.NumeroContrato, Contratos.Fecha, ContratosItems.Cantidad, ContratosItems.Descripcion,
Contratos.Identificacion, Contratos.Nombres, Contratos.Valor FROM Contratos INNER JOIN ContratosItems ON
Contratos.NumeroContrato=ContratosItems.NumeroContrato WHERE condición ; "
(Genera una nueva tabla llamada Temp_NombreApellido que contiene los campo deseados de dos tablas
XNombreApellido y XIndices que tienes dos campos que poseen igual información. La información de Índices
de la tabla Xindices que sea iguales a la información de secuencia de la tabla XNombreApellido).
BDatos.Execute "SELECT XNombreApellido.Nombre, XNombreApellido.Apellido, XIndices.Indice,
XIndices.Secuencia INTO Temp_NombreApellido FROM (XIndices LEFT JOIN XNombreApellido ON
XIndices.Indice=XNombreApellido.Secuencia) ;"
Funciones
LPAD (cad1, n[,cad2])= Añade caracteres a la izquierda de la cadena hasta que tiene una cierta longitud.
RPAD (cad1, n[,cad2])= Añade caracteres a la derecha de la cadena hasta que tiene una cierta longitud.
LTRIM (cad [,set])= Suprime un conjunto de caracteres a la izquierda de la cadena.
RTRIM (cad [,set])= Suprime un conjunto de caracteres a la derecha de la cadena.
REPLACE (cad, cadena_busqueda [, cadena_sustitucion])= Sustituye un carácter o caracteres de una cadena
con 0 o más caracteres. SUBSTR (cad, m [,n])= Obtiene parte de una cadena.
TRANSLATE (cad1, cad2, cad3)= Convierte caracteres de una cadena en caracteres diferentes, según un plan
de sustitución marcado por el usuario.
Funciones de conversión:
TO_CHAR= Transforma un tipo DATE ó NUMBER en una cadena de caracteres.
TO_DATE= Transforma un tipo NUMBER ó CHAR en DATE.
TO_NUMBER= Transforma una cadena de caracteres en NUMBER.
VISUAL BASIC
CONCEPTOS
Visual Basic.
Visual Basic es una tercera generación de lenguaje orientado a eventos de programación y entorno de desarrollo
integrado (IDE) de Microsoft por su modelo de objetos componentes (COM) modelo de programación por
primera vez en 1991 y declarado legado durante 2008. Microsoft Visual Basic destinado a ser relativamente
fácil aprender y utilizar. Visual Basic se deriva de BASIC y permite el desarrollo rápido de aplicaciones (RAD) de
la interfaz gráfica de usuario (GUI) de aplicaciones, acceso a bases de datos utilizando Data Access Objects,
objetos de datos remotos, u Objetos de datos ActiveX , y creación de ActiveX controles y objetos.
Un programador puede crear una aplicación que utiliza los componentes proporcionados por el programa de
Visual Basic en sí. Con el tiempo la comunidad de programadores desarrolla componentes de terceros. Los
programas escritos en Visual Basic también pueden utilizar la API de Windows, lo que requiere la declaración
de funciones externas.
La versión final fue la versión 6 en 1998 (ahora conocido simplemente como Visual Basic). El 8 de abril de
2008, Microsoft dejó de dar soporte de Visual Basic 6.0 IDE. El equipo de Microsoft Visual Basic todavía
mantiene la compatibilidad para Visual Basic 6.0 en Windows Vista, Windows Server 2008 incluyendo R2,
Windows 7, Windows 8 , de Windows 8.1 , Windows Server 2012 , Windows 10 , Windows Server 2016 y
Windows Server 2019 a través de su " Simplemente funciona" programa. En 2014, algunos desarrolladores de
software todavía prefieren Visual Basic 6.0 sobre su sucesor, Visual Basic .NET. En 2014 algunos
desarrolladores presionaron para una nueva versión del entorno de programación Visual Basic 6. En 2016,
Visual Basic 6.0 ganó el premio impacto técnico en la 19ª Entrega Anual dados. Un dialecto de Visual Basic,
Visual Basic para Aplicaciones (VBA), se utiliza como lenguaje de macros o secuencias de comandos dentro de
varias aplicaciones de Microsoft, incluyendo Microsoft Office.
Las formas se crean mediante arrastrar y soltar técnicas. Una herramienta se utiliza para colocar los controles
(por ejemplo, cajas de texto, botones, etc.) en el formulario (ventana). Los controles tienen atributos y
controladores de eventos asociados con ellos. Los valores por defecto se proporcionan cuando se crea el
control, pero pueden ser modificados por el programador. Muchos valores de los atributos se pueden modificar
durante el tiempo de ejecución en base a las acciones del usuario o los cambios en el medio ambiente,
proporcionando una aplicación dinámica. Por ejemplo, el código se puede insertar en el controlador de eventos
forma cambio de tamaño para cambiar la posición de un control de modo que permanece centrada en el
formulario, se expande para llenar el formulario, etc. Mediante la inserción de código en el controlador de eventos
para una pulsación de tecla en un cuadro de texto, el programa puede traducir automáticamente el caso del
texto que se ingresa, o incluso prevenir ciertos caracteres se inserte.
Visual Basic puede crear ejecutables (archivos EXE), controles ActiveX o archivos DLL, pero se utiliza
principalmente para desarrollar aplicaciones de Windows y para interconectar los sistemas de bases de datos.
Los cuadros de diálogo con menos funcionalidad se pueden utilizar para proporcionar capacidades de pop-up.
Controles proporcionan la funcionalidad básica de la aplicación, mientras que los programadores pueden
insertar lógica adicional dentro de los controladores de eventos apropiadas. Por ejemplo, una caja de
combinación desplegable muestra automáticamente una lista. Cuando el usuario selecciona un elemento, un
controlador de eventos que se llama ejecuta el código que el programador creado para realizar la acción para
ese elemento de la lista. Como alternativa, un componente de Visual Basic no puede tener ninguna interfaz de
usuario, y en lugar de proporcionar objetos ActiveX a otros programas a través de modelo de objetos
componentes (COM). Esto permite que el lado del servidor de procesamiento o un módulo de complemento.
El tiempo de ejecución se recupera la memoria no utilizada mediante el recuento de referencias, que depende
de variables que pasa fuera de alcance o se establece en el momento , evitando el problema de las pérdidas de
memoria que son posibles en otros idiomas. Hay una gran biblioteca de objetos de utilidad, y el idioma
proporciona soporte básico para la programación orientada a objetos. A diferencia de muchos otros lenguajes
de programación, Visual Basic no es generalmente entre mayúsculas y minúsculas, aunque se transforma
palabras clave en una configuración estándar de los casos y obliga al caso de los nombres de variables para
ajustarse al caso de la entrada en la tabla de símbolos. Comparaciones de cadenas entre mayúsculas y
minúsculas de forma predeterminada. El compilador de Visual Basic se comparte con otros lenguajes de Visual
Studio (C, C ++). Sin embargo, de manera predeterminada las restricciones en el IDE no permiten la creación de
algunos blancos (DLL) de Windows del modelo y modelos de roscado, pero con el paso de los años, los
desarrolladores han pasado por alto estas restricciones.
implícitamente multilínea con la concatenación de cadenas o explícitamente utilizando el guion bajo (_)
al final de las líneas.
• Los comentarios del código se realizan con un carácter de apóstrofo ( '). " Esto es un comentario
• Looping bloques de instrucciones comienzan y terminan con palabras clave: Do ... Loop, While ... End
while, for ... Next .
• Asignación de variable múltiple no es posible. A = B = C no implica que los valores de A, B y C son
iguales. El resultado booleano de "¿Es B = C?" se almacena en A. El resultado almacenado en A sería
por lo tanto ya sea falsa o verdadera.
• Boolean constante Truetiene un valor numérico -1. Esto se debe a que el tipo de datos booleano se
almacena como un complemento a dos entero con signo. En esta construcción -1 evalúa a todos-1s en
binario (el valor booleano True), y 0 como todo-0s (el valor booleano False). Esto es evidente cuando se
realiza una (bit a bit) Notoperación en el valor de complemento 0 de los dos, que devuelve el valor de
complemento a dos -1, en otras palabras True = Not False. Esta funcionalidad inherente convierte en
especialmente útil cuando se realizan operaciones lógicas en los bits individuales de un número entero
tal como And, Or, Xory Not. Esta definición Truetambién es consistente con BASIC desde principios de
1970 implementación de Microsoft BASIC y también está relacionado con las características de las
instrucciones de la CPU en el momento.
• Los operadores lógicos y bit a bit están unificados. Esto es a diferencia de algunos lenguajes C-derivados
(tales como Perl ), que tienen operadores lógicos y bit a bit separadas. De nuevo, esto es una
característica tradicional de BASIC.
• Variable array base. Las matrices se declaran mediante la especificación de los límites superior e inferior
de una manera similar a Pascal y Fortran . También es posible utilizar la instrucción Option Base para
establecer el valor predeterminado límite inferior. El uso de la instrucción Option Base puede llevar a
confusión al leer el código de Visual Basic y es mejor evitar por siempre explícitamente especificando
el límite inferior de la matriz. Este límite inferior no está limitado a 0 o 1, ya que también se puede ajustar
mediante declaración. De esta manera, tanto los límites inferior y superior son programables. En más
idiomas subíndice limitado, el límite inferior de la matriz no es variable. Este rasgo raro que existe en
Visual Basic .NET , pero no en VBScript .
• OPTION BASE fue presentado por ANSI, con el estándar ANSI BASIC mínimo a finales de 1970.
• Relativamente fuerte integración con el sistema operativo Windows y el Modelo de objetos componentes
. Los tipos nativos de cadenas y matrices son los tipos COM dedicados, BSTR y SAFEARRAY.
• Redondeo bancario como el comportamiento predeterminado al convertir números reales a enteros con
la Roundfunción. ? Round(2.5, 0)da 2, ? Round(3.5, 0)da 4.
• Los enteros son promovidos automáticamente a reales en expresiones que implican el operador de
división normal ( /) de manera que la división de un número entero por otro produce el resultado
intuitivamente correcta. VB proporciona un operador específico número entero divide ( \) que no truncar.
• Por defecto, si una variable no se ha declarado o si no se especifica el carácter de declaración de tipo,
la variable es de tipo Variant. Sin embargo, esto puede cambiar con las declaraciones DefType tales
como DefInt, DefBool, DefVar, DefObj, DefStr. Hay 12 Deftype estados en total ofrecidos por Visual Basic
6.0. El tipo de defecto puede ser anulado por una declaración específica mediante el uso de un carácter
especial sufijo en el nombre de la variable ( #por Doble, !Individual, &por mucho tiempo, %por entero,
$de cadena y @de moneda) o el uso de la frase clave As (type). VB también se puede configurar en un
modo que sólo se declaran explícitamente variables se pueden utilizar con el comando Option Explicit.
Historia
Visual Basic 1.0 se introdujo en 1991. El arrastrar y soltar de diseño para crear la interfaz de usuario se deriva
de un generador de forma de prototipo desarrollado por Alan Cooper y su compañía llamada trípode. Microsoft
contrató a Cooper y sus asociados para desarrollar un sistema de trípode en forma programable para Windows
3.0, bajo el nombre código de Ruby (sin relación con el posterior lenguaje de programación Ruby). Trípode no
incluyó un lenguaje de programación en absoluto. Microsoft decidió combinar rubí con el lenguaje Basic para
crear Visual Basic. El generador de interfaz de Rubí proporciona la parte "visual" de Visual Basic, y esto se
combinó con el "EB" motor básico integrado diseñado para el sistema de base de datos de Microsoft
abandonada "Omega". Rubí también proporciona la capacidad de cargar bibliotecas de enlace dinámico que
contienen controles adicionales (a continuación, llamado "artilugios"), que posteriormente se convirtió en el VBX
interfaz.
Cronología
1990
▪ Proyecto 'trueno básica' se inició en 1990. trueno persistió a lo largo de la última versión de Visual Basic
en el nombre de la función interna primaria, "ThunderRTMain".
▪ Visual Basic 1.0 (mayo de 1991) fue lanzado para Windows en la feria Comdex Mundial / Windows en
Atlanta, Georgia.
▪ Visual Basic 1.0 para DOS fue lanzado en septiembre de 1992. El lenguaje en sí mismo no era del todo
compatible con Visual Basic para Windows, ya que era la próxima versión de BASIC compiladores
basados en DOS de Microsoft, QuickBASIC y el Sistema de Desarrollo Profesional de BASIC. La interfaz
utiliza una interfaz de usuario de texto, usando ASCII extendidos caracteres para simular la apariencia
de una interfaz gráfica de usuario.
▪ Visual Basic 2.0 fue lanzado en noviembre de 1992. El entorno de programación era más fácil de usar,
y su velocidad se ha mejorado. En particular, las formas se convirtieron en objetos instanciables,
sentando así los conceptos fundamentales de los módulos de clase que se les ofreció más tarde en
VB4.
▪ Visual Basic 3.0 fue lanzado en el verano de 1993 y entró en versiones Standard y Professional. VB3
incluye la versión 1.1 del motor de base de datos Microsoft Jet que podrían leer y escribir Jet (o acceso)
bases de datos 1.x.
▪ Visual Basic 4.0 (agosto de 1995) fue la primera versión que podría crear 32 bits, así como de 16 bits
programas de Windows. Cuenta con tres ediciones; Standard, Professional y Enterprise. También
introdujo la capacidad de escribir las clases no GUI en Visual Basic. Incompatibilidades entre diferentes
versiones de VB4 causaron problemas de instalación y operación. Mientras que las versiones anteriores
de Visual Basic habían utilizado los controles VBX, Visual Basic utiliza ahora controles OLE (con los
nombres de los archivos que terminan en .OCX) en su lugar. Estos fueron los controles ActiveX para
posteriormente ser nombrados.
▪ Con la versión 5.0 (febrero de 1997), Microsoft lanzó Visual Basic exclusivamente para 32-bit versiones
de Windows. Los programadores que preferían escribir programas de 16 bits fueron capaces de
importar los programas escritos en Visual Basic 4.0 a Visual Basic 5.0 y Visual Basic 5.0 programas se
pueden convertir fácilmente a Visual Basic 4.0. Visual Basic 5.0 también introdujo la posibilidad de crear
controles personalizados por el usuario, así como la capacidad de compilar a código ejecutable nativo
de Windows, acelerando la ejecución de código número de cálculos. Una, se puede descargar la edición
de creación de control libre también fue lanzado para la creación de controles ActiveX . También fue
utilizado como una forma de introducción de Visual Basic: un proyecto .exe regular podría crearse y
funcionar en el IDE, pero no compilado.
▪ Visual Basic 6.0 (mediados de 1998) mejoró en un número de áreas, incluyendo la capacidad de crear
aplicaciones basadas en web.
Década de 2000
• Visual Basic 6.0 soporte extendido terminó en marzo de 2008; Sin embargo, los componentes
principales del Basic 6 Visual desarrollo entorno se ejecutan en todas las versiones de 32 bits de
Windows hasta e incluyendo 8,1.
• El soporte general para Microsoft Visual Basic 6.0 terminó el 31 de marzo de 2005. El soporte extendido
terminó en marzo de 2008. En respuesta, la comunidad de usuarios de Visual Basic expresó su
preocupación y presionó a los usuarios a firmar una petición para mantener el producto vivo, sin ningún
resultado.
Idiomas derivados
Microsoft ha desarrollado derivados de Visual Basic para su uso en secuencias de comandos . Visual Basic
propio se deriva en gran medida de BASIC , y posteriormente ha sido sustituido por un .NET versión de la
plataforma.
Algunas de las lenguas derivadas son:
• Visual Basic para Aplicaciones (VBA) se incluye en muchas aplicaciones de Microsoft ( Microsoft Office
), y también en muchos productos de terceros como SolidWorks , AutoCAD , WordPerfect Office 2002
, ArcGIS , Sage 300 ERP y Business Objects de Desktop Intelligence. Hay pequeñas inconsistencias en
la forma de VBA se implementa en diferentes aplicaciones, pero es en gran parte el mismo idioma que
Visual Basic 6.0 y utiliza la misma biblioteca de tiempo de ejecución. Desarrollo de Visual Basic terminó
con 6.0, pero en 2010 Microsoft introdujo VBA 7 para proporcionar características extendidas y añadir
soporte de 64 bits.
• VBScript es el idioma predeterminado para Active Server Pages . Puede ser utilizado en Ventanas de
secuencias de comandos del lado del cliente y la página web de secuencias de comandos. Se asemeja
a VB en la sintaxis , pero es un lenguaje-ejecutado por vbscript.dll en lugar del tiempo de ejecución de
VB separada. ASP y VBScript no deben confundirse con ASP.NET , que utiliza el .NET Framework para
páginas web compilados.
• Visual Basic .NET es el sucesor designado de Microsoft Visual Basic 6.0, y es parte de la de Microsoft
.NET plataforma. Visual Basic .NET compila y se ejecuta utilizando el .NET Framework. No es compatible
con Visual Basic 6.0. Existe una herramienta de conversión automática, pero la conversión totalmente
automatizado para la mayoría de los proyectos es imposible.
• OpenOffice.org Basic es un intérprete compatible con Visual Basic que se originó en StarOffice suite de
oficina.
• Gambas es un inspirado Visual Basic software libre lenguaje de programación para el sistema operativo
Linux. No es un clon de Visual Basic, pero tiene la capacidad de convertir programas de Visual Basic a
Gambas.
• WinWrap básico es una variante de VBA de terceros usados con diversos softwares, y está disponible
para los programadores utilizar para construir una instalación de macro en sus programas.
• Las versiones posteriores de Corel WordPerfect Office implementar el acceso a VBA como una de las
lenguas macro / scripting, los otros más importantes son CorelScript y PerfectScript
• Las versiones anteriores de Microsoft Word utilizan una variante de Visual Basic llamado WordBasic
soporte del proveedor para Visual Basic 6 ha terminado, y el producto nunca se ha apoyado en las últimas
versiones de Windows, piezas clave del entorno todavía trabajan en las plataformas más recientes. Es posible
obtener un subconjunto del entorno de desarrollo trabajando en versiones de 32 bits y 64 bits de Windows
Vista, Windows 7, Windows 8 y Windows 10.
Aunque su estrategia de optimización tendrá un objetivo concreto, es muy útil pensar en la optimización durante
el proceso de desarrollo. Al escribir código, puede aprender mucho si simplemente repasa el código y se detiene
a pensar en lo que está sucediendo realmente. Puede que olvide que establecer propiedades desencadena
eventos y si hay una cantidad grande de código en los procedimientos de evento, una inofensiva línea puede
provocar tremendos retrasos en el programa. Incluso si su objetivo principal es el tamaño, algunas veces puede
implementar las optimizaciones de velocidad sin aumentar el tamaño del código.
Un buen sistema para no usar variables Variant es usar la instrucción Option Explicit, que le obliga a declarar
todas las variables.
En las operaciones aritméticas, evite las variables Currency, Single y Double. Utilice variables Long Integer
siempre que pueda, especialmente dentro de los bucles. Long Integer es el tipo de
datos nativos de las CPU de 32 bits, de forma que las operaciones efectuadas sobre ellos son muy rápidas; si
no puede usar la variable Long, la opción más parecida son los tipos de datos Integer o Byte.
Cuando escriba procedimientos Sub o Function que incluyan argumentos no modificados, es más rápido pasar
los argumentos por valor (ByVal) que por referencia (ByRef). En Visual Basic los argumentos se pasan ByRef de
forma predeterminada, pero muy pocos procedimientos modifican los valores de sus argumentos. Si no necesita
modificar los argumentos
dentro del procedimiento, defínalos ByVal.
* Identificadores
* Comentarios
* Líneas en blanco
Otros elementos, como las variables, los formularios y los procedimientos, ocupan espacio en memoria.
Normalmente, lo mejor es refinar en esta dirección.
Puede usar varias técnicas para reducir la memoria que ocupa la aplicación cuando se ejecuta como archivo
.exe. Las siguientes técnicas pueden reducir el tamaño del código:
Tipo de Ficheros.
Tanto en Windows como en Visual Basic 6.0 existen, principalmente, dos tipos de archivos:
1. Ficheros ASCII o ficheros de texto. Contienen caracteres codificados según el código ASCII y se pueden leer
con cualquier editor de texto como Notepad. Suelen tener extensión *.txt o *.bat, pero también otras como *.m
para los programas de Matlab, *.c para los ficheros fuente de C, *.cpp para los ficheros fuente de C++ y *.java
para los de Java.
2. Ficheros binarios: Son ficheros imagen de los datos o programas tal como están en la memoria del ordenador.
No son legibles directamente por el usuario. Tienen la ventaja de que ocupan menos espacio en disco y que no
se pierde tiempo y precisión cambiándolos a formato ASCII al escribirlos y al leerlos en el disco.
Con Visual Basic 6.0 se pueden leer tanto ficheros ASCII como ficheros binarios. Además, el acceso a un fichero
puede ser de tres formas principales.
1. Acceso secuencial. Se leen y escriben los datos como si se tratara de un libro: siempre a continuación del
anterior y sin posibilidad de volver atrás o saltar datos. Si se quiere acceder a un dato que está hacia la mitad
de un fichero, habrá que pasar primero por todos los datos anteriores. Los ficheros de texto tienen acceso
secuencial.
2. Acceso aleatorio (random): Permiten acceder directamente a un dato sin tener que pasar por todos los demás,
y pueden acceder a la información en cualquier orden. Tienen la limitación de que los datos están almacenados
en unas unidades o bloques que se llaman registros, y que todos los registros que se almacenan en un fichero
deben ser del mismo tamaño. Los ficheros de acceso aleatorio son ficheros binarios.
3. Acceso binario. Son como los de acceso aleatorio, pero el acceso no se hace por registros sino por bytes.
Antes de poder leer o escribir en un fichero hay que abrirlo por medio de la sentencia Open. En esta sentencia
hay que especificar qué tipo de acceso se desea tener, distinguiendo también si es para lectura (input), escritura
(output) o escritura añadida (append).
VISUAL BASIC
EJEMPLOS Y TRUCOS
AVANZADOS
INDICE
Microsoft Access
Mysql
Foxpro – Dbf
Copiar un Archivo.
Ordenar Un Vector.
Microsoft Access
Conecta a una base de datos de tipo Access mediante OleDB
Dim path_Bd As String
path_Bd = App.Path & "\Nombre.mdb"
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & _
path_Bd & ";" & "User Id=admin;Password="
Conecta a una base de datos Microsoft Access mediante ODBC. Sin password y sin contraseña
cnn.Open "driver={Microsoft Access Driver (*.mdb)};" & _
"dbq=c:\LaBase.mdb;uid=admin;pwd="
Conecta a una base de datos Microsoft Access mediante OLEDB, usando un Grupo de trabajo
Dim path_Bd As String
path_Bd = App.Path & "\Nombre.mdb"
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path_Bd & ";" & _
Usando ODBC
cnn.Open "driver={SQL Server};" & _
"server=NOMBRE_DEL_SERVIDOR;database=LA_BASE;uid=USUARIO;pwd=PASSWORD"
MySql
A un servidor MySql Server mediante OLEDB en .NET
cnn.Open "Provider=MySQLProv;" & "Data Source=base;" & _
"User Id=USUARIO;Password=PASSWORD"
Mediante OLEDB
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=Path_De_La_carpeta;" & _
"Extended Properties=""text;HDR=Yes;FMT=Delimited"""
rst.Open "select * from ElArchivo.csv", cnn, _
adOpenStatic, adLockReadOnly, adCmdText
FoxPro - Dbf
Conectar por ODBC
Coneccion = "Driver={Microsoft dBASE Driver (*.dbf)};" & _
"DriverID=277;Dbq=c:\Path_de_carpeta;"
OLEDB
Connection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\La_Carpeta;" & _
"Extended Properties=dBASE IV;" & _
"User ID=Admin;Password=;"
Regdatos.MoveNext
Loop
Regdatos.Close
Set Regdatos = Nothing
DBConexion.Close
(Agrega un campo llamado ID de tipo COUNTER que automáticamente se llena con la secuencia numérica de
los registros).
BDatos.Execute "ALTER TABLE Tabla1 ADD COLUMN ID COUNTER;"
Al agregar campos debemos tener en cuenta que la base de datos ya exista y debe estar abierta.
NombreDeTabla = "Tabla1"
XCamposTabla = " (" + _
"Campo1 LONG, " + _
"Campo2 CHAR (10) NULL, " + _
"Campo3 DOUBLE, " + _
"Campo4 DOUBLE, " + _
"Campo5 CHAR (25) );"
Next I
Screen.MousePointer = 0
' Tener en cuenta que en la nueva tabla generada se pierden las definiciones referentes a índices, si se permite
longitud cero, campo requerido, etc.
' Iniciar Copia De Tabla, No Olvidar Colocar El Punto . Antes Del Nombre De La Tabla
BDatos.Execute "SELECT * INTO [" + XRutaDestino + "]." + XTabla + " FROM " + XRutaOrigen + "." + XTabla
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
Rutabasededatos = "I:\MICV\BASEDATOS\DATOS\PRUEBAS.mdb"
Set dbDatabase = CreateDatabase(Rutabasededatos, dbLangGeneral, dbEncrypt)
(Otra forma …)
Dim MiRuta As String
Dim NomBaseDatos As String
MiRuta = App.Path
NomBaseDatos = "EJEMPLO.MDB"
' Crear Nueva Tabla Vacia
Set dbDatabase = CreateDatabase(MiRuta + "\" + NomBaseDatos, dbLangGeneral, dbEncrypt)
Para el uso de Bases de Datos ADO, VB6, se debe tener habilitada la opción “Microsoft DAO 3.51 Objetc Library”.
(Marcarle en el menú, opciones; Proyecto, referencias)
En este ejemplo vamos a generar el resultado de una consulta de una tabla en una Base de Datos a otra.
Teniendo en cuenta que debe haber correspondencia en los campos llamados cedula y articulo.
BDatos.Execute "SELECT * INTO [" + XRutaMiaBD + "]." + XTablaD + " FROM " + XRutaBD + "." + XTablaO + "
WHERE Cedula='" + XCedula + "' AND Articulo='" + XArticulo + "' ;"
XTablaExiste = 0
Dim Td As TableDef
For Each Td In BDatos.TableDefs
If Td.Attributes = 0 Then
If UCase(Td.Name) = UCase(NomTabla) Then XTablaExiste = 1: Exit For
End If
Next Td
‘Si XTablaExiste = 1 la encontró.
Si las tablas se relacionan entre sí (supongamos que el Campo3 es el mismo en las 2 tablas):
SELECT tabla1.Campo1, tabla1.Campo2, tabla2.Campo1, tabla2.Campo2 FROM tabla1 INNER JOIN tabla2 ON
tabla1.Campo3 = tabla2.Campo3 WHERE tabla1.CampoX = algo
El inner join lo puedes cambiar por LEFT OUTER JOIN o RIGHT OUTER JOIN o FULL JOIN, dependiendo de lo
que quieras.
Endif
Next I
Screen.MousePointer = 0
Regdatos("Datos") = LineA
Regdatos.Update
End If
Loop
Regdatos.Close
Screen.MousePointer = 0
‘ En El Formulario O Control
Dim XBdOrigen, XMiRuta As String
XBdOrigen = "Datos.MDB"
XMiRuta = "I:\PRUEBAS"
XRutaOrigen = XMiRuta + "\" + XBdOrigen
For I = 0 To Regdatos.Fields.Count
A = Trim(Regdatos.Fields(I).Name)
List1.AddItem " " + A & vbTab & Trim(Regdatos(A))
List1.AddItem String(500, "-")
If I = Regdatos.Fields.Count - 1 Then Exit For
Next I
IDCliente Like 'A*'; (Para recuperar datos de una tabla de dBASE III+ hay que utilizar 'dBASE III+;' en lugar de
'dBASE IV;'.)
(En Un Módulo)
' Agregar una Barra de Desplazamiento Horizontal a un Control ListBox
Public Declare Function SendMessageByNum Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal
wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const LB_SETHORIZONTALEXTENT = &H194
Public XDK As Long
(El Ciclo FOR Se Usa Para Llenar El Listbox Con Información Que Supera En Ancho Definido)
‘ En Formulario O Control
For I = 1 To 500
List1.AddItem Trim(I) + " " + String(100, "A")
Next I
' Colocar Barra De Desplazamiento Horizontal A List1 (El Valor 1000 Define El Ancho De La Barra, Se Puede
Modificar)
SendMessageByNum List1.hwnd, LB_SETHORIZONTALEXTENT, 1000, 0
(En Un Módulo)
' Permite Colocar Mas De Una Columna En Un Listbox
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg
As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const LB_SETTABSTOPS = &H192
Public Tabuladores() As Long
Public Columnas() As Long, NumColumnas As Long
Sub ListBoXLlenaR(NomForm As Form, NumList As Integer, NroCols As Integer, TaM1 As Integer, TaM2 As
Integer, TaM3 As Integer, TaM4 As Integer, TaM5 As Integer, TaM6 As Integer)
Dim AuX As String, I As Long, AcuM As Long
AuX = NroCols
NumColumnas = CLng(AuX)
ReDim Columnas(NumColumnas - 1)
ReDim Tabuladores(NumColumnas - 1)
If TaM1 > 0 Then Columnas(1 - 1) = TaM1
If TaM2 > 0 Then Columnas(2 - 1) = TaM2
If TaM3 > 0 Then Columnas(3 - 1) = TaM3
If TaM4 > 0 Then Columnas(4 - 1) = TaM4
If TaM5 > 0 Then Columnas(5 - 1) = TaM5
(En Un Formulario)
Private Sub Form_Load()
' Tener En Cuenta Que Se Debe Enviar A La Subrutina El Nombre Del Formulario (Form1),
' El Numero De Columnas (3) Y La Separacion Entre Cada Columna (10,10).
' Los Valores Varian Dependiendo De Lo Que Se Requiera.
' (Las Separaciones No Usadas = 0)
ListBoXLlenaR Form1, 1, 3, 10, 20, 0, 0, 0, 0
For I = 1 To 10
List1.AddItem Trim(I) + vbTab + "XXXXXXXX" + vbTab + "888888"
Next I
End Sub
' En Este Caso Si El Archivo " CONTROL.DLL" No Se Encuentra, Esta Autorizado Para El Uso Del Programa Sin
' Límite De Tiempo. En Caso Contrario Solo Se Puede Usar Hasta La Fecha Definida
Copiar un Archivo.
(En Un Módulo)
Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal
lpNewFileName As String, ByVal bFailIfExists As Long) As Long
‘ En Formulario O Control
XRuta = "I:\PRUEBAS\"
CopyFile XRuta + "BDatos.MDB", XRuta + "BDatos.XXX", 0
(En el formulario)
Private Sub Form_Load()
A_DeterminarTamanoDeLaPantalla
' DEFINICION DE UBICACION DE CONTROLES
Me.Top = 0 : Me.Left = 0 : Me.Height = XPantAlto : Me.Width = XPantAncho
End Sub
(En Un Módulo)
Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
‘ En Formulario O Control
XRuta = "I:\PRUEBAS\"
DeleteFile XRuta + "BDatos.XXX"
Close #1
End If
End Function
Set fs = CreateObject("Scripting.FileSystemObject")
DirTrabajO = "F:\MP3_TAGS\"
Set A = fs.OpenTextFile(DirTrabajO + "TXT\TXT_Datos_MP3.TXT", 1)
Dim FINAL As Long
FINAL = 0
Do While A.AtEndOfStream <> True
LineA = A.ReadLine ' LineA, Información de Cada Registro.
FINAL = FINAL + 1
Loop
X = FINAL
End If
For I = a To B Step C
If Color = 1 Then Tono = RGB(0, 0, 0) 'NEGRO
If Color = 2 Then Tono = RGB(0, 0, I) 'AZUL
If Color = 3 Then Tono = RGB(0, I, 0) 'VERDE
If Color = 4 Then Tono = RGB(0, I, I) 'CIAN
If Color = 5 Then Tono = RGB(I, 0, 0) 'ROJO
If Color = 6 Then Tono = RGB(I, 0, I) 'MAGENTA
If Color = 7 Then Tono = RGB(I, I, 0) 'AMARILLO
If Color = 8 Then Tono = RGB(I, I, I) 'BLANCO
Formulario.Line (0, Y)-(Formulario.Width, Y + 2), Tono, BF
Y=Y+2
Next I
End Sub
(En El Control)
Private Sub Form_Load()
‘Se especifica el nombre del formulario, el número del color y el numero para indicar si la sombra va arriba
o abajo.
FondoConSombra Form1, 8, 1
End Sub
List1.Clear
List1.Visible = True
LimiteSup = 210
limiteInf = 140
XNumeros = 10000
Randomize
For I = 1 To XNumeros
If (I Mod 5000) = 0 Then Label1 = Format(I, "#,##"): DoEvents
List1.AddItem Int((LimiteSup - limiteInf + 1) * Rnd + limiteInf)
Next I
Vector(I) = Vector(J)
Vector(J) = temp
End If
Next
Next
' Los Presentamos En Un List1
List1.Clear
For I = 1 To XNumeros
List1.AddItem Trim(I) + " " + Trim(Vector(I))
Next I
(En Un Módulo)
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal
lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal
nShowCmd As Long) As Long
Public Const SW_HIDE = 0
(En Formato)
Private Sub Form_Load()
Screen.MousePointer = 11
TextFileName = "I:\PRUEBAS\FILETEXTO.txt"
Dim hProc As Long
'Esta Línea Comprueba Que El Archivo Sea *.Txt. Si No Es, Sale Del Procedimiento.
'Se Puede Marcar Como Comentario Para Que Acepte Todo Tipo De Archivos
If UCase(Right(TextFileName, 3)) <> "TXT" Then
MsgBox "El Archivo Encontrado (" + TextFileName + ") No Es *.TXT"
Exit Sub
End If
'Esta Línea Comprueba Que El Archivo Sea *.Txt. Si No Es, Sale Del Procedimiento.
'Se Puede Marcar Como Comentario Para Que Acepte Todo Tipo De Archivos
If UCase(Right(TextFileName, 3)) <> "TXT" Then
MsgBox "El Archivo Encontrado (" + TextFileName + ") No Es *.TXT"
Exit Sub
End If
'Se abre el archivo
Open TextFileName For Binary As #1
TextToPrint = Space(LOF(1)) 'Se crea el buffer
Get #1, , TextToPrint 'Se almacenan los datos en el buffer
Close #1 'Se cierra el archivo
Screen.MousePointer = 0
' *** Referencia Habilitada ; Microsoft ActiveX Data Objects 2.8 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO2.8.TLB"
(En Formulario)
' Definición Y Coneccion A Base De Datos
Set DBConexion = New ADODB.Connection
Set Regdatos = New ADODB.Recordset
DBConexion.Provider = "Microsoft.JET.OLEDB.4.0"
DBConexion.CursorLocation = adUseClient
DBConexion.Open "I:\PRUEBAS\DATOS.MDB"
' Abrir Y Conectar La Tabla
Regdatos.Open "SELECT * FROM PERSONAS", DBConexion, adOpenKeyset, adLockReadOnly
' Cargar Datos A Datagrid
Set DataGrid1.DataSource = Regdatos
Set Regdatos = Nothing
Set DBConexion = Nothing
NOTA: El ListView realiza la consulta y afecta directamente la memoria del equipo, si son muchos registros
(más de 400.000) se debe verificar la memoria disponible.
ListView.ColumnHeaders.Clear
ListView.ListItems.Clear
With ListView.ColumnHeaders ' Create column headers.
.Add , , "Campo1", 1500
.Add , , "Campo2", 2000
.Add , , "Campo3", 2000
.Add , , "Campo4", 2000
End With
End Sub
Loop
Regdatos.Close
Set Regdatos = Nothing
Label1 = "Finalizo"
Exit Sub
ErrorOpen:
MsgBox Err.Description, vbCritical
End
NOTA: El ListView realiza la consulta y afecta directamente la memoria del equipo, si son muchos registros
(más de 400.000) se debe verificar la memoria disponible.
Los encabezados de las columnas y su arco deben ser definido manualmente en las propiedades del control
ListView.
O pueden ser definidos con código de la siguiente forma:
ListView2.ColumnHeaders.Clear
ListView2.ListItems.Clear
With ListView2.ColumnHeaders ' Create column headers.
.Add , , "Campo1", 1500
.Add , , "Campo2", 2000
.Add , , "Campo3", 2000
.Add , , "Campo4", 2000
End With
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("ESTATURA")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("EPS")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("SANGRE")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("APELLIDO")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("DIRECCION")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("TELEFONO")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("CIUDAD")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("PAIS")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("CONTINENTE")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("ENTIDAD")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("TIPO")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("TARJETA")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("MAIL")
Regdatos.MoveNext
I=I+1
Loop
Regdatos.Close
Set Regdatos = Nothing
T2 = Format(Time, "hh:mm:ss")
HORAS = Format(TimeValue(T2) - TimeValue(T1), "hh:mm:ss")
Label1 = "Inicio : " + T1 + " Final : " + T2 + " Transcurrido : " + HORAS
Screen.MousePointer = 0
ListView.GridLines = True
ListView.ColumnHeaders.Clear
ListView.ListItems.Clear
With ListView.ColumnHeaders ' Create column headers.
.Add , , "Campo1", 1500
.Add , , "Campo2", 2000
.Add , , "Campo3", 2000
.Add , , "Campo4", 2000
End With
End Sub
Loop
Regdatos.Close
Set Regdatos = Nothing
Label1 = "Finalizo"
Exit Sub
ErrorOpen:
MsgBox Err.Description, vbCritical
End
'Constants
Public Const OF_CREATE = &H1000
'Globals
Global FileInfoStruct As OFSTRUCT
Global CreateTime As FILETIME
Global LastAccessTime As FILETIME
Global LastWriteTime As FILETIME
Global hFile As Long
Global SysTime As SYSTEMTIME
End Function
(En El Módulo).
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal
nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal
nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long,
ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
(En El Formulario).
Private Sub Form_Load()
FormShowInTaskBar Me.hwnd, True ' Mostar Icono En Barra De Tareas
End Sub
(En El MODULO)
Declare Sub SetCursorPos Lib "user32" (ByVal XP As Integer, ByVal YP As Integer)
(En El Formulario)
Private Sub Form_Load()
' Centrar Formato En Pantalla
Form1.Top = (Screen.Height - Form1.Height) / 2
Form1.Left = (Screen.Width - Form1.Width) / 2
' Ejecutar Subrutina
MoverCursor Form1, Command1
End Sub
(En El MODULO)
Declare Sub SetCursorPos Lib "user32" (ByVal XP As Integer, ByVal YP As Integer)
Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Public Type POINTAPI
AX1 As Long
AY1 As Long
End Type
(En El Formulario)
Private Sub Form_Load()
' Centrar Formato En Pantalla
Form1.Top = (Screen.Height - Form1.Height) / 2
Form1.Left = (Screen.Width - Form1.Width) / 2
' Ejecutar Subrutina
MoverCursor Form1, Command1
End Sub
(En Un Módulo).
Public Declare Function ReleaseCapture Lib "user32" () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg
As Long, ByVal wParam As Long, lParam As Any) As Long
ReleaseCapture
SendMessage Me.hwnd, &HA1, 2, 0&
End Sub
En El Formulario O Control
Dim XTiempo As Long
XTiempo = 5
' Se Multiplica Por 1000 Para Pasar A Milisegundos
Call Sleep(XTiempo * 1000)
CT = 0
Else
DBGrid1.HoldFields
Data1.RecordSource = "SELECT * FROM PERSONAS ORDER BY " & DBGrid1.Columns(ColIndex).DataField
& " DESC "
Data1.Refresh
DBGrid1.ReBind
CT = 1
End If
Ordenar Un Vector.
Dim VECTOR(100) As Integer
‘ Se Ingresan Los Datos Al Vector, 100 En Este Caso
Dim I As Integer, J As Integer, temp As Integer
For I = 1 To UBound(VECTOR) - 1
For J = I To UBound(VECTOR)
If VECTOR(I) > VECTOR(J) Then
temp = VECTOR(I)
VECTOR(I) = VECTOR(J)
VECTOR(J) = temp
End If
Next
Next
Set FX = CreateObject("Scripting.FileSystemObject")
Set R = FX.GetFile("I:\PRUEBAS\EJEMPLO.mdb")
XTemP = R.DateLastModified
(En El Formulario).
Private Sub Form_Load()
XMedForM = hWnd
SetWindowLong XMedForM, GWL_EXSTYLE, GetWindowLong(XMedForM, GWL_EXSTYLE) Or
WS_EX_LAYERED
‘ La Transparencia De Formulario Se Gradúa Modificando De 0 A 255, Siendo 0 Transparencia Total.
SetLayeredWindowAttributes XMedForM, 0, 255, LWA_ALPHA
End Sub
VISUAL BASIC
PROGRAMACION AVANZADA
PROGRAMACION AVANZADA
INDICE
FlaG = "N"
For PasO = 1 To Len(NumerO)
If Mid(NumerO, PasO, 1) = "." Then
FlaG = "S"
Else
If FlaG = "N" Then
EnterO = EnterO + Mid(NumerO, PasO, 1) 'Extrae La Parte Entera Del Numero
Else
DecI = DecI + Mid(NumerO, PasO, 1) 'Extrae La Parte Decimal Del Numero
End If
End If
Next PasO
FlaG = "N"
'Si El Numero Esta Dentro De 0 A 999.999.999
If Val(NumerO) >= -999999999 And Val(NumerO) <= 999999999 Then
For PasO = Len(EnterO) To 1 Step -1
b = Len(EnterO) - (PasO - 1)
Select Case PasO
Case 3, 6, 9
Select Case Mid(EnterO, b, 1)
Case "1"
Case 2, 5, 8
Select Case Mid(EnterO, b, 1)
Case "1"
If Mid(EnterO, b + 1, 1) = "0" Then FlaG = "S" ; ExpresioN = ExpresioN & "diez "
If Mid(EnterO, b + 1, 1) = "1" Then FlaG = "S" ; ExpresioN = ExpresioN & "once "
If Mid(EnterO, b + 1, 1) = "2" Then FlaG = "S" ; ExpresioN = ExpresioN & "doce "
If Mid(EnterO, b + 1, 1) = "3" Then FlaG = "S" ; ExpresioN = ExpresioN & "trece "
If Mid(EnterO, b + 1, 1) = "4" Then FlaG = "S" ; ExpresioN = ExpresioN & "catorce "
If Mid(EnterO, b + 1, 1) = "5" Then FlaG = "S" ; ExpresioN = ExpresioN & "quince "
If Mid(EnterO, b + 1, 1) > "5" Then FlaG = "N" ; ExpresioN = ExpresioN & "dieci"
Case "2"
If Mid(EnterO, b + 1, 1) = "0" Then ExpresioN = ExpresioN & "veinte "
FlaG = "S"
Else
ExpresioN = ExpresioN & "veinti" ; FlaG = "N"
End If
Case "3"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "treinta " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "treinta y " ; FlaG = "N"
End If
Case "4"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "cuarenta " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "cuarenta y " ; FlaG = "N"
End If
Case "5"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "cincuenta " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "cincuenta y " ; FlaG = "N"
End If
Case "6"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "sesenta " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "sesenta y " ; FlaG = "N"
End If
Case "7"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "setenta " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "setenta y " ; FlaG = "N"
End If
Case "8"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "ochenta " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "ochenta y " ; FlaG = "N"
End If
Case "9"
If Mid(EnterO, b + 1, 1) = "0" Then
ExpresioN = ExpresioN & "noventa " ; FlaG = "S"
Else
ExpresioN = ExpresioN & "noventa y " ; FlaG = "N"
End If
End Select
Case 1, 4, 7
Select Case Mid(EnterO, b, 1)
Case "1"
If FlaG = "N" Then
If PasO = 1 Then
ExpresioN = ExpresioN & "uno "
Else
ExpresioN = ExpresioN & "un "
End If
End If
Case "2"
Next PasO
Screen.MousePointer = 11
Label2 = "GENERANDO MAILS"
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
Screen.MousePointer = 11
XS = "SELECT * FROM DatosPersonales;"
Set Regdatos = BDatos.OpenRecordset(XS)
I=1
Do Until Regdatos.EOF
I=I+1
Regdatos.Edit
A = Trim(Regdatos("Nombre")) + "." + Trim(Mid(Regdatos("Apellido"), 1, 3)) + "."
B = Trim(Mid(Regdatos("Ciudad"), 1, 5)) + Trim(Mid(Regdatos("Pais"), 1, 5)) + "@"
If (I Mod 2) = 0 Then D = "Gmail.com" Else D = "Hotmail.com"
E = Trim(A + B + D)
If (I Mod 10000) = 0 Then Label1 = Format(I, "#,##") + " " + E: DoEvents
Regdatos("MAIL") = E
Regdatos.Update
Regdatos.MoveNext
Loop
Regdatos.Close
Set Regdatos = Nothing
BDatos.Close
Screen.MousePointer = 0
List1.Visible = True
' Definición De Variables
Dim XNumeros, XNumMax As Double
Dim XCiclo As Integer
' Cantidad De Números Requeridos
XNumeros = 5000
' Máximo Valor A Buscar, Número De Dígitos; Si Deseo Cantidades De 4 Dígitos (9999)
' Debo Colocar 10000 Diez Mil Que Es El Máximo.
XNumMax = 100000000
XCiclo = 1
ReDim VECTOR(XNumeros)
Screen.MousePointer = 11
' Ciclo O Bucle Para General El Proceso 1 O Mas Veces
For WW = 1 To XCiclo
Label2 = "Generando Paso : " + Trim(Str(WW)) + " DE " + Trim(Str(XCiclo))
Randomize
ArchivoTime = "_T" + Format(Time, "hhmmss") + ".TXT"
ArchivO = "I:\PRUEBAS\" + ArchivoTime
Open ArchivO For Output Shared As #1
For I = 1 To XNumeros
If (I Mod 1000) = 0 Then Label1 = I: DoEvents
INICIO:
X = Int((XNumMax * Rnd) + 1)
' Calcula La Longitud Del Número Y La Iguala A La Requerida
A = Len(X)
B = Len(Trim(Str(XNumMax))) - 1
If A < B Then
SA = B - A
VECTOR(I) = String(SA, "0") + Trim(Str(VECTOR(I)))
XX = VECTOR(I)
Else
XX = Trim(Str(X))
End If
For J = 0 To I
' Si El Número Ya Existe En El Array, Lo Descartamos
If XX = VECTOR(J) Then GoTo INICIO
Next J
' No Existe, Lo Añadimos A La Matriz
VECTOR(I) = XX
' Si La Cantidad Generada No Tiene Los Dígitos Necesarios Le Colocamos Ceros A La
' Izquierda Y De Damos El Formato “1111-2222-3333-4444”
A = ""
B = ""
For T = 8 To 1 Step -1
A = A + Mid(VECTOR(I), T, 1)
Next T
B = Mid(VECTOR(I), 1, 4) + "-" + Mid(VECTOR(I), 5, 4) + "-" + Mid(A, 1, 4) + "-" + Mid(A, 5, 4)
List1.AddItem B
LIN = B: Print #1, LIN
Next I
Close #1
Next WW
‘Abrimos El Archivo De Texto Generado
Shell "notepad.exe " + ArchivO, vbNormalFocus
Screen.MousePointer = 0
(Declaraciones)
Public BDatos, BDatos2, BDatos3 As Database
Public Regdatos, RegDatos2, RegDatos3 As Recordset
(Formulario)
Private Sub Form_Load()
XRutaBD = "I:\PRUEBAS\DATOS.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
End Sub
Regdatos.Close
Screen.MousePointer = 0
If (I Mod 2000) = 0 Then Label1 = "GENERANDO TELEFONOS : " + Format(I, "#,##") + " " + D: DoEvents
Regdatos.Edit
Regdatos("CAMPO5") = D
Regdatos.Update
Regdatos.MoveNext
Loop
Regdatos.Close
Screen.MousePointer = 0
End
End Sub
Debe Existir La Tabla En Las Dos Bases De Datos Con Iguales Características.
Screen.MousePointer = 11
Dim BDatos, BDatos2 As Database
Dim Regdatos, Regdatos2 As Recordset
XRutaBD1 = "I:\PRUEBAS\EJEMPLO.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD1, False, False, ";PWD=JUNIOR")
XRutaBD2 = "I:\PRUEBAS\MICVINFO.MDB"
Set BDatos2 = DBEngine.OpenDatabase(XRutaBD2, False, False, ";PWD=JUNIOR")
' Adicionar Datos De Micvinfo.Mdf A Ejemplo.Mdb
BDatos.Execute "INSERT INTO LogControlDeAccesos SELECT * FROM " + XRutaBD2 +
".LogControlDeAccesos ;"
Screen.MousePointer = 0
NOTA; funciona para versiones de Excel antiguas con extensión “Xls”, recuerden que estas versiones tienen un
límite en el número de filas (65.536 Max).
Para el uso de Bases de Datos ADO, VB6, se debe tener habilitada la opción “Microsoft DAO 3.51 Objetc Library”.
(Marcarle en el menú, opciones; Proyecto, referencias)
(En el formulario)
'***************************************************************************
'* Name : Ejemplo para pasar datos de Excel a Access con DAO
'* Referencias : Microsoft DAO Object Library
'* Controles : Command1
'***************************************************************************
Private Function Excel_a_Access( _
Path_BD As String, _
Path_XLS As String, _
La_Tabla As String, _
Filas As Double, _
Columnas As Integer) As Boolean
Screen.MousePointer = vbDefault
Label3 = Time
Exit Function
' -- Error
' --------------------------------------------------------------
ErrSub:
' -- Descargar Las Referencias Y Cierra La Base De Datos
Call Descargar_Objetos(rst, bd, Obj_Excel, Obj_Hoja)
MsgBox Err.Description, vbCritical
Screen.MousePointer = vbDefault
End Function
(En El Formulario)
Private Sub Form_Load()
MiRuta = App.Path
NomFileExcel = "DATOSEXCEL.Xlsx"
NomBaseDatos = "EJEMPLO.MDB"
NomTabla = "Datos"
Screen.MousePointer = 11
Dim StrExcelFile As String
Dim StrWorksheet As String
Dim StrDB As String
Dim StrTable As String
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\AAAA.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
StrExcelFile = "I:\PRUEBAS\DatosVarios.xls"
StrWorksheet = "WorkSheet1"
StrDB = "I:\PRUEBAS\"
StrTable = "Temp_Tabla"
If Dir(StrExcelFile) <> "" Then Kill StrExcelFile
BDatos.Execute "SELECT * INTO [Excel 8.0;DATABASE=" & StrExcelFile & "].[" & StrWorksheet & "] FROM
" & "[" & StrTable & "] ;"
BDatos.Close
Set BDatos = Nothing
' Visualizar Hoja En Excel
Dim eWorkbook As Excel.Workbook
miXLS = StrExcelFile
Set oExcel = CreateObject("Excel.Application")
Set eWorkbook = oExcel.Workbooks.Open(miXLS, , , , "")
oExcel.Visible = True
Screen.MousePointer = 11
' Definiciones Generales
Dim Excel, Libro, Hoja As Object
Dim arrData As Variant
Dim iRec As Long
Dim iCol, iRow As Integer
Dim XRutaBD, XS, XTemP, XTabla As String
Dim BDatos As Database
Dim Regdatos As Recordset
' Definiendo Rutas Y Nombres
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
XTabla = "DatosPersonales"
' Abriendo La Base De Datos Y Objetos De Excel
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
XS = "SELECT * FROM " + XTabla
Set Regdatos = BDatos.OpenRecordset(XS)
Regdatos.MoveLast
F = Regdatos.RecordCount
If F > 1048575 Then MsgBox ("Datos Exceden la Capacidad de Excel"): Exit Sub
F = Format(F, "#,##") + " Registros"
Regdatos.MoveFirst
XTemP = "I:\PRUEBAS\" + "Excel-" + Format(Time, "hhmmss") + "-" + XTabla + ".Xlsx"
Me.Enabled = False
TiT = "Creando Los Objetos Que se Utilizaran en Excel": DoEvents
Set Excel = CreateObject("Excel.Application")
Set Libro = Excel.Workbooks.Add
Screen.MousePointer = 11
FechaIncial = CDate("29/02/2020")
FechaFinal = Date
I=0
X=1
DifDias = 0
DifMeses = 0
XMA = ""
XFI = FechaIncial
Do Until I = 1
XMA = DateAdd("m", X, FechaIncial)
DifDias = DateDiff("d", XFI, XMA)
If XMA > Date Then
DifDias = DateDiff("d", XFI, Date)
DifMeses = X - 1
I=1
End If
XFI = XMA
X=X+1
Loop
Debug.Print "Meses: " + Str(DifMeses) + " / Dias: " + Str(DifDias)
Screen.MousePointer = 11
Screen.MousePointer = 11
Dim BDatos As Database
Dim Regdatos, Regdatos2 As Recordset
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
XS = "SELECT DISTINCT Apellido FROM DatosPersonales;"
Set Regdatos = BDatos.OpenRecordset(XS)
' Si deseas saber cuántos registros quedaron después de eliminar los repetidos habilita las dos siguientes
líneas
' Regdatos.MoveLast
' A = Regdatos.RecordCount
ArchivO = "I:\PRUEBAS\APELLIDO.TXT"
Open ArchivO For Output Shared As #1
Label2 = "Escribiendo el archivo de Texto"
I=0
Do Until Regdatos.EOF
LIN = Regdatos("APELLIDO"): Print #1, LIN
I=I+1
If (I Mod 5000) = 0 Then Label1 = Format(I, "#,##"): DoEvents
Regdatos.MoveNext
Loop
Close #1
Regdatos.Close
Set Regdatos = Nothing
BDatos.Close
Regdatos.MoveNext
Loop
Regdatos.Close
Set Regdatos = Nothing
BDatos.Close
PENDIENTES
TEMAS EN PROCESO
DE INVESTIGACION
BIBLIOGRAFIAS WEB
https://documentation.help
https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61