Beruflich Dokumente
Kultur Dokumente
CAPTULO 51
ndice de contenido
TRABAJAR CON TABLAS................................................................................................................2
DESEO UNA TABLA A MEDIDA.............................................................................................2
CREAR UNA TABLA.....................................................................................................................2
LA CLUSULA CONSTRAINT............................................................................................3
UNA PEQUEA ACLARACIN (PARA NO TENER QUE RASCARNOS LA
CABEZA).............................................................................................................................3
DEFINIR UN CAMPO QUE NO ADMITE DUPLICADOS: UNIQUE..............................3
DEFINIR UN CAMPO COMO CLAVE PRINCIPAL: PRIMARY KEY.............................4
DEFINIR UN CAMPO COMO REQUERIDO: NOT NULL...............................................5
DEFINIR UN CAMPO COMO AUTONUMRICO Y DEFINIR SU INTERVALO DE
INCREMENTO......................................................................................................................6
COMBINAR DEFINICIN DE PROPIEDADES................................................................8
DEFINIR UNA CLAVE EXTERNA: FOREING KEY.........................................................8
BORRAR UNA TABLA................................................................................................................10
CREAR NDICES (con CREATE INDEX)..................................................................................10
NDICES CON REGISTROS DUPLICADOS.........................................................................11
PROHIBIR VALORES NULOS EN EL NDICE...............................................................12
IGNORAR VALORES NULOS EN EL NDICE................................................................13
NDICE CON REGISTROS NO DUPLICADOS....................................................................14
CREAR UN NDICE CON CLAVE PRIMARIA................................................................15
ELIMINAR NDICES...................................................................................................................15
MODIFICAR UNA TABLA..........................................................................................................15
AADIR CAMPOS..................................................................................................................16
BORRAR CAMPOS.................................................................................................................16
CREAR NDICES (con ALTER TABLE)................................................................................17
CREAR UNA CLAVE PRINCIPAL....................................................................................17
CREAR UNA CLAVE EXTERNA......................................................................................17
MODIFICAR EL TIPO DE RELACIN........................................................................18
AADIR UNA REGLA DE VALIDACIN............................................................................20
ELIMINAR NDICES..............................................................................................................20
PARA FINALIZAR EL CAPTULO (Y EL CURSO!)....................................................................21
Vistame en http://siliconproject.com.ar/neckkito/
Creo_tabla:
CurrentDb.Execute miSql
MsgBox "La tabla 'TProductos' se ha creado correctamente", vbInformation, "OK"
Salida:
Exit Sub
sol_err:
If Err.Number = 3010 Then
DoCmd.DeleteObject acTable, "TProductos"
2
Algunos de los cdigos que se utilizarn llevan control de errores. El error 3010 se produce cuando la tabla ya existe. Por eso, si
salta dicho error, el cdigo borra la tabla existente y vuelve a crearla de nuevo en funcin de lo declarado en la SQL.
Vistame en http://siliconproject.com.ar/neckkito/
Resume Creo_tabla
Else
MsgBox "Se ha producido el error " & Err.Number & " " & Err.Description
Resume Salida
End If
End Sub
Nota: es posible que, tras ejecutar el cdigo, no nos aparezca TProductos en la ventana de
base de datos o en el panel de navegacin (segn la versin de Access que utilicemos). Si
seleccionamos cualquier tabla que tengamos en la BD y pulsamos 'F5' se producir una
actualizacin y nuestra tabla aparecer como por arte de magia
LA CLUSULA CONSTRAINT
Para establecer limitaciones o definiciones en nuestros campos debemos utilizar la clusula
CONSTRAINT. Avanzaremos que tambin la podemos utilizar para establecer relaciones con
otra tabla.
Podemos utilizar CONSTRAINT de dos maneras:
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdUnique_Click()
On Error GoTo sol_err
Dim miSql As String
miSql = "CREATE TABLE TProductos (CodProd STRING (5) CONSTRAINT miIndice UNIQUE," _
& " DescripProd STRING (25), ImportProd CURRENCY)"
'----------Asignacin directa-----' miSql = "CREATE TABLE TProductos (CodProd STRING UNIQUE, DescripProd STRING (25)," _
'
& "ImportProd CURRENCY)"
'----------------------------------
Creo_tabla:
CurrentDb.Execute miSql
MsgBox "La tabla 'TProductos' se ha creado correctamente", vbInformation, "OK"
Salida:
Exit Sub
sol_err:
If Err.Number = 3010 Then
DoCmd.DeleteObject acTable, "TProductos"
Resume Creo_tabla
Else
MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description
Resume Salida
End If
End Sub
Fijaos que:
Es decir:
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdPrimaryKey_Click()
On Error GoTo sol_err
Dim miSql As String
miSql = "CREATE TABLE TProductos (CodProd STRING (5) CONSTRAINT miClave PRIMARY KEY," _
& " DescripProd STRING (25), ImportProd CURRENCY)"
'----------Asignacin directa-----'
'
'---------------------------------Creo_tabla:
CurrentDb.Execute miSql
MsgBox "La tabla 'TProductos' se ha creado correctamente", vbInformation, "OK"
Salida:
Exit Sub
sol_err:
If Err.Number = 3010 Then
DoCmd.DeleteObject acTable, "TProductos"
Resume Creo_tabla
Else
MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description
Resume Salida
End If
End Sub
STRING
(5)
CONSTRAINT
miClave
PRIMARY KEY
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdNotNull_Click()
On Error GoTo sol_err
Dim miSql As String
miSql = "CREATE TABLE TProductos (CodProd STRING (5) CONSTRAINT miClave PRIMARY KEY," _
& " DescripProd STRING (25) CONSTRAINT miNoNulo NOT NULL, ImportProd CURRENCY)"
'----------Asignacin directa-----' miSql = "CREATE TABLE TProductos (CodProd STRING (5) PRIMARY KEY," _
'
& " DescripProd STRING (25) NOT NULL, ImportProd CURRENCY)"
'----------------------------------
Creo_tabla:
CurrentDb.Execute miSql
MsgBox "La tabla 'TProductos' se ha creado correctamente", vbInformation, "OK"
Salida:
Exit Sub
sol_err:
If Err.Number = 3010 Then
DoCmd.DeleteObject acTable, "TProductos"
Resume Creo_tabla
Else
MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description
Resume Salida
End If
End Sub
No creo que haga ya falta insistir en la estructura del CONSTRAINT...NOT NULL, verdad?
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdAutonumerico_Click()
On Error GoTo sol_err
Dim miSql As String
miSql = "CREATE TABLE TProductos (IdProd AUTOINCREMENT(1,3) CONSTRAINT miClave PRIMARY KEY," _
& " CodProd STRING (5), DescripProd STRING (25), ImportProd CURRENCY)"
'----------Asignacin directa-----' miSql = "CREATE TABLE TProductos (IdProd AUTOINCREMENT(1,3) PRIMARY KEY," _
'
& " CodProd STRING (5), DescripProd STRING (25), ImportProd CURRENCY)"
'----------------------------------
Creo_tabla:
CurrentDb.Execute miSql
MsgBox "La tabla 'TProductos' se ha creado correctamente", vbInformation, "OK"
Salida:
Exit Sub
sol_err:
If Err.Number = 3010 Then
DoCmd.DeleteObject acTable, "TProductos"
Resume Creo_tabla
Else
MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description
Resume Salida
End If
End Sub
Si nos fijamos hemos definido el tipo de campo [IdProd] como AUTOINCREMENT (si
hubiramos utilizado COUNTER funcionara exactamente igual), y, entre parntesis, le hemos
pasado dos valores. Supongo que alguien se preguntar: Y qu significan?.
Pues (1,3) significa que:
1 El primer registro que se introduzca empezar por 1. Si hubiramos puesto 15 el primer
registro hubiera tenido un [IdProd] igual a 15
3 Los incrementos se producirn de 3 en 3.
Es decir, que la introduccin de registros nos quedara as:
Vistame en http://siliconproject.com.ar/neckkito/
Creo_tabla:
CurrentDb.Execute miSql
MsgBox "La tabla 'TProductos' se ha creado correctamente", vbInformation, "OK"
Salida:
Exit Sub
sol_err:
If Err.Number = 3010 Then
DoCmd.DeleteObject acTable, "TProductos"
Resume Creo_tabla
Else
MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description
Resume Salida
End If
End Sub
Como podis observar el proceso es tan simple como aadir la definicin de las propiedades
una tras otra.
Recordad que, en SQL, para un campo autonumrico AUTOINCREMENT y COUNTER son sinnimos. En el ejemplo anterior he
utilizado AUTOINCREMENT, y en el ejemplo que sigue he utilizado COUNTER.
Vistame en http://siliconproject.com.ar/neckkito/
Id es la clave principal
NumMes es la clave externa, porque nos relaciona la tabla con una tabla externa, que
es TMeses.
KEY
(nomCampoInterno)
REFERENCES
CurrentDb.Execute miSql
MsgBox "La tabla 'TPedidos' se ha creado correctamente", vbInformation, "OK"
End Sub
miSql = "CREATE TABLE TPedidos (Id LONG CONSTRAINT miClave PRIMARY KEY," _
& " NumMes2 LONG, Cliente STRING (25), ImpPedido CURRENCY," _
& " CONSTRAINT miClaveExt FOREIGN KEY (NumMes2) REFERENCES TMeses (NumMes))"
Por qu el cdigo no lleva control de errores? Porque desde el momento en que establecemos relaciones no podemos borrar la
tabla porque Access no nos dejar: nos dir que no se puede borrar la tabla porque existen relaciones entre tablas. El proceso
sera, pues, primero eliminar la relacin y despus borrar la tabla. Como an no sabemos cmo eliminar relaciones (pero lo
veremos en breve!) omito el control de errores, por ahora.
Vistame en http://siliconproject.com.ar/neckkito/
Como vemos en el cdigo, si la tabla no existiera nos saltara el error 3376. El cdigo gestiona
dicho error a travs del control de errores.
Revisad la nota 4
10
Vistame en http://siliconproject.com.ar/neckkito/
Alguien podra pensar: Y qu hemos conseguido con lo anterior?. OK. En la tabla TProductos
yo he introducido varios registros, de la manera siguiente:
Conclusin: que al haber convertido en ndices los dos campos se produce, automticamente,
una ordenacin de la siguiente manera:
Lo vemos?
Pues ahora vamos a cambiar la ordenacin del ndice sobre el campo [DescripProd].
11
Vistame en http://siliconproject.com.ar/neckkito/
Aprovecharemos para ver cmo declaro explcitamente tambin la ordenacin sobre el campo
[CodProd]. Nuestro cdigo quedara as:
CurrentDb.Execute miSql
MsgBox "ndices creados satisfactoriamente", vbInformation, "OK"
End Sub
Y si abro la tabla TProductos (es necesario borrarla y volverla a crear antes de realizar el
proceso!) los resultados son los siguientes:
12
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdCreaIndiceDisallowNull_Click()
Dim miSql As String
miSql = "CREATE INDEX miIndice ON TProductos (CodProd ASC,DescripProd DESC)" _
& " WITH DISALLOW NULL"
CurrentDb.Execute miSql
MsgBox "ndices creados satisfactoriamente", vbInformation, "OK"
End Sub
13
Vistame en http://siliconproject.com.ar/neckkito/
CurrentDb.Execute miSql
MsgBox "ndices
vbInformation, "OK"
End Sub
creados
satisfactoriamente",
14
Vistame en http://siliconproject.com.ar/neckkito/
Fcil, no?
ELIMINAR NDICES
Para eliminar un ndice debemos utilizar la estructura:
DROP INDEX nombreIndice ON nomTabla
Vamos a suponer que hemos creado el ndice miIndice sobre la tabla TProductos utilizando
cualquiera de los mtodos explicados anteriormente. Vamos a eliminar ese ndice a travs del
siguiente cdigo:
Y listo.
Vistame en http://siliconproject.com.ar/neckkito/
como ndices.
Como veremos, las diferentes operaciones tienen una
estructura muy similar. nicamente hay que saber
pronunciar las palabras mgicas para que el sortilegio
surja efecto
Veamos pues qu podemos hacerle a nuestra tabla.
AADIR CAMPOS
La estructura para aadir un campo sera:
ALTER TABLE nomTabla ADD COLUMN nomCampo tipoCampo
Supongamos que en nuestra tabla TMeses queremos aadir el campo [Estacion], de tipo texto
con una longitud mxima de 10 caracteres. Nuestro cdigo debera ser as:
BORRAR CAMPOS
Caramba! Nos hemos equivocado y debemos borrar el campo [Estacion] que acabamos de
crear. Cmo lo hacemos?
Pues la estructura de la SQL sera:
ALTER TABLE nomTabla DROP COLUMN nomCampo
Es decir, que escribiramos:
16
Vistame en http://siliconproject.com.ar/neckkito/
CurrentDb.Execute miSql
MsgBox "Clave principal creada correctamente", vbInformation, "OK"
End Sub
miSql = "CREATE TABLE TPedidos (Id LONG CONSTRAINT miClave PRIMARY KEY," _
& " NumMes LONG, Cliente STRING (25), ImpPedido CURRENCY)"
Vamos a crear una clave externa con el campo [NumMes] entre las tablas TMeses y TPedidos.
La estructura de dicha construccin sera:
ALTER
TABLE
nomTabla
ADD
CONSTRAINT
miClaveExt
FOREIGN
nomCampoInterno REFERECES nomTablaExterna(nomCampoExterno)
Es decir:
17
Vistame en http://siliconproject.com.ar/neckkito/
KEY
Private Sub cmdModifCreaClaveExterna_Click()
Dim miSql As String
miSql = "ALTER TABLE TPedidos ADD CONSTRAINT miClaveExt FOREIGN KEY (NumMes)" _
& " REFERENCES TMeses(NumMes)"
CurrentDb.Execute miSql
MsgBox "La clave externa se ha creado correctamente", vbInformation, "OK"
End Sub
Os recuerdo que para comprobar la efectividad de nuestro cdigo basta con abrir la ventana
relaciones y mostrar estas dos tablas: debera aparecernos la relacin.
Alguien se ha perdido? Espero que esta imagen sirva para refrescar memorias:
Tambin podemos definir estas dos propiedades de la relacin en nuestra SQL, realizando una
pequea modificacin en la estructura. Es decir:
ALTER
TABLE
nomTabla
ADD
CONSTRAINT
miClaveExt
FOREIGN
KEY
nomCampoInterno REFERECES nomTablaExterna(nomCampoExterno) [ON UPDATE
CASCADE | ON DELETE CASCADE]
18
Vistame en http://siliconproject.com.ar/neckkito/
CurrentProject.Connection.Execute miSql
MsgBox "La clave externa se ha creado correctamente", vbInformation, "OK"
End Sub
CurrentProject.Connection.Execute miSql
MsgBox "La clave externa se ha creado correctamente", vbInformation, "OK"
End Sub
miSql = "ALTER TABLE TPedidos ADD CONSTRAINT miClaveExt FOREIGN KEY (NumMes)" _
& " REFERENCES TMeses(NumMes) ON UPDATE CASCADE ON DELETE CASCADE"
19
Vistame en http://siliconproject.com.ar/neckkito/
Nota: si, una vez ejecutada la SQL, abrimos TVentas en vista diseo y sacamos las
propiedades del campo [ImpVta] veremos que no hay ninguna regla de validacin especificada.
Eso no debe preocuparnos: si intentamos escribir un registro con una venta en negativo nos
saltar un aviso de que ese valor no cumple con la regla de validacin.
ELIMINAR NDICES
El proceso de eliminar ndices sera muy parecido a lo que ya conocemos con ADD, pero
utilizando, en su lugar, DROP.
Ergo la estructura que deberamos utilizar sera:
ALTER TABLE nomTabla DROP CONSTRAINT nomIndice
Para practicar un poco eliminaremos, de manera manual, la clave principal de la tabla TMeses.
Una vez eliminada la clave principal de esa tabla la volvemos a crear a travs de una SQL,
dndole nombre al ndice
Eso ya deberamos saber cmo hacerlo, pero para refrescar memorias os indico aqu cmo
sera la SQL
20
Vistame en http://siliconproject.com.ar/neckkito/
miSql = "ALTER TABLE TMeses ADD CONSTRAINT miSuperClavePpal PRIMARY KEY(NumMes)"
Si abrimos, tras su ejecucin, la tabla TMeses, veremos que nuestra clave principal ha
desaparecido.
21
Vistame en http://siliconproject.com.ar/neckkito/
Access. Eso nos da la ventaja de que podemos trabajar con muchas herramientas que se
complementan o se sustituyen unas a otras. Para clarificar lo que quiero decir, recordemos que
tenemos las consultas como objeto en Access, fcilmente manipulables a nivel visual.
Si tenemos problemas con la programacin de alguna SQL
quiz podramos plantearnos el utilizar una consulta-objeto
de Access para realizar la misma funcin, por ejemplo.
Quisiera tambin remarcar que existe una estrecha
simbiosis entre SQL y ADO, en la cual no hemos
profundizado en este curso porque eso excedera de las
pretensiones del manual. Sin embargo, creo que es
interesante dejarlo apuntado para aquellos que quieran
profundizar sobre el tema, porque, dadas las caractersticas
de ADO, no hablamos de hacer un viaje a otra ciudad,
sino ms bien de realizar un viaje a otro continente
Espero que este manual os haya sido de utilidad. Para quejas y dems poneos en contacto con
mi editor (Anda, pero si no tengo editor! :P).
Un saludo, y...
suerte!
22
Vistame en http://siliconproject.com.ar/neckkito/