Anda di halaman 1dari 25

RELACIONAR Y ESTRUCTURAR TABLAS

1
ndice de contenido
INTRODUCCIN................................................................................................................................2
UNAS IDEAS INICIALES..................................................................................................................3
PLANTEAMIENTO DE LAS PRIMERAS TABLAS........................................................................4
CONTINUAMOS CON LA ADICIN DE LA TABLA PRINCIPAL DE FACTURAS....................6
ALGO SOBRE LA TIPOLOGA DE RELACIONES.........................................................................8
AADAMOS UNA TABLA QUE HAREMOS FUNCIONAR COMO SUBFORMULARIO..........8
UN INCISO MS PARA QUE PROFUNDICIS!........................................................................."2
PLASMANDO LO ANTERIOR EN UN ACCESS..........................................................................."4
CREANDO UNA RELACIN DE MANERA AUTOMTICA................................................."#
RELACIN SI $AMOS A UTILI%AR SUBFORMULARIOS..................................................."6
CREANDO & MODIFICANDO LAS RELACIONES DE MANERA MANUAL......................"8
ESTABLECIENDO LA RELACIN A TRA$S DE FORMULARIO'SUBFORMULARIO. . .2"
OBTENCIN DE LA INFORMACIN INTRODUCIDA...............................................................22
PARA COMPLEMENTAR ESTE ARTCULO.................................................................................24
PARA FINALI%AR ESTE ARTCULO.............................................................................................2#
1 La BD de ejemplo os la podis bajar aqu
1
Vistame en http://neckkito.siliconproject.com.ar
INTRODUCCIN
En mis andan!as por la "eb# he $isto bastantes consultas
que muestran un desconocimiento total de lo que es el
cora!%n# de &ccess: las tablas' su estructuraci%n ( la
)ijaci%n de relaciones.
El principal problema de esto es que' por ejemplo' es )*cil
+aunque puede ser trabajoso, cambiar el dise-o de un
)ormulario o de un in)orme' pero cambiar a posteriori la
estructura de tablas de nuestra BD ( sus relaciones'
m*.ime si (a tenemos montones de re/istros introducidos'
puede de$enir una misi%n imposible# so pena de dejar la
BD inoperati$a.
En este ejemplo os intentar e.plicar c%mo estructurar correctamente una BD ( c%mo crear las
relaciones' tanto manual como autom*ticamente. 0ero $amos a partir de unas premisas
b*sicas que' si acab*is de leer este artculo ( queris trabajar con $uestras BD1s' debis tener
siempre presentes:
2o ha( una sola manera de hacer las cosas: es decir' que' se/3n la realidad a la que
nos en)rentemos#' habr* al/unas cosas que se pueden hacer o plasmar de otra )orma.
4on ello quiero decir que no coj*is este ejemplo como $erdad absoluta#. Lo importante
es entender los conceptos ( la sistem*tica.
4omo intentar ser lo m*s claro posible $o( a procurar utili!ar un len/uaje llano#' (
e$itar entrar en demasiados tecnicismos.
5s animo a no s%lo leer el ejemplo' sino a re)le.ionar ( a criticarlo: qui!* al/uien pueda
pensar en al/o# que sera mejor que lo que (o pueda haber ideado#. 4omo os deca'
no ha( una sola manera de hacer las cosas ( la que (o propon/o no tiene por que
siempre ser la mejor para $uestras circunstancias.
&unque tendr que recurrir a )ormularios la )inalidad del artculo es que entend*is la
estructura de las tablas. 0or ello utili!ar los )ormularios como meros instrumentos
necesarios# para la e.plicaci%n' pero no entrar en detalle en ellos.
6e basar en una interface, para las ilustraciones' de &ccess 7889' pero' como
hablamos de estructuraciones' lo e.plicado es per)ectamente aplicable a $ersiones
anteriores +( posteriores, de &ccess :con peque-as $ariaciones que no a)ectan a los
contenidos del artculo:.
;inalmente $amos a intentar estructurar una BD con los elementos mnimos para un pro/rama
de )acturaci%n. <in embar/o' insisto en que para lo que $a(a a ser$ir la BD es lo de menos: lo
importante es que $e*is c%mo la $o( constru(endo ( los ra!onamientos de por qu ha/o una
cosa u otra.
0or )a$or' que nadie piense que $o( a e.plicar c%mo reali!ar un pro/rama de )acturaci%n +sera
como para escribir un libro,. <%lo $o( a sentar las bases para que entend*is lo que es
estructurar una BD ( las relaciones entre tablas.
= dicho esto $amos a ponernos manos a la obra.
7
Vistame en http://neckkito.siliconproject.com.ar
UNAS IDEAS INICIALES
4omo siempre di/o' antes de arrancar &ccess debemos
sentarnos a pensar# en qu $amos a necesitar. =o $o( a
haceros ese planteamiento utili!ando un E.cel
;ijemos' antes de re)le.ionar sobre lo que ser* nuestra
tabla' unas ideas importantes que nos a(udaran a
con)i/urar %ptimamente la estructura ( las relaciones:
1.- TENEMOS QUE ESCRIBIR LO MENOS POSIBLE
>0or qu? 0or dos moti$os principales: el primero' para no cansarnos@ el se/undo' para e$itar
errores.
0or ejemplo' si en un hipottico campo llamado A0ro$inciaB tenemos que escribir' en cada
re/istro' el nombre de la pro$incia' e$identemente:
: 2os $amos a cansar de escribir pro$incias
: Cn usuario puede escribir' por ejemplo' Islas Baleares' ( otro puede escribir s%lo Baleares' o
Andaluca' ( otro Andalucia +sin acento /r*)ico,. 4omo os podis ima/inar' estas di)erencias
a)ectan a la homo/eneidad de los datos' lo cual implica que nuestros )iltros ( consultas $an a
)uncionar mal' arroj*ndonos in)ormaci%n no e.acta +porque' para &ccess' una cosa es
Andaluca ( otra Andalucia,.
2.- TENEMOS, SIEMPRE QUE PODAMOS, AADIR UN CAMPO [Id] AUTONUMRICO
PARA IDENTIFICAR EL REGISTRO
0uede ser que' inicialmente' no le $eamos nin/3n tipo de utilidad al hecho de tener un ADdB
autonumrico' pero ese ADdB cumple unas )unciones primordiales:
: Es un $alor numrico +m*s adelante e.plicar por qu eso es importante,
: Es un identi)icador inequ$oco del re/istro: e.iste ese ( s%lo este con ese n3mero' ( es
imposible que se pueda duplicar. 4uando' por los moti$os que sean' queramos re)erirnos a ese
re/istro' podremos utili!ar ese identi)icador sin miedo a que se nos con)undan# los re/istros.
: Es totalmente necesario para poder establecer relaciones de tipo 1:2. 6*s adelante e.plicar
qu es esto de relaciones 1:2
3.- TENEMOS, SIEMPRE QUE PODAMOS, QUE RECURRIR A CAMPOS TIPO NMERO!
E$identemente' ha( campos como A2ombreB' A6ateriaB' etc. que' per se' son de tipo te.to'
pero como probablemente lle$ar*n aparejados' en la tabla o tablas en la/s que estn ubicados'
un ADdB autonumrico' lo que haremos para almacenarlos ( trabajar con ellos ser* almacenar
ese ADdB ( no el $alor en s mismo +sal$o en las tablas ori/inales#,. Eui!* esto pueda ahora
resultar con)uso pero a lo lar/o del artculo lo iremos des/ranando ( $eremos c%mo lo
entendemos sin problemas.
>= por qu $alores numricos? B*sicamente por las si/uientes ra!ones:
: 5cupan menos espacio
: <on m*s )*ciles de manipular a la hora de crear consultas
: <on m*s )*ciles de manipular +( $ers*tiles, en c%di/o VB&
: E$itan errores que qui!* s se podran producir si )ueran' por ejemplo' cadenas de te.to.
En cuanto al primer punto' creo que se puede entender per)ectamente: no es lo mismo
almacenar un campo cu(o $alor pueda ser: el peligro potencial de esta valoracin puede ser
F
Vistame en http://neckkito.siliconproject.com.ar
altamente elevado debido a la toxicidad del producto' ( tener que re)erirse al mismo cada $e!
con el mismo te.to' que saber que su identi)icador es el F ( trabajar con un F.
<i queremos manipular ese $alor en consultas es m*s )*cil'
por ejemplo' )iltrar por al/o tan simple como GF que tener
que )iltrar por LDHE 1Ito.icidadI1#
;inalmente' si al/3n usuario quiere )iltrar por to.icidad# ('
por los moti$os que sean' cree que esa palabra se escribe
to.isidad#' pues di)cilmente $a a encontrar el re/istro. Eso
es m*s san/rante en BD1s de temas especiali!ados' como
por ejemplo una BD para controlar temas de dia/n%sticos
mdicos... 4reo que me entendis.
= ahora $iene la e.cepci%n que con)irma la re/la: en cuanto a la in)ormaci%n que captemos de
lo que podemos llamar tablas au.iliares#' si queremos' no hace )alta que seamos tan
estrictos#. Esto lo $eremos en el pr%.imo apartado.
Jened siempre en el coco# estas tres premisas a la hora de estructurar una tabla: puede
representar una /ran di)erencia de trabajo a )uturo# tanto en cantidad como en e$itaci%n de
errores.
PLANTEAMIENTO DE LAS PRIMERAS TABLAS
<i/amos con nuestra BD. Las )acturas se hacen a unos clientes. Vamos pues a necesitar una
tabla que nos recoja los datos de los clientes. 0or ejemplo' estos seran al/unos de los datos
que podramos necesitar.
&nalicemos un momento los campos:
: A4odi/o4lienteB: >puede haber dos clientes con el mismo c%di/o? La respuesta es no' lo que
implica que este campo $a a ser nuestro ADdB del re/istro' pero con otro nombre.
E$identemente le asi/naremos' como tipo de datos' un tipo autonumrico.
: AD2D/2D;B: >nos identi)ica inequ$ocamente el re/istro? 0ues s' dado que no puede haber
dos o m*s clientes con el mismo 4D; o D2D. Eso si/ni)ica que podemos con)i/urarlo como un
campo Dnde.ado <in Duplicados#. >Eu quiere decir eso? Eue ser* el propio &ccess que nos
a$isar* si repetimos al/3n $alor para este campo. 4omo este dato es al)anumrico pues
deber* ser un dato de tipo te.to. Lo anterior se con)i/ura al dise-ar la tabla' en sus
propiedades.
: A2ombreB: e$identemente cada cliente tendr* su nombre' con lo que este dato deber* ser de
tipo te.to.
: ADireccionB: el mismo ra!onamiento que para A2ombreB. 4omo sabis' un campo de te.to
est* limitado a 7KK caracteres. 0or este moti$o' ( en el ejemplo que acompa-a al artculo' este
campo lo he de)inido como de tipo 6emo.
L
Vistame en http://neckkito.siliconproject.com.ar
Veamos ahora los tres campos que nos quedan. Dma/inemos que $amos a dar de alta tres
clientes:
El campo del D2D/2D;' el 2ombre ( la Direcci%n' en cada
re/istro' ser* di)erente' por lo que no nos queda otro
remedio que escribirlos cada $e!. <in embar/o' si todos
est*n en la misma poblaci%n ( en la misma pro$incia' (
encima con el c%di/o postal idntico' $amos a tener que
escribir tres $eces la misma in)ormaci%n. Esto contra$iene
nuestra re/la 1.
>Eu hacemos entonces? 4rearnos otra tabla para tener que escribir una sola $e! la
in)ormaci%n del c%di/o postal. =' al mismo tiempo' buscar un campo de relaci%n entre ambas
tablas' que puede ser' per)ectamente' el propio A40B.
Es decir' que el paso tras di$idir nuestra tabla sera:
&pro$echo para haceros notar dos detalles:
: El campo AD2D/2D;B ahora lo he llamado ADni2i)B. Eso es as para e$itar la escritura de
caracteres especiales' como la barra +/,' e.tensible a otros caracteres como +M,' +N,' +1,' +O,'
etc.
Los moti$os son $arios: estos caracteres e.tra-os# pueden causar un )uncionamiento an%malo
en &ccess' o bien son caracteres reser$ados' o bien son caracteres reser$ados de VB&' (' en el
momento de pro/ramar' pueden dar problemas.
: Pe eliminado los acentos de los campos: lo ha/o as porque' b*sicamente' al pro/ramar VB&
parto siempre de la premisa de que no e.isten palabras acentuadas en lo que es la estructura
de nombres ( elementos de la BD +no cuento aqu los $alores introducidos en los re/istros' ( s
uso acentos en los comentarios al c%di/o,. &s e$ito problemas ( resultados inesperados' dado
que' para &ccess ( VB&' Direccin no es lo mismo que Direccion.
: =' como caso anecd%tico' os dir que tampoco utili!o la letra e-e +-, :siempre hablando de
elementos de estructura' no de $alores de re/istros:. Ello es as porque si se utili!a un teclado
no espa-ol' sencillamente' la letra -# no e.iste... ( as es di)cil escribirla +ha( que recurrir a
&scii... un poco rollo#,' je' je...
4entrmonos ahora en nuestra )utura tabla J4od0ostal: >$emos al/uno de los campos que
tendramos que escribir de manera repetiti$a? <i lo $emos ( hemos dicho que el campo
A0ro$inciaB es ese campo repetiti$o' pues... QenhorabuenaR Vamos a reali!ar unos cambios en
nuestra estructura:
K
Vistame en http://neckkito.siliconproject.com.ar
Q4arambaR &hora tenemos nuestro campo A0ro$inciaB
relacionado con el resto de tablas' pero no por l mismo'
sino por su identi)icador +re/la 7,.
4omo os comentaba antes' las tablas J4od0ostal ( J0ro$incias son lo que (o considerara
tablas au.iliares#. En el caso de J4od0ostal no he creado nin/3n ADdB ( ha/o la relaci%n
directamente por el 40@ en el caso de J0ro$incias s he utili!ado un campo ADdB.
CONTINUAMOS CON LA ADICIN DE LA TABLA PRINCIPAL
DE FACTURAS
& nuestro esquema anterior $amos a a-adirle una tabla principal de )acturas. <upon/amos que
$amos a necesitar estos campos para dicha tabla:
&nalicemos esta tabla:
: ADd;raB: >0or qu introdu!co este campo? 4omo (a os he comentado' un Dd autonumrico
nos sir$e para identi)icar inequ$ocamente un re/istro. &dem*s de lo e.plicado' eso si/ni)ica
que si borramos al/3n re/istro a nin/3n otro re/istro se le $a a asi/nar el autonumrico
borrado. Es decir' que la identi)icaci%n inequ$oca del re/istro se mantiene hasta despus de
haber borrado el re/istro.
>2os es 3til el comportamiento anterior? 0or supuesto que nos es 3til' pero' en este caso' la
utilidad choca# con la realidad' dado que la le/islaci%n no nos permite tener a/ujeros# en la
numeraci%n de las )acturas. Es por ese moti$o por lo que me $eo obli/ado a a-adir un nue$o
campo llamado A2um;raB' que nos permitir* a-adir un n3mero de )actura que (a e.ista pero
que' por los moti$os que sean' se ha borrado pre$iamente +si se produce el supuesto' claro,.
: <obre el campo A;echa;raB no ha( nada que decir.
: A4lienteB: >qu $alor almacenar* este campo? E$identemente' almacenar el nombre del
cliente sera ir contra la re/la F. El $alor m*s adecuado sera almacenar el c%di/o del cliente'
dado que es un $alor numrico.
= ahora' el /ran momento de tomar una decisi%n: la teora pura ( dura# nos dice que
debemos almacenar los menores datos posibles' ( que los c*lculos los realicemos a tra$s de
consultas o )unciones.
S
Vistame en http://neckkito.siliconproject.com.ar
Es decir' que si (o almaceno el campo ABaseDmpB e ADmptoB no tendra que almacenar el campo
AJotal;raB' puesto que en una consulta podra crear un campo calculado que hiciera
AJotal;raBTABaseDmpB I ADmptoB.
=' m*s all*' ni siquiera necesitara almacenar el campo
ABaseDmpB' pues lo podra sacar de las lneas del detalle de
la )actura +que $eremos m*s adelante,.
<in embar/o' $amos a suponer lo si/uiente:
a. Vendo un solo producto que cuesta 188 +descartemos los
impuestos,
b. El 81/81/81 ha/o la )actura n3mero 1 por una $enta. 6is campos calculados har*n
GJotal;raT 1 I 188 T 188U
c. El 81/8S/81 mi producto pasa a costar 118. &ctuali!o el nue$o precio en la tabla
correspondiente.
d. >Eu pasar* cuando quiera sacar una copia de la )actura n3mero 1? Eue mi campo
calculado har* GJotal;raT 1 I 118 T 118U
En de)initi$a' que con este sistema estamos perdiendo# la in)ormaci%n hist%rica.
6oraleja: si no nos importa la in)ormaci%n hist%rica si/amos la teora pura ( dura# (
almacenemos los mnimos campos posibles@ si nos importa la in)ormaci%n hist%rica no
tendremos otro remedio que /uardarla en sus respecti$os re/istros.
>2ecesitaramos al/una tabla au.iliar en este caso? 0ues... >qu opin*is? >Eu tal una tabla
au.iliar para tener que escribir manualmente' ( s%lo una $e!' el $alor del impuesto?
2uestro esquema de tablas de )actura nos quedara as' inicialmente:
= ahora s podemos poner en relaci%n nuestros dos bloques# de tablas' as:
9
Vistame en http://neckkito.siliconproject.com.ar
ALGO SOBRE LA TIPOLOGA DE
RELACIONES
Pa lle/ado el momento de entender al/o sobre la tipolo/a
de relaciones' que e.plicar de manera mu( bre$e.
Jenemos tres tipos de relaciones:
1, Las relaciones 1:1 +uno a uno,
0or ejemplo' si al esquema anterior le tu$iramos que a-adir una
tabla con los datos de la <e/uridad <ocial de nuestros clientes
+>para qu demonios# querramos ese dato?, nos encontraramos
una relaci%n 1:1' porque
A 1 DniNif slo le puede corresponder 1 nmero de la Seguridad Social
7, Las relaciones 1:2 o 2:1 +uno a $arios / $arios a uno,
<on las relaciones m*s habituales' ( responden a la idea de:
1 slo cliente puede tener varias facturas
5 tambin
1 sola provincia puede tener varias poblaciones con su respectivo cdigo postal
F, Las relaciones 2:2 +$arios a $arios,
Estas relaciones no se pueden manejar con &ccess +o' mejor dicho' &ccess no las maneja,. Eso
si/ni)ica que debemos ir di$idiendo esa relaci%n en una sucesi%n de relaciones 1:2' o 2:1' o
1:1' a tra$s de una o $arias consultas.
>4uando sabemos que nos encontramos ante este tipo de relaci%n? 0ues una pista inequ$oca
es cuando' al intentar ejecutar una consulta' &ccess nos lan!a un mensaje que dice m*s o
menos: La consulta no puede ejecutarse por haber relaciones ambi/uas entre las tablas#.
El de)inir una relaci%n correctamente nos permite preser$ar la inte/ridad de los datos como
base' (' en la propia de)inici%n de la relaci%n' podemos )or!ar:
: La actuali!aci%n de campos en cascada
: La eliminaci%n de campos en cascada
Lo $eremos m*s adelante cuando plasmemos lo que lle$amos e.plicado +( lo que
e.plicaremos, en un &ccess.
AADAMOS UNA TABLA QUE HAREMOS FUNCIONAR COMO
SUBFORMULARIO
>4%mo saber si necesitamos un )ormulario con sub)ormulario o no? 0ues ima/inemos que
$amos a escribir una )actura sobre papel' a mano. 5btendramos un esquema parecido a este:
V
Vistame en http://neckkito.siliconproject.com.ar
4omo $emos' nosotros estaramos creando un cuadro dentro de un cuadro /eneral. El cuadro
/eneral sera la base de los datos mnimos indispensables para la )actura@ el subcuadro nos
dara el detalle de artculos que se $enden +o ser$icios que se prestan,. <i nuestro esquema
manual# lle$a ese subcuadro' nuestro )ormulario debe lle$ar sub)ormulario +debe# es
demasiado e.clusi$o: recordad que puede haber otras necesidades que nos lle$en a utili!ar
otro sistema de )ormularios' como os comentaba al principio,.
>= qu tipo de relaci%n estableceramos entre cuadro/subcuadro' o )ormulario/sub)ormulario?
0ues pensadlo un momento: en una )actura' >se pueden $ender $arios artculos? <i la
respuesta es s estamos ante una relaci%n 1:2.
En realidad la relaci%n sera entre tablas +no entre )ormularios,' pero si a ni$el $isual# nos $a
mejor ima/inar la relaci%n' >por qu no hacerlo?
4omo me interesa que esto quede mu( claro os pon/o otro ejemplo. Dma/inemos un
trabajador que $a reali!ando di)erentes tareas durante el da. >2ecesitaramos utili!ar una
estructura de )ormulario/sub)ormulario?
0ues si hemos co/ido papel ( l*pi! ( hemos dibujado el esquema si/uiente' nuestro propio
esquema nos dir* si lo necesitamos o no. 0or ejemplo' (o hubiera dibujado:
W
Vistame en http://neckkito.siliconproject.com.ar
=' e$identemente' lo anterior nos muestra que un trabajador puede realiar varios trabajos' lo
que nos sit3a en una relaci%n 1:2
<i/amos con nuestra )actura: $amos a crearnos una tabla que nos recoja el detalle de la
)actura@ por ejemplo:
Veamos...
: Xe/la n3mero 7: a-adamos un ADdB autonumrico para identi)icar el re/istro. Esto es lo que
hace el campo ADdDetallB
: >4%mo relacionamos una tabla con la otra? 0ues debemos decir a qu )actura corresponde
cada lnea de detalle. Esto es lo que hace ADdDetall;raB. &dem*s' como tenemos un campo que
es ADd;raB en J;acturas' (a tenemos un numrico con qu relacionarlo.
>2o podramos relacionarlo por el campo A2um;raB? E$identemente s podramos relacionarlo'
pero...
"#$ %&"#'()*&$ $+") $& ,-&d&* &$.#/"&'&% &*.%& '#0,)$ d&" 0($0) .(,)
Es decir' (o no puedo relacionar un campo numrico con un campo tipo te.to +el autonumrico
es considerado un campo numrico,. &ccess no me dejar* establecer la relaci%n.
0ara e$itar la e$entualidad de que el campo A2um;raB pueda ser de te.to +por querer un
)ormato' para nuestro n3mero de )actura' por ejemplo como !A"#$$$, ( que no podamos
establecer la relaci%n recurrimos directamente a nuestro ADdB.
0arece ser que la utilidad de tener un campo ADdB autonumrico est* empe!ando a ser
palpable' >$erdad?
18
Vistame en http://neckkito.siliconproject.com.ar
: De nue$o nos encontramos aqu con la dicotoma que
hemos comentado en un ep/ra)e anterior. <i se/uimos la
teora pura ( dura# no necesitaramos a-adir el campo
A0recioCB ni el ADmporteB' dado que podramos calcularlo a
tra$s de A4antidadB I A0recioCB +ahora $eremos de d%nde
sacaremos el campo A0recioCB,. <in embar/o' como hemos
acordado que nos interesa mantener un hist%rico de datos
no tenemos otro remedio que /uardar esa in)ormaci%n en
sus respecti$os campos.
<in embar/o' re)le.ionemos un momento: si /uardamos
A4antidadB ( A0recioCB +con datos hist%ricos,' >realmente
necesitamos el campo ADmporteB? >Eu opin*is?
=o opino que si una )%rmula se aplica sobre precios hist%ricos el resultado que nos de$ol$er*
ser* un importe tambin hist%rico' por lo que' e)ecti$amente' $amos a eliminar el campo
ADmporteB. 2uestra tabla quedara as:
0ero como diran los %oone& 'unes: no se $a(an toda$a... Qa3n ha( m*sR#
0ensemos en nuestra re/la n3mero 1: >realmente necesitamos escribir cada $e! el artculo con
su precio unitario? La $erdad es que con que lo escribamos una sola $e! bastara. Ello implica
que necesitamos una tabla casi au.iliar# que nos d la in)ormaci%n de los artculos que
$endemos. &s pues nos aparece otra tabla:
Cna $e! m*s he a-adido un campo ADd&rtB' autonumrico' por el mismo moti$o que os
e.plicaba en la )actura: para pre$enir la e$entualidad de que el A4od&rtB no sea un c%di/o de
artculo numrico' sino que sea al)anumrico' lo que me impedira establecer la relaci%n.
4on estas nue$as premisas nuestra tabla JDetalle;ra debe cambiar li/eramente su estructura'
as:
Xecordad que no he quitado el campo A0recioCB' a pesar de estar en ambas tablas' por el
problema# de /uardar la in)ormaci%n hist%rica.
>= las relaciones? 0ues la relaci%n es 1:2' dado que un artculo puede estar en varias lneas de
detalle +ojo' no pensemos ahora en una sola )actura' sino que debemos pensar en muchas
11
Vistame en http://neckkito.siliconproject.com.ar
)acturas' porque lo que estamos anali!ando# son dos 3nicas tablas' J&rticulos ( JDetalle;ra'
independientemente de J;acturas,.
Jracemos la primera relaci%n:
Jracemos la se/unda relaci%n:
= ahora $eamos todo en su conjunto:
UN INCISO MS PARA QUE PROFUNDIC!IS"
Dma/inemos que queremos tener una lista de contactos de nuestras empresas clientes. 4omo
siempre' $amos a re)le.ionar un poco antes de tomar decisiones#.
El contacto de la empresa Y ser* su director' el se-or 0opo.
2in/3n problema.
El se-or 0opo nos dice que' para temas de pedidos' no contactemos con l' sino con la se-ora
Jata
Dos contactos para la misma empresa. 2in/3n problema
La se-ora Jata nos dice que para temas de cobros debemos contactar con el se-or 4ash.
Jres contactos. 2in/3n problema.
17
Vistame en http://neckkito.siliconproject.com.ar
Vamos a $er c%mo sera nuestra tabla:
>;*cil' $erdad?
0ero a los tres meses de operati$a el se-or 4ash nos dice que para )acturas superiores a F.888
euros debemos hablar con el se-or ;inan!as.
QVa(aR Jendremos que a-adir $arios campos m*s a la tabla +A2om4ontLB ( si/uientes,.
& los seis meses de operati$a la se-ora Jata nos dice que los pedidos del pro(ecto boom# los
lle$a el se-or Dnno$aci%n.
>&-adimos m*s campos a la tabla? La $erdad es que esto empie!a a ser una pesadilla de
tabla.
>= si' para pre$enirnos de esta e$entualidad' cambiamos nuestro esquema de pensamiento#?
>= si utili!amos un esquema que creo que nos recordar* a al/o? Cna cosa as como:
De esta manera no debemos preocuparnos por si la empresa tiene uno o cien contactos' dado
que con unos pocos campos podremos reco/er toda esa in)ormaci%n.
Xeha/amos nuestra tabla:
1F
Vistame en http://neckkito.siliconproject.com.ar
4omo siempre' incluimos nuestro ADdB' representado por
ADd4ontactoB' m*s el campo que nos relaciona ambas
tablas' ADd4ont4liB' m*s los datos que necesitemos.
Cna $e! relacionadas tendremos:
=' como $isi%n /eneral:
PLASMANDO LO ANTERIOR EN UN ACCESS
Vamos a ir creando nuestro &ccess con todo lo anterior. Empe!aremos por lo sencillo' es decir'
por las tablas au.iliares que nutren de in)ormaci%n a las restantes ( que no se nutren de
nin/una otra.
4reamos' en primer lu/ar' por ejemplo' la tabla JDmpuesto' as:
0odramos darle )ormato ( podramos )ijar un $alor predeterminado. Esto (a son adaptaciones
a nuestras necesidades#. = esto lo podramos aplicar a todo lo que si/ue' aunque (o ir a lo
simple# para no hacer este artculo eterno.
4reemos nuestra tabla J0ro$incias' as:
1L
Vistame en http://neckkito.siliconproject.com.ar
4reamos nuestra tabla J&rticulos' as:
CREANDO UNA RELACIN DE MANERA AUTOMTICA
&l/uien pensar*: si las relaciones entre tablas se basan en $alores numricos' >c%mo $o( a
saber (o de memoria todos los identi)icadores ( a qu corresponden?
E$identemente lo anterior sera cosa de locos#. 0ero para ello tenemos nuestro ami/o &ccess'
que lo tiene todo pre$isto' ( nos )acilita el trabajo de introducci%n de datos' adem*s de
crearnos una relaci%n autom*tica +eso s' sin de)inir :m*s adelante $eremos como de)inirlas:,.
Vamos a crearnos la tabla JDetalle;ra' as:
<itumonos en el tipo de datos del campo ADd&rticuloB' ( seleccionemos' como tipo de datos' el
&sistente para b3squedas#. >0or qu? 0orque los datos del artculo los tenemos /uardados en
J&rticulos' ( de ah $amos a esco/er lo que necesitemos.
2os saldr* el asistente' ( lo con)i/uramos as:
Deseo que busque los datos en una tabla
<eleccionamos la tabla J&rticulos
<eleccionamos el campo A4od&rtB ( ADescrB' por ejemplo.
5rdenamos se/3n nuestras necesidades
Xedimensionamos se/3n nuestras necesidades. <i la cla$e principal nos aportara al/una
in)ormaci%n 3til +como usuarios de la BD, desmarcaramos el check de 5cultar la
columna cla$e#. En este caso s la ocultamos.
Dejamos la etiqueta por de)ecto ( )inali!amos
>Vemos que nos aparece un lindo# mensaje? <i aceptamos' e)ecti$amente' se nos crear*n las
relaciones.
>Eu hemos conse/uido con lo anterior? 0ues que' a la hora de seleccionar un artculo' nos
importe poco el identi)icador del artculo' dado que la in)ormaci%n que nos aparecer* en
pantalla ser* la que hemos indicado' esto es' el c%di/o del artculo ( su descripci%n.
Visualmente sera:
1K
Vistame en http://neckkito.siliconproject.com.ar
<in embar/o' tened en cuenta que el $alor que se /uardar*
en el campo ADd&rticuloB ser* el identi)icador del artculo' no
su c%di/o ni su descripci%n.
RELACIN SI VAMOS A UTILIZAR SUBFORMULARIOS
<i $amos a utili!ar sub)ormularios' como es el caso de J;acturas/JDetalle;ra' no necesitamos
reali!ar' a priori' nin/una relaci%n. >0or qu? 0orque estableceremos dicha relaci%n en el
momento de dise-ar el )ormulario con su sub)ormulario.
En nuestro caso' >cu*les son los campos que unen ambas tablas? 0ues son ADdDetall;raB:
ADd;raB. En conclusi%n' para nin/uno de estos campos debemos utili!ar el asistente de tipos de
datos +insisto' si $amos utili!ar el sistema de sub)ormulariosR,.
Veamos c%mo enla!ar lo anterior con la estructura de la BD.
4reemos la tabla J;acturas' as:
Veamos...
ADd;raB 4omo hemos dicho que era el campo de relaci%n con ADdDetall;raB no hacemos nada.
A4od4li;raB &l i/ual que hemos hecho con los artculos' este campo nos debera mostrar qu
clientes tenemos para seleccionar uno. >Eu problema ha(? Eue a3n no tenemos J4lientes
creado' por lo que nos tomamos nota# para arre/lar este campo despus.
ADmptoB la tabla JDmpuesto (a la tenemos creada' por lo que s podemos utili!ar (a el
asistente para b3squedas. <eleccionamos como tipo de datos &sistente para b3squedas# (
se/uimos los pasos. 4omo JDmpuesto s%lo tiene un campo no tendremos ahora el dilema de si
ocultar o no la cla$e principal. = se nos crea autom*ticamente una relaci%n.
=' al i/ual que en los artculos' ahora este campo nos permitir* seleccionar el tipo impositi$o
que necesitemos +si es que ha( m*s de uno,' as:
1S
Vistame en http://neckkito.siliconproject.com.ar
5H. 4remonos la tabla J4lientes' as:
&3n no tenemos la tabla J4od0ostal creada' por lo que a3n no podemos ejecutar el asistente
para b3squedas. <in embar/o' s podemos $ol$er a abrir J;acturas en $ista dise-o ( establecer
la relaci%n autom*tica para el campo A4od4li;raB. La con)i/uraci%n del asistente sera:
Deseo buscar los $alores en una tabla
<eleccionamos J4lientes
<eleccionamos los campos ADni2i)B ( A2ombreB
5rdenamos a nuestro /usto
En este caso la cla$e principal' A4odi/o4lienteB' si nos podra ser 3til' por lo que
desmarcamos el check de ocultar la cla$e principal. Xedimensionamos a nuestro /usto.
&hora se nos pide' de los tres campos que $amos a $er' cu*l contiene el $alor que
queremos /uardar. 4omo hemos establecido que /uardaramos el c%di/o de cliente
seleccionamos A4odi/o4lienteB
Dejamos la etiqueta por de)ecto ( )inali!amos.
4on esto' el e)ecto $isual sera:
4reo que la mec*nica est* quedando clara. Vamos a crearnos el resto de tablas.
La tabla J4od0ostal:
El campo ADd400ro$B lo hemos creado utili!ando el tipo de datos &sistente para b3squedas#'
dado que (a tenamos creada nuestra tabla J0ro$incias. <u con)i/uraci%n no tiene nin/3n
secreto.
=' como $eis' el campo A40B es un campo tipo te.to. 4on esto os he querido mostrar que
tambin podemos relacionar por campos no numricos +aunque' si podemos' debemos
19
Vistame en http://neckkito.siliconproject.com.ar
e$itarlo,. Lo importante es que si A40B es tipo te.to en J4od0ostal tambin debe ser tipo te.to
en J4lientes.
= (a que hablamos del tema' situamos J4lientes en $ista
dise-o ( utili!amos el tipo de campo &sistente para
b3squedas# para crear la relaci%n autom*tica entre ambas
tablas +os dejo a $uestro criterio la con)i/uraci%n del
asistente,.
Vamos a crearnos la tabla J4ontactos' as:
4omo $amos a utili!ar la sistem*tica ;ormulario/<ub)ormulario no $amos a reali!ar nin/una
acci%n sobre ADd4ont4liB' dado que' como (a hemos comentado' la relaci%n la estableceremos
al crear el )ormulario.
CREANDO Y MODIFICANDO LAS RELACIONES DE MANERA MANUAL
&ccess tiene una opci%n de men3 o de cinta de opciones para abrir lo que se denomina
Ventana de relaciones#.
La $entana de relaciones nos permite $er la estructura de las tablas ( sus relaciones' (' a la
$e!' qu tipo de relaci%n se ha establecido entre ellas.
<i habis recreado el ejemplo del artculo hasta aqu' si abrs esa $entana' nos encontraremos
con esto:
4omo lo anterior es un poco ca%tico $amos a reor/ani!arlas para que nos quede m*s le/ible.
1V
Vistame en http://neckkito.siliconproject.com.ar
Dnmediatamente nos damos cuenta de $arias cosas +Qsuerte que hemos plani)icado antesR,:
: 2o aparece la tabla J4ontactos
: Pa( tablas en las que )alta relaci%n
: 2o tenemos de)inidos los tipos de relaci%n.
0ara arre/lar el primer punto basta con buscar la opci%n de 6ostrar tabla# +o clic derecho
sobre la $entana de relaciones, ( seleccionar J4ontactos.
0ara las tablas que no tienen relaci%n (a sabemos que lo bamos a hacer a tra$s de la
estructura )ormulario/sub)ormulario. <in embar/o' (a que lo tenemos delante' $amos a
establecer ( de)inir la relaci%n de manera manual.
0ara ello co/emos' por ejemplo' el campo ADdDetall;raB de JDetalle;ra ( lo arrastramos# sobre
el campo ADd;raB de J;acturas.
Vamos a modi)icar la relaci%n. En la $entana que nos aparece (a nos indica que el tipo de
relaci%n es 1:2. 0ara preser$ar la inte/ridad de los datos $amos a e.i/ir inte/ridad re)erencial
+marcando el check correspondiente,.
Jras hacer lo anterior podemos $er que la $entana de relaciones s nos muestra la relaci%n ( s
nos muestra el tipo de relaci%n +a tra$s del 1# ( del smbolo de in)inito Z#,:
1W
Vistame en http://neckkito.siliconproject.com.ar
>Eu si/ni)ica &ctuali!ar en cascada los campos relacionados#? 0ues simplemente si/ni)ica
que si cambiamos el $alor en el lado 1# de la relaci%n +por ejemplo' de &ntonio# pasamos a
Joni#, en el lado Z# todos los $alores que pudiramos tener con &ntonio# ahora se
mostrar*n como Joni#.
>= cu*ndo lo marco? 0ues si queris conser$ar in)ormaci%n hist%rica no lo marquis. &s'
tendris los re/istros con &ntonio# hasta la )echa en la que actuali!asteis el nombre a Joni#' a
partir de la cual (a os aparecer* Joni#.
La misma mec*nica puede aplicarse a Eliminar en cascada los campos relacionados#. <i la
marcamos todos los campos relacionados en la otra tabla ser*n eliminados.
<i $ais a hacerlo as' como consejo' os recomiendo hacer una copia de $uestra BD. &s' por si
acaso' tendris un antes# ( un despus#... je' je...
Vamos a crear la relaci%n entre J4ontactos ( J4lientes a tra$s de los campos A4odi/o4lienteB
( ADd4ont4liB' de i/ual manera que lo hemos hecho anteriormente.
= si ahora nos situamos +con buen pulso, sobre cualquiera de las lneas de relaci%n +por
ejemplo' la lnea que une J&rticulos ( JDetalle;ra,' ( hacemos clic +se nos debe poner la lnea
un poco m*s /ruesa,' ( hacemos de nue$o clic derecho del bot%n' $amos a seleccionar la
opci%n 6odi)icar relaci%n...# del men3 emer/ente.
Veremos as que se nos abre la conocida $entana de modi)icaci%n de relaciones. 6arcamos el
check de E.i/ir inte/ridad re)erencial#. =a tenemos de)inido correctamente el tipo de relaci%n.
= hacemos lo mismo con las relaciones que nos aparecen indeterminadas. 2uestra $entana de
relaciones ahora nos mostrar* lo si/uiente:
78
Vistame en http://neckkito.siliconproject.com.ar
ESTABLECIENDO LA RELACIN A TRAVS DE
FORMULARIO/SUBFORMULARIO
Vamos a crearnos un )ormulario continuo sobre la tabla J4ontactos +)ormulario de $arios
elementos,. 4omo lo $amos a utili!ar como sub)ormulario lo /uardaremos con el nombre de
sub;rm4ontactos ( le damos al/o de dise-o para tal menester. & m me ha quedado as:
&hora creamos un )ormulario sobre J4lientes. 0ero como no nos interesan todos los campos
$amos a crearlo utili!ando el asistente' que con)i/uraremos as:
<eleccionamos la tabla J4lientes. <eleccionamos los campos A4odi/o4lienteB' ADni2i)B (
A2ombreB.
&plicamos la distribuci%n que queramos
&plicamos el estilo que queramos
4omo ttulo escribimos ;4lientes' ( marcamos la opci%n de 6odi)icar el dise-o del
)ormulario#.
&-adimos el control sub)ormulario a ;4lientes. 4uando nos apare!ca el asistente lo
con)i/uramos as:
Csar un )ormulario e.istente' ( seleccionamos sub;rm4ontactos.
<i hemos hecho bien las relaciones en la $entana de relaciones la opci%n por de)ecto de
la lista que se muestra por de)ecto debera ser la $*lida. <in embar/o' $amos a suponer
que no hubiramos de)inido anteriormente la relaci%n. Vamos a de)inirla ahora. 0ara
ello:
6arcamos el check de De)inir la ma propia#
4ampos del )ormulario <eleccionamos A4odi/o4lienteB
4ampos del sub)ormulario <eleccionamos ADd4ont4liB
Dejamos el nombre que sale por de)ecto ( )inali!amos
71
Vistame en http://neckkito.siliconproject.com.ar
<i tu$iramos datos $eramos como el campo ADd4ont4liB autom*ticamente (a nos aparece
in)ormado con el $alor que ha( en el campo A4odi/o4lienteB
OBTENCIN DE LA INFORMACIN INTRODUCIDA
L%/icamente' la pre/unta del mill%n es: >( c%mo obten/o la in)ormaci%n que (o quiero? = la
respuesta simplemente es: a tra$s de las consultas.
Cn ejemplo simple: queremos $er las )acturas de nuestros clientes. 0ues la consulta sera' por
ejemplo:
0ero /racias a nuestras relaciones podemos ir un poco m*s all*: s%lo tenemos que poner en
relaci%n las tablas que queremos. = ese al/o# que las pone en relaci%n son las propias tablas
que se $an uniendo /racias a nuestras relaciones.
0or ejemplo' supon/amos que queremos saber los totales de )acturaci%n por pro$incia.
Los e.tremos# de nuestra inquietud son J;acturas ( J0ro$incias. Pa/amos el recorrido desde
una hacia otra' si/uiendo las lneas de relaci%n:
J;acturas J4lientes J4od0ostal J0ro$incias
0ues (a tenemos la estructura de nuestra consulta' que sera:
77
Vistame en http://neckkito.siliconproject.com.ar
4reo que la mec*nica de e.tracci%n# de datos se entiende per)ectamente' >$erdad? +espero
que me di/*is que s' porque si no...,.
4omo tercer ( 3ltimo ejemplo' pensemos en la pre/unta: >4u*nto he $endido del artculo Y
+tanto en cantidad )sica como en importe,?
0ues nada... a preparar una consultilla# se ha dicho.
Q5joR ;ijaos que he co/ido el campo A0recioCB de JDetalle;ra ( no ADmporteCB de J&rticulos. =
lo he hecho as porque A0recioCB /uarda la in)ormaci%n hist%rica. <i ADmporteCB se hubiera
actuali!ado ( hubiera usado ese campo en la consulta e$identemente la multiplicaci%n me
dara las unidades )sicas pero los importes con precio actuali!ado.
La anterior consulta nos da todo el detalle de $entas de los artculos. 4on un par*metro de
)iltro podramos seleccionar un artculo en cuesti%n. Es decir' as:
7F
Vistame en http://neckkito.siliconproject.com.ar
= si queremos $er directamente los totales nos creamos una consulta sobre esta 3ltima
consulta ( la con$ertimos en consulta de totales.
PARA COMPLEMENTAR ESTE ARTCULO
4omo os comentaba' hacer una aplicaci%n de )acturaci%n +( e.plicarla, requerira
pr*cticamente escribir un libro' m*.ime porque se requieren conocimientos de pro/ramaci%n
para ello.
<in embar/o' ( dado que (a hemos hecho todo este trabajo# de estructuraci%n de la BD'
apro$echo para comentaros ( recomendaros unos ejemplos que pueden dar respuesta a
al/unas pre/untas e.istenciales# que nos estemos planteando en este momento.
Jened en cuenta que no son ejemplos directos#. Eso si/ni)ica que lo que se tiene que anali!ar
es la sistem*tica del ejemplo ( aplicarla a la situaci%n actual' modi)icando li/eramente los
c%di/os para adaptarlos a los nombres e.istentes ( sus di)erentes tipolo/as. &h $an:
Dma/inemos que damos de alta un cliente ( que' desa)ortunadamente' el c%di/o postal a3n
no est creado' ( lo mismo en el momento de dar de alta la pro$incia. 0ara esta situaci%n
podis echar un $ista!o a este ejemplo: http:///oo./l/qFidsV
Dma/inemos que queremos ele/ir un artculo ( que autom*ticamente nos apare!ca su
precio unitario. 0ues este ejemplo nos puede a(udar: http:///oo./l/tJunXp
Dma/inemos que introducimos hemos creado un control en un hipottico sub;rmDetalle;ra'
que nos calcula la cantidad por precio' e ima/inemos que tenemos un control que nos calcula
7L
Vistame en http://neckkito.siliconproject.com.ar
dichos totales a pie de sub)ormulario. >4%mo lle$arnos ese subtotal al campo ABaseDmpB del
)ormulario? 0ues aqu tenis una manera: http:///oo./l/72snVk
Dma/inemos que nuestro campo A2um;raB es numrico
+si )uera te.to... m*s complejo ( no ha( ejemplo,. >4%mo
podramos asi/nar el n3mero de )actura que si/ue? 0ues
ah lo tenis: http:///oo./l/lV7nW$
Dma/inemos que no lle$amos la numeraci%n de las
)acturas de manera autom*tica' sino que lo hacemos
manualmente. <iempre cabe la posibilidad de que nos
equi$oquemos al asi/nar un n3mero de )actura ( utili!ar un
n3mero (a e.istente. 0ues para controlar ese $alor
duplicado podramos usar: http:///oo./l/)&[DLs
=' en de)initi$a' os animo a curiosear# en la \eb para $er si encontr*is al/3n otro ejemplo que
os pueda ser 3til.
PARA FINALI#AR ESTE ARTCULO
Bueno... 0ienso que en este artculo se ha podido entender de )orma m*s o menos clara
+espero que m*s#, c%mo podemos estructurar correctamente una BD de la tem*tica que sea
/ui*ndonos por la sistem*tica que os he ido e.plicando' ( c%mo establecer relaciones
autom*ticas' a tra$s de )ormulario/sub)ormulario o de manera directa.
5s he dado al/unas re/las +tres' en concreto,' que espero os puedan a(udar a decir al/o as
como: QPe(R Esto contra$iene la re/la 7R# +siempre contando que puede haber e.cepciones,' (
que eso os permita optimi!ar la estructura de $uestra BD.
;inalmente' la e.tracci%n de la in)ormaci%n es un proceso mu( l%/ico si hemos hecho bien la
estructuraci%n de tablas ( relaciones.
Espero que todo lo anterior os sea de utilidad en $uestras aplicaciones.
Cn saludo' (...
QsuerteR
7K
Vistame en http://neckkito.siliconproject.com.ar

Anda mungkin juga menyukai