Abrimos Access y elegimos "Crear una nueva base de datos usando" "Base de datos de Access en blanco"
Lo guardamos, por ejemplo, en "mis documentos", con el nombre "db1.mdb" Despus creamos una tabla en vista diseo
ngresen los mismos datos ! ven a continuaci"n, ya ! estos son los datos #la tabla$ ! vamos a usar para programar.
2
%uarden la tabla con el nombre "&abla1" A'ora ingresamos los datos en la tabla(
) a'ora lo mas importante. *ara no tener inconvenientes de compatibilidad vamos a 'acer lo siguiente( "+erramientas ,- .tilidades de las base de datos ,- Convertir base de datos ,- A una versi"n anterior de la base dee datos de Access..."
3
%uardamos con el nombre "base1.mdb" /sta base de datos llamada "base1.mdb" es la ! vamos a usar en 0isual Basic. 1o usaremos la otra #db1$ por motivos de compatibilidad. /n de2initiva, ambas bases de datos son iguales, solo cambia la versi"n. AHORA TRABAJAMOS EN VISUAL BASIC Cuando creamos el proyecto lo primero ! debemos 'acer para trabajar con nuestra base de datos es la "re2erencia al motor de bases de datos de 3icroso2t". *ara esto desde 0isual Basic vamos al menu *royecto ,- 4e2erencia y seleccionamos 3icroso2t DA5 6.71 5bject Library #si tenes otra versi"n igual tiene ! 2uncionar$. A'ora para ver lo ! estamos 'aciendo cuando ejecutamos, vamos a agregar una ListBo8 #llamada List1$ en nuestro 2ormulario. A partir de a'ora es todo codigo. Creamos las variables en la parte %eneral del 2ormulario( Dim BDD as DataBase 95bjeto para manejar la base de datos Dim &BL as 4ecord:et 95bjeto para manejar la &abla /s importante ! tengan en cuenta lo ! maneja cada objeto. Dijimos ! el objeto BDD maneja la base de datos. /ntonces podemos cargarla alli de la siguiente manera( :et BDD ; 5penDatabase#"c(<mis documentos<base1.mdb"$ 9Abre la base de datos Bueno, a'ora ! tenemos abierta la base de datos, vamos a reali=ar unas consultas utili=ando ordenes :>L. *or lo tanto podriamos declarar una variable para almacenar nuestra sentencia :>L. Dim :>L As :tring )a estamos listos para aplicar :>L... SENTENCIAS DE SELECCIN O CONSULTAS Bien, :>L permite reali=ar consultas mediante sentencias de selecci"n ":/L/C&". Lo ! 'ace esta sentencia :/L/C& es tomar datos de una base de datos para devolverlos a !uien se lo pidi" #en nuestro caso !uien se lo pide es el objeto &BL$. :/L/C& consta de seis cl?usulas( las dos primeras obligatorias #:/L/C& y @453$ y las otras opcionales #A+/4/, %45.* B), +A01%, .151, 54D/4 B)$. :/L/C& y @453 @.1C51/: D/ A%4.*A3/1&5 A+/4/ %45.* B) +A01% .151 4 54D/4 B) C51:.L&A: A 3A: D/ .1A &ABLA SELECT y FROM 0eamos, con un ejemplo, como 2unciona( :>L ; ":/L/C& B @453 tabla1" :et &BL ; BDD.5pen4ecordset#:>L$ 9&BL almacena todos los valores de la tabla 1uestra orden :>L es( seleccionar #:/L/C&$ todos los campos #B$ de #@453$ la tabla1. A'ora vamos a mostrar en la lista lo ! almacenamos. &BL.3ove@irst 9nos posicionamos en el primer registro de la tabla Do .ntil &BL./5@ 99La propiedad /5@ se pone &4./ cuando se a llegado al 2inal de la tabla List1.Addtem &BL#"nombre"$ &BL.3ove1e8t 9pasamos al siguiente registro Loop De esta manera, al ejecutar, nos debe aparecer en la lista todos los nombres de la tabla. :i !ueremos mostrar "nombre" "apellido"( &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ &BL.3ove1e8t Loop :i !ueremos listar "nombre" "apellido" tiene "edad"( &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ C " tiene " C &BL#"edad"$ &BL.3ove1e8t Loop >u sucede si solo !uerDa tomar de la tabla1 los campos nombre y edad #no el apellido$. /n este caso la sentencia :>L !uedarDa( :>L ; ":/L/C& nombre,edad @453 tabla1" *or lo tanto el 2ormato de la sentencia :/L/C& 'asta a'ora es( :/L/C& campo1,campoE,...,campo1 @453 nombreFdeFlaFtabla NOTA( :i ya terminamos de trabajar con la tabla y con la base de datos las podemos cerrar de la siguiente manera( &BL.Close 9cierra tabla BDD.Close 9cierra base de datos FUNCIONES DE AGRUPAMIENTO Las 2unciones de agrupamiento son( DISTINCT: Dijimos ! si usabamos el B nos seleccionaba todos los campos. &ambin 'ay un operador llamado D:&1C&, ste elimina las 2ilas o registros duplicados del resultado de la consulta. /sto se ve bien en el siguiente ejemplo( :>L ; ":/L/C& D:&1C& edad @453 tabla1" 9almacena todas las edades sin repetirlas :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"edad"$ &BL.3ove1e8t Loop COUNT: /ste operador nos devuelve la cantidad de valores en una columna. *or ejemplo, C5.1&#nombre$ devolver? el nGmero de registros con valores no nulos en el campo nombre. *ero si usamos C5.1&#B$, nos devuelve el nGmero de registros incluyendo a!uellos registros con valores nulos. :>L ; ":/L/C& C5.1&#B$ @453 tabla1" 9para saber la cantidad de registros #incluye los nulos$ :et &BL ; BDD.5pen4ecordset#:>L$ 5
List1.Addtem &BL#"e8pr1HHH"$ 9e8pr1HHH es el name del item de &BL ! almacena el resultado del operador de agrupamiento SUM: Devuelve la suma total de los valores de una e8presi"n de columna o campo 1.3/4CA #si no es numerica les da errorI$ . *or ejemplo, :.3#edad$ devolver? la sumatoria de las edades. :>L ; ":/L/C& :.3#edad$ @453 tabla1" 9sumatoria de las edades :et &BL ; BDD.5pen4ecordset#:>L$ List1.Addtem &BL#"e8pr1HHH"$ AVG: Devuelve el promedio de los valores de una e8presi"n de columna. *or ejemplo, A0%#edad$ devolver? el promedio de las edades. /sto seria dividir :.3#edad$JC5.1&#edad$. :>L ; ":/L/C& A0%#edad$ @453 tabla1" MAX: Devuelve el valor m?s alto de los contenidos en una e8presi"n de columna. :i 'acemos( :>L ; ":/L/C& 3AK#edad$ @453 tabla1" 1os dir? la edad mas alta. MIN: :i 'ay un 3AK, por ! no puede 'aber un 31L ya se 'abran dado cuenta lo ! 'ace. /ntonces, si :>L ; ":/L/C& 31#edad$ @453 tabla1" 1os dir? la edad mas baja. /M/3*L5( !uiero saber cu?ntos registro tengo, cual es la menor edad y cual es el promedio de todas las edades Dim BDD As Database Dim &BL As 4ecordset Dim :>L As :tring :et BDD ; 5penDatabase#"c(<mis documentos<base1.mdb"$ :>L ; ":/L/C& C5.1&#B$, 31#edad$, A0%#edad$ @453 tabla1" :et &BL ; BDD.5pen4ecordset#:>L$ List1.Addtem "total de reg( " C &BL#"e8pr1HHH"$ List1.Addtem "313A /DAD( " C &BL#"e8pr1HH1"$ List1.Addtem "*453/D5 /DAD/:( " C &BL#"e8pr1HHE"$ &BL.Close BDD.Close WHERE Con A+/4/ indicamos condiciones para la selecci"n de ciertos registros. 0eamos un ejemplo( Antes ! nada nuestra sentencia :/L/C& !uedarDa asi( :/L/C& campo1,campoE,...,campo1 @453 nombreFdeFlaFtabla A+/4/ condicion1 A1D condicionE A1D ... A1D condicion1 Dim BDD As Database Dim &BL As 4ecordset Dim :>L As :tring :et BDD ; 5penDatabase#"c(<mis documentos<base1.mdb"$ :>L ; ":/L/C& B @453 tabla1 A+/4/ edad N 6H" :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"edad"$ &BL.3ove1e8t Loop &BL.Close BDD.Close Con esta instrucci"n decimos !( seleccione #:/L/C&$ todos los campos #B$ de #@453$ tabla1 ! cumplan la condici"n #A+/4/$ edad N 6H GROUP BY /sta cl?usula se utili=a para agrupar segun lo ! especi2i!uemos. *or ejemplo, podemos listar todos los datos de nuestra tabla1, pero agrupados por edad. :>L ; ":/L/C& edad, nombre, apellido @453 tabla1 %45.* B) edad,nombre, apellido" :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ C " tiene " C &BL#"edad"$ 6 &BL.3ove1e8t Loop /ntonces el 2ormato es( %45.* B) e8presion1, e8presi"nE, ..., e8presi"n1. 3*54&A1&/( &odas las e8presiones deben coincidir con lo ! pusimos en :/L/C&. *or lo tanto lo siguiente no 2unciona( :>L ; ":/L/C& B @453 tabla1 %45.* B) edad,nombre, apellido" 9no se puede agrupar mediante los campos seleccionados con B :>L ; ":/L/C& edad @453 tabla1 %45.* B) apellido" :>L ; ":/L/C& nombre, apellido, edad @453 tabla1 %45.* B) edad" HAVING Asi como la cl?usula A+/4/ especi2ica condiciones para la selecci"n de registros, +A01% especi2ica condiciones para el agrupamiento #%45.* B)$. *or lo tanto +A01% 2unciona solo si se especi2ica un %45.* B). :>L ; ":/L/C& edad, nombre, apellido @453 tabla1 %45.* B) edad,nombre, apellido +A01% edadN6H" Con este ejemplo agrupamos segGn la edad, pero solo los ! su campo edad es menos a 6H. UNION Con este operador lo ! 'acemos es juntar dos resultados de dos sentencias :/L/C& di2erentes. /l resultado de la union son todos los registros devueltos en ambas sentencias, y los registros repetidos se omiten a no ser ! utilicemos la palabra ALL. La 2orma es( :/L/C& sentencia1 .151 ALL :/L/C& sentenciaE 9sentencia1 debe coincidir con sentenciaE. 0eamos ! sucede si 'acemos lo siguiente :>L ; ":/L/C& B @453 tabla1 UNION :/L/C& B @453 tabla1" :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ C " tiene " C &BL#"edad"$ &BL.3ove1e8t Loop /n este caso unimos la tabla1 con la misma tabla1, por lo tanto todos los resultados son repetidos y se omiten. 0eamos ! pasa con ALL :>L ; ":/L/C& B @453 tabla1 UNION ALL :/L/C& B @453 tabla1" :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ C " tiene " C &BL#"edad"$ &BL.3ove1e8t Loop 5tra ve= todos los datos se repiten pero en este caso le decimos ! no omita ninguno, por lo tanto cada valor de la tabla1 estar? repetido dos veces. +acer esto no tiene sentido, es decir ! la union deberDa ser con la selecci"n de dos tablas di2erentes. ORDER BY *ara ordenar los resultados utili=amos 54D/4 B). Cuando omitimos esta cl?usula, los resultados se ordenan por el primer campo !ue sea clave en el Dndice !ue se 'aya utili=ado. 0eamos las siguientes sentencias( :>L ; ":/L/C& B @453 tabla1 54D/4 B) edad A:C" 9 ordenado por edad en 2orma ascendente :>L ; ":/L/C& B @453 tabla1 54D/4 B) edad" 9 ordenado por edad, por de2ecto lo ordena en 2orma ascendente :>L ; ":/L/C& B @453 tabla1 54D/4 B) edad D/:C" 9 ordenado por edad en 2orma descendente :>L ; ":/L/C& B @453 tabla1 54D/4 B) 1" 9ordenado por el primer campo de la tabla 7 :>L ; ":/L/C& nombre, apellido, edad @453 tabla1 54D/4 B) 6,E,1" 9ordenado por edad, apellido y nombre /ntonces podemos indicar el nombreFdeFcampo, nGmeroFdeFcampo y si es A:Cendente o D/:Cendente. CONSULTAS A MAS DE UNA TABLA :upongamos ! tenemos una base de datos con dos tablas llamadas tabla1 y tablaE. &abla1 tiene como campos nombre, apellido y edad. 3ientras ! la tablaE tiene nombre y email. Bien, por ejemplo yo podria !uerer los emails de las personas ! estan en ambas tablas, esto es ! el nombre de la tabla1 tiene ! ser igual al nombre de la tablaE. 0eamos como lo indicamos... :>L ; ":/L/C& tabla1.nombre,email @453 tabla1,tablaE A+/4/ tabla1.nombre;tablaE.nombre" :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"email"$ &BL.3ove1e8t Loop 1uestra sentencia :>L !uedo asD( 1. ndicamos los campos a seleccionar #:/L/C&$. 5bservar ! el campo nombre aparece en las dos tablas, por lo tanto debemos indicar de ! tabla los voy a seleccionar #tabla1.nombre$. *or el contrario el campo email solo aparece en la tablaE, por lo tanto no 'ace 2alta indicarle de ! tabla lo !ueremos ya ! es obvio de cual va a ser. E. Despues indicamos cuales tablas van a ser consultadas #@453$. Le indicamos ! tabla1, tablaE. /l orden es importante por! de cada registro de la primer tabla se e2ectua una bus!ueda en la segunda. 6. por ultimo indicamos la condici"n #A+/4/$. Decimos ! el campo nombre de la tabla1 debe ser igual al de la tablaE. A'ora vamos a ver el mismo ejemplo pero usando ALA:. .n alias es un nombre temporal ! le asignamos a una tabla. *or ejemplo a la tabla1 la podemos llamar t1 y a la tablaE tE. De esta manera es mas 2acil escribir t1 ! tabla1. :>L ; ":/L/C& t1.nombre,email @453 tabla1 t1,tablaE tE A+/4/ t1.nombre;tE.nombre" /n el @453 escribimos nombreFtabla aliasFtabla. /n el resto de la sentencia usamos el alias en ve= de el nombre. A'ora, supongamos ! tenemos una tercer tabla ! contiene nombre y tele2ono como campos. >ueremos consultar los campos nombre, email y tele2onos. :>L ; ":/L/C& t1.nombre,email,tele2ono @453 tabla1 t1,tablaE tE, tabla6 t6 A+/4/ t1.nombre ; tE.nombre A1D t1.nombre ; t6.nombre" Lo importante de estas consultas es el orden en ! se escriben las tablas luego del @453, ya ! esto va a in2luir en la velocidad de la consulta. *ara terminar la secci"n de consultas vamos a ver las :/L/C& A1DADA:. /sto es una :/L/C& dentro de otra. /s muy simple. 0eamos un ejemplo. :>L ; ":/L/C& t1.nombre,email,tele2ono @453 tabla1 t1,tablaE tE, tabla6 t6 A+/4/ t1.nombre ; tE.nombre A1D t1.nombre ; t6.nombre A1D #:/L/C& C5.1&#B$ @453 tabla1$N 1HH" /s la misma condici"n anterior solo ! se agrego una condici"n mas( #:/L/C& C5.1&#B$ @453 tabla1$N 1HH, esto es, ! la tabla1 tenga menos de 1HH registros. /ntonces cuando insertamos una nueva :/L/C& dentro de otra, debemos ponerla entre parentesis. ORDENES PARA MODIFICAR DATOS .*DA&/ 1:/4& 1&5 D/L/&/
8
UPDATE *odemos cambiar los datos ! !ueramos en la tabla ! !ueramos mediante la orden .*DA&/. *or ejemplo, en la tabla1, donde teniamos nombre, apellido y edad. :upongamos ! !ueremos ! todas las edades se pongan a H #cero$. *rivate :ub @ormFLoad#$ Dim BDD As Database Dim &BL As 4ecordset Dim :>L As :tring :et BDD ; 5penDatabase#"c(<mis documentos<base1.mdb"$ SQL = "UPDATE t!"# SET $%% = &" BDD'E($)*t$ SQL :>L ; ":/L/C& B @453 tabla1" :et &BL ; BDD.5pen4ecordset#:>L$ &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ C " tiene " C &BL#"edad"$ &BL.3ove1e8t Loop &BL.Close BDD.Close /nd :ub /n este caso cambiamos la manera de trabajar, o mejor dic'o, para la orden .*DA&/ trabajamos directamente sobre el objeto Database ! almacena la base de datos donde !ueremos reali=ar el cambio. *ara ejecutar una sentencia :>L podemos poner nombreFvariableFdatabase.E($)*t$ "sentenciaF:>L" 0eamos nuestra sentencia( actuali=ar #.*DA&/$ de la tabla1 las edades, ponerlas a cero #:/& edad;H$. &ambien podemos utili=ar la orden A+/4/ para especi2icar algo mas preciso. *or ejemplo poner a cero las edades ! sean mayores ! E1. :>L ; ".*DA&/ tabla1 :/& edad ; H A+/4/ edad-E1" INSERT INTO &ambien podemos insertar nuevos registros. *ara ello utili=amos la orden 1:/4& 1&5. 0eamos un ejemplo. /n la tabla1 tengo los campos nombre, apellido y edad. Bien, a'ora !uiero agregar un nuevo nombre, apellido y edad. :>L ; "1:/4& 1&5 tabla1 #nombre,apellido,edad$ 0AL./:#9damian9,9sotto9,EE$" BDD./8ecute :>L Bien, primero decimos insertar en la tabla1 #1:/4& 1&5 tabla1$ nuevos valores para los campos #nombre, apellido,edad$ los valores son para el primer campo damian, para el segundo sotto y para el tercero EE. /n 0AL./: se escriben los valores de los campos en el mismo orden en ! se especi2icaron. Los caracteres van entre 9 9 y las 2ec'as entre OP. :i no especi2icamos valores entonces el campo !ueda vacio. *ero si o si debe 'aber un valor para poder crear un nuevo registro. Bueno, ya sabemos como actuali=ar datos y como agregar datos. A'ora nos 2alta como eliminar datos. DELETE /sta sentencia se utili=a para borrar los registros de una tabla. La sentencia es D/L/&/ @453 nombreFtabla A+/4/ condiciones. :>L ; "D/L/&/ @453 tabla1 A+/4/ edadNE1" BDD./8ecute :>L Con esta sentencia borro todos los registros cuya edad sea menor a E1. :i no especi2ico un A+/4/, se borran todos los registros, o sea, la tabla me !ueda vacia.
:>L ; "D/L/&/ @453 tabla1" BDD./8ecute :>L 9 A'ora, si la tabla esta vacia, cuando 'agamos una bus!ueda dentro de ella el programa va a dar error. .na soluci"n serDa( :>L ; ":/L/C& B @453 tabla1" :et &BL ; BDD.5pen4ecordset#:>L$ I+ TBL'EOF T,$- 99/5@ esta en verdaero si no 'ay datos M./B0( "N0 ,y %t0. 1*$ )02-)2%- )0- " !3.1*$% $.4$)2+2)%" E(2t S*! E-% I+ 9si llega 'asta aca es por! 'ay datos &BL.3ove@irst Do .ntil &BL./5@ List1.Addtem &BL#"nombre"$ C " " C &BL#"apellido"$ C " tiene " C &BL#"edad"$ &BL.3ove1e8t Loop &BL.Close BDD.Close