Professional Documents
Culture Documents
4.1- Introduccin.
El trmino base de datos es algo muy comn en nuestros das, y todos tenemos un idea
bsica de lo que es una base de datos, por lo menos a nivel abstracto.
Todas la caractersticas que hacen maravillosas a las bases de datos, no serviran de mucho
si los lenguajes de programacin no nos facilitarn las cosas. Hace unos aos apareci el
Clipper, el cual maravill a muchos programadores, profesionales y aficionados, de Dos.
Un poco ms tarde Windows acab por irrumpir en nuestros ordenadores, pero no trajo
consigo un buen lenguaje que gestionara bases de datos. Por eso muchos programadores
seguan generando sus aplicaciones en Dos.
Con todo esto quiero llegar a que si por un aspecto es conocido el Delphi, es por las bases
de datos siendo este uno de sus puntos ms fuertes est implementado en torno a la BDE,
que es el mismo motor de acceso a datos usado por Paradox y dBase for Windows. Adems,
Delphi trae drivers nativos para acceder a datos en tablas de Access y de FoxPro, as como
un servidor SQL (Interbase), para luego hacer la migracin a Cliente/Servidor sin cambios
en el programa. Instalando aparte el SQL Links tendremos acceso transparente a bases de
datos ORACLE, SYBASE, DB2, SQL SERVER e INFORMIX as como a cualquier origen
de datos ODBC.
Hasta la llegada de este lenguaje, Windows no tena un lenguaje que acabara de manejar
bases de datos con la simpleza del Clipper. El secreto del Delphi est en la sencillez. Delphi
ha puesto en nuestras manos una herramienta muy eficaz para trabajar y manejar las bases
de datos.
Los archivos son una parte fundamental de cualquier lenguaje de programacin, ya que
gracias a ellos podemos utilizar nuestro disco rgido para almacenar datos que despus
2
procesaremos en las aplicaciones. Hay dos tipos de archivos bien distinguidos: el de texto y
el binario. En esta oportunidad nos abocaremos a conocer el funcionamiento de los
primeros, que nos servirn para almacenar cualquier cosa que deseemos en forma de texto.
En Delphi podemos tratar ficheros tanto en Ascii como en binario. Los ficheros que vamos
a tratar son secunciales, ya que para almacenar datos en otras estructuras mejores, como
estructuras indexadas, tenemos las bases de datos como Dbase o Paradox, entre otras, las
cuales Delphi maneja a la perfeccin.
Antes de comenzar el trabajo con los ficheros veamos una pequea definicin de archivo:
Un archivo es un espacio de memoria (recordemos que memoria no es slo la RAM, sino
tambin un CD-ROM o un disco rgido) con principio y fin, donde es posible almacenar
datos interpretables por la mquina. La PC acude a la FAT (File Allocation Table) para ver
en qu direccin empieza el archivo que solicitamos, y lo lee hasta encontrar su final. Esta
definicin nos muestra como se trabaja con ellos.
El archivo de texto no son mas que aquellos ficheros que se pueden visualizar con la orden
type del Msdos, o con el Notepad de Windows, suelen llevar extensin txt que son los que
utilizaremos en esta oportunidad. Ahora quizs relacionen otras extensiones con este tipo
de archivo, como .doc Word) o .sam (Ami pro). Estos archivos tambin son de texto,
aunque si los abren con WordPad, por ejemplo, vern texto mezclado con ASCII.
Para leer o escribir un fichero de texto lo primero que tenemos que hacer es declarar una
variable a la cual le asignaremos el fichero de tipo texto de la siguiente forma:
Ahora veremos un pequeo ejemplo donde utilizaremos cada uno de los modos de abrir un
archivo.
3
Ejemplo1.
1- Lo primero que debemos hacer es abrir el bloc de notas, escribir un texto cualquiera en
l y guardarlo.
2- Ahora coloque en su formulario un opendialog para abrir la ventana de dialogo y
buscar el archivo, un memo para mostrar el archivo, un edit para escribir un texto el
cual vamos a buscar, dos botones (uno para que se ejecute el opendialog y el otro para
que comience a buscar el texto en el archivo). Quedando de la siguiente forma:
fig 4.1
1- Ya terminado esto podemos abrir el archivo. Para ello haremos una llamado al mtodo
execute del opendialog1, del cual luego que hayamos escogido el archivo tomaremos
el valor de su propiedad filename el cual nos devolver la direccin en memoria del
4
archivo seleccionado, tambin este valor ser asignado a la variable de fichero texto, de
la siguiente forma:
3- El procedimiento readln(texto a leer, variable a la cual asignar) lee la lnea del texto
indicado hasta que encuentra el EOL(end of line) el cual viene dado por un carcter
ASCII que le indica dicho fin y pasa para la prxima lnea asignndole esta lnea a la
variable a la cual se la va a asignar. Esto lo sigue haciendo mientras no encuentre el fin
del fichero.
5
Nota: Cuando ya no necesitemos utilizar mas el fichero debemos cerrarlo a travs del
procedimiento closefile.
1- Coloquemos un edit que sera el 2, a travs del cual introduciremos el texto que
colocar al final de la ltima lnea.
El procedimiento write lo que hace es escribir despus de la ltima lnea el texto que
desees, en este caso es el texto del edit1.
1- Para este inciso solo agregaremos un botn porque utilizaremos el mismo edit que
el inciso anterior para agregar el texto despus de la ltima lnea.
1- Para este inciso igual que para el anterior utilizaremos tan solo un botn porque
utilizaremos el mismo edit de los incisos anteriores para escribir el texto.
2- Ahora debemos abrirlo en modo de reescritura para luego asignarle la nueva cadena
de caracteres que contendr dicho archivo:
begin
rewrite(f);//abre el fichero en modo reescritura para reescribir en l
write(f,edit2.text);//escribe la cadena de caracteres en el fichero
closefile(f);//cierra el fichero
end;
Antes de comenzar a trabajar con bases de datos, conviene tener en claro una serie de
conceptos claves:
Tabla (Table): Es el lugar donde estn realmente los datos. Se divide en registros, los
cuales estn formados por campos. Podemos hacer una analoga con una tabla, segn la
cual los registros seran las filas y los campos las columnas.
Campo - Columna
Base de datos
Fig 4.2
Registro: Es un conjunto de datos acerca de una persona, un lugar, un evento o algn otro
elemento y constituye una fila de la tabla.
Indice (Index): es una estructura separada de la tabla que guarda ciertos campos de todos
los registros, para acelerar las bsquedas y el ordenamiento. En Paradox y dBase se utilizan
archivos adicionales para los ndices.
Database Desktop (DBD): es una versin reducida del Paradox for Windows; nos permite
ver, crear, modificar, borrar tablas. Se encuentra en el men Tools | Database Desktop.
Tambin podemos desde aqu transformar una tabla de un formato a otro o hacer consultas
SQL.
SQL Explorer: es una herramienta muy potente que nos permite navegar por las
definiciones y datos de las distintas bases de datos conectadas a la BDE, no importa su
formato. Lo utilizaremos para crear alias, para ver datos directamente de las tablas y para
ejecutar consultas SQL inmediatas.
El Database Desktop o BDB nos permite crear y gestionar las tablas. El mismo nos
permite tanto crear los campos de una tabla, sus tipos de datos y algunas caractersticas de
estos campos as como la edicin ya de los registros de dicha tabla y cambiar la estructura
de esta tabla.
El BDB lo podemos encontrar en el men Tools del Delphi la opcin Database Desktop.
Al seleccionar esta opcin se nos mostrar tal y como se muestra en la fig4.3 sin la
ventanita del centro.
8
fig4.3
Con el DBD comenzaremos por crear una nueva tabla, para ello iremos al men File la
opcin New el cual nos dar paso a tres nuevas opciones de las cuales escogeremos Table.
Al pulsar esta opcin nos aparecer una ventanita (fig4.3 centro) en la cual podemos
escoger entre varios el tipo de tabla que vamos a trabajar de las cuales nosotros
escogeremos el formato de Paradox7. En dependencia del tipo de tabla que escojamos crear
esta soportar unos tipos de campos u otros, la existencia de chequeos de validacin,
ndices de unos tipos u otros, etc.
Luego de indicar el tipo de tabla que vamos a crear el DBD nos mostrar una ventana (fig
4.4) llamada Field Roster (lista de campos) en la que podremos ir especificando los
distintos campos que contendr nuestra tabla, de los cuales debemos especificar su nombre,
tipo, longitud (en caso de ser necesario), si formar parte o no de un ndice, si es un campo
requerido y algunas otras cosas que no vienen al caso.
9
fig 4.4
En la primera columna podemos introducir el nombre de los campos que tendr nuestra
tabla, cada vez que introduzcamos un nombre (no debe pasar de 25 caracteres, tiene que ser
nico, puede tener cualquier carcter imprimible excepto ( [ ] { } ( ) # o la combinacin
->)) debemos presionar la tecla Tab o Enter para acceder a la columna Type, en la cual
podremos escoger el tipo de datos que contendr dicho campo. Para escoger el tipo de
campo podemos escribir en caso de saberlo la letra que indica el nombre de dicho caso. Si
no conocemos esa letra, podemos desplegar la lista de los tipos de datos dando clic derecho
sobre la columna al lado correspondiente al nombre del campo o estando en esa posicin
oprimir la tecla espacio. En ambos casos se desplegar la lista que se ve en la fig 4.4 en la
cual podemos definir campos el tipo de datos que soportar el campo. Los tipos de datos
que puede soportar un campo en una tabla paradox son:
Nombre del tipo de dato Tipo de dato Espacio que ocupa en byte En Delphi
Alpha (A) Alfanumrico - de 1 a 255 bytes ShortString
LongInteger (I) Entero entre -2.147.483.648 y Integer, Longint
Autoincrement (+) 2.147.483.647 (32 bits) - 4 bytes
Short (S) Entero entre -32.768 y 32.767 (16 bits) - 2 SmallInt
bytes
Number (N) Nmero real entre 5.0*10-324 y Double, Real
1.7*10308 - 8 bytes (Delphi 4)
10
NOTA: El formato que utiliza Paradox es del tipo Registro de longitud fija, lo que significa
que si declaramos un campo como de 40 caracteres, aunque lo dejemos en blanco en
realidad estar ocupando 40 bytes en el disco por cada registro. Por esto debemos conocer
el tamao mximo que tendrn los datos que vas a entrar en un campo, para a la hora de
especificar su tamao (size) no ponerlo mayor que dicho tamao mximo.
* El tipo String de Delphi est restringido a algo mas de 4 millones de caracteres, lo que en
la mayora de los casos prcticos es ms que suficiente y se puede considerar como que no
tiene lmite.
11
Algunos campos requieren tambin un longitud mxima como son el tipo Alpha, al cual
debemos facilitarle la cantidad de caracteres que podr contener cada registro de dicho
campo.
En la zona derecha del Field Roster tenemos opciones que nos permite editar las
propiedades de la tabla.
Los campos tienen varias propiedades como son los chequeos de validacin de campos,
los ndices secundarios, la integridad referencial entre otros. Este grupo de propiedades las
podemos ver desplegando que hay en la parte superior.
Fig4.5
12
En la caja de texto superior se introduce la mscara que tendr este campo que en este
caso nos permite introducir un nmero telefnico, en la que se encuentra debajo podemos
escribir un ejemplo y l nos mostrara en el componente que se encuentra ms abajo si el
valor escrito por nosotros est bien de acuerdo con la mscara escrita previamente. Luego
pulsamos el botn OK y la cadena pasar automticamente a la propiedad Picture.
4.4.4- ndices.
Existen dos tipos de ndices en las tablas de tipo Paradox, el ndice principal o clave
primaria y uno o ms ndices secundarios.
Podemos indicar que campos formarn parte de este ndice pulsando cualquier tecla en la
columna Key, haciendo aparecer un asterisco que indica que este campo forma parte del
ndice.
La estructura del ndice primario es una decisin muy importante, ya que define no slo el
orden de los registros sino tambin el criterio para diferenciar en forma unvoca cada
registro. En otras palabras, no puede haber dos registros con valores iguales en los
campos del ndice primario. Por ejemplo: en una tabla que contenga datos de personas, no
sera buena la eleccin del campo nombre para la clave primaria, ya que pueden existir dos
personas con el mismo nombre. En este caso un buen candidato sera el campo DNI, ya que
no puede haber dos personas con el mismo nmero. Postergamos la discusin de los ndices
para ms tarde.
ndice Secundario.
Fig 4.6
Al terminar de escoger los campos que formarn parte de este ndice, pulsamos el botn
OK, que har aparecer otra ventana para facilitarle el nombre que le asignaremos a este
ndice. Dicho nombre se mostrar en la lista de ndices secundarios de la tabla.
Solucin
Suponiendo que el campo edad est hecho para estudiantes de un tecnolgico que no
tiene grupos de 12 grado la edad de los alumnos est entre 14 y 19 aos. Entonces en
las propiedades de este campo le diremos que el valor del campo edad est entre este
intervalo de edades. Para esto primero seleccionemos el campo edad para que las
propiedades a la derecha sean las que le pertenecen a l. Ahora en las propiedades
Minimum Value y Maximum Value le daremos los valores 14 y 19 respectivamente.
Ahora en la propiedad Default Value le podemos dar el valor del grado que ms
alumnos tiene que casi siempre es primer ao, por lo tanto en Default Value le podemos
poner 15.
Ya hecho esto est terminada la estructura de la tabla y podemos salvarla. Para esto
hagamos clic sobre el botn Save As y se mostrar la ventana de dialogo para salvar la
tabla. En ella podemos especificar el nombre de la tabla, tipo de tabla y mas abajo podr
ver los alias(los veremos proximamente) que ya estn creados, si desea puede escoger
entre los distintos alias que hay creados y podr ver que cada uno hace referencia a un
directorio diferente. Como nosotros no tenemos creado ningn alias debemos salvarlo
en un directorio, salvemoslo por ejemplo en D:/proyectos/alumno/tablas con el nombre
Datos de alumnos. Ya tenemos la tabla creada y guardada lista para trabajar con ella.
Un alias o mote es un identificador asociado a una o varias bases de datos, de tal forma
que cada vez que se quiere acceder a ella, en lugar del camino en el que se encuentra y el
nombre de archivo usamos dicho alias. Este alias hace referencia a un directorio en el cual
estn contenidas todas las tablas que necesitemos. Es como a los que se llaman Gregorio y
Catalina les llaman Goyo y Cuca para no tener que decir todo el nombre largo.
Hay dos modos de crear un alias, una es por medio del SQL Explorer que no es mas que
un explorador de bases de datos y el gestor de alias (alias manager) que nos ofrece el
Database Desktop. Vamos a ver cada uno de ellos por medio de ejmplos.
Creemos un alias por medio del SQL Explorer. Para ello vayamos al men del Delphi en
la opcin Database y en ella escojamos la opcin Explore. Al realizar esta operacin se
mostrar una ventana (fig 4.7) que corresponde al SQL Explorer.
15
Fig 4.7
Con el SQL Explorer no solo se puede crear Alias sino tambin como su nombre lo indica
se puede explorar las base de datos, o sea ver sus tablas, tipos de datos, ndices, etc.
Cmo se aprecia en la figura 4.7, lo primero que se distingue, bajo la pestaa DataBases,
son los alias y que dependiendo del gestor de datos de que se trate tienen unas
caractersticas y unos datos distintos los cuales podremos ver en la parte derecha de la
ventana como descripcin si pinchamos en cualquiera de estos. Se darn casos que al
efectuar este proceso nos encontremos con que se solicita una identificacin si queremos
ver el contenido a travs de la zona izquierda del alias, donde figura el signo +. En el
caso de las tablas planas ocurre con Access, esto no tiene ni debe complicarnos, al
contrario, podemos utilizarlo o no en programacin, dejando que solicite los datos del
usuario si es eso lo que nos interesa, o desactivando la opcin en el DataBase.
Para crear un nuevo alias tan solo tenemos que hacer clic derecho sobre Database en la
parte izquierda o escoger New en el men Object y saldr una ventanita para especificar el
tipo de driver para este alias entre los cuales escogeremos Standard. Al pulsar OK se crear
un alias con el nombre Standard el cual le podemos cambiar y de hecho lo haremos y le
pondremos el nombre tabla. Ahora en la parte izquierda se pueden ver cuatro descripciones
de este alias. El primero es el tipo que tiene el valor Standard, el segundo es el driver por
defecto que tiene el valor paradox, la tercera que es de habilitar que tiene el valor false y la
cuarta que es la que nos interesa y no tiene ningn valor que es Path (camino) en la cual
podemos especificar el directorio al cual har referencia el alias. Para ello podemos escribir
directamente l camino lo cual es muy engorroso, lo ms cmodo es hacer clic en la elipsis
a la derecha para que se muestre la ventana de dialogo que le permitir seleccionar el
directorio al cual har referencia el alias. Cuando terminemos de escoger el camino
pulsamos el botn OK y ya tenemos creado el alias.
16
Ahora puede escoger su alias en la lista hacer clic en el signo de mas que tiene en la
izquierda para ver las tablas que estn contenidas en este alias y sus caractersticas.
Para ello primeramente abramos el Database Desktop. Primeramente vamos a ver el alias
que creamos anteriormente por el SQL Explorer. Vayamos al men File/Open/Table. Al
hacer esta operacin se nos mostrar la ventana de dialogo para escoger la tabla a abrir.
Despleguemos la lista de los alias para escoger el que ya tenemos creado y veremos como
hace referencia al directorio que nosotros le dimos como camino y nos mostrar las tablas
contenidas en este directorio. Este es uno de los objetivos de los alias, en vez de poner toda
la direccin o ir buscando abriendo carpeta tan solo ponemos el alias y l solo nos indica el
directorio.
Ahora volvamos al asunto de crear el alias por el DBD. En el men Tool encontramos la
opcin Alias Manager que nos mostrar una ventana que nos permitir crear el alias. En
esta ventana tenemos en la derecha un radiogroup para escoger los alias a mostrar. De las
tres escojamos la que nos mostrar los alias publicas (show public aliases only). Al
seleccionarla veremos a la izquierda las opciones para crear el alias. La primera nos
permitir proporcionar el nombre del alias (Database Alias), la segunda el tipo de driver
(Driver Type) y la tercera el camino o directorio al cual el alias va a hacer referencia (Path).
Proporcionmosles el nombre tablas1, el tipo de driver Standard y para darle la ruta
debemos hacer clic en el botn Browse que se encuentra en la parte derecha que mostrar
una ventana para escoger el camino. Le daremos como camino el mismo que le dimos al
alias anterior. Esto no dar problemas porque varios alias pueden hacer referencia a un
mismo directorio sin que esto traiga problema recuerde que el alias lo nico que hacer es
referencia a un directorio y nada ms.
Al hacer todo lo expuesto anteriormente podemos pulsar el botn OK que nos mostrar
una ventana que te indica si quieres guardar el alias en el IDAPI y le dices que si.
Nota: Si desea puede eliminar el ltimo alias que creamos porque de todas maneras
tenemos ya uno que hace referencia a este directorio. Para esto tenemos que abrir el alias
manager, escogerlo en la lista y oprimir el botn Remove que automticamente lo
eliminar.
4.4.6- Opciones del BDB.
Inicialmente sin tener ninguna tabla abierta tenemos las opciones File, Edit, Tools,
Window, Help.
Dentro de File encontramos las opciones New y Open que nos permite abrir o crear
consultas(Query), archivos SQL y Tablas.
17
Ya abierta alguna tabla se nos muestran ms opciones en los men edit y se activan los de
window, se muestra view (vista), table, Record (registro).
Debajo del men encontramos unos botones de accin rpida. Los tres primeros nos
permiten cortar, copiar y pegar registros. Luego aparece otro que permite reestructurar la
tabla al igual que en el men tools. Ms a la derecha hay un conjunto de botones parecidos
a los botones del mediaplayer o las grabadoras, los cuales hacen lo mismo que las opciones
del men record o sea te permite navegar por los registros de la tabla. Ya al final hay otro
grupito de dos, el primero te muestra el campo y el segundo te permite editar los registros
de la tabla o no en dependencia de si est o no presionado.
Ya hemos aprendido a disear las tablas y bases de datos, ahora nos falta aprender a
enlazar las bases de datos de nuestro con nuestros proyectos en Delphi. Para ello Delphi nos
brinda una serie de componentes que facilita sobremanera esta tarea.
Estos componentes se encuentran en las pestaas BDE, Data Access y Data Control en
Delphi6.
18
Estos son los componentes que te permiten hacer la conexin entre el proyecto y la tabla o
tablas, los cuales se encuentran en la pestaa DBE.
1- TDatabase
Este componente nos crea como una especie de alias pero que solo es utilizable para el
proyecto en que estamos trabajando.
2- TTable
Este componente nos permite hacer la conexin entre la tabla que hayamos creado y
nuestro proyecto. Para ello cuenta con dos propiedades que le permiten esta tarea.
DatabaseName: Permite conectarse con la base de datos con la cual vamos a trabajar, o
sea, con el directorio donde se encuentra la tabla que vamos a utilizar en nuestra aplicacin.
Nota: Recuerden que les dije que veramos la importancia del Database. Observen en la
propiedad DatabaseName y vern adems de todos los alias creados, el valor dado al
TDataBase en su propiedad DatabaseName. Observen adems que este componente no es
necesario en este caso, debido a que el componente table se puede conectar el mismo a la
base de datos, o sea al directorio donde se encuentra la o las tablas sin necesidad del
databse.
TableName: Nos permite conectar una tabla que se encuentre en el directorio escogido en
la propiedad databasename con este componente.
Ya conectada la base es necesaria activar la conexin la cual se hace por medio de la
propiedad Active. Ya al activarla puede trabajar directamente con ella.
3- Tquery.
Las tablas del tipo que estamos utilizando no son propias del lenguaje SQL, no obstante,
como el entorno nos lo permite, nos viene muy bien aprovecharlo. Es para esto que nos
sirve este componente, para hacer consultas a una tabla.
19
Este componente no cuenta con la propiedad tablename como en el caso del table, debido
a que ella hace la conexin con la tabla en el momento en que realiza la sentencia SQL,
pudiendo hacer la consulta sobre cualquiera(s) de las tablas que se encuentran dentro de la
base de datos especificada en la propiedad anterior. La propiedad que nos permite realizar
las consultas es la propiedad SQL. Al hacer clic en la elipsis que se encuentra al lado de la
propiedad, se visualizar una ventanita en la cual podemos editar la consulta SQL la cual
veremos brevemente en un ejemplo hasta ms adelante que profundizaremos un poco en el
mismo.
Ya hecha estas cosas, al igual que el table es necesario activarlo por medio de la misma
propiedad Active.
Hay otros componentes en esta pestaa BDE los cuales veremos ms adelante.
4.5.2- Insercin de los controles de edicin. Pestaas Data Access y Data Control.
Ahora veremos como insertar en nuestro formulario, los controles que permitan en
ejecucin ver y editar los registros de una tabla.
Vamos a crear el diseo en nuestro proyecto para trabajar con los registros de la tabla que
creamos anteriormente en la seccin 4.4 que contaba con los campos: Nombre de la
escuela, Nombre del Alumno, CI, Grupo, Edad, Sexo, Foto.
Para realizar el diseo debemos primeramente colocar un componente Table para conectar
la tabla con nuestro proyecto, para ello utilizaremos sus propiedades DatabaseName y
TableName para conectar la tabla con el directorio donde se encuentra la tabla por medio
del alias y para conectar con la tabla que deseemos trabajar de las que estn incluidas
dentro del alias. Si han seguido el curso de este libro y crearon la tabla y el alias entonces
sabrn que el alias que creamos para hacer referencia al directorio donde se encuentra
nuestra tabla se llama tabla y la tabla en cuestin se llama Datos de alumnos as que estos
son los valores que debemos escoger tanto en DatabaseName como en TableName.
Ya teniendo conectada la tabla con nuestro proyecto por medio del componente table
pasemos a colocar los componentes que nos mostrar los registros de nuestra tabla. Para
ello hagamos doble clic sobre el componente table y se nos mostrar una ventanita (Fig 4.8)
20
sin el men contextual que se ve. En esta ventana podemos adicionar los campos con los
que vamos a trabajar en nuestro proyecto. Lo podemos hacer de dos formas, adicionando
uno por uno a travs de la opcin Add fields que podremos escoger los que deseamos
adicionar o Add all fields que adicionar todos los campos con que cuenta la tabla. Ahora
escogeremos la opcin Add fields para ver como se hace por esta va ya que la otra es
directa y es slo escogerla y se adicionan solos. Al escoger la opcin Add fields se mostrar
otra ventanita Fig 4.9 donde podemos escoger los campos. Aqu seleccionamos los que
deseamos, que en este caso sern todos y pulsamos el botn OK para que aparezcan estos
campos en la ventanita anterior. Ahora marque todos los campos en la ventanita y
arrstrelos oprimiendo el clic izquierdo hasta el formulario y estando sobre l suelte el clic.
Al realizar esta ltima operacin se mostrarn una serie de componentes para acceder a los
registros de la tabla (Fig 4.10) los cuales Delphi ha colocado de forma automtica.
1- DataSource
Se encuentra en la pestaa DataAccess. Este componente permite el enlace entre los
componentes de datos y los de acceso a datos. En nuestro caso permite el enlace entre el
componente Table con los utilizados para mostrar los valores de los registros (DbEdit y
DbImage). Este componente cuenta con las propiedades:
DataSet: Permite escoger la tabla (de los componentes table colocados en nuestro proyecto) a
la cual el DataSource va a conectarse para luego permitir la relacin de los componentes de
acceso a datos con esta tabla.
Fig 4.10
2- Dbedit
Este componente permite mostrar el valor del registro del campo que se le indique. Cuenta
con las propiedades:
CharCase: Se puede escoger el tipo de letra que se mostrar en l. Toma tres valores:
1. ecLowerCase: Todas las letras en minsculas.
2. ecUpperCase: Todas las letras en maysculas.
3. ecNormal: Puedes escribir cualquiera de las dos.
3- Dbimage
22
Este componente nos permite mostrar los registros de los campos de tipo Graphic o sea
campos en los cuales se almacenan imgenes. Cuenta con las propiedades:
Este componente por si solo no carga las imgenes, por tanto tenemos que buscar la forma
de asignarle la imagen o foto que deseamos que se corresponda con los datos del alumno.
Para esto introduzcamos un botn y un opendialog. El primero para mandar a ejecutar el
segundo y tomar la imagen que deseamos mostrar en este registro. Ahora debemos
programarle para que realice estas acciones en el evento Onclic del botn, quedando:
Vamos a ver ahora como hacer lo mismo que se hizo anteriormente, pero ahora colocando
nosotros mismos los componentes. Para esto abran una nueva aplicacin del Delphi. Ya
abierta tenemos al igual que anteriormente colocar un componente Table. Al mismo en las
propiedades DatabaseName y TableName debemos darle los mismos valores que
anteriormente.
Si hemos hecho, entonces hemos logrado conectar nuestro proyecto con la tabla. Ahora
necesitamos un componente que permita enlazar este componente table con los
componentes enlazados a los datos. Si atendieron bien en el ejercicio anterior entonces
recordarn que el componente que permite esta relacin es el componente Datasource, que
vimos anteriormente que Delphi lo colocaba automticamente al arrastrar los campos de la
ventanita para el formulario. Este componente vimos que necesitaba conectarse con la tabla
y lo haca por medio de la propiedad DataSet, en la cual le daremos el valor table1.
Los componentes estn colocados pero necesitamos ahora que muestren los valores de los
registros pertenecientes a cada campo, para lo cual necesitamos enlazarlo con la tabla. Para
23
esto cada uno de estos componentes cuenta con la propiedad DataSource, en la cual se
puede escoger el DataSource con el cual deseamos que se conecte para as poder mostrar
los valores de los registros de un determinado campo de esta tabla. Pondr el ejemplo de
uno y los dems los dejo para que ustedes lo realicen.
En el primer Dbedit, el cual utilizaremos para mostrar los registros del campo Nombre del
centro, escogeremos en la propiedad DataSource el DataSource1, que es el nico que
tenemos en este caso. Al escoger el Datasource1 ya tenemos hecho el enlace entre nuestro
componente y la tabla. Ahora ya podemos enlazar el componente directamente con el
campo del que deseo que muestre sus registros por medio de la propiedad DataField, en la
cual escogeremos el campo Nombre del centro. Ya entonces tenemos conectado el
componente, por medio del Datasource1, con el campo Nombre del centro de la tabla1
(table1).
Esta misma tarea se realiza para los dems componentes slo variando el valor del campo
que va a mostrar (DataField).
Nota: Recuerde que los registros no se visualizarn hasta que active la tabla en su
propiedad Active.
Ahora veremos otros componentes enlazados a datos, algunos pueden ser colocados
automticamente por el Delphi al arrastrar los campos hacia el formulario y otros siempre
obligatoriamente tenemos que colocarlos nosotros.
1- TDBNavigator.
Este componente permite que se navegue por los registros, as como su reestructuracin
por medio de los botones que tiene.
Veamos ahora como se llama cada botn y la funcin especfica que realiza.
Prior (anterior) Coloca el cursor en el registros anterior dndonos acceso a sus datos.
Next (prximo) Coloca el cursor en el registros siguiente dndonos acceso a sus
datos.
Last (ltimo) Coloca el cursor en el primer registros dndonos acceso a sus datos.
Esta tarea tambin nosotros podemos imitarlas por medio de otros componentes haciendo
llamada a los mtodos que llaman estos botones al oprimirlos. Estos mtodos se llaman con
el mismo nombre que tienen los botones. Por ejemplo si queremos imitar el botn de
navegar hacia el primer registro, con un botn que nosotros coloquemos, entonces debemos
programar en su evento OnClic que vaya hacia el primer registro de la tabla:
Ya hemos visto las funciones de este componente, ahora veamos algunas de sus
propiedades.
25
Datasource: Al igual que las dems permite conectar el componente con la tabla,
permitiendo navegar por los datos de la tabla a la que est enlazado el datasource.
2- TDBGrid .
En la actualidad, con las facilidades otorgadas a los usuarios por los sistemas operativos
como Windows, ya no es suficiente con mostrar un registro a la vez. El usuario ahora
dispone de un arma de gran alcance: el ratn (mouse). Ya no est obligado a moverse lnea
por lnea en una tabla, puede ir directamente a donde desee con slo presionar un botn.
La mejor forma que podra haber para presentar una tabla a un usuario es mostrando todos
los registros en una tabla. Es esta la facilidad que brinda el DBGrid brindado por Borland,
muestra todos los campos y sus registros en forma de tabla.
Otra de las facilidades de este componente, es que puedes modificar el valor de los
registros con slo posicionarte con el mouse en cualquier celda.
A pesar de estas facilidades, tambin tiene sus peligros, ya que un usuario inexperto podra
sin darse cuenta, posicionarse sobre una celda y oprimir una tecla modificando sin querer el
valor de este registro y luego posicionarse sobre otra fila (registro) haciendo que se efecte
una llamada al mtodo post de la tabla y deje modificado el contenido de esta celda.
Tambin podemos determinar los campos que mostrar la tabla y el orden en que
aparecern por medio de un editor de columnas con que cuenta este componente la cual se
puede acceder haciendo doble clic sobre este componente.
La primera columna nos presenta informacin acerca del estado de la tabla y la posicin
del cursor. Los smbolos que se muestran en dicha columna tienen los siguientes
significados:
Cuando el smbolo tiene esta forma, la tabla est en modo navegacin (browse). Slo
estamos mirando, no hay modificaciones y el registro en que se encuentra es el que posee el
cursor en ese momento.
Ahora la tabla est en modo edicin (edit). Se estn modificando los datos del registro
en que se encuentra el smbolo.
Para poder utilizar estas teclas est claro que la tabla no puede ser de solo lectura, porque
si lo fuera no podemos escribir en ella, por lo tanto no podemos editar, insertar, ni borrar
registros. Las teclas son:
La tabla cuenta con una serie de mtodos y funciones que se pueden aplicar sobre ella las
cuales podemos aprovechar muy bien. Por medio de ellas podemos mostrar los datos en
otros componentes que no sean lo que nos ofrece la pestaa DataControl, lo cual nos
podra servir en algunos casos para trabajar ms fcil a la hora de de recibir o insertar los
datos. Tambin cuenta con mtodos para abrir y cerrar la tabla para que as no est abierta
todo el tiempo.
Los mtodos que se utilizan para abrir o cerrar una tabla son los mtodos Open y Close.
Ya conocido esto vamos a comenzar imitando los botones de navegacin del DBNavigator
por medio de botones comunes. Para ello en el mismo ejercicio que estamos realizando
vamos a colocar cuatro botones para ir al primer elemento, al anterior, al siguiente y al
ltimo. En cada uno de ellos lo que se hace es llamar al respectivo mtodo de la siguiente
forma.
Ahora vamos a ser ms osados y vamos a obviar los componentes de bases de datos y
vamos a trabajar con la base de datos sin necesidad de utilizar los componentes enlazados a
datos que nos brinda nuestro amigo Delphi. Entonces lo que vamos a hacer es el mismo
ejercicio que hemos estado haciendo pero ahora sin utilizar los componentes enlazados a
datos, tan slo utilizaremos el componente DBGrid para mostrar los datos y ver si est
funcionando correctamente, tambin un dbimage para mostrar el campo foto.
Para esta tarea de mostrar los datos en edit se habrn dado cuenta que tenemos que extraer
los datos de la tabla y debemos saber como acceder a cada campo y en especial al valor del
registro en ese campo que deseamos. Tambin necesitamos saber convertir los datos de un
tipo a otro a la hora de mostrarlos.
Conversin.
fraccin de
24 hs.
tBooleanField Convierte a No No permitido No permitido
string True permitido
o
False
tBytesField Convierte a No No permitido No permitido No permitido
tVarBytesField string permitido
tBlobField (generalmente
tMemoField slo tiene
tGraphicField sentido para
los
Memo)
Ahora bien, ya tienes colocado el cursor en el registro que deseas, como acceder a los
datos de un determinado campo del registro que est activo. Para esto el componente table
cuenta con las propiedades Fields[x], donde x es un nmero entero que se corresponde con
la posicin del campo que desees acceder (el primer campo ocupa la posicin cero). La otra
propiedad es FieldbyName(s), donde s es una cadena de caracteres que se corresponde con
el nombre del campo. En fin estas dos propiedades hacen lo mismo, nos dan acceso al
campo que especifiquemos, la diferencia es que a una le especificamos el nombre del
campo y a la otra el nmero del campo.
Ya sabemos acceder al campo y registro que deseemos, pero an nos falta poder obtener o
modificar su valor. Para obtener o modificar el valor del campo podemos tomar provecho
de la propiedad Value la cual nos devuelve el valor del campo que le especifiquemos en el
registro que est activo en ese momento. Tambin en lugar de poner value podemos poner
la conversin por ejemplo si lo que vas a tomar del texto quieres mostrarlo como texto
puedes poner asstring.
Por ejemplo si queremos mostrar en un edit el valor del campo nombre en el registro
activo, sera:
30
Edit1.text:=table1Nombre.value;
Edit1.text:=table1Nombre.asstring;
Edit1.text:=table1.fieldvalue['nombre'];
1- Luego de colocados todos estos componentes procedamos a dejar los edit en blanco
o sea sin texto.
31
2- Los label los colocaremos encima de cada edit especificando el nombre del campo
que cada edit mostrar, sabiendo que:
Edit1 Mostrar el campo Nombre de la escuela.
Edit2 Mostrar el campo Nombre.
Edit3 Mostrar el campo Grupo.
Edit4 Mostrar el campo Edad.
Edit5 Mostrar el campo Sexo.
Dbimage1 - Mostrar el campo Foto
3- Veamos ahora que hacer con los Bitbtn. Primeramente los dejaremos en blanco o
sea sin texto. Ahora para las imgenes las pueden crear ustedes o de lo contrario
pueden usar las que estn instaladas en la mquina, que se encuentran enpor
ejemplo pueden usar:
begin
table1.prior; //llama al mtodo prior y coloca el cursor en el registro anterior dndonos
acceso a sus datos.
bitbtn3.enabled:=true; //se manda a habilitar el 3 y el 4 por si estn inhabilitados o sea por
bitbtn4.enabled:=true; //si anteriormente estaban en el ltimo
if table1.RecNo=1 then//para saber si lleg al primer registro para inhabilitar el 1 y 2 ya
que no hay ninguno delante de l.
begin
bitbtn1.enabled:=false;
bitbtn2.enabled:=false;
end;
end;
edit2.clear;
edit3.clear;
edit4.clear;
edit5.clear;
bitbtn7.enabled:=false;//se inhabilita el bitbtn7 que es el de edicin ya que est en modo de
//edicin as que no es necesario que est habilitado.
bitbtn8.enabled:=true;//se habilitan los bitbtn 8 y 9 para que puedas validar o cancelar los
//cambios.
bitbtn9.enabled:=true;
end;
2- Hasta ahora todo est perfecto pero an no se ven los datos en los edit, incluso en el
botn de insertar le digo que limpie todos los edit como si tuviese los datos escritos
y no protestaron. Vamos ahora a mostrar los datos en los edit. Esta tarea no es nada
difcil, pero si no te das cuenta de que se hace lo mismo a la hora de mostrar los
datos se te puede hacer tedioso si piensas ponerlo cada vez que vayas adelante,
atrs, principio, final, eliminar o cancelar, por lo tanto lo ideal sera crear un
procedimiento que haga esta tarea y tan slo tendramos que llamar este
procedimiento. Creemos un procedimiento y llammoslo muestra, quedando as:
procedure Tform1.muestra;
begin
edit1.text:=table1.Fields[0].Value;//muestra en el edit1 el valor del campo 0.
edit2.text:=table1.Fields[1].Value; //muestra en el edit1 el valor del campo 1.
edit3.text:=table1.Fields[2].Value; //muestra en el edit1 el valor del campo 2.
edit4.text:=table1.Fields[3].Value; //muestra en el edit1 el valor del campo 3.
edit5.text:=table1.Fields[4].Value; //muestra en el edit1 el valor del campo 4.
edit6.text:=table1.fields[6].asstring;
end;
Recuerden que tambin hay que declararlo en la parte superior (type) donde estn los otros
procedimientos. Recuerden que se declara igual pero sin el nombre del formulario donde se
encuentra (Tform1).
table1.first;
muestra;//llama al procedimiento muestra para que realice lo que le hemos programado.
35
Ahora pruebe el programa y ver que ha logrado imitar el DbNavigator y los componentes
enlazados a datos. Faltan algunos detallitos como que se active tambin el bitbtn de editar
al oprimir cualquiera de los bitbtn, pero se los dejo de tarea.
En esta seccin veremos como buscar un determinado dato en una tabla. Para ello
necesitaremos conocer algunos mtodos nuevos de las tablas y haber fijado bien los
conocimientos que has adquirido en las secciones anteriores.
Deben recordar los mtodos que utilizaba el navegador para moverse por los registros,
pero que haras si desearas ir directamente a un registro sabiendo la posicin en que se
encuentra. Puedes hacerlo como te expliqu anteriormente que es hacer un ciclo desde 1
hasta la posicin que deseas colocar el cursor e ir llamando al mtodo next para
posicionarte en el prximo y as al terminar el ciclo el cursor est sobre el registro deseado.
Pero esto es un poso trabajoso luego que conozcamos que hay un mtodo que nos facilita
grandemente este trabajo. Hay un mtodo que posee la tabla que realiza esta tarea, que es el
mtodo MoveBy(cantidad). Este mtodo lo que hace es a partir de donde est el cursor en
ese momento, moverse la cantidad de registros especificada en la cantidad. Si la cantidad es
positiva se mueve hacia delante y en caso contrario hacia atrs. Entonces si quisieras
posicionar el cursor en un determinado registro tan solo deberias posicionar el cursor en el
primer registro llamando al mtodo first y luego decirle que se mueva una cantidad igual a
la del cursor y restarle 1 ya que la posicin comienza a contar de cero.
Bsquedas en tablas.
Una de las operaciones bsicas a realizar sobre cualquier tabla es la bsqueda. Delphi nos
ofrece varios caminos posibles:
Este mtodo lo que hace es busca la primera ocurrencia exacta de los valores buscados.
Los campos sobre los que hace la bsqueda deben ser los primeros en el ndice activo. Es
una funcin que devuelve un valor lgico verdadero si se encuentra un registro que
coincida con el o los valores buscados (y el cursor en la tabla queda posicionado sobre ese
registro) o falso en otro caso (y el cursor no se mueve). Hay que fijarse bien al buscar por
este mtodo porque si mandas a buscar en ms de un campo a la vez el valor que devolver
ser verdadero si encuentra un registro que coincida con todos los datos buscados. Por
ejemplo si buscas el nombre oscar con la edad 15 tiene que encontrar un registro que
cumpla con ambas condiciones.
Como parmetro recibe un arreglo de valores, o sea una lista de valores a buscar en
dependencia de la cantidad de ndices que tenga la tabla. Estos valores deben ir separados
por coma y en el mismo orden en que aparecen en la tabla.
36
Por ejemplo si el ndice est formado por los campos C.I y edad la bsqueda quedara:
Este mtodo es similar al anterior slo que este no devuelve ningn parmetro ya que es un
procedimiento. Su tarea es si encuentra el registro que cuenta con las condiciones de los datos
buscados, se posiciona el cursor de la tabla sobre el mismo. En caso que no lo encuentre, se
ubica el cursor en el lugar donde debera estar el registro si existiera. Este procedimiento al
igual que el Findkey espera tambin como parmetros una lista de valores.
El mtodo Locate.
Nota: Si en la opcin escribes [ ] esto indica que busque el texto que mandaste a buscar
exactamente como lo escribas.
Por ejemplo, si desea buscar en el campo nombre el nombre que comience exactamente con
la letra O:
L:=table1.locate('nombre', 'O',[lopartialkey]);//donde L es una variable booleana.
Si deseas que el nombre se pueda buscar como quiera que est escrito (con maysculas,
minsculas o combinacin de estas), que tan slo importe lo que diga.
De la misma manera sera si el nombre a buscar se entrara en un edit, tan slo se sustituye
el nombre que pusimos (oscar o a) por edit1.text.
El mtodo Locate.
Fase de diseo.
1- Para este inciso colocaremos un Groupbox para colocarle dentro dos edit, dos label
y un botn. En los edit1 y 2 escribiremos el C.I y la edad a buscar respectivamente y
los label los colocaremos encima con el texto correspondiente al edit que
representan. El botn tendr el texto buscar Findkey , ya que para este inciso
utilizaremos este mtodo.
2- Para el inciso b tan slo aadiremos otro botn con el texto buscar FindNearest
ya que esta bsqueda la haremos utilizando este mtodo y buscaremos los textos
escritos en los edit que insertamos en el inciso anterior.
3- Para el (c) colocaremos otro Groupbox y un edit dentro de l para escribir el
nombre a buscar y un botn con el ttulo exacto .
4- Para el (d) tan slo necesitamos insertar dentro del Groupbox2 un botn con el texto
sin importar ya que el buscar el nombre escrito en el inciso anterior.
5- Para el (e) insertemos otro botn en el groupbox2 con el texto que comience
Inciso b.
Inciso c.
Inciso d.
if l then
showmessage('el nombre '+edit3.text+' si aparece en la tabla')
else
showmessage('el nombre '+edit3.text+' no aparece en la tabla')
end;
Inciso e.
Nota: Observe cuando corra el programa que al encontrar el registro que coincide con el
texto a buscar coloca el cursor en el registro donde encontr la coincidencia. Pudiera ser
que nosotros quisiramos hacer la bsqueda y tan slo saber si la bsqueda saber fue
satisfactoria y coger los datos que deseemos y continuar en la situacin en que estabamos
antes de mandar a buscar. Es ah donde entran a jugar las marcas.
Marcadores (Bookmarks).
Estos marcadores son muy importantes ya que por ellos puedes recuperar la posicin del
registro donde estaba el cursor antes de realizar una determinada accin. Ustedes saben que
para buscar un elemento en un campo debes ir activando registro por registro e ir
comparando, pero sucede que al encontrarlo el deja el cursor donde encuentra el elemento y
puede ser que yo slo desee saber si existe o no sin necesidad de verlo y es aqu donde
entran las marcas.
FreeBookmark: libera los recursos ocupados por el bookmark dados como parmetro.
Nota: Para que a una variable se le pueda asignar el getbookmark tiene que ser una variable
de puntero. O sea del tipo pointer: var a:pointer.
40
Fase de diseo.
2- Para el inciso b necesitamos insertar otro botn dentro del groupobox al cual le
pondremos el texto buscar y marcar.
1- Para hacer la bsqueda en el evento Onclic de este botn haremos un ciclo desde 1
hasta el ltimo registro que tenga la tabla, para lo cual nos valdremos de los
mtodos Recordcount y Next para saber la cantidad de registros e ir pasando al
prximo respectivamente. Entonces escribamos el siguiente cdigo.
begin
showmessage('el nombre esta en la lista');//muestra un mensaje que si lo encontr
exit;//sale del procedimiento
end;
table1.next; //como no lo ha encontrado porque sino hubiese salido del procedimiento
//lamamos al mtodo next para que pase el cursor para el prximo registro.
end;
showmessage('el nombre no esta en la lista');//si termina el ciclo sin salir del
//procedimiento significa que no lo encontr entonces
//que muestre el mensaje correspondiente.
end;
Inciso a.
end;
Nota: Observe que en el cdigo est puesto el mensaje antes de volver a colocar el
cursor en el registro donde nos encontrbamos trabajando. Esto se hizo para que vieran
como cambia el cursor de posicin. En caso de encontrarlo coloca el cursor en el
registro coincidente y te muestra el mensaje y al pulsar OK vuelve a colocar el cursor
donde en el registro donde nos encontrbamos. Un tanto igual ocurre cuando no
encuentra un registro coincidente, coloca el cursor en el ltimo registro, muestra el
mensaje y luego vuelve a posicionar el cursor en el registro donde estabamos.