Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Visual Basic Practico
Curso Visual Basic Practico
Entrega N 1
5 de Octubre de 1998
Introduccin:
Name
Caption
cmbAadir
Aadir Nuevos
cmbMantenimiento
Mantenimiento
cmbBuscar
Bsqueda
cmbImprimir
Imprimir
cmbSalir
Salir
4. Si todo ha ido bien, ya tendris el formulario principal con los botones dentro. Y ser
una cosa + o - as:
5. Ahora incluiremos el cdigo del botn cmbSalir. Pulsamos doble encima del control y
aparecer el editor de cdigo con el evento cmbSalir_click(). Ponemos lo siguiente:
Private Sub cmbSalir_Click()
Unload Me
End Sub
Este cdigo har que al pulsar sobre Salir, se descargue el formulario (osea, salga a
Windows).
6. Por ltimo, cambiar otra propiedad del formulario. Salimos del editor de cdigo y
pulsamos en el formulario para ver sus propiedades. Una de ellas es Border Style, lo
ponemos a 3 (por qu?, para evitar que el usuario pueda cambiar el ancho y alto del
formulario.)
7. Esto es todo, recordad que cuando hay veinte programas que hacen lo mismo, el
mejor siempre es el ms fcil y vistoso. Tenemos una herramienta con la que podemos
hacer esto fcilmente. Todo depende de cada programador. Cualquier pregunta podis
realizarla a travs de la lista de la Web del Programador, en la misma Web o a mi
direccin de correo.
Anterior:
Campos
Tipo
multimedia
numero
entero
titulo
texto * 50
Ttulo de la entrada
autor
texto * 40
Autor de la entrada
fecha
fecha
tipo
text * 20
contenido
text * 30
prestado
boolean
Descripcin
Esa es la nica tabla por ahora. Vamos a crearla para que podamos
comenzar a utilizarla. Primero abrimos el VB y nuestro proyecto que
comenzamos la anterior entrega. Una vez abierto pulsamos
Complementos, Administrador Visual de Datos.
Este es el Administrador de Datos:
Campos
Tipo
multimedia
numero
entero
titulo
texto * 50
Ttulo de la entrada
autor
texto * 40
Autor de la entrada
fecha
fecha
tipo
text * 20
contenido
text * 30
prestado
boolean
Descripcin
Valor
Descripcin
Name
frmAadirEntrada
BorderStyle
3 - Fixed Dialog
Caption
Aadir Entrada
StartUpPosition
2 - Center Screen
Valor
Name
lblFecha
Alignment
2 - Center
Caption
Fecha
Descripcin
Nombre de la Etiqueta
Texto centrado
Es la etiqueta del campo Fecha
El tipo de letra y color a vuesto gusto. Hay que hacer lo mismo para
las etiquetas de: TITULO, AUTOR, TIPO y CONTENIDO. Slo sequir los pasos
anteriores.
Si ya hemos aadido todas las Etiquetas, aadiremos las Cajas de
Texto o text box, como querais. Aadimos el primero (el de la fecha) y
ponemos las siguientes propiedades:
txtFecha
Propiedad
Valor
Name
txtFecha
Text
Descripcin
Nombre de la Caja de Texto
Ponemos la caja de texto vacia
Tranquilos que aqui abajo esta el link para que os lleveis el cdigo
fuente (para los que estn diciendo, uff que dificil).
Valor
Descripcin
Name
dbMul
Caption
dbMul
DataBaseName
Ruta de la Base de
Datos
RecordSource
Multimedia
Visible
False
Pues eso
Tabla que vamos a utilizar
Que en ejecucin no se vea
comContenido.AddItem "Aventura"
comContenido.AddItem "Arcade"
comContenido.AddItem "Emuladores"
comContenido.AddItem "Programacin"
comContenido.AddItem "Ordenador Otros"
End Sub
Y me dir alguno de vosotros, Y esto que XXXXX hace?. Pues lo
que hace es cargar en los controles Combo las opciones que apareceran al
pulsar sobre ellos, tanto en el combo de Tipos como en el de Contenidos.
Es muy fcil, simplemente: nombre.AddItem "lo que quieras aadir"
Ahora, si ejecutamos el programa, al pulsar sobre el control Combo,
apareceran todas las caractersticas que hemos puesto. Eso es todo lo que
pondremos en el evento Load del formulario.
Por ltimo pondremos el cdigo de los botones: cmbAadir y
cmbVolver, en el evento Click de cada uno de ellos.
Private Sub cmbVolver_Click()
Unload Me
End Sub
Y aqui est el de cmbAadir, comentado en el mismo cdigo.
Private Sub cmbAadir_Click()
' recomendaciones iniciales
' hay que controlar los datos que vamos a introducir
' si introducimos una fecha incorrecta ---> ERROR
' si introducimos una cadena ms larga de lo que coge ---> ERROR
dbMul.Recordset.AddNew ' esto es para decirle
' que vamos a aadir
dbMul.Recordset("titulo") = Trim$(txtTitulo.Text)
' aadimos el titulo (el trim es para quitar los espacios de ms)
dbMul.Recordset("autor") = Trim$(txtAutor.Text)
' igual con el autor
dbMul.Recordset("fecha") = Format(txtFecha.Text, "dd/mm/yyyy")
' la fecha utiliza el format que es simplemente para decirle en qu
' formato la aadimos que es dia/mes/ao (con 4 digitos)
dbMul.Recordset("tipo") = Trim$(comTipo.Text)
' el tipo lo cogemos del combo
dbMul.Recordset("contenido") = Trim$(comContenido.Text)
' igual con el contenido
dbMul.Recordset.Update ' lo aade definitivamente
' ya est todo
' mostramos un mensaje de que se ha aadido
MsgBox ("Ya est dentro")
' vaciamos los campos para aadir otro
txtTitulo.Text = ""
txtAutor.Text = ""
txtFecha.Text = ""
comTipo.Text = "Elije el tipo"
comTipo.ListIndex = -1 ' indice de la lista, ya lo explicaremos
comContenido.Text = "Elije el contenido"
comContenido.ListIndex = -1 ' indice de la lista, ya lo explicaremos
Primero.
Anterior:
Valor
Name
frmMantenimiento
Descripcin
Nombre del formulario, para referirnos a l.
BorderStyle
3 - Fixed Dialog
Caption
Mantenimiento de
Datos
StartUpPosition
2 - Center Screen
Valor
Descripcin
Name
dbMul
Caption
dbMul
DataBaseName
Ruta de la Base de
Datos
RecordSource
Multimedia
Pues eso
Tabla que vamos a utilizar
Visible
False
Valor
Name
dbgMallal
DataSource
dbMul
Descripcin
Nombre del control DBGrid
El control data con el que enlazamos
Primero.
Pues si, el SQL que tanto se oye hablar y tan poco se comenta
detenidamente. Pues esto es sql, un lenguaje estructurado de consultas.
Con este lenguaje podemos conseguir una consulta del tipo de 'todas las
chicas de la base de datos que tengan los ojos verdes y el pelo negro y
ordenadas por edad'. (lo que falta es la base de datos). :-)
En nuestro caso (dejando la base de datos anterior, aunque si
alguien la tiene que la mande) podemos hacer una consulta de este tipo:
'Todos los cd-roms cuyo contenido sea aventuras y que su autor sea EA
Sports' pero las posibilidades de consultas y accesos a la base de datos
son inmensas.
Bueno, pasamos a cmo hacerlo, es que me he inspirado y no dejo
de escribir. Cmo lo hacemos en visual basic?. Pues, sencillamente,
ponemos la sentencia SQL en la propiedad RecordSource del control Data.
Y cmo cojxxxx hago la sentencia SQL?, pues a eso vamos, no seamos tan
impacientes.
Podemos decir que una sentencia SQL tiene tres partes:
1. SELECT
2. WHERE
3. ORDER
Un ejemplo de sentencia sera:
SELECT * FROM multimedia WHERE autor='EA Sports' ORDER BY
contenido
Esto nos SELECCIONA (select) TODOS los campos (*) DE LA
tabla (from) multimedia DONDE (where) el autor sea igual a EA Sports y
que se ORDENE (order) por (by) contenido.
En esa sentencia est lo ms necesario para que podais hacer
vuestra primera sentencia propia, bueno, no todo. Ahora os explicar lo
que no est escrito.
Primera Parte: SELECT
dems.
SELECT consta de seis clusulas: las dos primeras obligatorias (SELECT y FROM) y las otras
opcionales (WHERE, GROUP BY, HAVING, UNION, ORDER BY).
SELECT y FROM
FUNCIONES DE AGRUPAMIENTO
WHERE
GROUP BY
HAVING
UNION
ORDER BY
CONSULTAS A MAS DE UNA TABLA
SELECT y FROM
Veamos, con un ejemplo, como funciona:
SQL = "SELECT * FROM tabla1"
Set TBL = BDD.OpenRecordset(SQL) 'TBL almacena todos los valores de la tabla
Nuestra orden SQL es: seleccionar (SELECT) todos los campos (*) de (FROM) la tabla1.
Ahora vamos a mostrar en la lista lo q almacenamos.
TBL.MoveFirst 'nos posicionamos en el primer registro de la tabla
Do Until TBL.EOF ''La propiedad EOF se pone TRUE cuando se a llegado al final de la tabla
List1.AddItem TBL("nombre")
TBL.MoveNext 'pasamos al siguiente registro
Loop
De esta manera, al ejecutar, nos debe aparecer en la lista todos los nombres de la tabla.
Si queremos mostrar "nombre" "apellido":
TBL.MoveFirst
Do Until TBL.EOF
List1.AddItem TBL("nombre") & " " & TBL("apellido")
TBL.MoveNext
Loop
Si queremos listar "nombre" "apellido" tiene "edad":
TBL.MoveFirst
Do Until TBL.EOF
List1.AddItem TBL("nombre") & " " & TBL("apellido") & " tiene " & TBL("edad")
TBL.MoveNext
Loop
Qu sucede si solo quera tomar de la tabla1 los campos nombre y edad (no el apellido). En
este caso la sentencia SQL quedara:
SQL = "SELECT nombre,edad FROM tabla1"
FUNCIONES DE AGRUPAMIENTO
Las funciones de agrupamiento son:
DISTINCT: Dijimos q si usabamos el * nos seleccionaba todos los campos. Tambin hay un
operador llamado DISTINCT, ste elimina las filas o registros duplicados del resultado de la
consulta. Esto se ve bien en el siguiente ejemplo:
SQL = "SELECT DISTINCT edad FROM tabla1" 'almacena todas las edades sin repetirlas
Set TBL = BDD.OpenRecordset(SQL)
TBL.MoveFirst
Do Until TBL.EOF
List1.AddItem TBL("edad")
TBL.MoveNext
Loop
COUNT: Este operador nos devuelve la cantidad de valores en una columna. Por ejemplo,
COUNT(nombre) devolver el nmero de registros con valores no nulos en el campo nombre.
Pero si usamos COUNT(*), nos devuelve el nmero de registros incluyendo aquellos registros
con valores nulos.
SQL = "SELECT COUNT(*) FROM tabla1" 'para saber la cantidad de registros (incluye los
nulos)
Set TBL = BDD.OpenRecordset(SQL)
List1.AddItem TBL("expr1000") 'expr1000 es el name del item de TBL q almacena el resultado
del operador de agrupamiento
SUM: Devuelve la suma total de los valores de una expresin de columna o campo NUMERICA
(si no es numerica les da error!) . Por ejemplo, SUM(edad) devolver la sumatoria de las
edades.
SQL = "SELECT SUM(edad) FROM tabla1" 'sumatoria de las edades
Set TBL = BDD.OpenRecordset(SQL)
List1.AddItem TBL("expr1000")
AVG: Devuelve el promedio de los valores de una expresin de columna. Por ejemplo,
AVG(edad) devolver el promedio de las edades. Esto seria dividir SUM(edad)/COUNT(edad).
SQL = "SELECT AVG(edad) FROM tabla1"
MAX: Devuelve el valor ms alto de los contenidos en una expresin de columna.
Si hacemos: SQL = "SELECT MAX(edad) FROM tabla1" Nos dir la edad mas alta.
MIN: Si hay un MAX, por q no puede haber un MIN? ya se habran dado cuenta lo q hace.
Entonces, si SQL = "SELECT MIN(edad) FROM tabla1" Nos dir la edad mas baja.
EJEMPLO: quiero saber cuntos registro tengo, cual es la menor edad y cual es el promedio de
todas las edades
Dim BDD As Database
Dim TBL As Recordset
Dim SQL As String
Set BDD = OpenDatabase("c:\mis documentos\base1.mdb")
SQL = "SELECT COUNT(*), MIN(edad), AVG(edad) FROM tabla1"
Set TBL = BDD.OpenRecordset(SQL)
List1.AddItem "total de reg: " & TBL("expr1000")
List1.AddItem "MINIMA EDAD: " & TBL("expr1001")
List1.AddItem "PROMEDIO EDADES: " & TBL("expr1002")
TBL.Close
BDD.Close
WHERE
Con WHERE indicamos condiciones para la seleccin de ciertos registros. Veamos un ejemplo:
Antes q nada nuestra sentencia SELECT quedara asi:
SELECT campo1,campo2,...,campoN FROM nombre_de_la_tabla WHERE condicion1 AND
condicion2 AND ... AND condicionN
Dim BDD As Database
Dim TBL As Recordset
Dim SQL As String
Set BDD = OpenDatabase("c:\mis documentos\base1.mdb")
SQL = "SELECT * FROM tabla1 WHERE edad < 30"
Set TBL = BDD.OpenRecordset(SQL)
TBL.MoveFirst
Do Until TBL.EOF
List1.AddItem TBL("edad")
TBL.MoveNext
Loop
TBL.Close
BDD.Close
Con esta instruccin decimos q: seleccione (SELECT) todos los campos (*) de (FROM) tabla1 q
cumplan la condicin (WHERE) edad < 30
GROUP BY
Esta clusula se utiliza para agrupar segun lo q especifiquemos. Por ejemplo, podemos listar
todos los datos de nuestra tabla1, pero agrupados por edad.
SQL = "SELECT edad, nombre, apellido FROM tabla1 GROUP BY edad,nombre, apellido"
Set TBL = BDD.OpenRecordset(SQL)
TBL.MoveFirst
Do Until TBL.EOF
List1.AddItem TBL("nombre") & " " & TBL("apellido") & " tiene " & TBL("edad")
TBL.MoveNext
Loop
Entonces el formato es: GROUP BY expresion1, expresin2, ..., expresinN.
IMPORTANTE: Todas las expresiones deben coincidir con lo q pusimos en SELECT. Por lo
tanto lo siguiente no funciona:
SQL = "SELECT * FROM tabla1 GROUP BY edad,nombre, apellido"
'no se puede agrupar mediante los campos seleccionados con *
SQL = "SELECT edad FROM tabla1 GROUP BY apellido"
SQL = "SELECT nombre, apellido, edad FROM tabla1 GROUP BY edad"
HAVING
Asi como la clusula WHERE especifica condiciones para la seleccin de registros, HAVING
especifica condiciones para el agrupamiento (GROUP BY). Por lo tanto HAVING funciona solo
si se especifica un GROUP BY.
SQL = "SELECT edad, nombre, apellido FROM tabla1 GROUP BY edad,nombre, apellido
HAVING edad<30"
Con este ejemplo agrupamos segn la edad, pero solo los q su campo edad es menos a 30.
UNION
Con este operador lo q hacemos es juntar dos resultados de dos sentencias SELECT
diferentes. El resultado de la union son todos los registros devueltos en ambas sentencias, y
los registros repetidos se omiten a no ser q utilicemos la palabra ALL.
La forma es: SELECT sentencia1 UNION ALL SELECT sentencia2
con sentencia2
veamos q sucede si hacemos lo siguiente
ORDER BY
Para ordenar los resultados utilizamos ORDER BY. Cuando omitimos esta clusula, los
resultados se ordenan por el primer campo que sea clave en el ndice que se haya utilizado.
Veamos las siguientes sentencias:
SQL = "SELECT * FROM tabla1 ORDER BY edad ASC" ' ordenado por edad en forma
ascendente
SQL = "SELECT * FROM tabla1 ORDER BY edad" ' ordenado por edad, por defecto lo ordena
en forma ascendente
SQL = "SELECT * FROM tabla1 ORDER BY edad DESC" ' ordenado por edad en forma
descendente
SQL = "SELECT * FROM tabla1 ORDER BY 1" 'ordenado por el primer campo de la tabla
SQL = "SELECT nombre, apellido, edad FROM tabla1 ORDER BY 3,2,1" 'ordenado por edad,
apellido y nombre
Entonces podemos indicar el nombre_de_campo, nmero_de_campo y si es ASCendente o
DESCendente.
Apertura de la conexin
Lo primero que debemos hacer es aadir las referencias de acceso a datos. Para ello, nos
movemos a Proyecto Referencias y una vez all aadimos los Microsoft ActiveX Data
Objects 2.6 Library.
Una vez hecho esto, podemos proceder a escribir cdigo, creando las variables necesarias
para establecer la conexin:
Dim cnConex As ADODB.Connection
La conexin mediante la cual accederemos a la base de datos.
Dim cmdComando As ADODB.Command
El comando o consulta a ejecutar en la conexin.
Dim strCadenaConex As String
La cadena que indica el formato, ubicacin, etc. de la base de datos
Dim rsLista As ADODB.Recordset
El conjunto de registros donde se almacenarn los resultados de la consulta.
Dim parParametro1 As ADODB.Parameter
Creacin de la consulta
Una vez preparada la conexin, procedemos a preparar el comando:
Set cmdComando = New ADODB.Command
Instanciamos el comando.
Comando.ActiveConnection = cnConex
Le indicamos a que conexin pertenece.
Comando.CommandText = "Consulta SQL
Establecemos la consulta que ejecutar el comando.
Set parParametro1 = cmdComando.CreateParameter("campo", tipodedatos,
adParamInput, , valor)
cmdComando.Parameters.Append parParametro1
Ejecucin de la consulta
Una vez preparado tambin el comando, procedemos a ejecutarlo y guardar sus resultados:
cmdComando.Execute
Si nuestra consulta no devuelve datos, ejecutamos el comando.
Limpieza de variables
Una vez hallamos terminado de ejecutar la consulta y hallamos devuelto los datos, pasamos a
liberar la memoria ocupada por las distintas variables.
cnConex.Close
Cerramos la conexin (opcional, no es necesario hacerlo; si no lo indicamos VB lo har por
nosotros).
Set cnConex = Nothing
Set cmdComando = Nothing
Set strCadenaConex = Nothing
Eliminamos las variables.
Set rsLista = Nothing
Si ya hemos tratado los resultados devueltos, o los hemos trasladado a otra parte, eliminamos
tambin el RecordSet.
adParamInput
adParamInputOutput
adParamOutput
adParamReturnValue
adParamUnknown