0% encontró este documento útil (0 votos)
11 vistas320 páginas

SQL & Visual Basic Manual Completo

El manual de SQL y Visual Basic de Gonzalo Bolaño Stefanell ofrece una guía avanzada sobre el uso de SQL en bases de datos relacionales y su integración con Visual Basic. Incluye conceptos, ejemplos prácticos, y técnicas avanzadas para la manipulación de datos, así como un índice detallado de temas que abordan desde consultas básicas hasta funciones de agregado. La obra también detalla la historia y evolución de SQL como estándar industrial, facilitando la comprensión de su aplicación en diversos sistemas de gestión de bases de datos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas320 páginas

SQL & Visual Basic Manual Completo

El manual de SQL y Visual Basic de Gonzalo Bolaño Stefanell ofrece una guía avanzada sobre el uso de SQL en bases de datos relacionales y su integración con Visual Basic. Incluye conceptos, ejemplos prácticos, y técnicas avanzadas para la manipulación de datos, así como un índice detallado de temas que abordan desde consultas básicas hasta funciones de agregado. La obra también detalla la historia y evolución de SQL como estándar industrial, facilitando la comprensión de su aplicación en diversos sistemas de gestión de bases de datos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 320

|

Manual de SQL & Visual Basic Pág. 1

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 2

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 3

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 4

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.

SQL frente a desplazamiento


Como se describió antes en este manual, el motor de base de datos Microsoft Jet proporciona dos métodos
para la mayoría de las tareas con bases de datos:
Un modelo de desplazamiento basado en el movimiento por los registros de las bases de datos.
Un modelo relacional basado en el lenguaje de consulta estructurado (SQL).
El modelo de desplazamiento consta de las propiedades y métodos que se describen en el capítulo 2, "Creación
y modificación de bases de datos", y el capítulo 3, "Trabajo con registros y campos". En este capítulo se describe
el modelo relacional.
Los programadores que estén familiarizados con sistemas de bases de datos orientados a archivos, como
dBASE, FoxPro y Paradox, se sentirán más cómodos con los modelos de desplazamiento descritos en los
capítulos 3 y 4. No obstante, en la mayoría de los casos, el método equivalente de SQL es más eficiente y debe
usarse cuando sea importante el rendimiento. Además, SQL tiene la ventaja de ser una interfaz de bases de
datos estándar, por lo que conocer los comandos de SQL permite tener acceso y manipular una gran variedad
de productos de bases de datos procedentes de distintos fabricantes.
En la práctica, a menudo se encontrará utilizando los dos modelos simultáneamente. Por ejemplo, podría utilizar
la instrucción SQL SELECT para crear un pequeño Recordset de elementos seleccionados de una tabla grande
y a continuación emplear los métodos de desplazamiento Move para avanzar por el Recordset y examinar
determinados registros de uno en uno.
Nota Los términos relacionales fila y columna equivalen a los conocidos términos de bases de datos registro y
campo. Puesto que SQL es un lenguaje de base de datos relacional puro, los términos fila y columna se utilizan

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 5

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.1. Componentes del SQL


El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones de agregado. Estos
elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos.

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

CREATE Utilizado para crear nuevas tablas, campos e índices

DROP Empleado para eliminar tablas e índices

Utilizado para modificar las tablas agregando campos o cambiando la definición de


ALTER
los campos.

Comandos DML

Comando Descripción

Utilizado para consultar registros de la base de datos que satisfagan un criterio


SELECT
determinado

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 6

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

GROUP BY Utilizada para separar los registros seleccionados en grupos específicos

HAVING Utilizada para expresar la condición que debe satisfacer cada grupo

Utilizada para ordenar los registros seleccionados de acuerdo con un orden


ORDER BY
específico

1.4 Operadores Lógicos

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.

NOT Negación lógica. Devuelve el valor contrario de la expresión.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 7

1.5 Operadores de Comparación

Operador Uso

< Menor que

> Mayor que

<> Distinto de

<= Menor o Igual que

=> Mayor o Igual que

= Igual que

BETWEEN Utilizado para especificar un intervalo de valores.

LIKE Utilizado en la comparación de un modelo

In Utilizado para especificar registros de una base de datos

1.6 Funciones de Agregado


Las funciones de agregado se usan dentro de una cláusula SELECT en grupos de registros para devolver un
único valor que se aplica a un grupo de registros.

Función Descripción

AVG Utilizada para calcular el promedio de los valores de un campo determinado

COUNT Utilizada para devolver el número de registros de la selección

SUM Utilizada para devolver la suma de todos los valores de un campo determinado

MAX Utilizada para devolver el valor más alto de un campo especificado

MIN Utilizada para devolver el valor más bajo de un campo especificado

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 8

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.

2.1 Consultas básicas


La sintaxis básica de una consulta de selección es la siguiente:
SELECT Campos FROM Tabla;

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.

2.2 Ordenar los registros


Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante
la cláusula ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar.
Ejemplo:
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY Nombre;
Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes ordenados por el campo
Nombre.

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;

2.3 Consultas con Predicado


El predicado se incluye entre la cláusula y el primer nombre del campo a recuperar, los posibles predicados
son:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 9

Predicado Descripción

ALL Devuelve todos los campos de la tabla

TOP Devuelve un determinado número de registros de la tabla

DISTINCT Omite los registros cuyos campos seleccionados coincidan totalmente

Omite los registros duplicados basándose en la totalidad del registro y


DISTINCTROW
no sólo en los campos seleccionados.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 10

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;

2.5 Recuperar Información de una base de Datos Externa


Para concluir este capítulo se debe hacer referencia a la recuperación de registros de bases de datos externa.
Es ocasiones es necesario la recuperación de información que se encuentra contenida en una tabla que no se
encuentra en la base de datos que ejecutará la consulta o que en ese momento no se encuentra abierta, esta
situación la podemos salvar con la palabra reservada IN de la siguiente forma:
SELECT DISTINCTROW Apellido AS Empleado FROM Empleados IN 'c:\databases\gestion.mdb';
En donde c:\databases\gestion.mdb es la base de datos que contiene la tabla Empleados.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 11

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#.

3.1 Operadores Lógicos


Los operadores lógicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not. A excepción de los dos
últimos todos poseen la siguiente sintaxis:
<expresión1 operador <expresión2
En donde expresión1 y expresión2 son las condiciones a evaluar, el resultado de la operación varía en función
del operador lógico. La tabla adjunta muestra los diferentes posibles resultados:

<expresión1 Operador <expresión2 Resultado

Verdad AND Falso Falso

Verdad AND Verdad Verdad

Falso AND Verdad Falso

Falso AND Falso Falso

Verdad OR Falso Verdad

Verdad OR Verdad Verdad

Falso OR Verdad Verdad

Falso OR Falso Falso

Verdad XOR Verdad Falso

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 12

Verdad XOR Falso Verdad

Falso XOR Verdad Verdad

Falso XOR Falso Falso

Verdad Eqv Verdad Verdad

Verdad Eqv Falso Falso

Falso Eqv Verdad Falso

Falso Eqv Falso Verdad

Verdad Imp Verdad Verdad

Verdad Imp Falso Falso

Verdad Imp Null Null

Falso Imp Verdad Verdad

Falso Imp Falso Verdad

Falso Imp Null Verdad

Null Imp Verdad Verdad

Null Imp Falso Null

Null Imp Null Null

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');

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 13

3.2 Intervalos de Valores


Para indicar que deseamos recuperar los registros según el intervalo de valores de un campo emplearemos el
operador Between cuya sintaxis es:
campo [Not] Between valor1 And valor2 (la condición Not es opcional)

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.

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)

3.3 El Operador Like


Se utiliza para comparar una expresión de cadena con un modelo en una expresión SQL. Su sintaxis es:
expresión Like modelo
En donde expresión es una cadena modelo o campo contra el que se compara expresión. Se puede utilizar el
operador Like para encontrar valores en los campos que coincidan con el modelo especificado. Por modelo
puede especificar un valor completo (Ana María), o se pueden utilizar caracteres comodín como los reconocidos
por el sistema operativo para encontrar un rango de valores (Like An*).
El operador Like se puede utilizar en una expresión para comparar un valor de un campo con una expresión de
cadena. Por ejemplo, si introduce Like C* en una consulta SQL, la consulta devuelve todos los valores de campo
que comiencen por la letra C. En una consulta con parámetros, puede hacer que el usuario escriba el modelo
que se va a utilizar.
El ejemplo siguiente devuelve los datos que comienzan con la letra P seguido de cualquier letra entre A y F y
de tres dígitos:
Like 'P[A-F]###'
Este ejemplo devuelve los campos cuyo contenido empiece con una letra de la A la D seguidas de cualquier
cadena.
Like '[A-D]*'
En la tabla siguiente se muestra cómo utilizar el operador Like para comprobar
expresiones con diferentes modelos.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 14

Tipo de coincidencia Modelo Planteado Coincide No coincide

Varios caracteres 'a*a' 'aa', 'aBa', 'aBBBa' 'aBC'

Carácter especial 'a[*]a' 'a*a' 'aaa'

Varios caracteres 'ab*' 'abcdefg', 'abc' 'cab', 'aab'

Un solo carácter 'a?a' 'aaa', 'a3a', 'aBa' 'aBBBa'

Un solo dígito 'a#a' 'a0a', 'a1a', 'a2a' 'aaa', 'a10a'

Rango de caracteres '[a-z]' 'f', 'p', 'j' '2', '&'

Fuera de un rango '[!a-z]' '9', '&', '%' 'b', 'a'

Distinto de un dígito '[!0-9]' 'A', 'a', '&', '~' '0', '1', '9'

Combinada 'a[!b-m]#' 'An9', 'az0', 'a99' 'abc', 'aj0'

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');

3.5 La cláusula WHERE


La cláusula WHERE puede usarse para determinar qué registros de las tablas enumeradas en la cláusula
FROM aparecerán en los resultados de la instrucción SELECT. Después de escribir esta cláusula se deben
especificar las condiciones expuestas en los apartados 3.1 y 3.2. Si no se emplea esta cláusula, la consulta
devolverá todas las filas de la tabla. WHERE es opcional, pero cuando aparece debe ir a continuación de
FROM.
SELECT Apellidos, Salario FROM Empleados WHERE Salario 21000;
SELECT Id_Producto, Existencias FROM Productos WHERE Existencias <= Nuevo_Pedido;
SELECT * FROM Pedidos WHERE Fecha_Envio = #5/10/94#;
SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos = 'King';
SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos Like 'S*';
SELECT Apellidos, Salario FROM Empleados WHERE Salario Between 200 And 300;
SELECT Apellidos, Salario FROM Empl WHERE Apellidos Between 'Lon' And 'Tol';

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 15

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');

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 16

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 17

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.4 Max, Min


Devuelven el mínimo o el máximo de un conjunto de valores contenidos en un campo especifico de una consulta.
Su sintaxis es:
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realizar el cálculo. 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 Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'España';
SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'España';

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 18

4.5 StDev, StDevP


Devuelve estimaciones de la desviación estándar para la población (el total de los registros de la tabla) o una
muestra de la población representada (muestra aleatoria) . Su sintaxis es:
StDev(expr) / StDevP(expr)
En donde expr representa el nombre del campo que contiene los datos que desean evaluarse 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)
StDevP evalúa una población, y StDev evalúa una muestra de la población. Si la consulta contiene menos de
dos registros (o ningún registro para StDevP), estas funciones devuelven un valor Null (el cual indica que la
desviación estándar no puede calcularse).
SELECT StDev(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'España';
SELECT StDevP(Gastos) AS Desviacion FROM Pedidos WHERE Pais= 'España';

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;

4.7 Var, VarP


Devuelve una estimación de la varianza de una población (sobre el total de los registros) o una muestra de la
población (muestra aleatoria de registros) sobre los valores de un campo. Su sintaxis es:
Var(expr) / VarP(expr)
VarP evalúa una población, y Var evalúa una muestra de la población. Expr el nombre del campo que contiene
los datos que desean evaluarse 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)
Si la consulta contiene menos de dos registros, Var y VarP devuelven Null (esto indica que la varianza no puede
calcularse). Puede utilizar Var y VarP en una expresión de consulta o en una Instrucción SQL.
SELECT Var(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';
SELECT VarP(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 19

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.2 INSERT INTO


Agrega un registro en una tabla. Se la conoce como una consulta de datos añadidos. Esta consulta puede ser
de dos tipos: Insertar un único registro o Insertar en una tabla los registros contenidos en otra tabla.

5.2.1 Para insertar un único Registro:


En este caso la sintaxis es la siguiente:
INSERT INTO Tabla (campo1, campo2, .., campoN) VALUES (valor1, valor2, ..., valorN)
Esta consulta graba en el campo1 el valor1, en el campo2 y valor2 y así sucesivamente. Hay que prestar especial
atención a acotar entre comillas simples (') los valores literales (cadenas de caracteres) y las fechas indicarlas

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 20

en formato mm-dd-aa y entre caracteres de almohadillas (#).

5.2.2 Para insertar Registros de otra Tabla:


En este caso la sintaxis es:
INSERT INTO Tabla [IN base_externa] (campo1, campo2, ..., campoN)
SELECT TablaOrigen.campo1, TablaOrigen.campo2, ..., TablaOrigen.campoN FROM TablaOrigen
En este caso se seleccionarán los campos 1,2, ..., n dela tabla origen y se grabarán en los campos 1,2,.., n de la
Tabla. La condición SELECT puede incluir la cláusula WHERE para filtrar los registros a copiar. Si Tabla y
TablaOrigen poseen la misma estructura podemos simplificar la sintaxis a:
INSERT INTO Tabla SELECT TablaOrigen.* FROM TablaOrigen
De esta forma los campos de TablaOrigen se grabarán en Tabla, para realizar esta operación es necesario que
todos los campos de TablaOrigen estén contenidos con igual nombre en Tabla. Con otras palabras, que Tabla
posea todos los campos de TablaOrigen (igual nombre e igual tipo).
En este tipo de consulta hay que tener especial atención con los campos contadores o autonuméricos puesto
que al insertar un valor en un campo de este tipo se escribe el valor que contenga su campo homólogo en la
tabla origen, no incrementándose como le corresponde.
Se puede utilizar la instrucción INSERT INTO para agregar un registro único a una tabla, utilizando la sintaxis de
la consulta de adición de registro único tal y como se mostró anteriormente. En este caso, su código específica
el nombre y el valor de cada campo del registro. Debe especificar cada uno de los campos del registro al que
se le va a asignar un valor, así como el valor para dicho campo. Cuando no se especifica dicho campo, se inserta
el valor predeterminado o Null. Los registros se agregan al final de la tabla.
También se puede utilizar INSERT INTO para agregar un conjunto de registros pertenecientes a otra tabla o
consulta utilizando la cláusula SELECT ... FROM como se mostró anteriormente en la sintaxis de la consulta de
adición de múltiples registros. En este caso la cláusula SELECT especifica los campos que se van a agregar en
la tabla destino especificada.
La tabla destino u origen puede especificar una tabla o una consulta.
Si la tabla destino contiene una clave principal, hay que asegurarse que es única, y con valores no-Null ; si no
es así, no se agregarán los registros. Si se agregan registros a una tabla con un campo Contador, no se debe
incluir el campo Contador en la consulta. Se puede emplear la cláusula IN para agregar registros a una tabla en
otra base de datos.
Se pueden averiguar los registros que se agregarán en la consulta ejecutando primero una consulta de selección
que utilice el mismo criterio de selección y ver el resultado. Una consulta de adición copia los registros de una
o más tablas en otra. Las tablas que contienen los registros que se van a agregar no se verán afectadas por la
consulta de adición. 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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 21

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;

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 22

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:

Tipo de Datos Longitud Descripción

Para consultas sobre tabla adjunta de productos de bases de


BINARY 1 byte
datos que definen un tipo de datos Binario.

BIT 1 byte Valores Si/No o True/False

BYTE 1 byte Un valor entero entre 0 y 255.

COUNTER 4 bytes Un número incrementado automáticamente (de tipo Long)

Un entero escalable entre 922.337.203.685.477,5808 y


CURRENCY 8 bytes
922.337.203.685.477,5807.

DATETIME 8 bytes Un valor de fecha u hora entre los años 100 y 9999.

Un valor en punto flotante de precisión simple con un rango


de -3.402823*1038 a -1.401298*10-45 para valores
SINGLE 4 bytes
negativos, 1.401298*10-45 a 3.402823*1038 para valores
positivos, y 0.

Un valor en punto flotante de doble precisión con un rango


de -1.79769313486232*10308 a -
DOUBLE 8 bytes 4.94065645841247*10-324 para valores negativos,
4.94065645841247*10-324 a 1.79769313486232*10308
para valores positivos, y 0.

SHORT 2 bytes Un entero corto entre -32,768 y 32,767.

LONG 4 bytes Un entero largo entre -2,147,483,648 y 2,147,483,647.

LONGTEXT 1 byte por carácter De cero a un máximo de 1.2 gigabytes.

LONGBINARY Según se necesite De cero 1 gigabyte. Utilizado para objetos OLE.

TEXT 1 byte x carácter De cero a 255 caracteres.

La siguiente tabla recoge los sinónimos de los tipos de datos definidos:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 23

Tipo de Dato Sinónimos

BINARY VARBINARY

BIT BOOLEAN , LOGICAL , LOGICAL1 , YESNO

BYTE INTEGER1

COUNTER AUTOINCREMENT

CURRENCY MONEY

DATETIME DATE , TIME , TIMESTAMP

SINGLE FLOAT4 , IEEESINGLE , REAL

DOUBLE FLOAT , FLOAT8 , IEEEDOUBLE , NUMBER , NUMERIC

SHORT INTEGER2 , SMALLINT

LONG INT , INTEGER , INTEGER4

LONGBINARY GENERAL , OLEOBJECT

LONGTEXT LONGCHAR , MEMO , NOTE

TEXT ALPHANUMERIC , CHAR , CHARACTER , STRING , VARCHAR

VARIANT (No Admitido) VALUE

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 24

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);

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 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 DISTINCTROW NombreProducto, Precio_Unidad FROM Productos WHERE (Precio_Unidad =


(SELECT Precio_Unidad FROM Productos WHERE Nombre_Producto = "Almíbar anisado");
Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almíbar
anisado.

SELECT DISTINCTROW Nombre_Contacto, Nombre_Compañia, Cargo_Contacto, Telefono FROM Clientes


WHERE (ID_Cliente IN (SELECT DISTINCTROW ID_Cliente FROM Pedidos WHERE Fecha_Pedido =
#04/1/93# <#07/1/93#);
Obtiene una lista de las compañías y los contactos de todos los clientes que han realizado un pedido en el
segundo trimestre de 1993.

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.

SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad, (SELECT DISTINCTROW Productos.Nombre


FROM Productos WHERE Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto FROM Pedidos
WHERE Pedidos.Cantidad 150 ORDER BY Pedidos.Id_Producto;
Recupera el Código del Producto y la Cantidad pedida de la tabla pedidos, extrayendo el nombre del
producto de la tabla de productos.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 26

8. CONSULTA DE REFERENCIAS CRUZADAS.

Una consulta de referencias cruzadas es aquella que nos permite visualizar los datos en filas y en columnas,
estilo tabla, por ejemplo:

Producto / Año 1996 1997

Pantalones 1.250 3.000

Camisas 8.560 1.253

Zapatos 4.369 2.563

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[, ...]])]

En donde: función agregada


Es una función SQL agregada que opera sobre los datos seleccionados.
instrucción select
Es una instrucción SELECT.
campo pivot
Es el campo o expresión que desea utilizar para crear las cabeceras de la columna en el resultado de la consulta.
valor1, valor2
Son valores fijos utilizados para crear las cabeceras de la columna.
Para resumir datos utilizando una consulta de referencia cruzada, se seleccionan los valores de los campos o
expresiones especificadas como cabeceras de columnas de tal forma que pueden verse los datos en un formato
más compacto que con una consulta de selección.
TRANSFORM es opcional, pero si se incluye es la primera instrucción de una cadena SQL. Precede a la
instrucción SELECT que especifica los campos utilizados como encabezados de fila y una cláusula GROUP BY
que especifica el agrupamiento de las filas. Opcionalmente puede incluir otras cláusulas como por ejemplo
WHERE, que especifica una selección adicional o un criterio de ordenación.
Los valores devueltos en campo pivot se utilizan como encabezados de columna en el resultado de la consulta.
Por ejemplo, al utilizar las cifras de ventas en el mes de la venta como pivot en una consulta de referencia

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 27

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 28

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

Para resolver la consulta planteamos la siguiente consulta:


TRANSFORM Sum(Pedidos.Cantidad) AS Resultado SELECT Nombre AS Producto, Pedidos.Id AS Código,
Sum(Pedidos.Cantidad) AS TOTAL, Avg(Pedidos.Cantidad) AS Media FROM Pedidos INNER JOIN Artículos ON
Pedidos.Id = Artículos.Id GROUP BY Pedidos.Id, Artículos.Nombre PIVOT Year(Fecha);
y obtenemos el siguiente resultado:

Producto Código TOTAL Media 1996 1997

Zapatos 1 348 87 300 48

Pantalones 2 955 238,75 375 580

Blusas 3 1940 485 620 1320

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 29

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.

Otras posibilidades de fecha de la cláusula pivot son las siguientes:


1. Para agrupamiento por Trimestres
PIVOT "Tri " & DatePart("q",[Fecha]);

2. Para agrupamiento por meses (sin tener en cuenta el año)


PIVOT Format([Fecha],"mmm") In ("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic");

3. Para agrupar por días


PIVOT Format([Fecha],"Short Date");

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 30

9. CONSULTAS DE UNION EXTERNAS

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

En donde: tb1, tb2


Son los nombres de las tablas desde las que se combinan los registros.
campo1, campo2
Son los nombres de los campos que se combinan. Si no son numéricos, los campos deben ser del mismo tipo
de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.
comp
Es cualquier operador de comparación relacional: =, <, , <=, =, o <.
Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM. Esto crea una combinación por
equivalencia, conocida también como unión interna. Las combinaciones Equi son las más comunes; éstas
combinan los registros de dos tablas siempre que haya concordancia de valores en un campo común a ambas
tablas. Se puede utilizar INNER JOIN con las tablas Departamentos y Empleados para seleccionar todos los
empleados de cada departamento. Por el contrario, para seleccionar todos los departamentos (incluso si alguno
de ellos no tiene ningún empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no
está asignado a ningún departamento), en este caso RIGHT JOIN.
Si se intenta combinar campos que contengan datos Memo u Objeto OLE, se produce un error. Se pueden
combinar dos campos numéricos cualesquiera, incluso si son de diferente tipo de datos. Por ejemplo, puede
combinar un campo Numérico para el que la propiedad Size de su objeto Field está establecida como Entero, y
un campo Contador.

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)];

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 31

También puede anidar instrucciones JOIN utilizando la siguiente sintaxis:


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.

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:

SELECT Facturas.*, Albaranes.* FROM Facturas INNER JOIN Albaranes ON Facturas.IdAlbaran =


Albaranes.IdAlbaran WHERE Facturas.IdCliente = 325
La transformación de esta sentencia a formato ANSI sería la siguiente:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 32

SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes WHERE Facturas.IdAlbaran = Albaranes.IdAlbaran


AND Facturas.IdCliente = 325

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:

SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes WHERE Facturas.IdAlbaran = Albaranes.IdAlbaran


(+) AND Facturas.IdCliente = 325

Y esto a un RIGHT JOIN:


SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes WHERE Facturas.IdAlbaran (+) =
Albaranes.IdAlbaran AND Facturas.IdCliente = 325

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:

SELECT alias1.columna, alias2.columna, ...


FROM tabla1 as alias1, tabla2 as alias2
WHERE alias1.columna = alias2.columna
AND otras condiciones

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:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 33

SELECT t.num_emp, t.nombre, t.puesto, t.num_sup,s.nombre, s.puesto FROM empleados AS t, empleados AS


s WHERE t.num_sup = s.num_emp

Consultas de Combinaciones no Comunes


La mayoría de las combinaciones están basadas en la igualdad de valores de las columnas que son el criterio
de la combinación. Las no comunes se basan en otros operadores de combinación, tales como NOT, BETWEEN,
<>, etc.

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:

SELECT grados.grado,empleados.nombre, empleados.salario, empleados.puesto


FROM empleados, grados
WHERE empleados.salario
BETWEEN grados.salarioinferior AND grados.salariosuperior
ORDER BY grados.grado, empleados.salario

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 34

Autor (Nombre del Autor)

B0012 1. Francisco López


B0012 2. Javier Alonso
B0012 3. Marta Rebolledo
C0014 1. Francisco López
C0014 2. Javier Alonso
D0120 2. Javier Alonso
D0120 3. Marta Rebolledo

Queremos obtener, para cada libro, parejas de autores:


SELECT A.Codigo, A.Autor, B.Autor FROM Autores A, Autores B WHERE A.Codigo = B.Codigo

El resultado es el siguiente : Código Autor


B0012 1. Francisco López 1. Francisco López
B0012 1. Francisco López 2. Javier Alonso
B0012 1. Francisco López 3. Marta Rebolledo
B0012 2. Javier Alonso 2. Javier Alonso
B0012 2. Javier Alonso 1. Francisco López
B0012 2. Javier Alonso 3. Marta Rebolledo
B0012 3. Marta Rebolledo 3. Marta Rebolledo
B0012 3. Marta Rebolledo 2. Javier Alonso
B0012 3. Marta Rebolledo 1. Francisco López
C0014 1. Francisco López 1. Francisco López
C0014 1. Francisco López 2. Javier Alonso
C0014 2. Javier Alonso 2. Javier Alonso
C0014 2. Javier Alonso 1. Francisco López
D0120 2. Javier Alonso 2. Javier Alonso
D0120 2. Javier Alonso 3. Marta Rebolledo
D0120 3. Marta Rebolledo 3. Marta Rebolledo
D0120 3. Marta Rebolledo 2. Javier Alonso

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 35

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

El resultado ahora es el siguiente: Código Autor Autor


B0012 1. Francisco López 2. Javier Alonso
B0012 1. Francisco López 3. Marta Rebolledo
C0014 1. Francisco López 2. Javier Alonso
D0120 2. Javier Alonso 3. Marta Rebolledo

Ahora tenemos un conjunto de resultados en formato Autor - CoAutor.


Si en la tabla de empleados quisiéramos extraer todas las posibles parejas que podemos realizar, utilizaríamos
la siguiente sentencia:
SELECT Hombres.Nombre, Mujeres.Nombre FROM Empleados Hombre, Empleados Mujeres WHERE
Hombre.Sexo = 'Hombre' AND Mujeres.Sexo = 'Mujer' AND Hombres.Id <>Mujeres.Id

Para concluir supongamos la tabla siguiente:


Id Nombre SuJefe
1 Marcos 6
2 Lucas 1
3 Ana 2
4 Eva 1
5 Juan 6
6 Antonio
Queremos obtener un conjunto de resultados con el nombre del empleado y el nombre de su jefe:

SELECT Emple.Nombre, Jefes.Nombre FROM Empleados Emple, Empleados Jefe WHERE Emple.SuJefe =
Jefes.Id

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 36

10. CONSULTAS DE UNION EXTERNAS.

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;

Si no se indica lo contrario, no se devuelven registros duplicados cuando se utiliza la operación UNION, no


obstante, puede incluir el predicado ALL para asegurar que se devuelven todos los registros. Esto hace que la
consulta se ejecute más rápidamente. Todas las consultas en una operación UNION deben pedir el mismo
número de campos, no obstante, los campos no tienen por qué tener el mismo tamaño o el mismo tipo de
datos. Se puede utilizar una cláusula GROUP BY y/o HAVING en cada argumento consulta para agrupar los
datos devueltos. Puede utilizar una cláusula ORDER BY al final del último argumento consulta para visualizar
los datos devueltos en un orden específico.

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 37

11. ESTRUCTURA DE TABLAS.

11.1 Creación de Tablas Nuevas


Si se está utilizando el motor de datos de Microsoft para acceder a bases de datos Access, sólo se puede
emplear esta instrucción para crear bases de datos propias de Access. Su sintaxis es:
CREATE TABLE tabla (campo1 tipo (tamaño) índice1, campo2 tipo (tamaño) índice2 , ..., índice multicampo ,... )
En donde:

Parte Descripción

tabla Es el nombre de la tabla que se va a crear.

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.

tipo Es el tipo de datos de campo en la nueva tabla. (Ver Tipos de Datos)

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.

Es una cláusula CONSTRAINT que define el tipo de índice multicampos a crear. Un


índice
índice multi campo es aquel que está indexado por el contenido de varios campos. Esta
multicampos
cláusula en opcional.

CREATE TABLE Empleados (Nombre TEXT (25) , Apellidos TEXT (50));


Crea una nueva tabla llamada Empleados con dos campos, uno llamado Nombre de tipo texto y longitud
25 y otro llamado apellidos con longitud 50.

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);

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 38

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.

11.2 La cláusula CONSTRAINT


Se utiliza la cláusula CONSTRAINT en las instrucciones ALTER TABLE y CREATE TABLE para crear o eliminar
índices. Existen dos sintaxis para esta cláusula dependiendo si desea Crear o Eliminar un índice de un único
campo o si se trata de un campo multiíndice. Si se utiliza el motor de datos de Microsoft, sólo podrá utilizar esta
cláusula con las bases de datos propias de dicho motor.
Para los índices de campos únicos:
CONSTRAINT nombre {PRIMARY KEY | UNIQUE | REFERENCES tabla externa
[(campo externo1, campo externo2)]}
Para los índices de campos múltiples:
CONSTRAINT nombre {PRIMARY KEY (primario1[, primario2 [, ...]]) | UNIQUE (único1[, único2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES tabla externa [(campo externo1 [,campo externo2 [, ...]])]}

Parte Descripción

nombre Es el nombre del índice que se va a crear.

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

Tipo de Índice Descripción

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 39

Genera un índice primario el campo o los campos especificados. Todos los


PRIMARY KEY campos de la clave principal deben ser únicos y no nulos, cada tabla sólo
puede contener una única clave principal.

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.

11.3 Creación de Índices


Si se utiliza el motor de datos Jet de Microsoft sólo se pueden crear índices en bases de datos del mismo motor.
La sintaxis para crear un índice en una tabla ya definida en la siguiente:
CREATE [ UNIQUE ] INDEX índice ON tabla (campo [ASC|DESC][, campo [ASC|DESC], ...]) [WITH {
PRIMARY | DISALLOW NULL | IGNORE NULL }]

En donde:

Parte Descripción

Índice Es el nombre del índice a crear.

Tabla Es el nombre de una tabla existentes en la que se creará el índice.

Campo Es el nombre del campo o lista de campos que constituyen el índice.

Indica el orden de los valores de lso campos ASC indica un orden ascendente
ASC|DESC
(valor predeterminado) y DESC un orden descendente.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 40

UNIQUE Indica que el índice no puede contener valores duplicados.

DISALLOW NULL Prohíbe valores nulos en el índice

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.

CREATE UNIQUE INDEX MiIndice ON Empleados (ID) WITH DISALLOW NULL;


Crea un índice en la tabla Empleados utilizando el campo ID, obligando que el campo ID no contenga valores
nulos ni repetidos.

11.4 Modificar el Diseño de una Tabla


Modifica el diseño de una tabla ya existente, se pueden modificar los campos o los índices existentes. Su sintaxis
es:
ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tamaño)] [CONSTRAINT índice] CONSTRAINT índice
multicampo} | DROP {COLUMN campo I CONSTRAINT nombre del índice} }

En donde:

Parte Descripción

tabla Es el nombre de la tabla que se desea modificar.

campo Es el nombre del campo que se va a añadir o eliminar.

tipo Es el tipo de campo que se va a añadir.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 41

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).

ADD Se utiliza para agregar un índice de multicampos o de un único campo.

DROP COLUMN Se utiliza para borrar un campo. Se especifica únicamente el nombre del campo.

Se utiliza para eliminar un índice. Se especifica únicamente el nombre del índice a


DROP
continuación de la palabra reservada CONSTRAINT.

ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;


Agrega un campo Salario de tipo Moneda a la tabla Empleados.

ALTER TABLE Empleados DROP COLUMN Salario;


Elimina el campo Salario de la tabla Empleados.

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.

ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos;


Elimina el índice de la tabla Pedidos.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 42

12. CONSULTAS CON PARAMETROS.

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

nombre Es el nombre del parámetro

tipo Es el tipo de datos del parámetro

consulta Una consulta SQL

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:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 43

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 44

13. BASES DE DATOS EXTERNAS.

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:

FROM Tabla IN '[dBASE IV; DATABASE=C:\DBASE\DATOS\VENTAS;]';


FROM Tabla IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV;'

Acceso a una base de datos externa de Microsoft Access:


SELECT IDCliente FROM Clientes IN MISDATOS.MDB WHERE IDCliente Like 'A*';
En donde MISDATOS.MDB es el nombre de una base de datos de Microsoft Access que contiene la tabla
Clientes.

Acceso a una base de datos externa de dBASE III o IV:


SELECT IDCliente FROM Clientes IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV';
WHERE IDCliente Like 'A*';
Para recuperar datos de una tabla de dBASE III+ hay que utilizar 'dBASE III+;' en lugar de 'dBASE IV;'.

Acceso a una base de datos de Paradox 3.x o 4.x:


SELECT IDCliente FROM Clientes IN 'C:\PARADOX\DATOS\VENTAS'
'Paradox 4.x;' WHERE IDCliente Like 'A*';
Para recuperar datos de una tabla de Paradox versión 3.x, hay que sustituir 'Paradox 4.x;' por 'Paradox 3.x;'.

Acceso a una base de datos de Btrieve:


SELECT IDCliente FROM Clientes IN 'C:\BTRIEVE\DATOS\VENTAS\FILE.DDF'
'Btrieve;' WHERE IDCliente Like 'A*';
C:\BTRIEVE\DATOS\VENTAS\FILE.DDF es la ruta de acceso y nombre de archivo del archivo de definición
de datos de Btrieve.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 45

14. OMITIR LOS PERMISOS DE EJECUCION.

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:

instrucción sql WITH OWNERACCESS OPTION


SELECT Apellido, Nombre, Salario FROM Empleados ORDER BY Apellido WITH OWNERACCESS OPTION;

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 46

15. LA CLAUSULA PROCEDURE.

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:

PROCEDURE NombreConsulta Parámetro1 tipo1, .... , ParámetroN tipon ConsultaSQL

En donde:

Parte Descripción

NombreConsulta Es el nombre con se guardará la consulta en la base de datos.

Parámetro Es el nombre de parámetro o de los parámetros de dicha consulta.

tipo Es el tipo de datos del parámetro

ConsultaSQL Es la consulta que se desea grabar y ejecutar.

PROCEDURE Lista_Categorias; SELECT DISTINCTROW Nombre_Categoria, ID_Categoría FROM Categorias


ORDER BY Nombre_Categoria;
Asigna el nombre Lista_de_categorías a la consulta y la ejecuta.

PROCEDURE Resumen Fecha_Inicio DateTime, Fecha_Final DateTime; SELECT DISTINCTROW Fecha_Envio,


ID_Pedido, Importe_Pedido, Format(Fecha_Envio, "yyyy") AS Año FROM Pedidos WHERE Fecha_Envio
Between Fecha_Inicio And Fecha_Final;
Asigna el nombre Resumen a la consulta e incluye dos parámetros.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 47

16. ANEXOS.

16.1 Resolución de Problemas.

16.1.1 Buscar Información duplicada en un campo de una tabla.


Para generar este tipo de consultas lo más sencillo es utilizar el asistente de consultas de Access, editar la
sentencia SQL de la consulta y pegarla en nuestro código. No obstante, este tipo de consulta se consigue de la
siguiente forma:
SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla WHERE CampoDeBusqueda In (SELECT
CampoDeBusqueda FROM Tabla As psudónimo GROUP BY CampoDeBusqueda HAVING Count(*)1 ) ORDER
BY CampoDeBusqueda;

Un caso práctico, si deseamos localizar aquellos empleados con igual nombre y visualizar su código
correspondiente, la consulta sería la siguiente:
SELECT DISTINCTROW Empleados.Nombre, Empleados.IdEmpleado FROM Empleados WHERE
Empleados.Nombre In (SELECT Nombre FROM Empleados As Tmp GROUP BY Nombre HAVING Count(*)1)
ORDER BY Empleados.Nombre;

16.1.2 Recuperar Registros de una tabla que no contengan registros relacionados en otra.
Este tipo de consulta se emplea en situaciones tales como saber que productos no se han vendido en un
determinado periodo de tiempo,
SELECT DISTINCTROW Productos.IdProducto, Productos.Nombre FROM Productos LEFT JOIN Pedidos ON
Productos.IdProducto = Pedidos.IdProduct WHERE (Pedidos.IdProducto Is Null) AND (Pedidos.Fecha Between
#01-01-98# And #01-30-98#);
La sintaxis es sencilla, se trata de realizar una unión interna entre dos tablas seleccionadas mediante un LEFT
JOIN, establecimiendo como condición que el campo relacionado de la segunda sea Null.

16.2 Utlizar SQL desde Visual Basic


Existen dos tipos de consultas SQL: las consultas de selección (nos devuelven datos) y las consultas de acción
(aquellas que no devuelven ningún registro). Ambas pueden ser tratadas en Visual Basic pero de forma diferente.
Las consultas de selección se ejecutan recogiendo la información en un recordset previamente definido
mediante la instrucción openrecordset(), por ejemplo:
Dim SQL as String
Dim RS as recordset

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 48

SQL = "SELECT * FROM Empleados;"


Set RS=MiBaseDatos.OpenRecordSet(SQL)

Si la consulta de selección se encuentra almacenada en una consulta de la base de datos:


Set RS=MiBaseDatos.OpenRecordset("MiConsulta")
Las consultas de acción, al no devolver ningún registro, no las podemos asignar a ningún recordset, en este
caso la forma de ejecutarlas es mediante los métodos Execute y ExecuteSQL (para bases de datos ODBC), por
ejemplo:
Dim SQL as string
SQL = "DELETE * FROM Empleados WHERE Categoria = 'Ordenanza';"
MiBaseDatos.Execute SQL

16.3 Funciones de Visual Basic utilizables en una Instrucción SQL

Función Sintaxis Descripción

Now Variable= Now Devuelve la fecha y la hora actual del sistema

Date Variable=Date Devuelve la fecha actual del sistema

Time Variable=Time Devuelve la hora actual del sistema

Devuelve los cuatro dígitos correspondientes al


Year Variable=Year(Fecha)
año de Fecha

Month Variable=Month(Fecha) Devuelve el número del mes del parámetro fecha.

Devuelve el número del día del mes del parámetro


Day Variable=Day(Fecha)
fecha.

Devuelve un número entero que representa el día


Weekday Variable=Weekday(Fecha)
de la semana del parámetro fecha.

Devuelve un número entre 0 y 23 que representa


Hour Variable=Hour(Hora)
la hora del parámetro Hora.

Devuelve un número entre 0 y 59 que representa


Minute Variable=Minute(Hora)
los minutos del parámetro hora.

Devuelve un número entre 0 y 59 que representa


Second Variable=Second(Hora)
los segundos del parámetro hora.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 49

DatePart
Esta función devuelve una parte señalada de una fecha concreta. Su sintaxis es:
DatePart(Parte, Fecha, ComienzoSemana, ComienzoAño)
Parte representa a la porción de fecha que se desea obtener, los posibles valores son:

Valor Descripción

yyyy Año

q Trimestre

m Mes

y Día del año

d Día del mes

w Día de la semana

ww Semana del año

h Hora

m Minutos

s Segundos

ComienzoSemana indica el primer día de la semana. Los posibles valores son:

Valor Descripción

0 Utiliza el valor pode efecto del sistema

1 Domingo (Valor predeterminado)

2 Lunes

3 Martes

4 Miércoles

5 Jueves

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 50

6 Viernes

7 Sábado

Comienzo Año indica cual es la primera semana del año; los posibles valores son:

Valor Descripción

0 Valor del sistema

1 Comienza el año el 1 de enero (valor predeterminado).

2 Empieza con la semana que tenga al menos cuatro días en el nuevo año.

3 Empieza con la semana que esté contenida completamente en el nuevo año.

16.4 Evaluar valores antes de ejecutar la Consulta.


Dentro de una sentencia SQL podemos emplear la función iif para indicar las condiciones de búsqueda. La
sintaxis de la función iif es la siguiente:

iif(Expresion,Valor1,Valor2)
En donde Expresión es la sentencia que evaluamos; si Expresión es verdadera entonces se devuelve Valor1, si
Expresión es falsa se devuelve Valor2.

SELECT * Total FROM Empleados WHERE Apellido = iff(TX_Apellido.Text < '', TX_Apellido.Text, *) ;
Supongamos que en un formulario tenemos una casilla de texto llamanda TX_Apellido. Si cuando
ejecutamos esta consulta la casilla contiene algún valor se devuelven todos los empleados cuyo apellido
coincida con el texto de la casilla, en caso contrario se devuelven todos los empleados.

SELECT Fecha, Producto, Cantidad, (iif(CodigoPostal=28000 And


CodigoPostal <=28999,'Madrid','Nacional')) AS Destino FROM Pedidos;
Esta consulta devuelve los campos Fecha, Nombre del Producto y Cantidad de la tabla pedidos, añadiendo
un campo al final con el valor Madrid si el código postal está dentro del intervalo, en caso contario devuelve
Nacional.

16.5 Un Pequeño Manual de Estilo


Siempre es bueno intentar hacer las cosas de igual modo para que el mantenimiento y la revisión nos sea una

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 51

labor lo más sencilla posible. En lo que a mí respecta utilizo las siguientes normas a la hora de elaborar
sentencias SQL:

1. Las cláusulas siempre las escribo con Mayúsculas.


2. Los operadores lógicos de sentencias siempre con Mayúsculas.
3. Las operaciones siempre la primera letra con mayúsculas y el resto en minúsculas.
4. Los operadores lógicos incluidos en otros operadores la primera letra con mayúsculas y el resto con
minúsculas.
Los Nombres de las Tablas, Campos y Consultas, los escribo siempre la primera letra con mayúsculas y el resto
con minúsculas, en algunos casos utilizo el carácter "_" para definir mejor el nombre: Detalles_Pedidos.
Aunque con el motor Jet se pueden utilizar acentos y espacios en blanco para nombrar los campos, las tablas
y las consultas no los utilizo porque cuando se exportar tablas a otros sistemas los acentos y los espacios en
blanco pueden producir errores innecesarios.
Recuerda siempre que si utilizas espacios en blanco para llamar tablas o consultas cada vez que hagas
referencias a ellos en una consulta debes incluir sus nombres entre corchetes.
SELECT [ID de Pedido], [Nombre del Producto], Cantidad FROM [Detalles del Pedido];

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 52

Estrategias generales de optimización


✓ Utilice la ordenación de campos con moderación, especialmente con campos no indizados.
✓ Asegúrese de que las tablas de diferentes orígenes que va a combinar están indizadas o combinadas
por la clave principal.
✓ Si sus datos no se modifican con frecuencia, utilice consultas de creación de tablas para crear tablas a
partir de las hojas de respuestas dinámicas de su consulta. Utilice las tablas resultantes en lugar de
consultas como base para formularios, informes u otras consultas.
✓ Si está creando una consulta de tabla de referencias cruzadas, utilice encabezados de columna fijos
siempre que sea posible.
✓ Utilice los operadores BETWEEN...AND, IN e igual (=) en las columnas indizadas.
✓ Cuando cree una consulta, no agregue campos que no vaya a necesitar.

Optimización de consultas con la tecnología Rushmore


Rushmore es una tecnología de acceso a datos utilizada en el motor de base de datos Jet que permite la
consulta de conjuntos de registros de una forma muy eficiente. Con Rushmore, al usar determinados tipos de
expresiones en un criterio de consulta, ésta funcionará de forma mucho más rápida.

Expresiones simples optimizables


El motor de base de datos Jet puede optimizar expresiones simples en una cláusula WHERE de una instrucción
SQL SELECT. Una expresión simple optimizable puede formar una expresión entera o aparecer como parte de
una expresión.

Una expresión simple optimizable tiene uno de los siguientes formatos:


campo_indexado operador_comparación expresión
- o bien -
expresión operador_comparación campo_indexado

En una expresión simple optimizable:


campo_indexado debe ser un campo con el que se ha generado un índice.
operador_comparación debe ser uno de los operadores siguientes: <, >, =, <=, >=, <>, BETWEEN, LIKE o IN.
expresión puede ser cualquier expresión válida, incluyendo constantes, funciones y campos de otras tablas.

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*".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 53

Expresiones complejas optimizables


Microsoft Jet utiliza Rushmore para optimizar expresiones complejas creadas mediante la combinación de
expresiones simples optimizables con los operadores AND y OR. Una expresión compleja optimizable tiene uno
de los siguientes formatos:
expresión_simple AND expresión_simple
- o bien -
expresión_simple OR expresión_simple

Tenga en cuenta lo siguiente cuando utilice expresiones optimizables Rushmore:


La función COUNT(*) está muy optimizada para consultas que utilizan Rushmore.
Si el índice es descendente y el operador de comparación es diferente a igual (=), la consulta no se puede
optimizar.

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.

Diferencias entre SQL de Jet y ANSI


El lenguaje SQL del motor de base de datos Microsoft Jet generalmente se ajusta a ANSI-89 Nivel 1. Sin
embargo, algunas características del lenguaje SQL de ANSI no están implementadas en SQL de Jet. Por el
contrario, SQL de Jet incluye palabras clave y características no admitidas en SQL de ANSI.

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 54

o menor que expresión3.

Se utilizan diferentes caracteres comodines con el predicado LIKE.

Carácter coincidente Jet SQL ANSI SQL


Cualquier carácter simple ? _ (subrayado)
Cero o más caracteres * %
SQL de Jet suele ser menos restrictivo. Por ejemplo, permite agrupar y ordenar por expresiones.

Características mejoradas en SQL de Jet


SQL de Jet proporciona las siguientes características mejoradas:

✓ La instrucción TRANSFORM, que proporciona soporte para consultas de referencias cruzadas.


✓ Funciones agregadas adicionales, como StDev y VarP.
✓ La declaración PARAMETERS para definir consultas de parámetros.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 55

17. LIMITES DE SQL.

Límites de longitud del identificador


• El nombre de autorización más largo (sólo puede ser de caracteres de un solo byte) 30 Bytes
• Nombre de restricción más largo 18 Bytes
• Nombre de correlación más largo 128 Bytes
• Nombre de condición más largo 64 Bytes
• Nombre de cursor más largo 18 Bytes
• Nombre más largo de columna de fuente de datos 128 Bytes
• Nombre más largo de índice de fuente de datos 128 Bytes
• Nombre más largo de fuente de datos 128 Bytes
• Nombre más largo de tabla de fuente de datos (nombre-tabla-remota) 128 Bytes
• Nombre de programa externo más largo 8 Bytes
• Identificador del lenguaje principal más largo (1) 255 Bytes
• Identificador más largo de un usuario de fuente de datos (nombre-autorización-remota) 30 Bytes
• Nombre de etiqueta más largo 64 Bytes
• Nombre de método más largo 18 Bytes
• Nombre de parámetro más largo (2) 128 Bytes
• Palabra clave más larga para acceder a una fuente de datos 32 Bytes
• Nombre de punto de salvar más largo 128 Bytes
• Nombre de esquema más largo (3) 30 Bytes
• Nombre de servidor (seudónimo de base de datos) más largo 8 Bytes
• Nombre de variable SQL más largo 64 Bytes
• Nombre de sentencia más largo 18 Bytes
• Nombre de grupo de transformación más largo 18 Bytes
• Nombre de columna no calificada más largo 30
• Nombre de paquete no calificado más largo 8
• Nombre más largo del tipo definido por el usuario no calificado, función definida por el usuario,
agrupación de almacenamientos intermedios, espacio de tablas, grupo de nodos, desencadenante, índice o
especificación de índice 18
• Nombre más largo de tabla no calificado, nombre de vista, procedimiento almacenado, apodo o
seudónimo 128
• Nombre más largo de wrapper 128
Notas:
(1) Los compiladores de lenguaje principal individuales pueden aplicar límites más restrictivos a los nombres
de variable.
(2) En un procedimiento SQL los nombres de parámetros tienen una longitud máxima de 64 bytes.
(3) El nombre de esquema para un tipo estructurado definido por el usuario tiene una longitud máxima de 8
bytes.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 56

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 57

Límites de fecha y hora


• Valor DATE mínimo 0001-01-01
• Valor DATE máximo 9999-12-31
• Valor TIME mínimo 00:00:00
• Valor TIME máximo 24:00:00
• Valor TIMESTAMP mínimo 0001-01-01-00.00.00.000000
• Valor TIMESTAMP máximo 9999-12-31-24.00.00.000000

Límites del gestor de bases de datos


• Máximo número de columnas en una tabla (7) 1 012
• Máximo número de columnas en una vista (1) 5 000
• Longitud máxima de una fila incluyendo toda la actividad general (2)(7) 32 677
• Tamaño máximo de una tabla por partición (en gigabytes) (3)(7) 512
• Tamaño máximo de un índice por partición (en gigabytes) 512
• Número máximo de filas en una tabla por partición 4 x 109
• Clave de índice más larga incluyendo toda la actividad general (en bytes) 1 024
• Número máximo de columnas en una clave de índice 16
• Número máximo de índices en una tabla 32 767 or storage
• Número máximo de tablas de referencia en una sentencia SQL o una vista almacenamiento
• Número máximo de declaraciones de variables del lenguaje principal en un programa precompilado
(3) almacenamiento
• Número máximo de referencias de variables del lenguaje principal en una sentencia SQL 32 767
• Valor más largo de variable del lenguaje principal utilizado para operaciones de inserción o de
actualización (en bytes) 2 147 483 647
• Sentencia SQL más larga (en bytes) 65 535
• Número máximo de elementos en una lista de selección (7) 1 012
• Número máximo de predicados en una cláusula WHERE o HAVING almacenamiento
• Número máximo de columnas en una cláusula GROUP BY (7) 1 012
• Longitud total máxima de las columnas en una cláusula GROUP BY (en bytes) (7) 32 677
• Número máximo de columnas en una cláusula ORDER BY (7) 1 012
• Longitud total máxima de las columnas en una cláusula ORDER BY (en bytes) (7) 32 677
• Tamaño máximo de una SQLDA (en bytes) almacenamiento
• Número máximo de sentencias preparadas almacenamiento
• Número máximo de cursores declarados en un programa almacenamiento
• Número máximo de cursores abiertos a la vez almacenamiento
• Número máximo de tablas en un espacio de tablas SMS 65 534
• Número máximo de restricciones en una tabla almacenamiento
• Nivel máximo de anidamiento de subconsultas almacenamiento
• Número máximo de subconsultas en una sola sentencia almacenamiento
• Número máximo de valores en una sentencia INSERT (7) 1 012

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 58

• 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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 59

(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).

Límites específicos de tamaño de página del gestor de bases de datos

Descripción Límite de tamaño de página


4K 8K 16K 32K

Máximo número de columnas en una tabla 500 1012 1012 1012

Longitud máxima de una fila incluyendo toda la


4005 8101 16293 32677
actividad general

Tamaño máximo de una tabla por partición (en


64 128 256 512
gigabytes)
Tamaño máximo de un índice por partición (en
64 128 256 512
gigabytes)
Número máximo de elementos en una lista de
500 1012 1012 1012
selección
Número máximo de columnas en una cláusula
500 1012 1012 1012
GROUP BY

Longitud total máxima de las columnas en una


4005 8101 16293 32677
cláusula GROUP BY (en bytes)

Número máximo de columnas en una cláusula


500 1012 1012 1012
ORDER BY

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 60

Longitud total máxima de las columnas en una


4005 8101 16293 32677
cláusula ORDER BY (en bytes)

Número máximo de valores en una sentencia


500 1012 1012 1012
INSERT

Número máximo de cláusulas SET en una sola


500 1012 1012 1012
sentencia UPDATE

Tamaño máximo de un espacio de tablas DMS


64 128 256 512
normal (en gigabytes)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 61

18. FUNCIONES DE VISUAL BASIC.

Contenido

Funciones matemáticas ............................................................................................................................................................................... 53


Funciones matemáticas derivadas ...................................................................................................................................................... 54
Abs (Función) ....................................................................................................................................................................................................... 55
Atn (Función) ........................................................................................................................................................................................................ 55
Asc (Función) ....................................................................................................................................................................................................... 56
Chr (Función) ........................................................................................................................................................................................................ 56
Cos (Función) ....................................................................................................................................................................................................... 57
Date (Función) ..................................................................................................................................................................................................... 57
DateAdd (Función) ............................................................................................................................................................................................ 57
DateSerial (Función) ........................................................................................................................................................................................ 59
DateValue (Función) ........................................................................................................................................................................................ 60
Day (Función) ....................................................................................................................................................................................................... 60
Exp (Función) ....................................................................................................................................................................................................... 61
Hour (Función)..................................................................................................................................................................................................... 61
InputBox (Función) ........................................................................................................................................................................................... 61
InStr (Función) ..................................................................................................................................................................................................... 63
InStrRev (Función) ............................................................................................................................................................................................ 65
Int, Fix (Funciones) ........................................................................................................................................................................................... 66
IsDate (Función) ................................................................................................................................................................................................. 67
IsEmpty (Función)............................................................................................................................................................................................. 67
IsNumeric (Función) ........................................................................................................................................................................................ 68
LCase (Función) ................................................................................................................................................................................................. 68
Left (Función) ....................................................................................................................................................................................................... 69
Len (Función)........................................................................................................................................................................................................ 69
LoadPicture (Función) ................................................................................................................................................................................... 71
Log (Función) ....................................................................................................................................................................................................... 74
LTrim, Rtrim y Trim (Funciones)............................................................................................................................................................ 74
Mid (Función)........................................................................................................................................................................................................ 75

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 62

Minute (Función) ................................................................................................................................................................................................ 76


Month (Función) ................................................................................................................................................................................................. 77
MonthName (Función) ................................................................................................................................................................................... 77
MsgBox (Función) ............................................................................................................................................................................................. 77
Now (Función)...................................................................................................................................................................................................... 81
QBColor (Función) ............................................................................................................................................................................................ 81
Replace (Función) ............................................................................................................................................................................................ 82
RGB (Función) ..................................................................................................................................................................................................... 83
Right (Función) ................................................................................................................................................................................................... 85
Rnd (Función) ...................................................................................................................................................................................................... 85
Randomize (Instrucción).............................................................................................................................................................................. 86
Round (Función) ................................................................................................................................................................................................ 87
Second (Función).............................................................................................................................................................................................. 87
Sgn (Función) ...................................................................................................................................................................................................... 88
Sin (Función) ........................................................................................................................................................................................................ 88
Space (Función)................................................................................................................................................................................................. 89
Sqr (Función) ....................................................................................................................................................................................................... 89
Str (Función) ........................................................................................................................................................................................................ 90
StrComp (Función) .......................................................................................................................................................................................... 90
StrConv (Función) ............................................................................................................................................................................................ 91
String (Función) ................................................................................................................................................................................................. 93
StrReverse (Función) ..................................................................................................................................................................................... 93
Tan (Función) ...................................................................................................................................................................................................... 94
Time (Función) ................................................................................................................................................................................................... 94
Timer (Función) ................................................................................................................................................................................................. 94
TimeSerial (Función) ...................................................................................................................................................................................... 95
TimeValue (Función) ...................................................................................................................................................................................... 96
TypeName (Función) ..................................................................................................................................................................................... 96
UCase (Función) ................................................................................................................................................................................................ 98
Val (Función) ........................................................................................................................................................................................................ 98
VarType (Función) ........................................................................................................................................................................................... 99

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 63

Weekday (Función) ......................................................................................................................................................................................... 100


WeekdayName (Función) ........................................................................................................................................................................... 102
Year (Función) .................................................................................................................................................................................................... 103

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 64

Funciones matemáticas derivadas

La siguiente es una lista de funciones matemáticas no intrínsecas que pueden derivarse de funciones
matemáticas intrínsecas:

Función Derivadas equivalentes

Secante Sec(X) = 1 / Cos(X)

Cosecante Cosec(X) = 1 / Sin(X)

Cotangente Cotan(X) = 1 / Tan(X)

Seno inverso Arcsin(X) = Atn(X / Sqr(-X * X + 1))

Coseno inverso Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

Secante inversa Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) - 1) * (2 * Atn(1))

Cosecante inversa Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1))

Cotangente inversa Arccotan(X) = Atn(X) + 2 * Atn(1)

Seno Hiperbólico HSin(X) = (Exp(X) - Exp(-X)) / 2

Coseno hiperbólico HCos(X) = (Exp(X) + Exp(-X)) / 2

Tangente hiperbólica HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))

Secante hiperbólica HSec(X) = 2 / (Exp(X) + Exp(-X))

Cosecante hiperbólica HCosec(X) = 2 / (Exp(X) - Exp(-X))

Cotangente hiperbólica HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))

Seno hiperbólico inverso HArcsin(X) = Log(X + Sqr(X * X + 1))

Coseno hiperbólico inverso HArccos(X) = Log(X + Sqr(X * X - 1))

Tangente hiperbólica inversa HArctan(X) = Log((1 + X) / (1 - X)) / 2

Secante hiperbólica inversa HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)

Cosecante hiperbólica inversa HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)

Cotangente hiperbólica inversa HArccotan(X) = Log((X + 1) / (X - 1)) / 2

Logaritmo en base N LogN(X) = Log(X) / Log(N)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 65

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 66

Atn (Función)
Devuelve un tipo Double que especifica el arco tangente de un número.

Sintaxis: Atn(número)

El argumento número es un tipo Double o cualquier expresión numérica válida.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 67

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 68

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)

El argumento código car es un tipo Long que identifica a un carácter.

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 %.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 69

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 70

Date (Función)
Devuelve un tipo Variant (Date) que contiene la fecha actual del sistema.

Sintaxis: Date

Comentarios: Utilice la instrucción Date para establecer la fecha del sistema.

Ejemplo
Dim MiFecha
MiFecha = Date ' MiFecha contiene la fecha del sistema actual.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 71

DateAdd (Función)
Devuelve un valor de tipo Variant (Date) con una fecha a la que se ha agregado un intervalo de tiempo
especificado.

Sintaxis: DateAdd(intervalo, número, fecha)


La sintaxis de la función DateAdd consta de los siguientes argumentos con nombre:

Parte Descripción

Requerido. Expresión de tipo cadena (String) que contiene el intervalo de


intervalo
tiempo que se desea agregar.

Requerido. Expresión numérica con el número de intervalos que se desea


número agregar. Puede ser positiva (para obtener fechas futuras) o negativa (para
obtener fechas pasadas).

fecha Valor de tipo Variant (Date) o literal que representa la fecha en la que se
Requerido. agregó el intervalo

Valores: El argumento intervalo tiene los siguientes valores:

Valor Descripción

yyyy Año

q Trimestre

m Mes

y Día del año

d Día

w Día de la semana

ww Semana

h Hora

n Minuto

s Segundo

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 72

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 73

DateSerial (Función)
Devuelve un tipo Variant (Date) para un año, mes y día especificados.

Sintaxis: DateSerial(año, mes, día)

La sintaxis de la función DateSerial consta de los siguientes argumentos con nombre:

Parte Descripción

Se requiere; Integer. Número entre 100 y 9999, inclusive o una expresión


Año
numérica.

mes Se requiere; Integer. Cualquier expresión numérica.

día Se requiere; Integer. Cualquier expresión numérica.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 74

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 75

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 76

Exp (Función)
Devuelve un tipo Double que especifica e (la base de los logaritmos naturales) elevado a una potencia.

Sintaxis: Exp(número)

El argumento número es un tipo Double o cualquier expresión numérica válida

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 77

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 78

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.

Sintaxis: InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])

La sintaxis de la función InputBox consta de estos argumentos con nombre:

Parte Descripción

Requerido. Expresión de cadena que se muestra como mensaje en el cuadro


de diálogo. La longitud máxima de prompt es de aproximadamente 1024
caracteres, según el ancho de los caracteres utilizados. Si prompt consta de
prompt más de una línea, puede separarlos utilizando un carácter de retorno de
carro (Chr(13)), un carácter de avance de línea (Chr(10)) o una combinación
de los caracteres de retorno de carro-avance de línea (Chr(13) y Chr(10))
entre cada línea y la siguiente.

Opcional. Expresión de cadena que se muestra en la barra de título del


title cuadro de diálogo. Si omite title, en la barra de título se coloca el nombre de
la aplicación.

Opcional. Expresión de cadena que se muestra en el cuadro de texto como


default respuesta predeterminada cuando no se suministra una cadena. Si omite
default, se muestra el cuadro de texto vacío.

Opcional. Expresión numérica que especifica, en twips, la distancia en


sentido horizontal entre el borde izquierdo del cuadro de diálogo y el borde
xpos
izquierdo de la pantalla. Si se omite xpos, el cuadro de diálogo se centra
horizontalmente.

Opcional. Expresión numérica que especifica, en twips, la distancia en


sentido vertical entre el borde superior del cuadro de diálogo y el borde
ypos superior de la pantalla. Si se omite ypos, el cuadro de diálogo se coloca a
aproximadamente un tercio de la altura de la pantalla, desde el borde
superior de la misma.

Opcional. Expresión de cadena que identifica el archivo de Ayuda que se


helpfile utilizará para proporcionar ayuda interactiva para el cuadro de diálogo. Si se
especifica helpfile, también deberá especificarse context.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 79

Opcional. Expresión numérica que es el número de contexto de Ayuda


context asignado por el autor al tema de Ayuda correspondiente. Si se especifica
context, también deberá especificarse helpfile

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.

Dim Mensaje, Título, ValorPred, MiValor


Mensaje = " Introduzca un número del 1 a 3" ' Establece el mensaje.
Título = "Demostración de InputBox" ' Establece el título.
ValorPred = "1" ' Establece el valor predeterminado.
' Muestra el mensaje, el título, y el valor predeterminado.
iValor = InputBox(Mensaje, Título, ValorPred)
' Muestra el mensaje, el título y el valor predeterminado.

' MiValor = InputBox(Mensaje, Título, , , , "DEMO.HLP", 10)

‘Se muestra el diálogo en la posición 100, 100.


MiValor = InputBox(Mensaje, Título, ValorPred, 100, 100)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 80

InStr (Función)
Devuelve un tipo Variant (Long) que especifica la posición de la primera aparición de una cadena en otra.

Sintaxis: InStr([start, ]string1, string2[, compare])

La sintaxis de la función InStr tiene estos argumentos:

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.

Opcional. Especifica el tipo de comparación de cadena. Si se omite compare,


compare
el valor Option Compare determina el tipo de comparación.

Valores
Los valores del argumento compare son:

Constante Valor Descripción

Realiza una comparación con los valores de la


vbUseCompareOption 1
instrucción Option Compare.

vbBinaryCompare 0 Realiza una comparación binaria.

vbTextCompare 1 Realiza una comparación textual.

Sólo para Microsoft Access. Realiza una


vbDatabaseCompare 2 comparación basada en la información en las bases
de datos.

Valores devueltos

Si La función InStr devuelve

string1 es de longitud cero 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 81

string1 es Null Null

string2 es de longitud cero Start

string2 es Null Null

string2 no se encontró 0

Posición en la que se halla la


string2 se encontró dentro de string1
coincidencia

start > string2 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.

Dim SearchString, SearchChar, MyPos


SearchString ="XXpXXpXXPXXP" ' Cadena en la que se busca.
SearchChar = "P" ' Se busca "P".

Una comparación textual que comienza en la posición 4.


Devuelve 6. MyPos = Instr(4, SearchString, SearchChar, 1)
Una comparación binaria que comienza en la posición 1.
Devuelve 9. MyPos = Instr(1, SearchString, SearchChar, 0)

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 82

InStrRev (Función)
Devuelve la posición de una aparición de una cadena dentro de otra, desde el final de la cadena.

Sintaxis: InstrRev(cadena1, cadena2[, inicio[, comparar]])

La sintaxis de la función InstrRev consta de las siguientes partes:

Parte Descripción

cadena1 Requerido. Expresión de cadena en la que se busca.

cadena2 Requerido. Expresión de cadena que se busca.

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á

cuando se evalúen subcadenas. Si se omite, se realiza una comparación binaria.


Comparar
Vea la sección Valores para consultar los valores posibles.

Valores
El argumento comparar puede tener los valores siguientes:

Constante Valor Descripción

Realizar una comparación utilizando el valor de la


vbUseCompareOption 1
instrucción Option Compare.

vbBinaryCompare 0 Realizar una comparación binaria.

vbTextCompare 1 Realiza una comparación basada en el texto.

Sólo para Microsoft Access. Realizar una comparación


vbDatabaseCompare 2
basada en la información de su base de datos

Valores de retorno

InStrRev devuelve los valores siguientes:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 83

Si I nStrRev devuelve

cadena1 es de longitud cero 0

cadena1 es Null Null

cadena2 es de longitud cero Inicio

cadena2 es Null Null

cadena2 no se encuentra 0

cadena2 se encuentra dentro de La posición en la que se encuentra la


cadena1 coincidencia

inicio > Len(cadena2) 0

Comentarios

Observe que la sintaxis para la función InstrRev no es la misma que la sintaxis para la función Instr.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 84

Int, Fix (Funciones)


Devuelve la parte entera de un número.

Sintaxis: Int(número) , Fix(número)

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.

La función Fix(número) es equivalente a:

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 85

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 86

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 87

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 88

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".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 89

Left (Función)
Devuelve un tipo Variant (String) que contiene un número especificado de caracteres del lado izquierdo de
una cadena.

Sintaxis: Left(string, length)

La sintaxis de la función Left tiene estos argumentos con nombre:

Parte Descripción

Requerido. Expresión de cadena de la cual se devuelven los caracteres que


string
están más a la izquierda. Si string contiene Null, se devuelve Null.

Requerido, un tipo Variant (Long). Expresión numérica que indica cuántos


caracteres se van a devolver. Si es 0, devuelve una cadena de longitud cero ("").
length
Si es mayor o igual al número de caracteres en string, se devuelve la cadena
entera.

Comentarios: Para determinar el número de caracteres en string, utilice la función Len.


Nota: Utilice la función LeftB con datos de byte contenidos en una cadena. En lugar de especificar el número de
caracteres que se van a devolver, length especifica el número de bytes.

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".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 90

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.

Sintaxis: Len(cadena | nombrevar)

La sintaxis de la función Len consta de las siguientes partes:

Parte Descripción

Cualquier expresión de cadena válida. Si cadena contiene Null, se devuelve


cadena
Null.

Cualquier nombre de variable válido. Si nombrevar contiene Null, se devuelve


Nombrevar Null. Si nombrevar es un tipo Variant, Len actúa igual que con un tipo String y
siempre devuelve el número de caracteres que contiene.

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.

Type RegistroCliente ' Define un tipo definido por el usuario.


ID As Integer ' Incluye esta definición en
Name As String * 10 ' un módulo estándar.
Address As String * 30

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 91

End Type

Dim Customer As RegistroCliente ' Declara variables.


Dim MiEntero As Integer, MyCur As Currency
Dim MiCadena, MiLong
MiCadena = "Hola a todos" ' Inicializa la cadena.
MiLong = Len(MiEntero) ' Devuelve 2.
MiLong = Len(Customer) ' Devuelve 42.
MiLong = Len(MiCadena) ' Devuelve 11.
MiLong = Len(MyCur) ' Devuelve 8

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.

Function LenMbcs (ByVal str as String)


LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function

Dim MiCadena, MyLen


MiCadena = "ABc"
' Donde "A" y "B" son DBCS y "c" es SBCS.
MyLen = Len(MyString)
' Devuelve 3 - 3 caracteres en la cadena.
MyLen = LenB(MyString)
' Devuelve 6 - 6 bytes en Unicode.
MyLen = LenMbcs(MiCadena)
' Devuelve 5 - 5 bytes en ANSI.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 92

LoadPicture (Función)
Carga un gráfico en un objeto Picture, un control PictureBox o un control Image.

Sintaxis: LoadPicture([nombreArchivo], [tamaño], [profundidadColor],[x,y])

La sintaxis de la función LoadPicture consta de las siguientes partes:

Parte Descripción

Opcional. Expresión de cadena que indica un nombre de archivo.


nombreArchivo Puede incluir carpetas y unidades. Si no se indica un nombre de
archivo LoadPicture borra el control Image o PictureBox.

Tipo Variant opcional. Si nombreArchivo es un cursor o un


Tamaño
archivo de icono, indica el tamaño de imagen deseado.

Tipo Variant opcional. Si nombreArchivo es un archivo de cursor


profundidadColor
o icono, indica la profundidad de color deseada

Tipo Variant opcional, necesario si se usa y. Si nombreArchivo es


un archivo de cursor o icono, indica el ancho deseado. En un
archivo que contenga múltiples imágenes, se usa la mejor
x
coincidencia si no hay disponible una imagen de ese tamaño. Los
valores X e y sólo se usan cuando profundidadColor es
vbLPCustom. Para archivos de iconos 255 es el valor máximo.

Tipo Variant opcional, necesario si se usa x. Si nombreArchivo es


un archivo de cursor o icono, indica el alto deseado. En un
y archivo que contenga múltiples imágenes, se usa la mejor
coincidencia si no hay disponible una imagen de ese tamaño.
Para archivos de iconos 255 es el valor máximo.

Valores
Los valores para tamaño son:

Constante Valor Descripción

vbLPSmall 0 Icono pequeño del sistema.

vbLPLarge 1 Icono grande del sistema, determinado por el controlador

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 93

de vídeo.

vbLPSmallShell 2 Tamaño del icono pequeño de Ayuda, determinado


por el tamaño establecido para los títulos de los
botones en la ficha Apariencia en el cuadro de diálogo
Propiedades de la pantalla del Panel de control.

vbLPLargeShell 3 Tamaño del icono grande de Ayuda, determinado por la


ficha Apariencia en el cuadro de diálogo Propiedades de
la pantalla del Panel de control.

vbLPCustom 4 Tamaño predeterminado, valores proporcionados por los


argumentos x e y

Los valores para profundidadColor son:

Constante Valor Descripción

vbLPDefault 0 Mejor coincidencia si se usa el archivo especificado.

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:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 94

Set Form1.Icon = LoadPicture("MIICONO.ICO")

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")

Ejemplo: Ejemplo de la propiedad LoadPicture


Este ejemplo usa la función LoadPicture para cargar una imagen en un control PictureBox y para borrar la
imagen del control. Para probar este ejemplo, agregue un control PictureBox a un objeto Form, pegue el
código en la sección Declaraciones del objeto Form y después ejecute el ejemplo y haga clic en el formulario.

Private Sub Form_Click ()


Dim Msg as String ' Declara variables.
On Error Resume Next ' Establece el tratamiento de errores.
Height = 3990
Width = 4890 ' Define el alto y el ancho.
Picture1.Picture = LoadPicture("PAPEL.CUR", vbLPCustom, vbLPColor,
32, 32) ' Carga un cursor.
If Err Then
Msg = "Imposible encontrar el archivo .cur."
MsgBox Msg ' Presenta el mensaje de error.
Exit Sub ' Sale si hay error.
End If
Msg = "Elija "Aceptar" para borrar el mapa de bits del cuadro de imagen."
MsgBox Msg
Picture1.Picture = LoadPicture() 'vacía el cuadro de imagen.
End Sub

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 95

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.

Comentarios: El logaritmo natural es el logaritmo en base e. El valor de la constante e es 2.718282


aproximadamente.
Puede calcular logaritmos en base-n para cualquier número x dividiendo el logaritmo natural de x por el
logaritmo natural de n de la siguiente manera:
Logn(x) = Log(x) / Log(n)

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))

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 96

LTrim, Rtrim y Trim (Funciones)


Devuelve un tipo Variant (String) que contiene una copia de una cadena determinada sin espacios a la
izquierda (LTrim), sin espacios a la derecha (RTrim) o sin espacios ni a la derecha ni a la izquierda (Trim).

Sintaxis: LTrim(cadena), RTrim(cadena), Trim(cadena)

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->".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 97

Mid (Función)
Devuelve un tipo Variant (String) que contiene un número especificado de caracteres de una cadena.

Sintaxis: Mid(string, start[, length])

La sintaxis de la función Mid tiene estos argumentos con nombre:

Parte Descripción

Requerido. Expresión de cadena de la cual se devuelven los caracteres. Si


string
string contiene Null, se devuelve Null.

Requerido; un tipo Long. Posición de carácter en string en la cual comienza la


start parte que se quiere tomar. Si start es mayor que el número de caracteres en
la string, Mid devuelve una cadena de longitud cero ("").

Requerido; un tipo Variant (Long). Número de caracteres que se van a


devolver. Si se omite o en el texto hay menos de length caracteres
length
(incluyendo el carácter de start), se devuelven todos los caracteres desde la
posición de start hasta el final de la cadena.

Comentarios: Para determinar el número de caracteres en string, utilice la función Len.

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.

Dim MiCadena, PrimeraPalabra, UltimaPalabra, PalabraMedia


MiCadena = "Demostración función Mid" ' Crea la cadena de texto.
PrimeraPalabra = Mid(MiCadena, 1, 12) ' Devuelve "Demostración".
UltimaPalabra = Mid(MiCadena, 21, 3) ' Devuelve "Mid".
PalabraMedia = Mid(MiCadena, 14) ' Devuelve "función Mid".

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 98

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"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 99

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.

Dim MiTiempo, MiMinuto


MiTiempo = #4:35:17 PM# ' Asigna una hora.
MiMinuto = Minute(MiTiempo) ' MiMinuto contiene 35.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 100

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 101

MonthName (Función)
Devuelve una cadena que indica el mes especificado.

Sintaxis: MonthName(mes [, abreviar])

La sintaxis de la función MonthName consta de las siguientes partes:

Parte Descripción

Requerido. La designación numérica del


mes mes. Por ejemplo, enero es 1, febrero es 2,
etcétera.

Opcional. El valor Boolean que indica si se


va a abreviar el nombre del mes. Si se
abreviar omite, el valor predeterminado es False,
que significa que el nombre del mes no se
abrevia.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 102

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.

Sintaxis: MsgBox(prompt[, buttons][, title][, helpfile, context])

La sintaxis de la función MsgBox consta de estos argumentos con nombre:

Parte Descripción

Requerido. Expresión de cadena que representa el prompt


en el cuadro de diálogo. La longitud máxima de prompt es
de aproximadamente 1024 caracteres, según el ancho de
los caracteres utilizados. Si prompt consta de más de una
prompt línea, puede separarlos utilizando un carácter de retorno
de carro (Chr(13)) o un carácter de avance de línea
(Chr(10)), o una combinación de caracteres de retorno de
carro – avance de línea (Chr(13) y Chr(10)) entre cada
línea y la siguiente.

Opcional. Expresión numérica que corresponde a la suma


de los valores que especifican el número y el tipo de los
botones que se pretenden mostrar, el estilo de icono que
buttons
se va a utilizar, la identidad del botón predeterminado y la
modalidad del cuadro de mensajes. Si se omite este
argumento, el valor predeterminado para buttons es 0.

Opcional. Expresión de cadena que se muestra en la barra


title de título del cuadro de diálogo. Si se omite title, en la
barra de título se coloca el nombre de la aplicación.

Opcional. Expresión de cadena que identifica el archivo de


Ayuda que se utiliza para proporcionar ayuda interactiva
helpfile
en el cuadro de diálogo. Si se especifica helpfile, también
se debe especificar context.

Opcional. Expresión numérica que es igual al número de


contexto de Ayuda asignado por el autor al tema de
context
Ayuda correspondiente. Si se especifica context, también
se debe especificar helpfile.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 103

Valores
El argumento buttons tiene estos valores:

Constante Valor Descripción

VbOKOnly 0 Muestra solamente el botón Aceptar.

VbOKCancel 1 Muestra los botones Aceptar y Cancelar.

VbAbortRetryIgnore 2 Muestra los botones Anular, Reintentar e Ignorar.

VbYesNoCancel 3 Muestra los botones Sí, No y Cancelar.

VbYesNo 4 Muestra los botones Sí y No.

VbRetryCancel 5 Muestra los botones Reintentar y Cancelar.

VbCritical 16 Muestra el icono de mensaje crítico.

VbQuestion 32 Muestra el icono de pregunta de advertencia.

VbExclamation 48 Muestra el icono de mensaje de advertencia.

VbInformation 64 Muestra el icono de mensaje de información.

VbDefaultButton1 0 El primer botón es el predeterminado.

VbDefaultButton2 256 El segundo botón es el predeterminado.

VbDefaultButton3 512 El tercer botón es el predeterminado.

VbDefaultButton4 768 El cuarto botón es el predeterminado.

Aplicación modal; el usuario debe responder al cuadro


VbApplicationModal 0 de mensajes antes de poder seguir trabajando en la
aplicación actual.

Sistema modal; se suspenden todas las aplicaciones


VbSystemModal 4096
hasta que el usuario responda al cuadro de mensajes.

VbMsgBoxHelpButton 16384 Agrega el botón Ayuda al cuadro de mensaje.

Especifica la ventana del cuadro de mensaje como la


VbMsgBoxSetForeground 65536
ventana de primer plano.

VbMsgBoxRight 524288 El texto se alínea a la derecha.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 104

Especifica que el texto debe aparecer para ser leído de


VbMsgBoxRtlReading 1048576
derecha a izquierda en sistemas hebreo y árabe.

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

Constante Valor Descripción

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 105

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.

Dim Mensaje, Estilo, Título, Ayuda, Ctxt, Respuesta, MiCadena


Mensaje = "¿Desea continuar?" ' Define el mensaje.
Estilo = vbYesNo + vbCritical + vbDefaultButton2 ' Define los botones.
Título = "Demostración de MsgBox" ' Define el título.
Ayuda = "DEMO.HLP" ' Define el archivo de ayuda.
Ctxt = 1000 ' Define el tema
' el contexto
' Muestra el mensaje.
Respuesta = MsgBox(Mensaje, Estilo, Título, Ayuda, Ctxt)
If Respuesta = vbYes Then ' El usuario eligió el botón Sí.
MiCadena = "Sí" ' Ejecuta una acción.
Else ' El usuario eligió el botón No.
MiCadena = "No" ' Ejecuta una acción.
End If

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 106

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 107

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:

Número Color Número Color

0 Negro 8 Gris

1 Azul 9 Azul claro

2 Verde 10 Verde claro

3 Aguamarina 11 Aguamarina claro

4 Rojo 12 Rojo claro

5 Fucsia 13 Fucsia claro

6 Amarillo 14 Amarillo claro

7 Blanco 15 Blanco brillante

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 108

Replace (Función)
Devuelve una cadena en la que se reemplazó una subcadena especificada con otra subcadena un número
especificado de veces.

Sintaxis: Replace(expresión, encontrar, reemplazarCon [, inicio[, contar[, comparar]]])

La sintaxis de la función Replace consta de las siguientes partes:

Parte Descripción

Requerido. Una expresión de cadena que contiene la subcadena que


expresión
reemplazar.

encontrar Requerido. La subcadena que se busca.

reemplazarCon Requerido. La subcadena de sustitución.

Opcional. La posición dentro de la expresión donde se empezará a buscar


inicio
la subcadena. Si se omite, se supone que es 1.

Opcional. El número de sustituciones de subcadenas que se realizarán. Si


contar se omite, el valor predeterminado es –1, que significa que se hagan todas
las sustituciones posibles.

Opcional. El valor númerico que indica la clase de comparación que se


comparar realizará cuando se evalúen las subcadenas. Vea la sección Valores para
consultar los valores posibles.

Valores
El argumento comparar puede tener los valores siguientes:

Constante Valor Descripción

Realizar una comparación


vbUseCompareOption 1 utilizando el valor de la
instrucción Option Compare.

Realiza una comparación


vbBinaryCompare 0
binaria.

vbTextCompare 1 Realizar una comparación

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 109

basada en el texto.

Sólo para Microsoft Access.


Realizar una comparación
vbDatabaseCompare 2
basada en la información de su
base de datos.

Valores de retorno
La función Replace devuelve los valores siguientes:

Si Reemplazar devuelve

expresión es de longitud cero Una cadena de longitud cero ("").

expresión es Null Un error.

encontrar es de longitud cero Una copia de expresión.

Una copia de expresión con todas las


Reemplazar Con es de longitud cero
apariciones de encontrar quitadas.

inicio > Len(expresión) Una cadena de longitud cero.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 110

RGB (Función)
Devuelve un número entero tipo Long que representa un valor de color RGB.

Sintaxis: RGB(red, green, blue)

La sintaxis de la función RGB consta de los siguientes argumentos:

Parte Descripción

Obligatorio. tipo Variant (Integer). Número en el intervalo de 0-255, ambos


red
inclusive, que representa el componente rojo del color.

Obligatorio; tipo Variant (Integer). Número en el intervalo de 0-255, ambos


green
inclusive, que representa el componente verde del color.

Obligatorio; tipo Variant (Integer). Número en el intervalo de 0-255, ambos


blue
inclusive, que representa el componente azul del color

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:

Color Valor de rojo Valor de verde Valor de azul

Negro 0 0 0

Azul 0 0 255

Verde 0 255 0

Cián 0 255 255

Rojo 255 0 0

Magenta 255 0 255

Amarillo 255 255 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 111

Blanco 255 255 255

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.

Dim Rojo, I, ValorRGB, MiObjeto


Red = RGB(255, 0, 0) ' Devuelve el valor de Rojo.
I = 75 ' Inicializa un desplazamiento.
ValorRGB = RGB(I, 64 + I, 128 + I) ' Igual que RGB(75, 139, 203).
MiObjeto.Color = RGB(255, 0, 0) ' Establece la propiedad Color de MiObjeto a Rojo.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 112

Right (Función)
Devuelve un tipo Variant (String) que contiene un número especificado de caracteres del lado derecho de
una cadena.

Sintaxis: Right(string, lenght)

La sintaxis de la función Right tiene estos argumentos con nombre:

Parte Descripción

Requerido. Expresión de cadena desde la cual se devuelven los


string caracteres que están más a la derecha. Si string contiene Null, se
devuelve Null.

Requerido, un tipo Variant (Long). Expresión numérica que indica cuántos


caracteres se van a devolver. Si es 0, se devuelve una cadena de longitud
lenght
cero (""). Si es mayor o igual al número de caracteres en string, se
devuelve la cadena completa.

Comentarios: Para determinar el número de caracteres en string, utilice la función Len.

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".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 113

Rnd (Función)
Devuelve un tipo Single que contiene un número aleatorio.

Sintaxis: Rnd[(número)]

El argumento opcional número es un tipo Single o cualquier expresión numérica válida.

Valores devueltos

Si número es Rnd genera

El mismo número todas las veces, utilizando número como


Menor que cero
valor de semilla.

Mayor que cero El siguiente número aleatorio de la secuencia.

Igual a cero El número generado más recientemente.

No se especifica El siguiente número aleatorio de la secuencia

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.

Para producir enteros aleatorios en un intervalo dado, use esta fórmula:


Int((Límite_superior - límite_inferior + 1) * Rnd + límite_inferior)
Aquí, límite_superior es el número mayor del intervalo y límite_inferior es el número menor del intervalo.
Nota: Para repetir secuencias de números aleatorios, llame a la función Rnd con un argumento negativo
antes de utilizar la funció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: En este ejemplo se utiliza la función Rnd para generar un valor entero aleatorio de 1 a 6. Dim MiValor

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 114

MiValor = Int((6 * Rnd) + 1) ' Genera un valor aleatorio entre 1 y 6.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 115

Randomize (Instrucción)
Inicializa el generador de números aleatorios.

Sintaxis: Randomize [número]

El argumento opcional número es un tipo Variant o cualquier expresión numérica válida.

Comentarios: La instrucción Randomize utiliza número para inicializar el generador de números


aleatorios de la función Rnd y le asigna un nuevo valor de semilla. Si omite número, el valor devuelto
por el reloj del sistema se usa como el nuevo valor de semilla.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 116

Round (Función)
Devuelve un número redondeado en el número especificado de lugares decimales.

Sintaxis: Round(expresión [, númLugaresDecimales])

La sintaxis de la función Round consta de las siguientes partes:

Parte Descripción

expresión Requerido. La expresión numérica que se redondea.

Opcional. Un número que indica cuántos lugares a la


númLugaresDecimales derecha del decimal se incluyen en el redondeo. Si se
omite, la función Round devuelve enteros.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 117

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 118

Sgn (Función)
Devuelve un tipo Variant (Integer) que indica el signo de un número.

Sintaxis: Sgn(número)

El argumento número puede ser cualquier expresión numérica válida.

Valores devueltos

Si número es Sgn devuelve

Mayor que cero 1

Igual a cero 0

Menor que cero - 1

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 119

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.

El resultado entra dentro del intervalo -1 a 1.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 120

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"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 121

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 122

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.

Comentarios: Cuando los números se convierten a cadenas, siempre se reserva un espacio a la


izquierda para el signo del número. Si número es positivo, la cadena devuelta contiene un espacio a
la izquierda y el signo más se da por supuesto.

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".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 123

StrComp (Función)
Devuelve un tipo Variant (Integer) que indica el resultado de una comparación de cadena.

Sintaxis: StrComp(string1, string2[, compare])

La sintaxis de la función StrComp tiene estos argumentos con nombre:

Parte Descripción

string1 Requerido. Cualquier expresión de cadena válida.

string2 Requerido. Cualquier expresión de cadena válida.

Opcional. Especifica el tipo de comparación de cadena. Si el argumento


compare
compare es nulo el valor de Option Compare determina el tipo de comparación.

Valores
Los valores de la instrucción compare son los siguientes:

Constante Valor Descripción

Realiza una comparación con los valores de la


vbUseCompareOption 1
instrucción Option Compare.

vbBinaryCompare 0 Realiza una comparación binaria.

vbTextCompare 1 Realiza una comparación textual.

Sólo para Microsoft Access. Realiza una


vbDatabaseCompare 2 comparación basada en la información en las
bases de datos.

Valores devueltos
La función StrComp devuelve los siguientes valores:

Si La función StrComp devuelve

string1 es menor que string2 - 1

string1 es igual a string2 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 124

string1 es mayor que string2 1

string1 o string2 es Null Null

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 125

StrConv (Función)
Devuelve un tipo Variant (String) que se convierte como se especifica.

Sintaxis: StrConv(string, conversion, LCID)

La sintaxis de la función StrConv tiene estos argumentos con nombre:

Parte Descripción

string Requerido.Expresión de cadena que se va a convertir.

Requerido. Un tipo Integer. La suma de los valores que especifica el tipo


Conversion
de conversión que se va a realizar.

Opcional. La LocaleID, si es diferente de la LocaleID del sistema. (La


LCID
LocaleID del sistema es la predeterminada.)

Valores
Los valores del argumento conversión son:

Constante Valor Descripción

vbUpperCase 1 Convierte la cadena a caracteres en mayúscula.

vbLowerCase 2 Convierte la cadena a caracteres en minúscula.

Convierte a mayúscula la primera letra de cada palabra


vbProperCase 3
de la cadena.

Convierte los caracteres cortos (un único byte) de la


vbWide* 4*
cadena a caracteres anchos (doble byte).

Convierte los caracteres anchos (doble byte) de la cadena


vbNarrow* 8*
a caracteres cortos (un único byte).

Convierte los caracteres Hiragana de la cadena a


vbKatakana** 16**
caracteres Katakana.

Convierte los caracteres Katakana de la cadena a


vbHiragana** 32**
caracteres Hiragana.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 126

Convierte la cadena a Unicode utilizando la página de


vbUnicode 64
códigos predeterminada del sistema.

Convierte la cadena de Unicode a la página de códigos


vbFromUnicode 128
predeterminada del sistema.

*Se aplica a las configuraciones regionales del Lejano Oriente.


**Se aplica solamente a Japón.

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 "

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 127

String (Función)
Devuelve un tipo Variant (String) que contiene una cadena de caracteres que se repite de la longitud
especificada.

Sintaxis: String(number, character)

La sintaxis de la función String tiene estos argumentos con nombre:

Parte Descripción

Requerido; un tipoLong. Longitud de la cadena devuelta. Si número


number
contieneNull, se devuelve Null.

Requerido; un tipoVariant.Código de carácter que especifica el carácter o


character laexpresión de cadena cuyo primer carácter se utiliza para construir la
cadena devuelta. Si carácter contiene Null, se devuelve Null.

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".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 128

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 129

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 130

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 131

Timer (Función)
Devuelve un tipo Single que representa el número de segundos transcurridos desde la medianoche.

Sintaxis: Timer

Comentarios: En Microsoft Windows la función Timer devuelve partes fraccionales de un segundo.

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.

Dim TiempoPausa, Inicio, Final, TiempoTotal


If (MsgBox("Presione Sí para parar 5 segundos", 4)) = vbYes Then
TiempoPausa = 5 ' Asigna hora de inicio.
Inicio = Timer ' Establece la hora de inicio.
Do While Timer < Inicio + TiempoPausa
DoEvents ' Cambia a otros procesos.
Loop
Final = Time ' Asigna hora de finalización.
TiempoTotal = Final - Inicio ' Calcula tiempo total.
MsgBox "Detenida durante " & TiempoTotal & " segundos"
Else
End
End If

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 132

TimeSerial (Función)
Devuelve un tipo Variant (Date) que contiene la hora actual para una hora, minuto y segundo específicos.

Sintaxis: TimeSerial(hora, minuto, segundo)

La sintaxis de la función TimeSerial consta de los siguientes argumentos con nombre:

Parte Descripción

Requerido; Variant (Integer). Número entre 0 (12:00 a.m.) y 23 (11:00 p.m.),


hora
inclusive o una expresión numérica

minuto Requerido; Variant (Integer). Cualquier expresión numérica.

segundo Requerido; Variant (Integer). Cualquier expresión numérica.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 133

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 134

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:

Cadena devuelta La variable contiene

tipo de objeto Un objeto cuyo tipo es tipo objeto

Byte Un valor byte

Integer Un entero

Long Un entero largo

Single Un número de punto flotante de precisión simple

Double Un número de punto flotante de precisión doble

Currency Un valor de moneda

Decimal Un valor decimal

Date Un valor fecha

String Una cadena

Boolean Un valor booleano

Error Un valor de error

Empty No inicializado

Null Datos no válidos

Object Un objeto

Desconocido Un objeto cuyo tipo es desconocido

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 135

Una variable de que no hace referencia a un


Nothing
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()".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 136

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".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 137

Val (Función)
Devuelve los números contenidos en una cadena como un valor numérico del tipo adecuado.

Sintaxis: Val(cadena)

El argumento obligatorio cadena es cualquier expresión de cadena válida.

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.

Lo siguiente devuelve el valor 1615198: Val(" 1615 198 Calle N.E.")

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 138

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

Constante Valor Descripción

vbEmpty 0 Empty (no inicializado)

vbNull 1 Null (datos no válidos)

vbInteger 2 Entero

vbLong 3 Entero largo

Un número de coma flotante de


vbSingle 4
precisión simple

Un número de coma flotante de


vbDouble 5
precisión doble

vbCurrency 6 Valor de moneda

vbDate 7 Valor de fecha

vbString 8 Cadena

vbObject 9 Objeto

vbError 10 Valor de error

vbBoolean 11 Valor booleano

Variant (utilizada solamente con


vbVariant 12
matrices de variantes)

vbDataObject 13 Un objeto de acceso a datos

vbDecimal 14 Valor decimal

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 139

vbByte 17 Valor de byte

Variantes que contienen tipos definidos


vbUserDefinedType 36
por el usuario

vbArray 8192 Matriz

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 140

Weekday (Función)
Devuelve un valor de tipo Variant (Integer) que contiene un número entero que representa el día de la semana.

Sintaxis: Weekday(fecha, [primer día semana])

La sintaxis de la función Weekday consta de los siguientes argumentos con nombre:

Parte Descripción

Requerido. Variant, expresión numérica, expresión de tipo cadena


fecha o cualquier combinación que puede representar una fecha. Si
fecha contiene Null, la función devolverá Null

Opcional. Una constante que especifica el primer día de la


Primer día semana
semana. Si no se especifica, se asume el valor vbSunday

Valores
El argumento primer día semana tiene estos valores:

Constante Valor Descripción

Utilice configuración de la API de


vbUseSystem 0
NLS.

vbSunday 1 Domingo (predeterminado)

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:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 141

Constante Valor Descripción

vbSunday 1 Domingo

vbMonday 2 Lunes

vbTuesday 3 Martes

vbWednesday 4 Miércoles

vbThursday 5 Jueves

vbFriday 6 Viernes

vbSaturday 7 Sábado

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 142

WeekdayName (Función)
Devuelve una cadena que indica el día de la semana especificado.

Sintaxis: WeekdayName(día De La Semana, abreviar, primer Día De La Semana)

La sintaxis de la función WeekdayName consta de las siguientes partes:

Parte Descripción

Requerido. La designación numérica para el día de la


Día De La Semana semana. El valor numérico de cada día depende de la
configuración del valor primer Día De La Semana

Opcional. Un valor Boolean que indica si se abrevia el


nombre del día de la semana. Si se omite, el valor
abreviar
predeterminado es False, que significa que el nombre del
día de la semana no se abrevia

Opcional. Un valor numérico que indica el primer día de la


Primer Día De La Semana semana. Vea la sección Valores para consultar los valores
posibles.

Valores
El argumento primer Día De La Semana puede tener los valores siguientes:

Constante Valor Descripción

Utilizar la configuración de la API National


vbUseSystem 0
Language Support (NLS).

vbSunday 1 Domingo (predeterminado).

vbMonday 2 Lunes.

vbTuesday 3 Martes.

vbWednesday 4 Miércoles.

vbThursday 5 Jueves.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 143

vbFriday 6 Viernes.

vbSaturday 7 Sábado

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 144

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 145

19. FUNCION DE FORMATO.

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.

Opcional. Una expresión de formato con nombre o


Formato
definida por el usuario válida.
Opcional. Una constante que especifica el primer día de la
Primer día de la semana semana.

Opcional. Una constante que especifica la primera


Primera Semana Del Año
semana del año.

Ajustes
El argumento del primer día de la semana tiene esta configuración.

Constante Valor Descripción


vbUseSystem 0 Utilice la configuración de la API de NLS.
vbSunday 1 Domingo (predeterminado)
vbMonday 2 Lunes
vbTuesday 3 martes
vbWednesday 4 miércoles
vbThursday 5 jueves
vbFriday 6 Viernes
vbSaturday 7 sábado

El argumento de la primera semana del año tiene esta configuración.

Constante Valor Descripción


vbUseSystem 0 Utilice la configuración de la API de NLS.

vbFirstJan1 1 Comenzar con la semana en la que ocurre el 1 de enero


(predeterminado).

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 146

Comience con la primera semana que tenga al menos


vbFirstFourDays 2
cuatro días en el año.
vbFirstFullWeek 3 Comience con la primera semana completa del año.

Observaciones

Formatear Hacer esto


Utilice formatos numéricos con nombre predefinidos o cree
Números
formatos numéricos definidos por el usuario.
Utilice formatos de fecha/hora con nombre predefinidos o
Fechas y horas
cree formatos de fecha/hora definidos por el usuario.
Números de serie de
fecha y hora Utilice formatos de fecha y hora o formatos numéricos.
Instrumentos de Cree sus propios formatos de cadena definidos por el
cuerda usuario.

El formato trunca el format a 257 caracteres.


Si intenta dar formato a un número sin especificar format , Format proporciona una funcionalidad similar a la
función Str , aunque tiene reconocimiento internacional. Sin embargo, los números positivos formateados como
cadenas mediante Format no incluyen un espacio inicial reservado para el signo del valor; aquellos convertidos
usando Str retienen el espacio inicial.

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.

Si el calendario es gregoriano, el significado de los símbolos de expresión de formato no cambia. Si el calendario


es Hijri, todos los símbolos de formato de fecha (por ejemplo, dddd , mmmm , yyyy ) tienen el mismo significado
pero se aplican al calendario Hijri. Los símbolos de formato permanecen en inglés; los símbolos que dan como
resultado la visualización de texto (por ejemplo, AM y PM) muestran la cadena (inglés o árabe) asociada con ese
símbolo. El rango de ciertos símbolos cambia cuando el calendario es Hijri.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 147

Símbolos de fecha

Símbolo Rango

d 1-31 (Día del mes, sin cero inicial)

dd 01-31 (Día del mes, con cero inicial)


w 1-7 (Día de la semana, empezando por el domingo = 1)
1-53 (semana del año, sin cero inicial; la semana 1 comienza el 1
ww
de enero)
m 1-12 (mes del año, sin cero inicial, comenzando en enero = 1)
01-12 (Mes del año, con un cero inicial, comenzando en enero =
mm
01)
Muestra los nombres de los meses abreviados (los nombres de
mmm
los meses de Hijri no tienen abreviaturas)
mmmm Muestra los nombres completos de los meses
y 1-366 (Día del año)
yy 00-99 (Últimos dos dígitos del año)
yyyy 100-9999 (año de tres o cuatro dígitos)

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,

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 148

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.

Dim MyTime, MyDate, MyStr


MyTime = #17:04:23#
MyDate = #January 27, 1993#

' 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")

MyStr = Format(MyTime, "h:m:s") ' Returns "17:4:23".


MyStr = Format(MyTime, "hh:mm:ss am/pm") ' Returns "05:04:23 pm".
MyStr = Format(MyTime, "hh:mm:ss AM/PM") ' Returns "05:04:23 PM".
MyStr = Format(MyDate, "dddd, mmm d yyyy") ' Returns "Wednesday, Jan 27 1993".
' If format is not supplied, a string is returned.
MyStr = Format(23) ' Returns "23".

' User-defined formats.


MyStr = Format(5459.4, "##,##0.00") ' Returns "5,459.40".
MyStr = Format(334.9, "###0.00") ' Returns "334.90".
MyStr = Format(5, "0.00%") ' Returns "500.00%".
MyStr = Format("HELLO", "<") ' Returns "hello".
MyStr = Format("This is it", ">") ' Returns "THIS IS IT".

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 149

Diferentes formatos para diferentes valores numéricos


Una expresión de formato definida por el usuario para números puede tener de una a cuatro secciones
separadas por punto y coma. Si el argumento de formato contiene uno de los formatos numéricos mencionados,
solo se permite una sección.

Si utiliza El resultado es

Solo una sección La expresión de formato se aplica a todos los valores.

La primera sección se aplica a valores positivos y ceros, la


Dos secciones
segunda a valores negativos.
La primera sección se aplica a valores positivos, la segunda
Tres secciones
a valores negativos y la tercera a ceros.
La primera sección se aplica a valores positivos, la segunda
Cuatro secciones a valores negativos, la tercera a ceros y la cuarta a valores
nulos .
"$#,##0;($#,##0)"
Si incluye punto y coma sin nada entre ellos, la sección que falta se imprime usando el formato del valor positivo.
Por ejemplo, el siguiente formato muestra valores positivos y negativos utilizando el formato de la primera
sección y muestra "Cero" si el valor es cero.
"$#,##0;;\Z\e\r\o"

Diferentes formatos para diferentes valores de cadena


Una expresión de formato para cadenas puede tener una o dos secciones separadas por punto y coma ( ; ).

Si utiliza El resultado es
Solo una sección El formato se aplica a todos los datos de cadena.

La primera sección se aplica a datos de cadena, la


Dos secciones segunda a valores nulos y cadenas de longitud cero
("").

Formatos de fecha/hora con nombre


La siguiente tabla identifica los nombres de formato de fecha y hora predefinidos.
Nombre del
Descripción
formato
Muestre una fecha y/u hora, por ejemplo, 4/3/93 05:34 PM. Si no
hay una parte fraccionaria, muestre solo una fecha, por ejemplo,
General Date 4/3/93. Si no hay una parte entera, muestra solo la hora, por
ejemplo, 05:34 p. m. La visualización de la fecha está determinada por
la configuración de su sistema.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 150

Muestre una fecha de acuerdo con el formato de fecha larga de su


Long Date
sistema.
Muestre una fecha usando el formato de fecha medio apropiado para
Medium Date
la versión de idioma de la aplicación host .
Short Date Muestre una fecha usando el formato de fecha corta de su sistema.
Muestre una hora utilizando el formato de hora larga de su sistema;
Long Time
incluye horas, minutos, segundos.
Muestra la hora en formato de 12 horas usando horas y minutos y el
Medium Time
designador AM/PM.
Short Time Muestre una hora usando el formato de 24 horas, por ejemplo, 17:45.

Formatos numéricos con nombre


La siguiente tabla identifica los nombres de formato numérico predefinidos.
Nombre del
Descripción
formato

General
Muestra el número sin separador de miles.
Number

Muestre el número con separador de miles, si corresponde; mostrar dos


Currency dígitos a la derecha del separador decimal. La salida se basa en la
configuración regional del sistema .
Muestre al menos un dígito a la izquierda y dos dígitos a la derecha del
Fixed
separador decimal.
Mostrar número con separador de miles, al menos un dígito a la izquierda y
Standard
dos dígitos a la derecha del separador decimal.
Muestra el número multiplicado por 100 con un signo de porcentaje ( % )
Percent adjunto a la derecha; siempre muestre dos dígitos a la derecha del
separador decimal.
Scientific Usa la notación científica estándar.
Yes/No Mostrar No si el número es 0; de lo contrario, muestre Sí.
True/False Muestra Falso si el número es 0; de lo contrario, muestre True .
On/Off Mostrar apagado si el número es 0; de lo contrario, mostrar On.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 151

Formatos de cadena definidos por el usuario


Utilice cualquiera de los siguientes caracteres para crear una expresión de formato para cadenas.

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.

Formatos de fecha/hora definidos por el usuario


La siguiente tabla identifica los caracteres que puede usar para crear formatos de fecha/hora definidos por el
usuario.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 152

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 153

de hora reconocido por su sistema. Se muestra un cero inicial si se


selecciona la opción de cero inicial y la hora es anterior a las 10:00 a. m. o
p. m. El formato de hora predeterminado es h:mm:ss.
Use el reloj de 12 horas y muestre AM en mayúsculas con cualquier hora
AM/PM antes del mediodía; mostrar un PM en mayúsculas con cualquier hora
entre el mediodía y las 11:59 p. m.
Use el reloj de 12 horas y muestre AM en minúsculas con cualquier hora
am/pm antes del mediodía; mostrar un PM en minúsculas con cualquier hora
entre el mediodía y las 11:59 p. m.
Use el reloj de 12 horas y muestre una A mayúscula con cualquier hora
A/P antes del mediodía; mostrar una P mayúscula con cualquier hora entre el
mediodía y las 11:59 p. m.
Use el reloj de 12 horas y muestre una A minúscula con cualquier hora
a/p antes del mediodía; mostrar una P minúscula con cualquier hora entre el
mediodía y las 11:59 p. m.
Use el reloj de 12 horas y muestre el literal de cadena AM según lo define
su sistema con cualquier hora antes del mediodía; mostrar el literal de la
cadena PM según lo define su sistema con cualquier hora entre el
mediodía y las 11:59 PM AMPM puede estar en mayúsculas o minúsculas,
AMPM
pero el caso de la cadena que se muestra coincide con la cadena definida
por la configuración de su sistema. El formato predeterminado es AM/PM.
Si su sistema está configurado para un reloj de 24 horas, la cadena
normalmente se establece en una cadena de longitud cero.

Formatos numéricos definidos por el usuario


La siguiente tabla identifica los caracteres que puede usar para crear formatos de números definidos por el
usuario.

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 154

del separador decimal que ceros a la izquierda del separador decimal en la


expresión de formato, muestre los dígitos adicionales sin modificación.
Marcador de posición de dígitos. Mostrar un dígito o nada. Si la expresión
tiene un dígito en la posición donde aparece # en la cadena de formato,
muéstrelo; de lo contrario, no muestre nada en esa posición. Este símbolo
(#) funciona como el marcador de posición de 0 dígitos, excepto que los ceros
iniciales y finales no se muestran si el número tiene los mismos dígitos o
menos que los caracteres # a cada lado del separador decimal en la
expresión de formato.
Marcador de posición decimal. En algunas configuraciones regionales , se
usa una coma como separador decimal. El marcador de posición decimal
determina cuántos dígitos se muestran a la izquierda y derecha del
separador decimal. Si la expresión de formato contiene solo signos
numéricos a la izquierda de este símbolo, los números menores que 1
(.)
comienzan con un separador decimal. Para mostrar un cero inicial con
números fraccionarios, use 0 como marcador de posición del primer dígito
a la izquierda del separador decimal. El carácter real utilizado como
marcador de posición decimal en la salida formateada depende del formato
de número reconocido por su sistema.
Marcador de posición de porcentaje. La expresión se multiplica por 100. El
(%) carácter de porcentaje ( % ) se inserta en la posición donde aparece en la
cadena de formato.
Separador de mil. En algunos lugares, se usa un punto como separador de
miles. El separador de mil separa los miles de las centenas dentro de un
número que tiene cuatro o más lugares a la izquierda del separador
decimal. El uso estándar del separador de miles se especifica si el formato
contiene un separador de miles rodeado de marcadores de posición de
dígitos ( 0 o #). Dos separadores de mil adyacentes o un separador de mil
inmediatamente a la izquierda del separador decimal (ya sea que se
especifique un decimal o no) significa "escalar el número dividiéndolo por
(,)
1000, redondeando según sea necesario". Por ejemplo, puede usar la
cadena de formato "##0," para representar 100 millones como 100. Los
números menores de 1 millón se muestran como 0. Dos separadores de
miles adyacentes en cualquier posición que no sea inmediatamente a la
izquierda del separador decimal se tratan simplemente como si
especificaran el uso de un separador de mil. El carácter real utilizado como
separador de miles en la salida formateada depende del formato de número
reconocido por su sistema.
Separador de tiempo. En algunos lugares, 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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 155

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.
Formato científico. Si la expresión de formato contiene al menos un
marcador de posición de dígito ( 0 o # ) a la derecha de E-, E+, e- o e+, el
número se muestra en formato científico y se inserta E o e entre el número
( E-E + e- y su exponente. El número de marcadores de posición de dígitos a la
e+) derecha determina el número de dígitos en el exponente. Use E- o e- para
colocar un signo menos al lado de los exponentes negativos. Utilice E+ o e+
para colocar un signo menos junto a los exponentes negativos y un signo
más junto a los exponentes positivos.
Mostrar un carácter literal. Para mostrar un carácter que no sea uno de los
-+$() enumerados, prepárelo con una barra invertida ( \) o escríbalo entre
comillas dobles (" ").
Muestra el siguiente carácter en la cadena de formato. Para mostrar un
carácter que tiene un significado especial como carácter literal, preceda
una barra invertida ( \). La barra invertida en sí no se muestra. Usar una
barra invertida es lo mismo que encerrar el siguiente carácter entre
comillas dobles. Para mostrar una barra diagonal inversa, utilice dos barras
(\)
diagonales inversas ( \\). Ejemplos de caracteres que no se pueden
mostrar como caracteres literales son los caracteres de formato de fecha y
de hora (a, c, d, h, m, n, p, q, s, t, w, y, / y :), los caracteres de formato
numérico (#, 0, %, E, e, coma y punto) y los caracteres de formato de
cadena (@, &, <, > y !).
Muestre la cadena dentro de las comillas dobles (" "). Para incluir una
("A B C") cadena en formato desde dentro del código, debe usar Chr(34) para
encerrar el texto (34 es el código de carácter para una comilla (")).

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 156

20. LISTADO COMPLETO DE CODIGOS ASCII.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 157

¿CÓMO SE USA EL CÓDIGO ASCII EN WINDOWS?

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 158

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 159

Sec Carácter Descripción


0 NULL Carácter nulo
1 SOH Inicio encabezado
2 STX Inicio texto
3 ETX Fin de texto
4 EOT Fin transmisión
5 ENQ Enquiry
6 ACK Acknowledgement
7 BEL Timbre
8 BS Back space o retroceso
9 HT Tabulador horizontal
10 LF Salto de línea
11 VT Tabulador vertical
12 FF Form feed
13 CR Retorno de carro
14 SO Shift Out
15 SI Shift In
16 DLE Data link escape
17 DC1 Device control 1
18 DC2 Device control 2
19 DC3 Device control 3
20 DC4 Device control 4
21 NAK Negative acknowledgement
22 SYN Synchronous idle
23 ETB End of trans. Block
24 CAN Cancel
25 EM End of medium
26 SUB Substitute
27 ESC Escape
28 FS File separator
29 GS Group separator
30 RS Record separator
31 US Unit separator
32 Espacio en blanco
33 ! Signo de admiración

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 160

34 " Comillas dobles, comillas altas o inglesas


35 # Numeral
36 $ Signo pesos
37 % Signo de porcentaje, por ciento
38 & Y, ampersand, et latina
39 ' Comillas simples, apóstrofe
40 ( Abre paréntesis
41 ) Cierra paréntesis
42 * Asterisco
43 + Signo más, suma, positivo
44 , Coma
45 - Signo menos, resta, negativo, guion medio
46 . Punto
47 / Barra inclinada, división, operador aritmético de cociente
48 0 Número cero
49 1 Número uno
50 2 Número dos
51 3 Número tres
52 4 Número cuatro
53 5 Número cinco
54 6 Número seis
55 7 Número siete
56 8 Número ocho
57 9 Número nueve
58 : Dos puntos
59 ; Punto y coma
60 < Mayor que
61 = Signo igual, igualdad, igual que
62 > Menos que
63 ? Cierra signo interrogación
64 @ Arroba
65 A Letra A mayúscula
66 B Letra B mayúscula
67 C Letra C mayúscula
68 D Letra D mayúscula

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 161

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 162

104 h Letra h minúscula


105 i Letra i minúscula
106 j Letra j minúscula
107 k Letra k minúscula
108 l Letra l minúscula
109 m Letra m minúscula
110 n Letra n minúscula
111 o Letra o minúscula
112 p Letra p minúscula
113 q Letra q minúscula
114 r Letra r minúscula
115 s Letra s minúscula
116 t Letra t minúscula
117 u Letra u minúscula
118 v Letra v minúscula
119 w Letra w minúscula
120 x Letra x minúscula
121 y Letra y minúscula
122 z Letra z minúscula
123 { Abre llave curva, llaves curvas
124 | Barra vertical, pleca , línea vertical
125 } Cierra llave, llaves curvas
126 ~ Signo de equivalencia, tilde, virgulilla de la ñ
127 DEL Suprimir, borrar, eliminar
128 Ç Letra C cedilla mayúscula
129 ü Letra "u" minúscula con diéresis
130 é Letra "e" minúscula con acento agudo
131 â Letra "a" minúscula con acento circunflejo
132 ä Letra "a" minúscula con diéresis
133 à Letra "a" minúscula con acento grave
134 å Letra "a" minúscula con anillo
135 ç Letra c cedilla minúscula
136 ê Letra "e" minúscula con acento circunflejo
137 ë Letra "e" minúscula con diéresis
138 è Letra "e" minúscula con acento grave

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 163

139 ï Letra "i" minúscula con diéresis


140 î Letra "i" minúscula con acento circunflejo
141 ì Letra "i" minúscula con acento grave
142 Ä Letra "A" mayúscula con diéresis
143 Å Letra "a" mayúscula con anillo
144 É Letra "e" mayúscula con acento agudo
145 æ Diptongo "ae" latina minúscula
146 Æ Diptongo "AE" latina mayúscula
147 ô Letra "o" minúscula con acento circunflejo
148 ö Letra "o" minúscula con diéresis
149 ò Letra "o" minúscula con acento grave
150 û Letra "u" minúscula con acento circunflejo
151 ù Letra "u" minúscula con acento grave
152 ÿ Letra "y" minúscula con diéresis
153 Ö Letra "O" mayúscula con diéresis
154 Ü Letra "U" mayúscula con diéresis
155 ø Letra "o" minúscula con barra
156 £ Signo Libra Esterlina
157 Ø Letra "O" mayúscula con barra
158 × Signo de multiplicación
159 ƒ Símbolo matemático de función, florín neerlandés
160 á Letra "a" minúscula con acento
161 í Letra "i" minúscula con acento agudo
162 ó Letra "o" minúscula con acento
163 ú Letra "u" minúscula con acento
164 ñ Letra ñ minúscula, n minúscula con tilde, eñie
165 Ñ Letra Ñ mayúscula, N mayúscula con tilde, EÑIE
166 ª Ordinal femenino, indicador de género femenino
167 º Ordinal masculino, indicador de género masculino
168 ¿ Abre signo interrogación
169 ® Símbolo de Marca Registrada
170 ¬ Signo de negación
171 ½ Un medio, mitad, fracción
172 ¼ Un cuarto, cuarta parte, fracción
173 ¡ Abre signo de exclamación

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 164

174 « Abre comillas bajas, apertura comillas angulares, latinas o españolas


175 » Cierra comillas bajas, cierre comillas angulares, latinas o españolas
176 ░ Bloque color tramado densidad baja, carácter gráfico
177 ▒ Bloque color tramado densidad media, gráfico
178 ▓ Bloque color tramado densidad alta, carácter gráfico
179 │ Línea simple vertical de recuadro gráfico
180 ┤ Línea vertical con empalme de recuadro gráfico
181 Á Letra "a" mayúscula con acento agudo
182 Â Letra "A" mayúscula con acento circunflejo
183 À Letra "A" mayúscula con acento grave
184 © Símbolo Copyright, bajo derecho de autor
185 ╣ Doble línea vertical empalme izquierdo recuadro gráfico
186 ║ Líneas dobles vertical de recuadro gráfico, dos verticales
187 ╗ Línea doble esquina de recuadro gráfico
188 ╝ Línea doble esquina de recuadro gráfico
189 ¢ Signo centavo, céntimo o centésimo
190 ¥ Signo monetario YEN japonés, YUAN chino
191 ┐ Línea simple esquina de recuadro gráfico
192 └ Línea simple esquina de recuadro gráfico
193 ┴ Línea horizontal con empalme de recuadro gráfico
194 ┬ Línea horizontal con empalme de recuadro gráfico
195 ├ Línea vertical con empalme de recuadro gráfico
196 ─ Línea simple horizontal de recuadro gráfico
197 ┼ Líneas simples empalmes de recuadro gráfico
198 ã Letra "A" minúscula con tilde
199 Ã Letra "A" mayúscula con tilde
200 ╚ Línea doble esquina de recuadro gráfico
201 ╔ Línea doble esquina de recuadro gráfico
202 ╩ Doble línea horizontal empalme arriba recuadro gráfico
203 ╦ Doble línea horizontal empalme abajo recuadro gráfico
204 ╠ Doble línea vertical empalme derecho de recuadro gráfico
205 ═ Líneas doble horizontales de recuadro gráfico
206 ╬ Líneas dobles cruce de líneas de recuadro gráfico
207 ¤ Signo monetario, divisa general
208 ð Letra eth latina minúscula

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 165

209 Ð Letra eth latina mayúscula


210 Ê Letra "E" mayúscula con acento circunflejo
211 Ë Letra "E" mayúscula con diéresis
212 È Letra "E" mayúscula con acento grave
213 ı Letra minúscula i sin punto
214 Í Letra "i" mayúscula con acento agudo
215 Î Letra "i" mayúscula con acento circunflejo
216 Ï Letra "i" mayúscula con diéresis
217 ┘ Línea simple esquina de recuadro gráfico
218 ┌ Línea simple esquina de recuadro gráfico
219 █ Bloque color pleno sólido, carácter gráfico
220 ▄ Medio bloque color pleno, mitad inferior, carácter gráfico
221 ¦ Barra vertical partida
222 Ì Letra "i" mayúscula con acento grave
223 ▀ Medio bloque color pleno, mitad superior, carácter gráfico
224 Ó Letra "O" mayúscula con acento agudo
225 ß Letra alemana "eszett" o "ese-zeta"
226 Ô Letra "O" mayúscula con acento circunflejo
227 Ò Letra "O" mayúscula con acento grave
228 õ Letra "o" minúscula con tilde
229 Õ Letra "O" mayúscula con tilde
230 µ Signo micro
231 þ Letra thorn latina minúscula
232 Þ Letra thorn latina mayúscula
233 Ú Letra "u" mayúscula con acento
234 Û Letra "U" mayúscula con acento circunflejo
235 Ù Letra "U" mayúscula con acento grave
236 ý Letra "y" minúscula con acento agudo
237 Ý Letra "Y" mayúscula con acento agudo
238 ¯ Macron ,marca larga, super guion, guion alto
239 ´ Acento agudo
240 ≡ Símbolo matemático de congruencia
241 ± Signo más menos
242 ‗ Ascii 242
243 ¾ Tres cuartos, fracción

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 166

244 ¶ Fin de párrafo, signo de calderón


245 § Signo de sección
246 ÷ Signo de división
247 ¸ Cedilla, virgulilla baja
248 ° Signo de grado
249 ¨ Diéresis
250 · Punto centrado, punto medio, coma georgiana
251 ¹ Superíndice uno
252 ³ Superíndice tres, potencia tres, al cubo
253 ² Superíndice dos, al cuadrado
254 ■ Ascii 254
255 nbsp Espacio sin separación - non breaking space

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 167

21. CONSTANTES DE CODIGO CLAVE

Las siguientes constantes se pueden usar en cualquier parte de su código en lugar de los valores reales:

Constant Value Description


vbKeyLButton 0x1 Botón izquierdo del mouse (ratón)
vbKeyRButton 0x2 Botón derecho del mouse (ratón)
vbKeyCancel 0x3 Tecla Cancelar
vbKeyMButton 0x4 Botón izquierdo del mouse
vbKeyBack 0x8 Tecla Retroceso
vbKeyTab 0x9 Tecla Tab
vbKeyClear 0xC Tecla Supr
vbKeyReturn 0xD Tecla Entrar
vbKeyShift 0x10 Tecla Mayús
vbKeyControl 0x11 Tecla Ctrl
vbKeyMenu 0x12 Tecla Menú
vbKeyPause 0x13 Tecla Pausa
vbKeyCapital 0x14 Tecla Bloq Mayús
vbKeyEscape 0x1B Tecla Esc
vbKeySpace 0x20 Tecla Barra espaciadora
vbKeyPageUp 0x21 Tecla Re Pág
vbKeyPageDown 0x22 Tecla Av Pág
vbKeyEnd 0x23 Tecla Fin
vbKeyHome 0x24 Tecla Inicio
vbKeyLeft 0x25 Tecla Flecha izquierda
vbKeyUp 0x26 Tecla Flecha arriba
vbKeyRight 0x27 Tecla Flecha derecha
vbKeyDown 0x28 Tecla Flecha abajo
vbKeySelect 0x29 Tecla Seleccionar
vbKeyPrint 0x2A Tecla Impr Pant
vbKeyExecute 0x2B Tecla Ejecutar
vbKeySnapshot 0x2C Tecla Impr Pant
vbKeyInsert 0x2D Tecla Insert
vbKeyDelete 0x2E Tecla Supr
vbKeyHelp 0x2F Tecla Ayuda
vbKeyNumlock 0x90 Tecla Bloq Num

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 168

Las teclas A Z son las mismas que los equivalentes ASCII A – Z:

Constant Value Description


vbKeyA 65 Tecla A
vbKeyB 66 Tecla B
vbKeyC 67 Tecla C
vbKeyD 68 Tecla D
vbKeyE 69 Tecla E
vbKeyF 70 Tecla F
vbKeyG 71 Tecla G
vbKeyH 72 Tecla H
vbKeyI 73 Tecla I
vbKeyJ 74 Tecla J
vbKeyK 75 Tecla K
vbKeyL 76 Tecla L
vbKeyM 77 Tecla M
vbKeyN 78 Tecla N
vbKeyO 79 Tecla O
vbKeyP 80 Tecla P
vbKeyQ 81 Tecla Q
vbKeyR 82 Tecla R
vbKeyS 83 Tecla S
vbKeyT 84 Tecla T
vbKeyU 85 Tecla U
vbKeyV 86 Tecla V
vbKeyW 87 Tecla W
vbKeyX 88 Tecla X
vbKeyY 89 Tecla Y
vbKeyZ 90 Tecla Z

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 169

Las teclas 0 a 9 son las mismas que sus equivalentes ASCII 0 – 9:

Constant Value Description


vbKey0 48 0 key
vbKey1 49 1 key
vbKey2 50 2 key
vbKey3 51 3 key
vbKey4 52 4 key
vbKey5 53 5 key
vbKey6 54 6 key
vbKey7 55 7 key
vbKey8 56 8 key
vbKey9 57 9 key

Las siguientes constantes representan teclas en el teclado numérico:

Constant Value Description


vbKeyNumpad0 0x60 Tecla 0
vbKeyNumpad1 0x61 Tecla 1
vbKeyNumpad2 0x62 Tecla 2
vbKeyNumpad3 0x63 Tecla 3
vbKeyNumpad4 0x64 Tecla 4
vbKeyNumpad5 0x65 Tecla 5
vbKeyNumpad6 0x66 Tecla 6
vbKeyNumpad7 0x67 Tecla 7
vbKeyNumpad8 0x68 Tecla 8
vbKeyNumpad9 0x69 Tecla 9
vbKeyMultiply 0x6A Tecla Signo de multiplicación (*)
vbKeyAdd 0x6B Tecla Signo más (+)
vbKeySeparator 0x6C Tecla Entrar
vbKeySubtract 0x6D Tecla Signo menos (–)
vbKeyDecimal 0x6E Tecla Punto decimal (,)
vbKeyDivide 0x6F Tecla Signo de división (/)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 170

Las siguientes constantes representan teclas de función:

Constant Value Description


vbKeyF1 0x70 F1 key
vbKeyF2 0x71 F2 key
vbKeyF3 0x72 F3 key
vbKeyF4 0x73 F4 key
vbKeyF5 0x74 F5 key
vbKeyF6 0x75 F6 key
vbKeyF7 0x76 F7 key
vbKeyF8 0x77 F8 key
vbKeyF9 0x78 F9 key
vbKeyF10 0x79 F10 key
vbKeyF11 0x7A F11 key
vbKeyF12 0x7B F12 key
vbKeyF13 0x7C F13 key
vbKeyF14 0x7D F14 key
vbKeyF15 0x7E F15 key
vbKeyF16 0x7F F16 key

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 171

22. RESUMEN DE PALABRAS CLAVE.

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

Directivas del compilador.


Definir una constante del compilador. #Const
Compilar bloques seleccionados de código. #If...Then...#Else

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 172

Información de atributo de un archivo. Diversas.


Procesar eventos pendientes. DoEvents
Ejecutar otros programas. AppActivate, Shell
Enviar pulsaciones de teclas a una aplicación. SendKeys
Hacer sonar un pitido en el equipo. Beep
Sistema. Environ
Proporcionar una cadena en la línea de comandos. Command
Automatización. CreateObject, GetObject
Color. QBColor, RGB

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 173

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 174

Manipular cadenas. InStr, Left, LTrim, Mid, Right, RTrim, Trim


Establecer las reglas de comparación de cadenas. Option Compare
Trabajar con valores ASCII y ANSI. Asc, Chr

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 175

Palabras clave por tarea.


Matrices Crear, definir y utilizar matrices.
Directivas del compilador Controlar el comportamiento del compilador.
Flujo de control Realizar bucles y controlar el flujo del procedimiento.
Conversión Convertir números y tipos de datos.
Tipos de datos Tipos de datos y subtipos Variant.
Fechas y horas Convertir y utilizar expresiones de fecha y hora.
Directorios y archivos Controlar el sistema de archivos y procesar archivos.
Errores Interceptar y devolver valores de error.
Financieras Realizar cálculos financieros.
Entrada y salida Recibir una entrada y mostrar o imprimir el resultado.
Matemáticas Realizar cálculos trigonométricos u otros cálculos matemáticos.
Diversas Iniciar otras aplicaciones y procesar eventos.
Operadores Comparar expresiones y otras operaciones.
Manipulación de cadenas Manipular cadenas y datos de tipo String.
Variables y constantes Declarar y definir variables y constantes.

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 176

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 177

23. RESUMEN.

DELETE FROM Elimina un registro de una tabla


INSERT INTO Agrega un grupo de registros a una tabla
SELECT Recupera un grupo de registros y los sitúa en una dynaset o tabla
TRANSFORM Genera una tabla resumen utilizando el contenido de un campo como encabezados de columnas
UPDATE Modifica los valores de campos específicos de la tabla

'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]]...

El * se puede usar para seleccionar todos los campos de la tabla especificada.


Los campos calculados se pueden obtener a partir de operaciones aritméticas (+, -, *, /, ^) con campos
numéricos o mediante la unión de campos alfanuméricos (operador &). También se pueden usar funciones
propias de Visual Basic.
Mediante el uso de la cláusula AS, se puede especificar un nombre alternativo para el campo. También
se puede usar SELECT para realizar cálculos sobre la información de la tabla, mediante las funciones de
agregado de SQL.
Estas funciones de agregado devuelven un solo valor para todo el conjunto de registros, a menos que se emplee
la cláusula GROUP BY que devuelve un valor para grupo de registros.
Las funciones de agregado disponibles son:

AVG: Media aritmética del campo


COUNT: Número de registros
MIN: Valor mínimo del campo
MAX: Valor máximo del campo
SUM: Valor total del campo (suma de todos los valores)
FIRST: Valor del campo para el primer registro del recordset

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 178

LAST: Valor del campo para el último registro del recordset


STDEV: Desviación típica de los valores del campo
STDEVP: Desviación típica de los valores del campo
Siempre referidas a los registros que cumplan la cláusula WHERE

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:

SELECT [{ALL/DISTINCT/DISTINCTROW}] FieldList

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:

Tabla1 {INNER|LEFT|RIGHT} JOIN Tabla2 ON Tabla1.Clave1 = Tabla2.Clave2

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 179

tengan correspondencia en la tabla de la izquierda. Con RIGHT se consigue el caso contrario.

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:

WHERE ExpresionLogica1 [{AND|OR} ExpresionLogica2]...

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.

Expresión LIKE Modelo


Predicado IN: Compara un campo con una lista de valores aceptables.
Expresión IN Lista
Predicado BETWEEN: Compara un campo con un rango de valores. La búsqueda es inclusiva, o sea, si el valor
es igual a uno de los puntos finales del intervalo, se incluye el registro

Expresion [NOT] BETWEEN Valor1 AND Valor2

Opciones de ordenación -> Se usa para determinar el orden en que han de aparecer los registros en la dynaset
de salida.

ORDER BY Field1 [ASC|DESC][, Field2 [ASC|DESC][, ...]]

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 180

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:

GROUP BY Field1 [, Field2]... [HAVING ExpLogica1 [{AND|OR} ExpLogica2]...]

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)

Instrucción DELETE: Elimina un registro (o varios) de una tabla

DELETE FROM NombreTabla [WHERE ClausulaWhere]

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

Instrucción INSERT INTO: Agrega un grupo de registros a una tabla

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 181

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

UPDATE NombreTabla SET Field1=Valor1[, Field2=Valor2]... [WHERE ClausulaWhere]

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

Ejecución de instrucciones SQL desde VB:

DateBase.EXECUTE Source[, Options]

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

Source -> Instrucción SQL a ejecutar


Options -> Integer que determina las características de integridad de datos de la consulta. Puede tener una
combinación de los siguientes valores:
dbDenyWrite Deny write permission to other users.
dbInconsistent (Default) Inconsistent updates.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 182

dbConsistent Consistent updates.


dbSQLPassThrough SQL pass-through. Causes the SQL statement to be passed to an ODBC database for
processing.
dbFailOnError Roll back updates if an error occurs.
dbSeeChanges Generate a run-time error if another user is changing data you are editing
Set Querydef = DataBase.CreateQueryDef([Name][, Source]

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

Name -> Nombre que tendrá la consulta SQL en la base de datos


Source -> Instrucción SQL a ejecutar
Options -> Las mismas que para DataBase.EXECUTE

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 183

SQL
EJEMPLOS PRACTICOS

By Gonzalo Bolaño Stefanell

© Gonzalo Bolaño Stefanell – 2.023 REGRESAR »»»»»»»


Manual de SQL & Visual Basic Pág. 184

Ejercicio - Viajeros
Dado el siguiente modelo relacional de una base de datos de una agencia de viajes

Lugar ( l_codigo, l_nombre, l_tipo, l_clima, l_total_habitantes, l_descripcion, l_fk_lugar )


Viaje ( v_codigo , v_fk_pasajero , v_fk_lugar , v_fecha)
Pasajero ( p_codigo , p_nombre, p_apellido, p_perfil, p_fecha_nacimiento, p_num_telefonico,
p_fk_lugar_pais_residencia )

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 l_nombre, l_total_habitantes, l_total_habitantes + 100000 AS incremento_total_ habitantes FROM


lugar ; (Mostrar el nombre, total de habitantes de todos los lugares, además, suponer un incremento de la
población de cada lugar en 100000 habitantes)

SELECT l_nombre, l_tipo, l_total_habitantes, L_total_habitantes * 2 AS Doble_de_habitantes FROM lugar ;


(Mostrar el nombre, tipo de lugar y el número de habitantes de cada lugar si su población se doblará. Nombrar
la columna como "Doble_de_habitantes")

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 185

'01-01-1970' AND '31-12-1980'; (Mostrar todos los pasajeros nacidos entre el 1970 y 1980)

SELECT p_nombre, p_fecha_nacimiento AS Nacido_el FROM pasajero WHERE p_perfil IN


('BUSINESS','PRIMERA_CLASE'); (Mostrar nombre y fecha de nacimiento de los pasajeros de clase business y
primera clase. Etiquetar la fecha de nacimiento como "Nacido_el")

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 186

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 l_nombre, l_total_habitantes FROM lugar WHERE l_tipo = 'CONTINENTE' ORDER BY


l_total_habitantes ASC ; (Mostrar los países de Europa ordenándolos por su número de habitantes de menor a
mayor)

SELECT p_apellido, p_nombre, p_fecha_nacimiento FROM pasajero ORDER BY p_fecha_nacimiento,


p_apellido DESC ; (Mostrar los viajeros ordenados por su fecha de nacimiento (de más joven a menos) y por
su apellido de forma inversa)

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.l_nombre pais , c.l_nombre AS Continente, p.l_total_habitantes AS total_habitantes FROM lugar p ,


lugar AS c WHERE p.l_tipo = 'PAIS' AND p.l_fk_lugar = c.l_codigo AND c.l_tipo = 'CONTINENTE' AND c.l_nombre
NOT IN ('EUROPA','OCEANIA') ORDER BY c.l_nombre ASC , p.l_total_habitantes DESC ; (Hacer un listado con
los países que no pertenezcan a Europa u Oceanía ordenados alfabéticamente por su continente y su total de
habitantes de mayor a menor)

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 187

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 hospitales(hospital_cod NUMBER(2), nombre VARCHAR(15), direccion VARCHAR(20), telefono


CHAR(8), num_cama NUMBER(3), CONSTRAINT hospital_pk PRIMARY KEY (hospital_cod));

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));

CREATE TABLE enfermo(inscripcion NUMBER(5), apellido VARCHAR(15), direccion VARCHAR(20),fecha-nac


DATE, s VARCHAR(1), nss number(9), CONSTRAINT enfermo_pk PRIMARY KEY (inscripcion));

CREATE TABLE ocupacion(inscripcion NUMBER(5) PRIMARY KEY, hospital_cod NUMBER(2)PRIMARY KEY,


sala_cod NUMBER(2)PRIMARY KEY, cama NUMBER(4), CONSTRAINT hospital_ocup_fk FOREIGN KEY
(hospital_cod) REFERENCES hospital (hospital_cod), CONSTRAINT sala_ocup_fk FOREIGN KEY (sala_cod)
REFERENCES sala (sala_cod));

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 188

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)

INSERT INTO plantilla VALUES (22,2,1234,'Garcia J.','ENFERMERO','M',3000000); (Solución 2: 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 VIEW informacion_de_enfermos AS SELECT e.apellido, e.direccion, e.fecha_nac, h.nombre FROM


enfermo e, hospital h, ocupación o WHERE e.inscripcion = o.inscripcion AND o.hospital_cod = h.hospital-cod;
(Defina una vista porque se va a realizar un programa de consulta de la información sobre enfermos. Los datos
a mostrar serán sus apellidos, dirección, fecha de nacimiento y hospital en el que se encuentran)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 189

Ejercicio - Empresa distribuidora de alimentos.


Dado el DDL de la base de datos de la empresa.

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 190

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 191

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 192

el máximo y el mínimo excede la media salarial de toda la empresa)

Ejercicio - Control de Stock y facturación


Dado el siguiente modelo relacional de una base de datos.

Provincias( codpro , nombre)


Pueblos( codpue , nombre, codpro)
Clientes( codcli , nombre, direccion, codpostal, codpue )
Vendedores( codven , nombre, direccion, codpostal, codpue , codjefe )
Articulos( codart , descrip, precio, stock, stock_min )
Facturas( codfac , fecha, codcli , codven , iva, dto )
Lineas_fac( codfac , linea , cant, codart , precio, dto )

Consultas
SELECT * FROM provincias; (Mostrar las provincias)

SELECT nombre, codpro FROM provincias; (Nombre y código de 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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 193

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 =

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 194

'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 empleados(empleadoid NUMBER(8) , nombre VARCHAR(30), apellido VARCHAR(30),


fecha_nac DATE, reporta_a NUMBER(8), extension NUMBER(8), CONSTRAINT pk_empleados PRIMARY KEY
(empleadoid));

CREATE TABLE proveedores(proveedorid NUMBER(8), nombreprov VARCHAR(50) NOT NULL, contacto


VARCHAR(50) NOT NULL, celuprov VARCHAR(12), fijoprov VARCHAR(12), CONSTRAINT pk_proveedores
PRIMARY KEY(proveedorid ) );

CREATE TABLE categorias(categoriaid NUMBER(8), nombrecat VARCHAR(50) NOT NULL, CONSTRAINT


pk_categorias PRIMARY KEY(categoriaid) ) ;

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) );

CREATE TABLE productos(productoid NUMBER(8), proveedorid NUMBER(8) NOT NULL, categoriaid


NUMBER(8) NOT NULL, descripcion VARCHAR(50), preciounit NUMBER(8) NOT NULL, existencia NUMBER(8)
NOT NULL, CONSTRAINT pk_productos PRIMARY KEY (productoid)) ;

CREATE TABLE detalle_ordenes(ordenid NUMBER(8), detalleid NUMBER(8), productoid NUMBER(8) NOT


NULL, cantidad NUMBER(8) NOT NULL, CONSTRAINT pk_detalle_ordenes PRIMARY KEY (ordenid,detalleid) );

ALTER TABLE ordenes ADD CONSTRAINT fk_ordenes_clien_ord_clientes FOREIGN KEY (clienteid)


REFERENCES clientes (clienteid);

ALTER TABLE ordenes ADD constraint fk_ordenes_emple_ord_empleado FOREIGN KEY (empleadoid)


REFERENCES empleados (empleadoid);

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 195

ALTER TABLE detalle_ordenes ADD CONSTRAINT fk_detalle__orden_det_ordenes FOREIGN KEY (ordenid)


REFERENCES ordenes (ordenid);

ALTER TABLE detalle_ordenes ADD CONSTRAINT fk_detalle__prod_deta_producto FOREIGN KEY


(productoid) REFERENCES productos (productoid);

ALTER TABLE productos ADD CONSTRAINT fk_producto_cate_prod_categori FOREIGN KEY (categoriaid)


REFERENCES categorias (categoriaid);

ALTER TABLE productos ADD CONSTRAINT fk_producto_prov_prod_proveedo FOREIGN KEY (proveedorid)


REFERENCES proveedores (proveedorid);

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%)

UPDATE PROVEEDORES SET CELUPROV = '0990101291' WHERE CONTACTO = 'MANUEL ANDRADE';


(Actualizar el teléfono celular del proveedor cuyo contacto es MANUEL ANDRADE, con el valor 099010291)

DELETE FROM PRODUCTOS WHERE DESCRIPCION ='YOGURT DE SABORES'; (Eliminar el producto YOGURT
DE SABORES)

SELECT ORD.ORDENID, EMP.NOMBRE, EMP.APELLIDO, ORD.FECHAORDEN, CLI.CLIENTEID, CLI.NOMBRECIA


FROM ORDENES ORD, EMPLEADOS EMP, CLIENTES CLI WHERE ORD.EMPLEADOID = EMP.EMPLEADOID
AND ORD.CLIENTEID = CLI.CLIENTEID ; (Mostrar todas las órdenes. Se pide el id de la orden, el apellido y
nombre del empleado que la atendió el nombre de la compañía cliente y la fecha de orden)

SELECT PRODUCTOID, SUM(CANTIDAD) AS SUMA_TOTAL FROM DETALLE_ORDENES GROUP BY


PRODUCTOID; (Mostrar la suma total de cada tipo de producto pedidos en todas las órdenes)

SELECT NOMBRE, APELLIDO, COUNT(ORD.EMPLEADOID) AS NUM_ORDENES FROM EMPLEADOS EMP


LEFT JOIN ORDENES ORD ON EMP.EMPLEADOID = ORD.EMPLEADOID GROUP BY NOMBRE, APELLIDO;
(Mostrar el número de órdenes atendidas por cada empleado, incluidos los que tienen 0 órdenes)

SELECT PROV.NOMBREPROV, SUM(D.CANTIDAD * PROD.PRECIOUNIT) AS SUMA_DINERO FROM


PROVEEDORES PROV, PRODUCTOS PROD, DETALLE_ORDENES D WHERE D.PRODUCTOID =
PROD.PRODUCTOID AND PROV.PROVEEDORID = PROD.PROVEEDORID GROUP BY NOMBREPROV; (Muestre
los proveedores y la suma de dinero vendido en los productos de ese proveedor)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 196

Ejercicio - Venta de Productos


Dado el siguiente modelo relacional de una base de datos:

CLIENTE ( codigo ,nombre, domicilio, provincia)


PRODUCTO ( codigo_producto , nombre_producto)
ITEM_VENTAS ( número_factura , codigo_producto , cantidad, precio)
VENTAS ( numero_factura , codigo_cliente , fecha)

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; (Obtener el


importe total en pesos por factura y producto, especificando el número de factura, el código del producto y el
importe total)

SELECT numero_factura, codigo_producto, (precio * cantidad) AS Total FROM item_ventas WHERE


codigo_producto = 'a'; (Sobre la consulta 3, obtener solo el importe total para el producto a)

SELECT numero_factura, codigo_producto, (precio * cantidad) AS Total FROM item_ventas WHERE


numero_factura BETWEEN 2 AND 5 AND codigo_producto = 'c'; (Sobre la consulta 3, obtener solo el importe
total para las facturas mayores iguales a 2 y menores iguales a 5 y solo para el producto código c)

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 numero_factura, nombre_producto, cantidad FROM Producto AS p, item_ventas AS iv WHERE


iv.codigo_producto = p.codigo_producto; (Obtener un listado de las facturas realizadas especificando número
de factura, nombre del producto y cantidad vendida)

SELECT numero_factura, nombre_producto, cantidad FROM Producto AS p, item_ventas AS iv WHERE


iv.codigo_producto = p.codigo_producto AND cantidad >= 15; (Obtener un listado de las facturas realizadas
cuya cantidad sea mayor igual a 15 especificando número de factura, nombre del producto y cantidad vendida)

SELECT item_ventas.Numero_factura, nombre_cliente, nombre_producto, cantidad, precio, (cantidad * precio)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 197

AS Total FROM Cliente, Ventas, Item_Ventas, Producto WHERE Cliente.codigo_cliente = Ventas.codigo_cliente


AND Ventas.numero_factura = Item_Ventas.Numero_factura AND Item_Ventas.codigo_producto =
Producto.codigo_producto; (Obtener un listado de las facturas realizadas indicando número de factura, nombre
del cliente, nombre del producto, cantidad y precio y el importe total)

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)

SELECT nombre_producto AS Producto, SUM (cantidad) AS Cantidad FROM Producto AS p, item_ventas AS iv


WHERE iv.codigo_producto = p.codigo_producto GROUP BY nombre_producto ORDER BY SUM (cantidad)
DESC ; (Cantidad de unidades vendidas por producto, indicando la descripción del producto, ordenado de mayor
a menor por las cantidades vendidas)

SELECT nombre_producto AS Producto, sum(cantidad) AS Cantidad FROM Producto AS p, item_ventas AS iv


WHERE iv.codigo_producto = p.codigo_producto GROUP BY nombre_producto HAVING SUM (cantidad) > 30
ORDER BY nombre_producto; (Cantidad de unidades vendidas por producto, indicando la descripción del
producto, ordenado alfabéticamente por nombre de producto para los productos que vendieron más de 30
unidades)

SELECT v.codigo_cliente, nombre_cliente, COUNT (numero_factura) AS compras FROM cliente AS c, ventas


AS v WHERE v.codigo_cliente = c.codigo_cliente GROUP BY v.codigo_cliente, nombre_cliente ORDER BY
COUNT (numero_factura) DESC ; (Obtener cuantas compras (1 factura = 1 compra) realizo cada cliente
indicando el código y nombre del cliente ordenado de mayor a menor)

SELECT codigo_producto, AVG (cantidad) AS promedio FROM Ventas AS v, item_ventas AS iv WHERE


iv.numero_factura = v.numero_factura AND codigo_cliente = 1 GROUP BY codigo_producto; (Promedio de
unidades vendidas por producto, indicando el código del producto para el cliente 1)

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 198

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 199

(es el precio aumentado en un 16%))

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 200

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 numpedido, importe, empleados.nombre AS representante, clientes.nombre AS cliente FROM pedidos


INNER JOIN clientes ON pedidos.clie = clientes.numclie INNER JOIN empleados ON pedidos.rep =
empleados.numemp WHERE importe > 25000; (Listar los pedidos superiores a 25.000 Bs, incluyendo el
nombre del empleado que tomó el pedido y el nombre del cliente que lo solicitó)

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 empleados.*, jefes.numemp AS num_jefe, jefes.nombre AS nombre_jefe, jefes.cuota AS cuota_jefe


FROM empleados INNER JOIN empleados jefes ON empleados.jefe = jefes.numemp WHERE empleados.cuota >
jefes.cuota; (Listar los empleados con una cuota superior a la de su jefe; para cada empleado sacar sus datos
y el número, nombre y cuota de su jefe)

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 (importe) AS importe_medio, SUM (importe) AS importe_total, AVG (importe/cant) AS


precio_venta_medio FROM pedidos; (Hallar el importe medio de pedidos, el importe total de pedidos y el precio
medio de venta (el precio de venta es el precio unitario en cada pedido))

SELECT AVG (precio) AS p_medio_ACI FROM productos WHERE idfab = 'ACI'; (Hallar el precio medio de los
productos del fabricante ACI)

SELECT SUM(importe) AS total_pedidos_V_Pantalla FROM empleados INNER JOIN pedidos ON


empleados.numemp = pedidos.rep WHERE nombre = 'Pedro Roriz'; (¿ Cuál es el importe total de los pedidos
realizados por el empleado Pedro Roriz?)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 201

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))

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 202

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 203

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)

UPDATE productos INNER JOIN nuevaproductos ON ( productos.idfab = nuevaproductos.idfab) AND


(productos.idproducto = nuevaproductos.idproducto) SET productos.precio = nuevaproductos.precio;
(Recuperar los precios originales a partir de la tabla nuevosproductos)

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 204

Ejercicio 11 - Departamentos y Empleados


Dado el DDL de la base de datos de hospitales:

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:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 205

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';

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 206

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');

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 207

SQL
EJEMPLOS Y CONSULTAS
INTELIGENTES

By Gonzalo Bolaño Stefanell

© 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

Ejecutar una Consulta SQL

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"

Mediante el uso de ejecutar de la base de datos


Db.EXECUTE SQL, dbFailOnError

Mediante la creacion de una QueryDef


Set Qd = Db.CreateQueryDef("Borrar libros sin ISBN", SQL)
Qd.EXECUTE dbFailOnError

Ejecutar la consulta con el método ejecutar base de datos


Db.EXECUTE "Borrar libros sin ISBN", dbFailOnError

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]]

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 209

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 Campos FROM Tabla;

SELECT ALL FROM Tabla;

SELECT * FROM Ventas;

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');

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 21000;

SELECT Id_Producto, Existencias FROM Productos WHERE Existencias <= Nuevo_Pedido;

SELECT * FROM Pedidos WHERE Fecha_Envio = #5/10/94#;

SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos = 'King';

SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos Like 'S*';

SELECT Apellidos, Salario FROM Empleados WHERE Salario Between 200 And 300;

SELECT Apellidos, Salario FROM Empl WHERE Apellidos Between 'Lon' And 'Tol';

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 210

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 Nombre, Telefono FROM Clientes; (Solo los campo mencionados)

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 numberPercent, column_name(s) FROM table_name WHERE condition;

SELECT column_name(s) FROM table_name WHERE condition LIMIT number;

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 211

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 column_names FROM table_name WHERE column_name IS NOT NULL;

SELECT MIN(column_name) FROM table_name WHERE condition;

SELECT MAX(column_name) FROM table_name WHERE condition;

SELECT Provincia, SUM(VentasTotales) FROM Clientes GROUP BY Provincia; (Obtiene el total de ventas de
las provincias)

SELECT COUNT(column_name) FROM table_name WHERE condition;

SELECT AVG(column_name) FROM table_name WHERE condition;

SELECT SUM(column_name) FROM table_name WHERE condition;

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 212

SELECT Ventas.*, Articulos.Descripcion, Articulos.Minorista FROM Ventas, Articulos WHERE Ventas.Articulo =


Articulos.Articulo; (Seleccionar todos los campos de la tabla Ventas y los campos Descripcion y Minorista
de la tabla de Articulos, relacionando ambas tablas por el codigo del articulo)

SELECT Articulos.Minorista * Ventas.Cantidad FROM Articulos, Ventas WHERE Ventas.Articulo =


Articulos.Articulo; (Calcular el precio total de los articulos. Esta consulta crea un campo con el resultado de
la multiplicación)

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 UCASE$(MID$(Apellidos, 1, 3)) & UCASE$(MID$(Nombre, 1, 3)) FROM Clientes; (Crea un


identificador de cliente utilizando las 3 primeras letras de los campos Apellidos y Nombre y pone todo en
mayúsculas)

SELECT Min(Stock), Max(Stock), Avg(Stock), Sum(Stock * Articulos.Precio) FROM Articulos; (Crea un


recordset con un único registro con el stock mínimo, el máximo y el medio de los artículos así como el coste
total de las existencias)

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 Clientes.Apellido & Clientes.Nombre AS Nombre, [Codigos Postales].Ciudad, [Codigos


Postales].Provincia FROM Clientes, [Codigos Postales] IN Codigos WHERE Clientes.[Codigo Postal] = [Codigos
Postales].[Codigo Postal]; (Crea una consulta con datos de dos bases de datos diferentes)

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 Nombre_Categoría, NombreProducto FROM Categorias INNER JOIN Productos ON

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 213

Categorias.IDCategoria = Productos.IDCategoria; (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.)

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 DISTINCT Paises, Ciudades FROM Tabladatos;

SELECT COUNT(DISTINCT Country) FROM Customers;

SELECT Count(*) AS DistinctCountries FROM (SELECT DISTINCT Country FROM Customers); (Cuenta el
número de paises sin incluir los repetidos)

(Por Probar )

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 214

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;

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; (Un caso práctico, si deseamos localizar aquellos empleados con igual
nombre y visualizar su código correspondiente)

Sub Consultas

Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO,

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 215

INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta.

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 DISTINCTROW NombreProducto, Precio_Unidad FROM Productos WHERE (Precio_Unidad =


(SELECT Precio_Unidad FROM Productos WHERE Nombre_Producto = "Almíbar anisado"); (Obtiene una
lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almíbar anisado.)

SELECT DISTINCTROW Nombre_Contacto, Nombre_Compañia, Cargo_Contacto, Telefono FROM Clientes


WHERE (ID_Cliente IN (SELECT DISTINCTROW ID_Cliente FROM Pedidos WHERE Fecha_Pedido =
#04/1/93# <#07/1/93#); (Obtiene una lista de las compañías y los contactos de todos los clientes que
han realizado un pedido en el segundo trimestre de 1993.)

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.)

SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad, (SELECT DISTINCTROW Productos.Nombre


FROM Productos WHERE Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto FROM Pedidos
WHERE Pedidos.Cantidad 150 ORDER BY Pedidos.Id_Producto; (Recupera el Código del Producto y la
Cantidad pedida de la tabla pedidos, extrayendo el nombre del producto de la tabla de productos.)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 216

Consultas de Acción

Eliminar:
DELETE Tabla.* FROM Tabla WHERE criterio

Elimina todos los clientes que vivan en Sevilla


DELETE FROM Clientes WHERE Provincia = "Sevilla"

Elimina todos los clientes


DELETE FROM Clientes

Elimina de una Base de Datos de la tabla Inventario los Codigos en blanco.


BDatos.Execute "DELETE FROM Inventario WHERE CodigoArticulo=’’ ;"

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)

Añade un nuevo registro a la tabla de correo


INSERT INTO Correo VALUES ("Perez, Jose", "Calle Mayor", "Vigo", "Po", "36201")

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]')

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 217

Para insertar Registros de otra Tabla:


INSERT INTO Tabla [IN base_externa] (campo1, campo2, ..., campoN) SELECT TablaOrigen.campo1,
TablaOrigen.campo2, ..., TablaOrigen.campoN FROM TablaOrigen

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 ;"

Si Tabla y TablaOrigen poseen la misma estructura podemos simplificar la sintaxis a:


INSERT INTO Tabla SELECT TablaOrigen.* FROM TablaOrigen

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

Insertar datos de una tabla a otra.


INSERT INTO TableB (campo1, campo2, campo3) SELECT campoA, campoB, CampoC FROM TableA

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 218

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 Empleados SET Grado = 5 WHERE Grado = 2;

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"

Aumenta el precio al por menor de todos los articulos en un 5%


UPDATE Articulos SET Minorista=Minorista*1.05

Ejemplo para VB
BDatos.Execute "UPDATE Contratos SET Renovable = 'S' WHERE Renovable IS NULL ;"

BDatos.Execute "UPDATE ContratosItems SET CodigoArticulo = '000' WHERE LEN(TRIM(CodigoArticulo))=0


OR CodigoArticulo 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 ;"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 219

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 + ";"

BDatos.Execute "SELECT Nombre, Direccion INTO TablaNueva FROM TablaOrigen ;"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 220

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.)

"SELECT * FROM Productos INNER JOIN NuevosProductos ON Productos.Nombre =


NuevosProductos.Nombre ;"

(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;

SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON


Orders.CustomerID = Customers.CustomerID;

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName FROM ((Orders INNER JOIN


Customers ON Orders.CustomerID = Customers.CustomerID) INNER JOIN Shippers ON Orders.ShipperID =
Shippers.ShipperID);

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 Tabla2 que no existen en Tabla1)


SELECT [Tabla2].* FROM [Tabla1] RIGHT JOIN [Tabla2] ON [Tabla1].[ID] = [Tabla2].[ID] WHERE [Tabla1].[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 ; "

BDatos.Execute "SELECT Contratos.NumeroContrato, Contratos.Fecha, ContratosItems.CodigoArticulo,


ContratosItems.Descripcion, Contratos.Identificacion, Contratos.Nombres, Contratos.Valor INTO

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 221

Temp_ArticulosVencidos FROM (Contratos LEFT JOIN ContratosItems ON


Contratos.NumeroContrato=ContratosItems.NumeroContrato) WHERE condición ; "

BDatos.Execute "SELECT * INTO Temp_ListadoDeProveedores FROM Licores_Proveedores ORDER BY


Licores_Proveedores.Nombres ;"

(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) ;"

(Unir dos tablas en una consulta por un valor común en un campo.)


"SELECT * FROM Contratos WHERE Identificacion='72352074' UNION SELECT * FROM
Contratos_Anteriores WHERE Identificacion='72352074' ORDER BY NumeroContrato"

(Elimina los números que no existen en la secuencia)


BDatos.Execute "DELETE Temp_ValidaSecuencias.* FROM Temp_Contratos INNER JOIN
Temp_ValidaSecuencias ON Temp_Contratos.NumeroContrato = Temp_ValidaSecuencias.NoEncontrado ;"

(Comparar campos de 2 tablas y borrar los registros de una de ellas.)


BDatos.Execute "DELETE tabla2 FROM tabla2 LEFT OUTER JOIN tabla1 ON tabla2.CampoComun = tabla1.
CampoComun WHERE tabla1. CampoComun IS NULL;”
(Tabla1 la tabla principal con campo numérico indexado, Tabla2, tabla secundaria con campo numérico con
índices repetidos y contiene valores que vamos a eliminar que no existen en la tabla1)
Ejemplo. Compara Tabla De Items Y Contratos Eliminando Los Números Que No Existan En Contratos.
Eliminando Items anteriores, Innecesarios.
BDatos.Execute "DELETE ContratosItems_Anteriores.* FROM ContratosItems_Anteriores LEFT OUTER JOIN
Contratos_Anteriores ON ContratosItems_Anteriores.NumeroContrato =
Contratos_Anteriores.NumeroContrato WHERE Contratos_Anteriores.NumeroContrato IS NULL;"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 222

Funciones

Funciones de valores simples:


ABS(n)= Devuelve el valor absoluto de (n).
CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n".
FLOOT(n) = Devuelve el valor entero inmediatamente inferior o igual a "n".
MOD (m, n)= Devuelve el resto resultante de dividir "m" entre "n".
NVL (valor, expresión)= Sustituye un valor nulo por otro valor.
POWER (m, exponente)= Calcula la potencia de un número.
ROUND (numero [, m])= Redondea números con el número de dígitos de precisión indicados.
SIGN (valor)= Indica el signo del "valor".
SQRT(n)= Devuelve la raíz cuadrada de "n".
TRUNC (numero, [m])= Trunca números para que tengan una cierta cantidad de dígitos de precisión.
VAIRANCE (valor)= Devuelve la varianza de un conjunto de valores.

Funciones de grupos de valores:


AVG(n)= Calcula el valor medio de "n" ignorando los valores nulos.
COUNT (* | Expresión)= Cuenta el número de veces que la expresión evalúa algún dato con valor
no nulo. La opción "*" cuenta todas las filas seleccionadas.
MAX (expresión)= Calcula el máximo.
MIN (expresión)= Calcula el mínimo.
SUM (expresión)= Obtiene la suma de los valores de la expresión.
GREATEST (valor1, valor2…)= Obtiene el mayor valor de la lista.
LEAST (valor1, valor2…)= Obtiene el menor valor de la lista.

Funciones que devuelven valores de caracteres:


CHR(n) = Devuelve el carácter cuyo valor en binario es equivalente a "n".
CONCAT (cad1, cad2)= Devuelve "cad1" concatenada con "cad2".
LOWER (cad)= Devuelve la cadena "cad" en minúsculas.
UPPER (cad)= Devuelve la cadena "cad" en mayúsculas.
INITCAP (cad)= Convierte la cadena "cad" a tipo título.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 223

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 que devuelven valores numéricos:


ASCII(cad)= Devuelve el valor ASCII de la primera letra de la cadena "cad".
INSTR (cad1, cad2 [, comienzo [,m]])= Permite una búsqueda de un conjunto de caracteres en una cadena pero
no suprime ningún carácter después.
LENGTH (cad)= Devuelve el número de caracteres de cad.

Funciones para el manejo de fechas:


SYSDATE= Devuelve la fecha del sistema.
ADD_MONTHS (fecha, n)= Devuelve la fecha "fecha" incrementada en "n" meses.
LASTDAY (fecha)= Devuelve la fecha del último día del mes que contiene "fecha".
MONTHS_BETWEEN (fecha1, fecha2)= Devuelve la diferencia en meses entre las fechas
"fecha1" y "fecha2".
NEXT_DAY (fecha, cad)= Devuelve la fecha del primer día de la semana indicado por "cad"
después de la fecha indicada por "fecha".

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 224

VISUAL BASIC
CONCEPTOS

By Gonzalo Bolaño Stefanell

© Gonzalo Bolaño Stefanell – 2.023


REGRESAR »»»»»»»
Manual de SQL & Visual Basic Pág. 225

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.

Características del lenguaje


Al igual que el BASIC lenguaje de programación Visual Basic fue diseñado para una fácil curva de aprendizaje.
Los programadores pueden crear tanto simples como complejos GUI aplicaciones. Programación en VB es una
combinación de organizar visualmente los componentes o controles en un formulario, especificando los
atributos y acciones de esos componentes, y escribir líneas adicionales de código para una mayor funcionalidad.
Desde VB define los atributos y acciones predeterminadas para los componentes, un programador puede
desarrollar un programa simple sin tener que escribir mucho código. Los programas creados con versiones
anteriores sufrieron problemas de rendimiento, pero los ordenadores más rápidos y compilación de código
nativo ha hecho de este un problema menor. Aunque los programas de VB pueden ser compilados en
ejecutables de código nativo de la versión 5 en, todavía requieren la presencia de alrededor de 1 MB de
bibliotecas de tiempo de ejecución. Bibliotecas de ejecución de núcleo se incluye de forma predeterminada en
Windows 2000 y más tarde, pero los componentes de tiempo de ejecución extendidos todavía tienen que ser
instalado. Las versiones anteriores de Windows (95/98 / NT), requieren que las bibliotecas de ejecución ser
distribuidos con el ejecutable.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 226

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.

Visual Basic se basa en las características de BASIC.


• No hay números de línea como en el anterior BASIC, el código se agrupa en subrutinas o métodos: Sub
... End Sub .
• Las declaraciones de código no tienen carácter de terminación que no sea un final de línea (retorno de
carro / avance de línea). Versiones desde al menos VB 3.0 permite que los estados pueden ser

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 227

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,

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 228

$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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 229

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 230

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.

• LotusScript es una variante de VBA disponible en Lotus SmartSuite y Lotus Notes .

• 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

Desarrollo heredado y apoyo


Todas las versiones del entorno de desarrollo de Visual Basic desde 1,0 a 6,0 fueron retirados por Microsoft
para el año 2008, y por lo tanto ya no son compatibles. Los entornos de ejecución asociados también son no
compatibles, a excepción de la Basic 6 entorno de ejecución de núcleo Visual, que Microsoft admite oficialmente
para la vida útil de Windows 8 y Windows 10 . Los componentes de terceros que se entregan con Visual Studio
6.0 no se incluyen en esta declaración de apoyo. Algunos componentes heredados de Visual Basic todavía
pueden trabajar en las plataformas más recientes, a pesar de ser soportado por Microsoft y otros proveedores.
La documentación de Visual Basic 6.0, su interfaz de programación de aplicaciones y herramientas está mejor
cubierto en la última MSDN de liberación antes de Visual Studio.NET 2002. Las versiones posteriores de MSDN
centrado en el desarrollo .NET y tenía partes significativas de la documentación de Visual Básico de
programación 6.0 eliminado como el lenguaje evolucionó, y soporte para código antiguo terminó. Aunque el

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 231

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.

Optimizaciones Visual Basic.


Saber qué optimizar: comprender el problema real.
Si no tiene claros sus objetivos, puede desperdiciar mucho tiempo optimizando cosas sin importancia. Sus
objetivos tienen que estar basados en las necesidades y expectativas de los usuarios. Por ejemplo, la velocidad
puede ser un factor determinante en el cálculo de los impuestos de ventas en una aplicación de punto de venta,
mientras que el tamaño tendrá más importancia si va a transferirse la aplicación por Internet. La clave de la
elección de una buena estrategia de optimización es saber el problema real que tiene que afrontar la
optimización.

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.

Saber dónde optimizar: máximas ventajas con el mínimo esfuerzo.


Por ejemplo, si la velocidad es su objetivo principal, los cuerpos de los bucles son un buen sitio por dónde
empezar. Si mejora la velocidad de ejecución de las operaciones de un bucle, esa mejora se multiplicará por el
número de veces que se ejecute el bucle. En los bucles con un gran número de iteraciones, una operación de
cadenas menos puede suponer una gran diferencia. Este mismo principio puede aplicarse frecuentemente a las
subrutinas.

Evitar el uso de variables Variant.


Como Visual Basic convierte las variables Variant al tipo de datos apropiado en tiempo de ejecución, las
operaciones con otros tipos de datos simples eliminan este paso adicional y son más rápidas que sus
equivalentes Variant.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 232

Uso de variables Long Integer


Tipo de datos numérico Velocidad
Long Máxima
Integer
Byte
Single
Double
Currency Mínima

Almacenamiento en caché de las propiedades utilizadas con mayor frecuencia en variables


Los valores de las variables se obtienen y se establecen con más rapidez que los de las propiedades. Si va a
leer frecuentemente el valor de una propiedad (como en un bucle), su código se ejecutará más deprisa si asigna
la propiedad a una variable externa al bucle y después utiliza la variable en lugar de la propiedad.

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.

Mantener los formularios ocultos pero cargados


Ocultar los formularios en lugar de descargarlos es un truco que viene de las primeras épocas de Visual Basic
1.0, pero sigue siendo efectivo. El inconveniente obvio de esta técnica es la cantidad de memoria que consumen
los formularios cargados, pero puede desestimarlo si puede permitirse el gasto en memoria, ya que hacer que
los formularios aparezcan con rapidez es de la máxima importancia.

Reducir el tamaño del código


La mayoría de las técnicas de optimización del tamaño consisten en eliminar elementos innecesarios del código.
Visual Basic elimina automáticamente ciertos elementos cuando compila la aplicación. No hay razones para
restringir la longitud o el número de los siguientes elementos:

* 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:

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 233

• Reducir el número de formularios cargados.


• Reducir el número de controles.
• Usar etiquetas en lugar de cuadros de texto.
• Guardar datos en archivos de disco o en otros recursos y cargarlos sólo
• cuando sean necesarios.
• Organizar los módulos.
• Considerar alternativas al tipo de datos Variant.
• Usar matrices dinámicas y borrarlas para liberar memoria.
• Liberar el espacio utilizado por las cadenas o por las variables de
• objeto.
• Eliminar el código inservible y las variables que no se utilizan.

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.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 234

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).

Diferencia entre ADO y DAO.


El DAO es relativamente fácil de codificar, pero debido a esta simplicidad se ve en muchas ocasiones limitado
a operaciones que requieren velocidad en una transacción de Datos, si esa BD se incrementara
considerablemente verías de que te estoy hablando (a mayor cantidad de registros o datos, mayor será el
tiempo de espera de conexión de tu objeto Data con la BD) esto es más evidente si utilizas controles Combo o
List en tu aplicación.
Además, una desventaja de DAO es que no puede ser usado en Access 2000.
Por el contrario, la incorporación de la biblioteca de Objetos ActiveX de acceso a datos a Visual Basic 6 agrega
todo un nuevo conjunto de posibilidades en la programación de bases de datos con este lenguaje. Con todo, el
modelo ADO es el más pequeño de todos los modelos de objetos para acceso a BD. Proporciona un rápido y
efectivo medio para crear conjuntos de registros de la BD. Aún mejor, puede crear un conjunto de registros,
desconectarse del servidor (y guardar el conjunto de registros en un archivo local) y luego volver a conectarse
a la BD para enviar su conjunto de registros actualizado.
¿Qué es ADO?, EL Modelo de Objetos ActiveX de acceso a datos, podría interpretarse como el eslabón perdido
entre DAO y RDO (RDO es el modelo que se utiliza para acceder a BD Remotas). Aunque no se relacionan de
alguna manera especial, todos estos modelos se enfocan en dar servicios de datos a las aplicaciones sin la
sobrecarga del DAO y con algunas adiciones al RDO. En sí, una de las mayores diferencias con DAO y RDO es
que ADO se ha creado para utilizar la interfaz OLEBD como el proveedor de dato.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 235

VISUAL BASIC
EJEMPLOS Y TRUCOS
AVANZADOS

By Gonzalo Bolaño Stefanell

© Gonzalo Bolaño Stefanell – 2.023 REGRESAR »»»»»»»


Manual de SQL & Visual Basic Pág. 236

EJEMPLOS Y TRUCOS AVANZADOS

INDICE

Cadenas De Conexión (Connectionstring).

Microsoft Access

Microsoft Sql Server

Mysql

Cadenas De Conexión Para Conectar A Microsoft Excel

Connectionstring Para Archivos De Texto ( Txt, Csv Etc..)

Foxpro – Dbf

Bases de Datos Access

Abrir Base de Datos.

Abrir Base de Datos (ADO).

Agregar campos a una Tabla.

Agregar una Tabla a una Base de Datos.

Cambiar Nombre (Renombrar) una Tabla en una Base de Datos.

Copiar Tabla de Una Base de Datos a Otra.

Copiar Tabla de Una Base de Datos a Otra (Estructura Completa).

Crear Base de Datos en Blanco (Sin tablas).

Transferir el Resultado de una Consulta de un Base de Datos a Otra.

Determinar si existe una Tabla en una Base de Datos.

Unir Dos Tablas en otra Nueva Tabla.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 237

Eliminar Campos a una Tabla.

Eliminar una Tabla en una Base de Datos.

Eliminar Contenido de una Tabla en una Base de Datos.

Pasar Tabla de una Base de Datos a Archivo Binario (TXT).

Pasar de un Archivo Binario (TXT) a una Tabla en una Base de Datos.

Pasar Tabla de una Base de Datos a DBase III (DBF).

Pasar Tabla de una Base de Datos a FoxPro 2.6 (DBF).

Realizar una Copia de una Base de Datos.

Saber el Número y Nombres de Campo de Una Tabla.

Abrir y Mostrar Archivo de Texto.

Acceder a Bases de Datos Externas

Calcular Edad Con Base en Fecha de Nacimiento.

Colocar Barra de Desplazamiento Horizontal a Control List1.

Colocar Mas de Una Columna en un Control ListBox.

Controlar por Fecha la Ejecución de un Programa.

Copiar un Archivo.

Determinar y Asignar el Tamaño de la Pantalla (Sin Incluir la Barra de Tareas).

Eliminar (Borrar) un Archivo.

Escribir y Leer Archivo Binario (Texto).

Determinar si Existe Archivo Binario (Texto), Leer o Grabar Contenido.

Calcular el Número de Registros de Archivo Binario (Texto).

Fondo Con Sombra a Formulario.

Generar Números Aleatorios (Incluye Duplicados).

Generar y Ordenar Números Aleatorios (Sin Duplicados).

Imprimir un Archivo de Texto (*.txt).

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 238

Llenar Datagrid con Registro de Base de Datos (ADO).

Llenar ListView con Registro de Base de Datos (ADO).

Llenar ListView con Registro de Base de Datos (ADO) Otro.

Llenar ListView con Registro de Base de Datos (DAO).

Modificar Fecha y Hora de Un archivo Determinado

Mostar el Icono de Programa en la Barra de Tareas.

Mover Cursor a Un Control

Mover Cursor Directo a Un Control (en el centro)

Mover el Formulario con el Mouse.

Obtener Espera en Segundos de Algún Proceso.

Ordenar DBGrid Por Columna (Ascendente y Descendente).

Ordenar Un Vector.

Ordenar Un Vector (Metodo De Burbuja).

Permitir Solo Letras en Una Cadena.

Separar Números y Letras en una Cadena de Texto.

Ver con Explorador de Windows Ubicación de Archivo.

Ver Fecha y hora de un Archivo.

Volver Formulario Opaco o Transparente.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 239

Cadenas de conexión (Connectionstring).


Lista de algunos Connectionstring para acceder a base de datos y archivos de datos mediante Ado. Aquí se
listan algunas cadenas de conexión, y ejemplos de cadenas de conexión de ADO para ODBC DSN / DSN-Less,
OLE DB Proveedores, Remote Data Services (RDS), MS Remote, y MS DataShape.
También están incluidas cadenas de conexión para ADO.NET y proveedores como MySQL, ODBC, OLE DB,
Oracle, y SQL Server .NET Data Providers

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 mediante ODBC en modo exclusivo


cnn.open "Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=C:\Labase.mdb;Exclusive=1;Uid=admin;Pwd=;"

Para .net mediante OleDB y con Password


cnn.open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\LaBase.mdb;" & _
"Jet OLEDB:Database Password=Password;"

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 & ";" & _

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 240

"Jet OLEDB:System Database=c:\Archivo.mdw", "User", "Password"

Igual al anterior, pero usando ODBC


Dim path_Bd As String
path_Bd = "c:\carpta\LaBase.mdb"
cnn.Open "driver={Microsoft Access Driver (*.mdb)};" & _
"dbq=" & path_Bd & ";" & _
"systemdb=c:\Archivo.mdw;", _
"usuario", " password "

Conectar a Access 2007


Private Sub Form_Load()
Dim cs As String
Dim cn As ADODB.Connection
Dim sPath_Access As String
' -- Ruta del archivo ACCDB
sPath_Access = App.Path & "\base\db.accdb"
cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
sPath_Access & ";Persist Security Info=False;"
' -- Access 2007 con password
cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
sPath_Access & ";Jet OLEDB:Database Password=contraseña;"
cn.Open cs
End Sub

Microsoft Sql Server


Cadena de conexión usando OLEDB
cnn.Open "Provider=sqloledb;" & _
"Data Source=Nombre_del_Servidor;" & _
"Initial Catalog=Nombre_de_la_base;" & _
"User Id=USUARIO;Password=PASSWORD"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 241

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"

A una base Mysql remota mediante ODBC


cnn.Open "Driver={MySQL ODBC 3.51 Driver};" & _
"Server=data.domain.com;" & _
"Port=3306;Database=LaBase;" & _
"User=USUARIO;Password=PASSWORD;Option=3;"

Base de datos local mediante ODBC


cnn.Open "Driver={MySQL ODBC 3.51 Driver};Server=localhost;" & _
"Database=LaBase;User=Usuario;Password=Password;Option=3;"

Cadenas de conexión para conectar a Microsoft Excel


A un archivo Excel mediante OLEDB
conexion.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & path_Bd & _
";Extended Properties=""Excel 8.0;HDR=Yes;"""

A Excel Mediante ODBC


cnn.Open "driver={Microsoft Excel Driver (*.xls)};" & _
"driverid=790;dbq=c:\libro.xls;" & _
"defaultdir=c:\lacarpeta"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 242

ConnectionString para archivos de texto ( txt, Csv etc..)


ODBC
cnn.Open "DRIVER={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=" & App.Path & ";", "", ""
'Ejemplo para cargar un recordset
'El archivo de texto en la cláusula From
rs.Open "select * from [ElArchivo#txt]", conn, adOpenStatic, _
adLockReadOnly, adCmdText

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=;"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 243

Bases de Datos Access

Abrir Base de Datos.


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)

' Variables BASE DE DATOS definidas en declaración del MODULO


Public BDatos, BDatos2, BDatos3 As Database
Public Regdatos, RegDatos2, RegDatos3 As Recordset

'Sub rutina creada en MODULO para abrir la Base de Datos


XRutaBD (Ruta y nombre de la Base de Datos)
PWD=JUNIOR (opcional en caso de que tenga clave la Base de Datos)

Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")

Abrir Base de Datos (ADO).


' *** Referencia Habilitada ; Microsoft ActiveX Data Objects 2.5 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO25.TLB"
Dim Regdatos As ADODB.Recordset
Set DBConexion = New ADODB.Connection
DBConexion.Provider = "Microsoft.JET.OLEDB.4.0"
DBConexion.Open "I:\PRUEBAS\DATOS.MDB"
Set Regdatos = New ADODB.Recordset
Regdatos.Open "SELECT * FROM PERSONAS", DBConexion, adOpenKeyset, adLockReadOnly ' Select
fields
Do Until Regdatos.EOF
Datos=Regdatos("CAMPO1")
Regdatos.MoveNext
Loop
Regdatos.Close

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 244

Set Regdatos = Nothing

Abrir Base de Datos (DAO).


' *** Referencia Habilitada ; Microsoft DAO 3.51 Objetc Library
' Archivo "C:\Program Files\Common Files\microsoft shared\DAO\DAO350.DLL"
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\DATOS.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
XS = "SELECT * FROM Personas ORDER BY CAMPO1"
Set Regdatos = BDatos.OpenRecordset(XS)
Do Until Regdatos.EOF
Datos= Regdatos("CAMPO1")
Regdatos.MoveNext
Loop
Regdatos.Close
Set Regdatos = Nothing

Abrir Base de Datos Access 2007-2016 (ADO).


' *** Referencia Habilitada ; Microsoft ActiveX Data Objects 2.5 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO25.TLB"
Dim Regdatos As ADODB.Recordset
Set DBConexion = New ADODB.Connection
CadConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=I:\PRUEBAS\Database2.accdb;Persist
Security Info=False;"
DBConexion.Open CadConexion
Set Regdatos = New ADODB.Recordset
Regdatos.Open "SELECT * FROM PERSONAL", DBConexion, Opendynamic
DoEvents
Do Until Regdatos.EOF
Datos = Regdatos("CAMPO1")

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 245

Regdatos.MoveNext
Loop
Regdatos.Close
Set Regdatos = Nothing
DBConexion.Close

Agregar Campos A Una Tabla.


ALTER TABLE tblCustomers ADD COLUMN Address TEXT(30)
BDatos.Execute "ALTER TABLE Tabla1 ADD COLUMN Nueva TEXT(30);"

(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;"

(Otra forma También de agregar campos es utilizar un vector)


' AGREGAR NUEVOS CAMPO
ReDim Vector(8)
Vector(1) = "Grupo CHAR(1) NULL ;"
Vector(2) = "NumeroContrato LONG ;"
Vector(3) = "Fecha DATETIME ;"
Vector(4) = "Meses CHAR (12) NULL ;"
Vector(5) = "ClaseDeOro CHAR (10) NULL ;"
Vector(6) = "PesoAproximado SINGLE ;"
Vector(7) = "NroAnterior LONG ;"
Vector(8) = "Valor LONG ;"
For i = 1 To 8
BDatos.Execute "ALTER TABLE NombredeTabla ADD COLUMN " + Vector(i)
Next i

Agregar una Tabla a una Base de Datos.


Para el uso de Bases de Datos ADO, VB6, se debe tener habilitada la opción “Microsoft DAO 3.51 Objetc Library”.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 246

(Marcarle en el menú, opciones; Proyecto, referencias)

' Variables BASE DE DATOS definidas en declaración del MODULO


Public BDatos As Database

XRutaBD (Ruta y nombre de la Base de Datos)


Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")

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) );"

BDatos.Execute "CREATE TABLE “ + NombreDeTabla + XCamposTabla


(si la tabla ya existe se debe eliminar antes)
BDatos.Execute "DROP TABLE NombreDeTabla ;"

Cambiar Nombre (Renombrar) una Tabla en una Base de Datos.


Screen.MousePointer = 11
Dim BDatos As Database
Dim Regdatos, Regdatos2 As Recordset
XRutaBD = "I:\PRUEBAS\XXXXX.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
For I = 0 To BDatos.TableDefs.Count - 1
If BDatos.TableDefs(I).Name = "DatosPersonales" Then BDatos.TableDefs(I).Name = "DatosClientes": Exit
For

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 247

Next I
Screen.MousePointer = 0

Copiar Tabla de Una Base de Datos a Otra.


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)

' Tener en cuenta que en la nueva tabla generada se pierden las definiciones referentes a índices, si se permite
longitud cero, campo requerido, etc.

' Variables BASE DE DATOS Definidas En Declaración Del MODULO


Public BDatos As Database

' NOMBRE ORIGEN Y DESTINO DE BASES DE DATOS


XBdOrigen = "BDatos.MDB"
XBdDestino = "BDatosDestino.MDB"
XMiRuta = "I:\PRUEBAS"
XRutaOrigen = XMiRuta + "\" + XBdOrigen
XRutaDestino = XMiRuta + "\" + XBdDestino
XTabla = "Ventas"

' Abrir Base De Datos


Set BDatos = DBEngine.OpenDatabase(XRutaOrigen, False, False, ";PWD=JUNIOR")

' Iniciar Copia De Tabla, No Olvidar Colocar El Punto . Antes Del Nombre De La Tabla
BDatos.Execute "SELECT * INTO [" + XRutaDestino + "]." + XTabla + " FROM " + XRutaOrigen + "." + XTabla

Copiar Tabla de Una Base de Datos a Otra (Estructura Completa).


Para el uso de Bases de Datos ADO, VB6, se debe tener habilitada la opción “Microsoft Access 8.0 Objetc
Library”. (Marcarle en el menú, opciones; Proyecto, referencias). Dependiendo de la versión de Access utilizada.

XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 248

Dim MiBase As New Access.Application


' Abre Access y la Base de Datos
MiBase.OpenCurrentDatabase XRutaBD
' Copia Tabla “TablaOrigen” como “TablaNueva”, Datos y Estructura.
MiBase.DoCmd.CopyObject , "TablaNueva", acTable, "TablaOrigen"
' Cierra la Base de Datos
MiBase.CloseCurrentDatabase
' Cierra Access
MiBase.Quit

Crear Base De Datos En Blanco (Sin Tablas).


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)
' Verificamos Que La Base De Datos No Exista En Caso Contrario Se Elimina
MiRuta = App.Path
If Dir(MiRuta + "\" + NomBaseDatos) = NomBaseDatos Then Kill MiRuta + "\" + NomBaseDatos

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)

Transferir el Resultado de una Consulta de un Base de Datos a Otra.

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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 249

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.

XRutaBD = "C: \BD_ORIGEN\DATOS.DAT"


XRutaMiaBD = "C: \BD_DESTINO\DATOSNEW.DAT"
XTablaD = "Temp_PruebaSupletoria"
XTablaO = "Pruebasupletoria"
XCedula Campo de Comparación
XArticulo Campo de Comparación

BDatos.Execute "SELECT * INTO [" + XRutaMiaBD + "]." + XTablaD + " FROM " + XRutaBD + "." + XTablaO + "
WHERE Cedula='" + XCedula + "' AND Articulo='" + XArticulo + "' ;"

Determinar si existe una Tabla en una Base de Datos.


Variables:
XTablaExiste = 0, NO EXISTE
XTablaExiste = 1, SI EXISTE
NomTabla = nombre de la tabla a buscar
AbrirBasedeDatos "MICVDATO.MDB” (Consultar arriba como se abre la base de datos; Abrir una Base de Datos
Access)

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ó.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 250

Unir Dos Tablas en Otra Nueva Tabla.


Generamos la tabla Temp_Basura con la Consulta de la tabla contratos y contratosItems si el número de
contrato en la tabla contrato es igual al que tiene la variable XTemP.

BDatos.Execute "SELECT * INTO Temp_Basura FROM (Contratos LEFT JOIN ContratosItems


ON Contratos.NumeroContrato = ContratosItems.NumeroContrato) WHERE
Contratos.NumeroContrato = " + XTemP + " ;"

Si las tablas no se relacionan entre sí:


SELECT tabla1.Campo1, tabla1.Campo2, tabla2.Campo1, tabla2.Campo2 FROM tabla1, tabla2 WHERE
tabla1.CampoX = algo

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.

Eliminar Campos a una Tabla.


ALTER TABLE tblCustomers DROP COLUMN Address
BDatos.Execute "ALTER TABLE TablaDatos DROP COLUMN Campo3;"

Eliminar una Tabla en una Base de Datos.


Variables:
NomTabla = nombre de la tabla a eliminar
On Error Resume Next
Screen.MousePointer = 11
AbrirBasedeDatos "MICVDATO.MDB”
(Consultar Arriba Como Se Abre La Base De Datos; Abrir Una Base De Datos Access)
For I = 0 To BDatos.TableDefs.Count - 1
If BDatos.TableDefs(I).Name = NomTabla Then
BDatos.Execute "DROP TABLE " + NomTabla + " ;" : Exit For

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 251

Endif
Next I
Screen.MousePointer = 0

Eliminar Contenido de Tabla en una Base de Datos.


Ubicamos un Campo que Tenga Siempre Información y lo Tomamos de Referencia.
AbrirBasedeDatos "MICVDATO.MDB”
BDatos.Execute "DELETE FROM NombreTabla WHERE LEN(Campo) > 0 ;"

Pasar Tabla de una Base de Datos a Archivo Binario (TXT).


Exporta Una Tabla De La Base De Datos A Archivo Texto, Separado Por Comas Y Campos Entre Comillas
Screen.MousePointer = 11
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
‘ Exporta La Tabla DatosPersonales Como Export.Txt
BDatos.Execute "SELECT * INTO [text;database=I:\PRUEBAS\].Export.TXT FROM DatosPersonales ;"
Screen.MousePointer = 0

Pasar de un Archivo Binario (TXT) a una Tabla en una Base de Datos.


Screen.MousePointer = 11
Dim BDatos As Database
Dim Regdatos As Recordset
Set Regdatos = BDatos.OpenRecordset("TemporalCorregido", dbOpenDynaset)
Set fs = CreateObject("Scripting.FileSystemObject")
Set A = fs.OpenTextFile("C:\TXT\TXT_Datos_MP3.TXT", 1)
Do While A.AtEndOfStream <> True
LineA = A.ReadLine
If Len(LineA) > 0 Then
Regdatos.AddNew

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 252

Regdatos("Datos") = LineA
Regdatos.Update
End If
Loop
Regdatos.Close
Screen.MousePointer = 0

Pasar Tabla de una Base de Datos a DBase III (DBF).


Exporta Una Tabla De La Base De Datos A Archivo DBF.
Screen.MousePointer = 11
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
‘ Exporta La Tabla DatosPersonales Como Export.Txt
BDatos.Execute "SELECT * INTO [dbase III;database=I:\PRUEBAS\].Export.DBF FROM DatosPersonales ;"
Screen.MousePointer = 0

Pasar Tabla de una Base de Datos a FoxPro 2.6 (DBF).


Exporta Una Tabla De La Base De Datos A Archivo DBF.
Screen.MousePointer = 11
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\EJEMPLO.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
‘ Exporta La Tabla DatosPersonales Como Export.Txt
BDatos.Execute "SELECT * INTO [foxpro 2.6;database=I:\PRUEBAS\].Export. DBF FROM DatosPersonales ;"
Screen.MousePointer = 0

Realizar una Copia de una Base de Datos.


Aplica Para Copiar Cualquier Tipo De Archivo

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 253

Dim XBdOrigen, XBdDestino, XMiRuta As String


Set fs = CreateObject("Scripting.FileSystemObject")
' Nombre Origen Y Destino De Bases De Datos
XBdOrigen = "BDatos.MDB"
XBdDestino = "BDatosDestino.MDB"
XMiRuta = "I:\PRUEBAS"
' Verificamos Si Existe El Nuevo Nombre Para Eliminarlo
If Dir(XMiRuta + "\" + XBdDestino) = XBdDestino Then Kill XMiRuta + "\" + XBdDestino
' Copiamos
fs.CopyFile XMiRuta + "\" + XBdOrigen, XMiRuta + "\" + XBdDestino

Saber el Número y Nombres de Campo de Una Tabla.


' Además Muestra La Información Del Primer Registro De Campo En Un List.
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)

' Variables BASE DE DATOS Definidas En Declaración Del MODULO


Public BDatos As Database
Public Regdatos As Recordset

‘ En El Formulario O Control
Dim XBdOrigen, XMiRuta As String
XBdOrigen = "Datos.MDB"
XMiRuta = "I:\PRUEBAS"
XRutaOrigen = XMiRuta + "\" + XBdOrigen

' ABRIR BASE DE DATOS


Set BDatos = DBEngine.OpenDatabase(XRutaOrigen, False, False, ";PWD=JUNIOR")
' NOMBRE DE LA TABLA "PERSONAS"
Set Regdatos = BDatos.OpenRecordset("PERSONAS", dbOpenDynaset)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 254

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

Abrir y Mostrar Archivo de Texto.


' Colocar La Siguiente Línea Indicando La Ruta Y Nombre Del Archivo Del Cual Vamos A Visualizar El
Contenido.
Shell "Notepad.exe " + "I:\PRUEBAS\Archivo.TXT", vbNormalFocus
Cadena = Shell("notepad.exe " + DirTrabajO + "TXT_Inconsistencias.TXT", vbNormalFocus)

Acceder a Bases de Datos Externas


(SQL-ACCESS- Bases de Datos Externas)
ACCESS: Para el acceso a bases de datos externas se utiliza la cláusula IN. Se puede acceder a bases 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:

FROM Tabla IN '[dBASE IV; DATABASE=C: \DBASE\DATOS\VENTAS;]';


FROM Tabla IN 'C: \DBASE\DATOS\VENTAS' 'dBASE IV;'

Acceso a una base de datos externa de Microsoft Access:


SELECT IdCliente FROM Clientes IN 'C:\MISDATOS.MDB' WHERE IDCliente Like 'A*'; (En donde
MISDATOS.MDB es el nombre de una base de datos de Microsoft Access que contiene la tabla Clientes.)

Acceso a una base de datos externa de dBASE III o IV:


SELECT IdCliente FROM Clientes IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV'; WHERE

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 255

IDCliente Like 'A*'; (Para recuperar datos de una tabla de dBASE III+ hay que utilizar 'dBASE III+;' en lugar de
'dBASE IV;'.)

Acceso a una base de datos de Paradox 3.x o 4.x:


SELECT IdCliente FROM Clientes IN 'C:\PARADOX\DATOS\VENTAS' 'Paradox 4.x;' WHERE
IDCliente Like 'A*' ; (Para recuperar datos de una tabla de Paradox versión 3.x, hay que sustituir 'Paradox
4.x;' por 'Paradox 3.x;'.)

Acceso a una base de datos de Btrieve:


SELECT IdCliente FROM Clientes IN 'C:\BTRIEVE\DATOS\VENTAS\FILE.DDF' 'Btrieve;' WHERE IDCliente Like
'A*' ; (C:\BTRIEVE\DATOS\VENTAS\FILE.DDF es la ruta de acceso y nombre de archivo del archivo de
definición de datos de Btrieve.)

Calcular Edad Con Base en Fecha de Nacimiento.


Teniendo en cuenta que la fecha actual es 04/06/2020, la Edad sería igual a 45 Años.

Usar Funcion DateDiff


FecNac=(“04/03/1975”)
Edad= DateDiff("yyyy", FecNac, Date)

Colocar Barra de Desplazamiento Horizontal a Control List1.


(Esta Función Permite Colocar A Un Control Listbox Una Barra Para Desplazamiento Horizontal Cuando La
Información Que Llena El Listbox Sobrepasa El Ancho Asignado Al Control.)

(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)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 256

‘ 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

Colocar Mas de Una Columna en un Control ListBox.


(Esta Función Permite Colocar A Un Control Listbox Una Barra Para Desplazamiento Horizontal Cuando La
Información Que Llena El Listbox Sobrepasa El Ancho Asignado Al Control.)

(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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 257

If TaM6 > 0 Then Columnas(6 - 1) = TaM6


AcuM = 0
For Q = 0 To NumColumnas - 1
Tabuladores(Q) = AcuM + (Columnas(Q) + 1) * 4 'ponemos un carácter de más
AcuM = AcuM + Tabuladores(Q)
Next Q
If NumList = 1 Then
NomForm.List1.Clear
Q = SendMessage(NomForm.List1.hwnd, LB_SETTABSTOPS, NumColumnas, Tabuladores(0))
End If
If NumList = 2 Then
NomForm.List2.Clear
Q = SendMessage(NomForm.List2.hwnd, LB_SETTABSTOPS, NumColumnas, Tabuladores(0))
End If
End Sub

(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

Controlar por Fecha la Ejecución de un Programa.


' Definición De Fecha Máxima De Ejecución De Programa.
' Se Debe Tener Un Archivo Como Referencia Para La Búsqueda Y Autorización Del Uso De La Aplicación.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 258

' 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

Dim XCtl, XRuta As String


XRuta = "I:\PRUEBAS\"
XCtl = "CONTROL.DLL"

If UCase(Dir(XRuta + XCtl)) = XCtl Then


' Fecha Hasta La Cual Es Autorizado El Programa
If CDate("30/05/2020") < Date Then
MsgBox "Problemas Con Licenciamiento Del Programa, Se Excedió La Fecha De Uso. Comuníquese Con
Soporte Técnico."
End
End If
End If

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

Otra forma seria:


‘ En Formulario O Control
Set fs = CreateObject("Scripting.FileSystemObject")
Set Arc = fs
fs.CopyFile XOrigen, XDestino

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 259

Determinar y Asignar el Tamaño de la Pantalla (Sin Incluir la Barra de Tareas).


(En El Módulo).
' Variables Integer
Public XPantAncho, XPantAlto As Integer

' Determinar Tamaño De La Pantalla (Sin Incluir La Barra De Tareas)


Public Ret As Long
Public T_rect As RECT
' Obtener Tamaño De La Pantalla
Private Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction
As Long, ByVal uiParam As Long, pvParam As Any, ByVal fWinIni As Long) As Long
Private Const SPI_GETWORKAREA = 48
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type FILETIME
dwLowDate As Long
dwHighDate As Long
End Type

(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

Eliminar (Borrar) un Archivo.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 260

(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"

Escribir y Leer Archivo Binario (Texto).


' Al Crear Archivo De Texto Verificar Que No Exista El Nombre
If Dir("I:\PRUEBAS\BASURA.TXT") = "BASURA.TXT" Then Kill "I:\PRUEBAS\BASURA.TXT"

' Abrir Y Escribir


Open "I:\PRUEBAS\BASURA.TXT" For Output Shared As #1
LIN = "Linea de Prueba 1": Print #1, LIN
LIN = "Linea de Prueba 2": Print #1, LIN
LIN = "Linea de Prueba 3": Print #1, LIN
Close #1

' Abrir Y Leer Datos Del Archivo


Open "I:\PRUEBAS\BASURA.TXT" For Input Shared As #1
Do While Not EOF(1)
Input #1, InfoR
Datos = InfoR
Loop
Close #1

' Adicionar datos a un archivo ya existente


Open "I:\PRUEBAS\BASURA.TXT" For Append As #1
LIN = "Linea de Prueba 1": Print #1, LIN
LIN = "Linea de Prueba 2": Print #1, LIN
LIN = "Linea de Prueba 3": Print #1, LIN

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 261

Close #1

Otra forma sería:


Set fs = CreateObject("Scripting.FileSystemObject")
DirTrabajO = "F:\MP3_TAGS\"
Set A = fs.OpenTextFile(DirTrabajO + "TXT\TXT_Datos_MP3.TXT", 1)
num_linea = 0
Do While A.AtEndOfStream <> True
LineA = A.ReadLine
num_linea = num_linea + 1
Loop

Determinar si Existe Archivo Binario (Texto), Leer o Grabar Contenido.


' Ejemplo del contenido del archivo
// Parámetros De Configuración Programa Mp3Tags
// (C)Copyright 2.022 - Gonzalo Bolaño Stefanell
* --------------------------------------------------------------------------
* 01. Color Pantalla De Fondo.....................: &H00000000&
* 02. Total Imagenes JPG En Carpeta Album.........: 2432
* 03. Total Imagenes JPG En Carpeta General.......: 17528
* 04. Total Canciones Clasificadas Por Albums.....: 2442
* 05. Total Canciones MP3 En Carpeta Origen.......: 17628
* --------------------------------------------------------------------------
// Actualizado : 08/10/2023 - 16:18:21

' Instrucciones Para Proceso De Búsqueda…


If BuscarArchivo(DirTrabajO + "MP3PROCS.CFG") = True Then
' SI ARCHIVO EXISTE SE LEE CONTENIDO
Open Dir(CurDir() + "\MP3PROCS.CFG") For Input Shared As #1
Do While Not EOF(1)
Input #1, InfoR

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 262

If Mid(InfoR, 3, 2) = "01" Then ProcFecha = Trim(Mid(InfoR, 53, 35))


If Mid(InfoR, 3, 2) = "02" Then ProcOrganiza = Trim(Mid(InfoR, 53, 35))
If Mid(InfoR, 3, 2) = "03" Then ExtAlbElimina = Trim(Mid(InfoR, 53, 35))
If Mid(InfoR, 3, 2) = "04" Then ExtAlbExtrae = Trim(Mid(InfoR, 53, 35))
If Mid(InfoR, 3, 2) = "05" Then ExtAlbOrganiza = Trim(Mid(InfoR, 53, 35))
Loop
Close #1
Else
' SI EL ARCHIVO DE PROCESOS NO EXISTE SE CREA CON PARAMETROS FIJOS
Open DirTrabajO + "MP3PROCS.CFG" For Output Shared As #1
LIN = "// Control De Procesos Del Programa Mp3Tags": Print #1, LIN
LIN = "// (C)Copyright 2.022 - Gonzalo Bolaño Stefanell": Print #1, LIN
LIN = "* --------------------------------------------------------------------------": Print #1, LIN
LIN = "* 01. Extraer Información De MP3 (TAGS)...........: " + "00/00/0000 - 00:00:00": Print #1, LIN
LIN = "* 02. Organización De Datos Extraidos.............: " + "00/00/0000 - 00:00:00": Print #1, LIN
LIN = "* 03. Eliminar Caratulas JPG En Album.............: " + "00/00/0000 - 00:00:00": Print #1, LIN
LIN = "* 04. Extraer Caratulas Por Album.................: " + "00/00/0000 - 00:00:00": Print #1, LIN
LIN = "* 05. Organizar Nombres De Caratulas En Album.....: " + "00/00/0000 - 00:00:00": Print #1, LIN
LIN = "* --------------------------------------------------------------------------": Print #1, LIN
LIN = "// Actualizado : " + Trim(Str(Date)) + " - " + Trim(Str(Time)): Print #1, LIN
Close #1
End If
End If
(En Un Módulo)
Public Function BuscarArchivo(NomArch As String) As Boolean
Set fs = CreateObject("Scripting.FileSystemObject")
AB = UCase(NomArch)
If fs.fileexists(AB) Then
BuscarArchivo = True
Else
BuscarArchivo = False

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 263

End If
End Function

Calcular el Número de Registros de Archivo Binario (Texto).

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

Fondo Con Sombra a Formulario.


Colocar un color definido al fondo del formulario de forma degradada con sobra en la parte superior o inferior.

(En El Formulario, Generales)


Sub FondoConSombra(Formulario As Object, Color, Posicion As Variant)
Dim Tono As Long
Formulario.AutoRedraw = True
Formulario.DrawStyle = 6
Formulario.DrawMode = 13
Formulario.ScaleMode = 3
Formulario.ScaleHeight = (256 * 2)
If Posicion = 1 Then
a = 0: B = 255: C = 1
Else
a = 255: B = 0: C = -1

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 264

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

Generar Números Aleatorios (Incluye Duplicados).


Genera una lista de números aleatorios y los visualiza en un control List, en este caso se debe estipular el valor
mínimo, máximo y la cantidad de números a generar.

List1.Clear
List1.Visible = True
LimiteSup = 210
limiteInf = 140
XNumeros = 10000

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 265

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

Generar y Ordenar Números Aleatorios (Sin Duplicados).


(En Un Control Command).
Dim XNumeros, XNumMax As Long
' Cantidad De Numeros A Generar
XNumeros = 5
' VALOR MAXIMO
XNumMax = 1000
ReDim Vector(XNumeros)
Randomize
' Generar Números Aleatorios (Sin Repetidos)
For I = 1 To XNumeros
INICIO:
x = Int((XNumMax * Rnd) + 1)
For J = 0 To I
' si el número ya existe en el array, lo descartamos
If x = Vector(J) Then GoTo INICIO
Next J
' no existe, lo añadimos a la matriz
Vector(I) = x
Next I
' Se Ordena El Vector De Menor A Mayor
For I = 1 To UBound(Vector) - 1
For J = I To UBound(Vector)
If Vector(I) > Vector(J) Then
temp = Vector(I)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 266

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

Imprimir un Archivo de Texto (*.txt).


(Una Forma Rápida Y Eficiente Es La Siguiente, Se Conserva El Formato Del Archivo De Texto, Se Dee Validar
La Existencia Del Archivo A Imprimir)

(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"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 267

Exit Sub
End If

hProc = ShellExecute(Me.hwnd, "Print", TextFileName, "", App.Path, SW_HIDE)


Screen.MousePointer = 0
End Sub

(Otra Forma Es La Siguiente)


Screen.MousePointer = 11
TextFileName = "I:\PRUEBAS\FILETEXTO.txt"

Dim TextToPrint As String 'Contendrá el texto del archivo *.txt

'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

Printer.Print TextToPrint 'Se imprimen los datos del buffer


Printer.EndDoc 'Se termina el documento de impresión

Screen.MousePointer = 0

Llenar Datagrid con Registro de Base de Datos (ADO).

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 268

Recomendado para consultar grandes cantidades de datos. Por su rapidez y eficiencia.

' *** 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

Llenar ListView con Registro de Base de Datos (ADO).


' *** Referencia Habilitada ; Microsoft ActiveX Data Objects 2.5 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO25.TLB"

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.

(En Formulario, Declaraciones)


Sub ListaDeColumnas()
ListView.FullRowSelect = True
ListView.View = lvwReport
ListView.GridLines = True

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 269

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

(En Control, Command)


On Error GoTo ErrorOpen
' *** Referencia Habilitada ; Microsoft ActiveX Data Objects 2.5 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO25.TLB"
Dim I As Long
Dim Regdatos As ADODB.Recordset
Set DBConexion = New ADODB.Connection
DBConexion.Provider = "Microsoft.JET.OLEDB.4.0" '
DBConexion.Open "I:\PRUEBAS\DATOS.MDB"
Set Regdatos = New ADODB.Recordset
Regdatos.Open "SELECT * FROM PERSONAS", DBConexion, adOpenKeyset, adLockReadOnly ' Select
fields
I=1
Do Until Regdatos.EOF
If (I Mod 10000) = 0 Then Label1 = "Procesando Datos : " + Format(I, "#,##") + " Registros": DoEvents
ListView.ListItems.Add , , Regdatos("CAMPO1") 'Create the first item in the column
ListView.ListItems(I).ListSubItems.Add , , Regdatos("CAMPO2")
ListView.ListItems(I).ListSubItems.Add , , Regdatos("CAMPO3")
ListView.ListItems(I).ListSubItems.Add , , Regdatos("CAMPO4")
Regdatos.MoveNext
I=I+1

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 270

Loop
Regdatos.Close
Set Regdatos = Nothing
Label1 = "Finalizo"
Exit Sub

ErrorOpen:
MsgBox Err.Description, vbCritical
End

(En El Formulario, Load)


ListaDeColumnas 'Load Columheaders

Llenar ListView con Registro de Base de Datos (ADO) Otro.


' *** Referencia Habilitada ; Microsoft ActiveX Data Objects 2.5 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO25.TLB"

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 271

(En Control, Command)


Screen.MousePointer = 11
TiT = "Conectar ListView a BD sin Control ADODC o DATACONTROL": DoEvents
T1 = Format(Time, "hh:mm:ss")
ListView2.Top = 120
ListView2.Left = 120
ListView2.Width = 14960
ListView2.Height = 7575
ListView2.FullRowSelect = True
ListView2.View = lvwReport
ListView2.GridLines = True
ListView2.ListItems.Clear
ListView2.Visible = True
Dim I As Long
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\DatosGenerales.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
XS = "SELECT * FROM DatosPersonales ;"
Set Regdatos = BDatos.OpenRecordset(XS)
W = 100000 ' NUMERO MAXIMO DE REGISTROS A PROCESAR
I=1
Do Until Regdatos.EOF
If (I Mod 20000) = 0 Then Label1 = "Procesando Datos : " + Format(I, "#,##") + " Registros": DoEvents
If I = W Then Screen.MousePointer = 0: Exit Do
ListView2.ListItems.Add , , Regdatos("CEDULA") 'Create the first item in the column
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("NOMBRE")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("APELLIDO")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("NACIMIENTO")
ListView2.ListItems(I).ListSubItems.Add , , Regdatos("EDAD")

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 272

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

Llenar ListView con Registro de Base de Datos (DAO).


' *** Referencia Habilitada; Microsoft DAO 3.51 Objetc Library
' Archivo "C:\Program Files\Common Files\microsoft shared\DAO\DAO350.DLL"

(En Formulario, Declaraciones)


Sub ListaDeColumnas()
ListView.FullRowSelect = True
ListView.View = lvwReport

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 273

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

(En Control, Command)


On Error GoTo ErrorOpen
' *** Referencia Habilitada ; Microsoft DAO 3.51 Objetc Library
' Archivo "C:\Program Files\Common Files\microsoft shared\DAO\DAO350.DLL"
Dim I As Long
Dim BDatos As Database
Dim Regdatos As Recordset
XRutaBD = "I:\PRUEBAS\DATOS.MDB"
Set BDatos = DBEngine.OpenDatabase(XRutaBD, False, False, ";PWD=JUNIOR")
XS = "SELECT * FROM Personas ORDER BY CAMPO1"
Set Regdatos = BDatos.OpenRecordset(XS)
I=1
Do Until Regdatos.EOF
If (I Mod 10000) = 0 Then Label1 = "Procesando Datos : " + Format(I, "#,##") + " Registros": DoEvents
ListView.ListItems.Add , , Regdatos("CAMPO1") 'Create the first item in the column
ListView.ListItems(I).ListSubItems.Add , , Regdatos("CAMPO2")
ListView.ListItems(I).ListSubItems.Add , , Regdatos("CAMPO3")
ListView.ListItems(I).ListSubItems.Add , , Regdatos("CAMPO4")
Regdatos.MoveNext
I=I+1

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 274

Loop
Regdatos.Close
Set Regdatos = Nothing
Label1 = "Finalizo"
Exit Sub

ErrorOpen:
MsgBox Err.Description, vbCritical
End

(En El Formulario, Load)


ListaDeColumnas 'Load Columheaders

Modificar Fecha y Hora de Un archivo Determinado.


(En El Módulo, Declaraciones)
'Api To Open A File
Public Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT,
ByVal wStyle As Long) As Long
'Api To Close A Handle
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'Api To Set The File Date/Time Stamp
Public Declare Function SetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME,
lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
'Api To Convert A Local Time To A UTC Time
Public Declare Function LocalFileTimeToFileTime Lib "kernel32" (lpLocalFileTime As FILETIME, lpFileTime As
FILETIME) As Long
'Api To Convert A System Time To A File Time
Public Declare Function SystemTimeToFileTime Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime
As FILETIME) As Long

'Constants
Public Const OF_CREATE = &H1000

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 275

Public Const OF_DELETE = &H200


Public Const OF_EXIST = &H4000
Public Const OF_PARSE = &H100
Public Const OF_PROMPT = &H2000
Public Const OF_READ = &H0
Public Const OF_READWRITE = &H2
Public Const OF_REOPEN = &H8000
Public Const OF_SHARE_COMPAT = &H0
Public Const OF_SHARE_DENY_NONE = &H40
Public Const OF_SHARE_DENY_READ = &H30
Public Const OF_SHARE_DENY_WRITE = &H20
Public Const OF_SHARE_EXCLUSIVE = &H10
Public Const OF_WRITE = &H1
Public Const HFILE_ERROR = &HFFFF
Public Const OFS_MAXPATHNAME = 128

'Api Needed Types


Public Type OFSTRUCT
cBytes As Byte
fFixedDisk As Byte
nErrCode As Integer
Reserved1 As Integer
Reserved2 As Integer
szPathName(OFS_MAXPATHNAME) As Byte
End Type

Public Type FILETIME


dwLowDateTime As Long
dwHighDateTime As Long
End Type

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 276

Public Type SYSTEMTIME


wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

'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

Public Function String_To_SysDateTime(strDate As String, strTime As String) As SYSTEMTIME


If Len(strDate) = 10 Then
String_To_SysDateTime.wDay = Mid(strDate, 1, 2)
String_To_SysDateTime.wMonth = Mid(strDate, 4, 2)
String_To_SysDateTime.wYear = Mid(strDate, 7, 4)
End If
If Len(strTime) = 12 Then
String_To_SysDateTime.wHour = Mid(strTime, 1, 2)
String_To_SysDateTime.wMinute = Mid(strTime, 4, 2)
String_To_SysDateTime.wSecond = Mid(strTime, 7, 2)
String_To_SysDateTime.wMilliseconds = Mid(strTime, 10, 3)
End If

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 277

End Function

(En El Formulario o Control)


'Open The File
Dim Result As Long, txtFile As String, txtDate As String, txtTime As String
txtFile = "I:\PRUEBAS\EJEMPLO.mdb"
txtDate = "20/06/2020"
txtTime = "17:00:00" + ".000"
'Open
hFile = OpenFile(txtFile, FileInfoStruct, OF_READWRITE)
'Put The Date And Time Into A Systime Variable
SysTime = String_To_SysDateTime(txtDate, txtTime)
'Convert To A File Time
Result = SystemTimeToFileTime(SysTime, CreateTime)
'Convert To A UTC Time
Result = LocalFileTimeToFileTime(CreateTime, CreateTime)
'Set
Result = SetFileTime(hFile, CreateTime, CreateTime, CreateTime)
'Close File
Result = CloseHandle(hFile)

Mostar el Icono de Programa en la Barra de Tareas.


Se Debe Asignar Al Primer Formulario Que Ejecute El Programa Un Icono Que Se Visualizara En La Barra De
Tareas. (Tamaño Del Icono 16 X 16).

(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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 278

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

Sub FormShowInTaskBar(Handle As Long, new_value As Boolean)


' Mostrar Icono Del Programa En La Barra De Tareas, Este Icono Se Asigna Al Formulario Que Queda Siempre
En Ejecución.
Dim style As Long
style = GetWindowLong(Handle, GWL_EXSTYLE)
If new_value Then
style = style Or WS_EX_APPWINDOW
Else
style = style And Not WS_EX_APPWINDOW
End If
ShowWindow Handle, SW_HIDE
SetWindowLong Handle, GWL_EXSTYLE, style
ShowWindow Handle, SW_SHOW
SetWindowPos Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED Or SWP_NOMOVE Or SWP_NOSIZE Or
SWP_NOZORDER
End Sub

(En El Formulario).
Private Sub Form_Load()
FormShowInTaskBar Me.hwnd, True ' Mostar Icono En Barra De Tareas
End Sub

Mover Cursor a Un Control


Movimiento del cursor sobre un control en especial, para que el usuario solo de clic y evite los desplazamientos.
El curso se ubica en el centro del control parte superior.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 279

(En El MODULO)
Declare Sub SetCursorPos Lib "user32" (ByVal XP As Integer, ByVal YP As Integer)

Sub MoverCursor(XNForm As Form, XNControl)


' Colocar El Cursor Sobre Un Control
XP = (XNForm.Left + XNControl.Left + XNControl.Width - (XNControl.Width / 2)) /
Screen.TwipsPerPixelX
YP = (XNForm.Top + XNControl.Top + XNControl.Height - (XNControl.Height / 2)) /
Screen.TwipsPerPixelY
SetCursorPos Trim(XP), Trim(YP)
End Sub

(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

Mover Cursor Directo A Un Control (En El Centro)


Movimiento del cursor sobre un control en especial, para que el usuario solo de click y evite los desplazamientos.
El curso se ubica en el centro del control. (Exacto)

(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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 280

End Type

Sub MoverCursor(XNForm As Form, XNControl)


' Colocar El Cursor Sobre Un Control
XP = (XNForm.Left + XNControl.Left + XNControl.Width - (XNControl.Width / 2)) /
Screen.TwipsPerPixelX
YP = (XNForm.Top + XNControl.Top + XNControl.Height - (XNControl.Height / 2)) /
Screen.TwipsPerPixelY
SetCursorPos Trim(XP), Trim(YP)
End Sub

(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

Mover el Formulario con el Mouse.


Permite Mover El Formulario En Ejecución, Presionando Click En El Formulario Y Ubicándolo En La Posición
Deseada.

(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

(En El Formulario, Load, MouseDown).


Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 281

ReleaseCapture
SendMessage Me.hwnd, &HA1, 2, 0&
End Sub

Obtener Espera en Segundos de Algún Proceso.


(En Un Módulo).
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

En El Formulario O Control
Dim XTiempo As Long
XTiempo = 5
' Se Multiplica Por 1000 Para Pasar A Milisegundos
Call Sleep(XTiempo * 1000)

Ordenar DBGrid Por Columna (Ascendente y Descendente).


Para utilizar componente DBGrid, se debe activar en ; Proyecto - Componentes : Microsoft Data Bound Grid
Control 5.0 (SP3) – DBGRID32.OCX

(En Formulario, Declaraciones).


Dim CT As Integer

(En Formulario, Load).


CT = 0 ' 0 Ascendente, 1 Descendente

(En Control DBgrid, HeadClick).


If CT = 1 Then
DBGrid1.HoldFields
Data1.RecordSource = "SELECT * FROM PERSONAS ORDER BY " & DBGrid1.Columns(ColIndex).DataField
& " ASC "
Data1.Refresh
DBGrid1.ReBind

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 282

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

Ordenar Un Vector (Metodo De Burbuja).


Dim XNumeros As Long
XNumeros = 10000000
ReDim VECTOR(XNumeros)
For X = XNumeros To 1 Step -1: VECTOR(X) = X: Next X
Dim I, J, TEMP As Long
Dim Control As Boolean

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 283

' Método De Burbuja


For I = (XNumeros - 1) To 0 Step -1
Control = False
For J = 1 To I
If (VECTOR(J - 1) > VECTOR(J)) Then
Control = True
TEMP = VECTOR(J - 1)
VECTOR(J - 1) = VECTOR(J)
VECTOR(J) = TEMP
End If
Next J
If Not Control Then I = -1
Next I

Permitir Solo Letras en Una Cadena.


Screen.MousePointer = 11
Open "I:\PRUEBAS\DatosTexto.TXT" For Input Shared As #1
Do While Not EOF(1)
Input #1, InfoR
DATOS = InfoR
For I = 1 To Len(DATOS)
D = Mid(Trim(UCase(DATOS)), I, 1)
If (Asc(D) >= 65) And (Asc(D) <= 90) Then
' Es Una Letra De La A La Z En Mayúscula
Else
' Es Un Numero o Carácter Diferente
End If
Next I
Loop
Close #1
Screen.MousePointer = 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 284

Separar Números y Letras en una Cadena de Texto.


' Definición De Variables
Dim TextoGeneral, TextNumeros, TextLetras As String
Dim I As Integer
' Asignación De Cadena De Texto
TextoGeneral =
"ASDE43RF5678JHNM{}Ó08JU76H5GF4DSWA21FRVG5677809(/(&G6534hhhhh875432JHNBGQÑP=)("
TextoGeneral = Replace(TextoGeneral, ",", "")
' Búsqueda De Números
For I = 1 To Len(TextoGeneral)
If IsNumeric(Mid(TextoGeneral, I, 1)) = True Then
TextNumeros = TextNumeros & Mid(TextoGeneral, I, 1)
End If
Next I
' Búsqueda De Letras Y Símbolos
For I = 1 To Len(TextoGeneral)
If IsNumeric(Mid(TextoGeneral, I, 1)) = False Then
TextLetras = TextLetras & Mid(TextoGeneral, I, 1)
End If
Next I
'Resultados
Debug.Print TextNumeros
Debug.Print TextLetras

Ver con Explorador de Windows Ubicación de Archivo.


' Colocar La Siguiente Línea Indicando La Ruta Y Nombre Del Archivo que Queremos Ubicar.

Shell "explorer.exe root =" + XRutayNombredeArchivo, vbNormalFocus

Ver Fecha y hora de un Archivo.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 285

Set FX = CreateObject("Scripting.FileSystemObject")
Set R = FX.GetFile("I:\PRUEBAS\EJEMPLO.mdb")
XTemP = R.DateLastModified

Volver Formulario Opaco o Transparente.


(En El Módulo).
' Volver Un Formulario Opaco O Transparente
Public Const LWA_ALPHA = &H2
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000
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 SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long,
ByVal bAlpha As Byte, ByVal dwflags As Long) As Long
Public XMedForM, XMedForM2 As Long

(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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 286

VISUAL BASIC
PROGRAMACION AVANZADA

By Gonzalo Bolaño Stefanell

© Gonzalo Bolaño Stefanell – 2.023 REGRESAR »»»»»»»


Manual de SQL & Visual Basic Pág. 287

PROGRAMACION AVANZADA

INDICE

Convertir Números a Letras (Hasta 999.999.999).

Genera Direcciones “Mails” con Base En Campos de la Tabla.

Genera Números Aleatorios Para Tarjetas de Crédito.

Genera Números Secuenciales de Diferentes Tipos.

Pasar Datos de una Tabla a Otra Bases de Datos.

Pasar Hoja de Excel (*.Xls) a Tabla en Access.

Pasar Hoja de Excel (*.Xlsx) a Tabla de Access.

Pasar Toda una Tabla (Copiar) a Otra Bases de Datos.

Pasar una Tabla a Excel (Xls).

Pasar una Tabla a Excel (Xlsx), Cualquier Versión.

Seleccionar Datos no Repetidos y Guardar como Txt.

Resta Entre Fechas (Meses y Días).

Traslado de Datos Entre 2 Tablas (DAO).

Validar la Existencia de un Archivo.

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 288

Convertir Numeros a Letras (Hasta 999.999.999).


Función.

Public Function EnLetras(NumerO As String) As String


Dim b, PasO As Integer
Dim ExpresioN, EnterO, DecI, flag As String

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

If Len(DecI) = 1 Then DecI = DecI & "0"

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"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 289

If Mid(EnterO, b + 1, 1) = "0" And Mid(EnterO, b + 2, 1) = "0" Then


ExpresioN = ExpresioN & "cien "
Else
ExpresioN = ExpresioN & "ciento "
End If
Case "2"
ExpresioN = ExpresioN & "doscientos "
Case "3"
ExpresioN = ExpresioN & "trescientos "
Case "4"
ExpresioN = ExpresioN & "cuatrocientos "
Case "5"
ExpresioN = ExpresioN & "quinientos "
Case "6"
ExpresioN = ExpresioN & "seiscientos "
Case "7"
ExpresioN = ExpresioN & "setecientos "
Case "8"
ExpresioN = ExpresioN & "ochocientos "
Case "9"
ExpresioN = ExpresioN & "novecientos "
End Select

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 "

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 290

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"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 291

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"

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 292

If FlaG = "N" Then ExpresioN = ExpresioN & "dos "


Case "3"
If FlaG = "N" Then ExpresioN = ExpresioN & "tres "
Case "4"
If FlaG = "N" Then ExpresioN = ExpresioN & "cuatro "
Case "5"
If FlaG = "N" Then ExpresioN = ExpresioN & "cinco "
Case "6"
If FlaG = "N" Then ExpresioN = ExpresioN & "seis "
Case "7"
If FlaG = "N" Then ExpresioN = ExpresioN & "siete "
Case "8"
If FlaG = "N" Then ExpresioN = ExpresioN & "ocho "
Case "9"
If FlaG = "N" Then ExpresioN = ExpresioN & "nueve "
End Select
End Select
If PasO = 4 Then
If Mid(EnterO, 6, 1) <> "0" Or Mid(EnterO, 5, 1) <> "0" Or Mid(EnterO, 4, 1) <> "0" Or _
(Mid(EnterO, 6, 1) = "0" And Mid(EnterO, 5, 1) = "0" And Mid(EnterO, 4, 1) = "0" And _
Len(EnterO) <= 6) Then
ExpresioN = ExpresioN & "mil "
End If
End If
If PasO = 7 Then
If Len(EnterO) = 7 And Mid(EnterO, 1, 1) = "1" Then
ExpresioN = ExpresioN & "millón "
Else
ExpresioN = ExpresioN & "millones "
End If
End If

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 293

Next PasO

If DecI <> "" Then


If Mid(EnterO, 1, 1) = "-" Then 'si el NumerO es negativo
EnLetras = "menos " & ExpresioN & "con " & DecI ' & "/100"
Else
EnLetras = ExpresioN & "con " & DecI ' & "/100"
End If
Else
If Mid(EnterO, 1, 1) = "-" Then 'si el NumerO es negativo
EnLetras = UCase("menos " & ExpresioN)
Else
EnLetras = UCase(ExpresioN)
End If
End If
Else 'Si El Numero A Convertir Esta Fuera Del Rango Superior E Inferior
EnLetras = ""
End If
End Function

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 294

Genera Direcciones “Mails” con Base En Campos de la Tabla.


Crea con los datos de los campos; nombre, apellido, ciudad y país una dirección de correo. Ejemplo;
[email protected]

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 295

Genera Números Aleatorios Para Tarjetas de Crédito.


Genera Por Ciclos Números Aleatorios Para Pruebas De Tarjetas De Crédito De 16 Dígitos “1111-2222-3333-
4444” Sin Repetir Y Automáticamente Los Escribe A Un Archivo De Texto Cuyo Nombre Se Genera Con La
Hora Que Se Realizo El Proceso.

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 296

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 297

Genera Números Secuenciales de Diferentes Tipos.


(Programa que genera números secuenciales a diferentes campos, números de identificación, teléfonos,
números de tarjetas de crédito, Mails con base en el nombre, la dirección y el apellido.)

(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

Private Sub Command1_Click()


' GENERA NUMEROS DE IDENTIFICACION SECUENCIALMENTE
Screen.MousePointer = 11
XS = "SELECT * FROM Personas ORDER BY CAMPO10"
Set Regdatos = BDatos.OpenRecordset(XS)
I = 1000000000
W=1
Do Until Regdatos.EOF
I=I+1
W=W+1
If (W Mod 2000) = 0 Then Label1 = "GENERANDO NUMEROS : " + Format(W, "#,##") + " / " + Format(I,
"#,##"): DoEvents
Regdatos.Edit
Regdatos("CAMPO1") = Trim(Str(I))
Regdatos.Update
Regdatos.MoveNext
Loop

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 298

Regdatos.Close
Screen.MousePointer = 0

' GENERA NUMEROS DE TELEFONOS


Screen.MousePointer = 11
XS = "SELECT * FROM Personas ORDER BY CAMPO11"
Set Regdatos = BDatos.OpenRecordset(XS)
A = 100
B = 121
C = 2000
I=1
Do Until Regdatos.EOF
I=I+1
A = A + 1: If A = 999 Then A = 100
B = B + 1: If B = 999 Then B = 121
C = C + 1: If C = 9999 Then C = 2000

D = "(" + Trim(Str(A)) + ")-" + Trim(Str(B)) + "-" + Trim(Str(C))

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 299

Pasar Datos de una Tabla a Otra Bases de Datos.


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)

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 300

Pasar Hoja de Excel (*.Xls) a Tabla en Access.

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)

Private Sub Form_Load()


XrutaBD = "I:\PRUEBAS\DATOS.MDB"
Set BDatos = DBEngine.OpenDatabase(XrutaBD, False, False, ";PWD=JUNIOR")
'Establecemos conexión con el archivo de Excel, desde donde vamos a exportar la tabla
'Debes verificar la ruta a del archivo Excel y respetar las comillas "dobles" y "simples"
' B.XLs' nombre tabla de Excel

ConExcel = "'I:\PRUEBAS\B.XLs' 'Excel 8.0;HDR=Yes;'"


'Definimos el nombre de las tablas:
'Origen será la tabla de Excel
'Destino será la tabla de Access
Origen = "[B$] "
Destino = "[TRABAJADORES]"
'Importamos la tabla a Access con los nuevos cambios que hayamos realizado en Excel
BDatos.Execute "SELECT * INTO " & Destino & " FROM " & Origen & " IN " & ConExcel
BDatos.Close
End Sub

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 301

Pasar Hoja de Excel (*.Xlsx) a Tabla de Access.


Este programa permite pasar datos de una libro o archivo de Excel (*.xlsx) a una base de datos Access (*.mdb),
se deben especificar; el nombre del archivo de Excel, el nombre de la base de datos en Access y el nombre de
la tabla, además de la cantidad de columnas y filas que se convertirán de Excel.
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, Declaraciones)


' Option Explicit
Dim MiRuta As String
Dim NomBaseDatos As String
Dim NomTabla As String
Dim NomFileExcel As String
Dim NrColumnas As Integer
Dim NrFilas As Double
Dim ReT As Boolean

Public BDatos, BDatos2, BDatos3 As Database


Public Regdatos, RegDatos2, RegDatos3 As Recordset

Sub Descargar_Objetos(rst As Recordset, bd As Database, Obj_Excel As Object, Obj_Hoja As Object)


'Descarga los objetos y los cierra
Set rst = Nothing
bd.Close
Set bd = Nothing
Obj_Excel.ActiveWorkbook.Close False
Obj_Excel.Quit
Set Obj_Hoja = Nothing
Set Obj_Excel = Nothing
End Sub

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 302

'***************************************************************************
'* 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

' -- Variables Para Acceder Al Libro De Excel,


' -- Para La Base De Datos Y El Recordset Dao
Dim Obj_Excel As Object
Dim Obj_Hoja As Object
Dim bd As Database
Dim rst As Recordset

' -- Variables Para La Fila, La Columna Y El Dato A Copiar


Dim Fila_Actual As Double
Dim Columna_Actual As Integer
Dim Dato As Variant
Dim I As Long
Screen.MousePointer = vbHourglass

' -- Crea Una Nueva Instancia De Excel


Set Obj_Excel = CreateObject("Excel.Application")

' -- Abre El Libro Pasándole El Path


Obj_Excel.Workbooks.Open FileName:=Path_XLS

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 303

' -- Si Es La Versión De Excel 97, Asigna La Hoja Activa ( Activesheet )


If Val(Obj_Excel.Application.Version) >= 8 Then
Set Obj_Hoja = Obj_Excel.ActiveSheet
Else
Set Obj_Hoja = Obj_Excel
End If
' -- Abrir La Base De Datos
Set bd = OpenDatabase(Path_BD)
' -- Llenar El Recordset Indicándole La Tabla
Set rst = bd.OpenRecordset(La_Tabla, dbOpenTable)

' -- Recorrer Las Filas Y Columnas De La Hoja


I=0
For Fila_Actual = 1 To Filas
' -- Agregar Un Nuevo Registro
rst.AddNew
' -- Recorrer Las Columnas Del Libro
For Columna_Actual = 0 To Columnas - 1
' -- Almacena Le Dato De La Celda Actual
Dato = Trim$(Obj_Hoja.Cells(Fila_Actual, Columna_Actual + 1))
' -- Agrega Los Datos Al Campo Indicado
rst(Columna_Actual).Value = Dato
Next
I = I + 1: Label1 = Format(I, "#,##")
' -- Actualiza Los Datos En La Tabla
rst.Update
Next
Excel_a_Access = True
' -- Descargar Los Objetos
Call Descargar_Objetos(rst, bd, Obj_Excel, Obj_Hoja)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 304

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"

' Verificamos Que La Base De Datos No Exista En Caso Contrario Se Elimina


If Dir(MiRuta + "\" + NomBaseDatos) = NomBaseDatos Then Kill MiRuta + "\" + NomBaseDatos
' Crear Nueva Base De Datos Vacia
Set dbDatabase = CreateDatabase(MiRuta + "\" + NomBaseDatos, dbLangGeneral, dbEncrypt)
' Abrir Base De Datos
Set BDatos = DBEngine.OpenDatabase(MiRuta + "\" + NomBaseDatos, False, False, ";PWD=JUNIOR")
' Indicar Cuantas Columnas Y Filas Se Quieren Agregar De La Hoja De Excel
NrColumnas = 11
NrFilas = 500
' Definir Campos (Nombres, Tipo Y Tamaño)
XA = ""
For I = NrColumnas To 1 Step -1

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 305

XA = "CAMPO" + Trim(Str(I)) + " CHAR(150) NULL, " + XA


Next I
' Eliminamos Los Últimos Campos En Blanco Y La Coma Final, Para Poder Crear Formato De La Cadena
XA = Trim(XA)
XA = Mid(XA, 1, Len(XA) - 1)
XA = " (" + XA + " ) ;"
' Se Divide La Cadena Para No Tener Problemas Al Crear La Tabla
X1 = Mid(XA, 1, (Len(XA) / 2))
X2 = Mid(XA, (Len(XA) / 2) + 1, Len(XA))
XCamposTabla = X1 + X2
' Crear Tabla
BDatos.Execute "CREATE TABLE " + NomTabla + XCamposTabla
Command1.Caption = " Excel a Access "
End Sub

Private Sub Command1_Click()


Label2 = Time
NomTabla = "Datos"
Label1 = "Procesando, Espere ..."
ReT = Excel_a_Access(MiRuta + "\" + NomBaseDatos, MiRuta + "\" + NomFileExcel, NomTabla, NrFilas,
NrColumnas)
If ReT Then 'Ok
MsgBox " Datos copiados a Access ", vbInformation
End If
End Sub

Pasar Toda una Tabla (Copiar) a Otra Bases de Datos.


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ú, opciónes; Proyecto, referencias)

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 306

No Debe Existir La Tabla En Las Bases De Datos Que Recibe La Información.


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")
' Copia (Crea) Tabla De Micvinfo.Mdf A Ejemplo.Mdb
BDatos2.Execute "SELECT * INTO [" + XRutaBD1 + "].LogControlDeAccesos FROM " + XRutaBD2 +
".LogControlDeAccesos ;"
Screen.MousePointer = 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 307

Pasar una Tabla a Excel (Xls).


Para el uso de Bases de Datos ADO, VB6, se debe tener habilitada las opciónes:
“Microsoft DAO 3.51 Objetc Library” , “Microsoft Excel 16.0 Objetc Library”
(Marcarlas en el menú, opciónes; Proyecto, referencias)
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).

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 308

Set eWorkbook = Nothing


Set oExcel = Nothing
Screen.MousePointer = 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 309

Pasar una Tabla a Excel (Xlsx), Cualquier Versión.


Para el uso de Bases de Datos ADO, VB6, se debe tener habilitada la opción: “Microsoft DAO 3.51 Objetc Library”,
(Marcarlas en el menú, opciónes; Proyecto, referencias)

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 310

' Haciendo Referencia A La Hoja


Set Hoja = Libro.Worksheets(1)
' Permite Visualizar Excel En Tiempo Real Mientras Se Realiza El Proceso
'Excel.Visible = True: Excel.UserControl = True
iCol = Regdatos.Fields.Count
For iCol = 1 To Regdatos.Fields.Count
Hoja.Cells(1, iCol).Value = Regdatos.Fields(iCol - 1).Name
Next
' Verifica La Que La Versión Del Excel Sea Actualizada, Mayor Que 8
If Val(Mid(Excel.Version, 1, InStr(1, Excel.Version, ".") - 1)) > 8 Then
TiT = "Pasando la Información a Excel " + F: DoEvents
Hoja.Cells(2, 1).CopyFromRecordset Regdatos
Else
MsgBox ("Versión Incorrecta de Excel Para Este Proceso ...")
End If
' Autoconfigura Tamaños De Filas Y Columnas
Excel.Selection.CurrentRegion.Columns.AutoFit
Excel.Selection.CurrentRegion.Rows.AutoFit
' Cierra El Recordset Y La Base De Datos Y Los Objetos ADO
Regdatos.Close
BDatos.Close
' Guardar El Libro
Libro.SaveAs XTemP
' Libro.Close
Excel.Visible = True: Excel.UserControl = True
' Elimina Las Referencias Xls
Set Hoja = Nothing
Set Libro = Nothing
'Excel.Quit ' Cierra el Excel
Set Excel = Nothing
Me.Enabled = True

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 311

TiT = "Trabajo Finalizado."


Screen.MousePointer = 0

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 312

Resta Entre Fechas (Meses y Dias).

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 313

Seleccionar Datos no Repetidos y Guardar como Txt.


En una tabla de apellidos se descartan los repetidos y lo que no se repiten se guardan en un archivo de texto.

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

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 314

Traslado de Datos Entre 2 Tablas (DAO).


' *** Referencia Habilitada; Microsoft ActiveX Data Objects 2.5 Library
' Archivo "C:\Program Files\Common Files\System\ado\MSADO25.TLB"

(En el Control o Formulario)


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 * FROM Personas ;"
Set Regdatos = BDatos.OpenRecordset(XS)
XS = "SELECT * FROM DatosPersonales ;"
Set Regdatos2 = BDatos.OpenRecordset(XS)
I=0
Do Until Regdatos.EOF
Regdatos2.AddNew
Regdatos2("CEDULA") = Regdatos("CAMPO1")
Regdatos2("NOMBRE") = Mid(Regdatos("CAMPO2"), 1, 20)
Regdatos2("APELLIDO") = Mid(Regdatos("CAMPO3"), 1, 20)
Regdatos2("DIRECCION") = Mid(Regdatos("CAMPO4"), 1, 60)
Regdatos2("TELEFONO") = Mid(Regdatos("CAMPO5"), 1, 15)
Regdatos2("CIUDAD") = Mid(Regdatos("CAMPO6"), 1, 30)
Regdatos2("PAIS") = Mid(Regdatos("CAMPO7"), 1, 50)
Regdatos2("NACIMIENTO") = Mid(Regdatos("CAMPO10"), 1, 10)
Regdatos2("EDAD") = " "
Regdatos2("ENTIDAD") = Mid(Regdatos("CAMPO9"), 1, 50)
Regdatos2("TARJETA") = Mid(Regdatos("CAMPO11"), 1, 20)
Regdatos2("MAIL") = Mid(Regdatos("CAMPO8"), 1, 60)
Regdatos2.Update
I=I+1
If (I Mod 5000) = 0 Then Label1 = Format(I, "#,##"): DoEvents

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 315

Regdatos.MoveNext
Loop
Regdatos.Close
Set Regdatos = Nothing
BDatos.Close

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 316

Validar la Existencia de un Archivo.


Si se desea validar la existencia de algunos archivos claves para la aplicación (Base de Datos, imágenes,
librerías, ayudas, etc.), creamos un vector con una lista de los nombres de estos archivos y validamos e
informamos si existen.

Dim Vector(): ReDim Vector(8)


Vector(1) = "MICV.exe"
Vector(2) = "MICVBASE.DAT"
Vector(3) = "MICVBDRT.DAT"
Vector(4) = "MICVTEAM.EXE"
Vector(5) = "MICVANYD.EXE"
Vector(6) = "MICVCOPY.EXE"
Vector(7) = "MICVIMPR.DAT"
Vector(8) = "MICVSCAN.DAT"
YT = 0
For I = 1 To 8
If UCase(Dir(DirTrabajO + Vector(I))) <> UCase(Vector(I)) Then YT = 1: Exit For
Next I
If YT = 1 Then
MsgBox "Falta Archivo ..... ( " + Vector(I) + " ) ..... Para Ejecutar el Programa."
End
End If

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 317

PENDIENTES
TEMAS EN PROCESO
DE INVESTIGACION

By Gonzalo Bolaño Stefanell

© Gonzalo Bolaño Stefanell – 2.023


REGRESAR »»»»»»»
Manual de SQL & Visual Basic Pág. 318

1) Cambiar Nombre De Campo En Una Tabla.


2) Modificar El Tipo De Campo En Una Tabla.
3) Modificar El Tamaño Del Campo De Texto En Una Tabla.
4) Eliminar Un Registro En Especial En Varias Tablas Al Tiempo.
5) Uso De Lector De Huellas Como Reconocedor De Clientes.
Links Asociados:
https://social.msdn.microsoft.com/Forums/sqlserver/es-ES/1737e7ca-1374-4c91-8f4a-
c967cded20e7/guardar-y-leer-huella-digital-en-visual-basic-2008?forum=vbes
http://topicos-seguridad.blogspot.com/2009/08/utilizar-lector-de-huellas-en-nuestras.html

© Gonzalo Bolaño Stefanell – 2.023


Manual de SQL & Visual Basic Pág. 319

BIBLIOGRAFIAS WEB

https://documentation.help
https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61

© Gonzalo Bolaño Stefanell – 2.023

También podría gustarte