Sunteți pe pagina 1din 42

1

Curso rpido para aprender Delphi en el menos tiempo


posible y con una buena calidad para realizar tus
programas.
UNIDAD # 4 : APLICACIONES DE BASES DE DATOS
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.
En un ordenador, una base de datos, no es ms que un conjunto de ficheros con unas
caractersticas propias que los hacen especiales. Entre estas caractersticas se puede
destacar su facilidad para almacenar datos de diversos formatos en un mismo fichero, y su
ordenacin (si se desea).
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.

4.2- Ficheros de texto y ficheros binarios.


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.
4.2.1- Ficheros de texto o ASCII.
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:
Var f : textfile; // declaramos la variable de tipo archivo de texto;
Assignfile(f, 'direccion del fichero');// se le asigna a la variable f el fichero ubicado en la
direccion dada.
Ya teniendo el archivo asignado a la variable podemos abrirlo. Al abrirlo podemos hacerlo
en dependencia de lo que vayamos a hacer con l de tres modos: en modo lectura, escritura
y reescritura. Para abrirlo en cada uno de los distintos modos es necesario llamar algunos
procedimientos:
Reset(f): Lo abre en modo de lectura(solo se pueden leer los datos del fichero).
Rewrite(f): Lo abre en modo de reescritura.
Append(f): Lo abre en modo de escritura.
El abrir un fichero en modo de escritura o reescritura tiene sus particularidades. Si abres
un fichero en modo escritura es para aadir lneas en l, mientras que si lo abres en modo
reescritura crea el fichero y en caso que exista lo sobrescribe eliminando todo lo que tenga
escrito el mismo.
Ahora veremos un pequeo ejemplo donde utilizaremos cada uno de los modos de abrir un
archivo.

Ejemplo1.
1- Abra el notepad y escriba un texto en l y luego slvelo.
a- Abrir en modo de lectura para determinar si un determinado texto aparece en este
archivo.
b- Abrir en modo de escritura para escribir un texto al final del ltimo texto.
c- Abrir en modo de escritura para escribir un texto debajo de la ltima lnea.
d- Abrir en modo de reescritura para que sobrescriba el archivo.
Solucion por fases.(inc a)
Fase de diseo.
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

Fase de diseo - ejecucin.

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.execute then
begin
memo1.lines.loadfromfile();
assignfile(f,opendialog1.filename);
end;
end;
Observe que no se declar la variable f, esto es debido a que esta variable la utilizaremos
en el botn1 para asignarle el archivo y en el dos para trabajar con l. As que en la zona de
declaracin private debemos escribir:
f:textfile;
2- Ya teniendo asignado el archivo a la variable f, podemos abrirlo para leer en l, para
eso debemos escribir el siguiente cdigo:
procedure TForm1.Button1Click(Sender: TObject);
var l:string;//variable para asignarle la linea que se vaya leyendo
d:integer;//variable para almacenar la posicin donde encontr el texto
begin
reset(f);//abrir el fichero en modo lectura
while not eof(f)do//ciclo mientras no encuentre el fin del fichero
begin
readln(f,l);//lee la lnea en el fichero f y se la asigna a l
d:=pos(edit1.text,l);//se le asigna a d la posicin en que se encuentra el texto
if d<>0 then//si d es desigual de cero indica que lo encontr
begin
showmessage('el texto aparece');//muestra el mensaje
closefile(f);//cierra el fichero
exit;//sale del procedimiento
end;
end;
closefile(f);//cierra el fichero
showmessage('el texto no aparece');//si no sale nunca del procedimiento es porque
nunca d fue desigual de cero lo que indica que no haba ningn texto igual
end;
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.

Solucin por fases.(inc b)


1- Coloquemos un edit que sera el 2, a travs del cual introduciremos el texto que
colocar al final de la ltima lnea.
2- Ahora programemos para que adicione el texto. Ya tenemos la variable de fichero
declarada y asignada anteriormente, as que solo nos resta abrirla en modo de
escritura y escribir en l.
3- En el evento Onclick de este botn tan solo tenemos que escribir:
procedure TForm1.Button3Click(Sender: TObject);
begin
append(f);//abre el fichero n modo de escritura
write(f,edit2.text);//escribe al final de la ltima lnea del fichero
closefile(f);//cierra el fichero
end;
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.
Solucin por fases.(inc c)
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.
2- A la hora de programarlo todo queda igual excepto que se sustituye el
procedimiento write por el writeln que permite escribir debajo de la ltima lnea.
writeln(f,edit2.text);//escribe debajo de la ltima lnea
Solucin por fases.(inc d)
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:
procedure TForm1.Button5Click(Sender: TObject);

6
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;

4.3- Bases de datos.


Antes de comenzar a trabajar con bases de datos, conviene tener en claro una serie de
conceptos claves:
Base de Datos (Database): Es un conjunto de tablas. En Delphi una base de datos es un
directorio donde estarn las tablas -archivos- y los ndices.
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
Nombre de la escuela
IPI: Juan M. Castieiras
IPI: Juan M. Castieiras

Nombre
Javier Sandoval
William Prieto

Grupo
I-901
I-901

Edad Sexo
16
M
16
M
Registro - Fila

Base de datos
Fig 4.2
Campo(Field): Es un componente de la tabla que contiene un elemento especfico de
informacin y se representa como una columna o celda de la tabla. Los campos son los
elementos bsicos con los que se construyen o define la estructura de la tabla. Cada campo
contiene informacin sobre un aspecto de la categora, es como si viramos la categora
desde un punto de vista distinto cada vez que tomamos un campo de la tabla.

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.
Structured Query Language (SQL): lenguaje estructurado creado especialmente para
realizar consultas a bases de datos.
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.
4.4- Database Desktop.
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.

fig4.3
4.4.1- Creacin de una tabla.
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.
4.4.2- Definir los campos de una tabla.
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.

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
Alpha (A)
LongInteger (I)
Autoincrement (+)
Short (S)
Number (N)

Tipo de dato Espacio que ocupa en byte


Alfanumrico - de 1 a 255 bytes
Entero
entre
-2.147.483.648
y
2.147.483.647 (32 bits) - 4 bytes
Entero entre -32.768 y 32.767 (16 bits) - 2
bytes
Nmero real entre 5.0*10-324 y
1.7*10308 - 8 bytes

En Delphi
ShortString
Integer, Longint
SmallInt
Double,
Real
(Delphi 4)

10
Money ($)

BCD (#)

Timestamp (@)
Date (D)
Time (T)
Logical (L)
Bytes (Y)
Binary (B)
OLE (O)

Memo (M)
Formatted Memo (F)

Graphic (G)

Nmero real. Internamente se trabaja en 6


dgitos
y
en
forma
entera,
independientemente de la cantidad de
decimales mostrados. Por defecto se
muestra con 2 decimales y el signo
monetario. 8 bytes
Nmero en formato BCD (Binary Coded
Decimal). Mantenido por compatibilidad
con otras aplicaciones que usen este
formato, evita los errores de redondeo al
trabajar con decimales. 17 bytes
Fecha y hora juntos - 8 bytes
Fecha - 4 bytes
Hora - 4 bytes
Valor True o False - 1 byte
Campo de bytes, que puede contener hasta
255 bytes con cualquier informacin. De 1
a 255 bytes.
Un conjunto de bytes de longitud
arbitraria, por ejemplo para contener un
sonido o un objeto OLE. En el archivo
.DB se almacenan 10 bytes ms lo que
indiquemos como longitud, hasta 240. El
resto va a un archivo .MB (mximo 64
Mb)
Texto de longitud arbitraria. En el
archivo .DB se almacenan 10 bytes ms lo
que indiquemos como longitud, hasta 240.
El resto va a un archivo .MB (mximo 4
Mb para el memo, 64 Mb para el Memo
con formato)
Grfico. En el archivo .DB se almacenan
10 bytes ms lo que indiquemos como
longitud, hasta 240. El resto va a un
archivo .MB (mximo 64 Mb)

Currency

tDateTime
tDateTime
tDateTime
Bolean
Byte

String *

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.
4.4.3- Propiedades de la tabla.
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.
La opcin que aparece inicialmente es la de chequeo de validacin, propiedad que se
aplica a cada campo individual de la tabla. Esta nos permite validar la entrada de datos en la
tabla. Para ello disponemos de cinco propiedades disponemos de cinco propiedades.
La primera de estas propiedades Required Field nos permite indicar si necesariamente se
tendr que introducir un valor en el campo. La segunda (Minimun Value), tercera
(Maximum Value) y cuarta(Default Value), nos permiten indicar cual ser el valor mnimo
permitido, el mximo y el valor que tomar por defecto cundo usuario introduce un registro
nuevo, respectivamente.
La quinta propiedad es el apartado Picture, en el que se puede introducir una plantilla o
mscara de entrada de los datos en el campo que tenemos seleccionado en ese momento.
Tiene debajo un botn (assist..) mediante el cual podemos acceder a un asistente de
representacin(fig 4.5).

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.
ndice Principal o Clave Primaria.
El ndice principal es una estructura aparte de la tabla1, donde se mantienen nicamente
los campos marcados en la definicin. Se utiliza para optimizar el mantenimiento de los
datos en el archivo principal.
No es necesario crear una clave principal, pero si muyrecomendable. El subsistema de
manejo de los datos funciona de manera mucho ms eficiente si dispone de un ndice, y hay
algunas operaciones que no se pueden realizar si no se crea esta estructura (como el enlace
de dos tablas en una relacin, o la bsqueda eficiente de un registro).
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.
Para definir un ndice secundario tenemos que primeramente seleccionar en la lista de
propiedades del Field Roster (vea definir campos de una tabla) la propiedad Secondary
Indexes. En la parte inferior nos mostrar un botn con el titulo Define el cual nos abrir
otra ventanita (Fig 4.6) en la cual podremos seleccionar los campos que pertenecern a este
ndice. En la lista de la izquierda estn los campos disponibles en la tabla y en la derecha
estarn los que nosotros escojamos para formar parte de este ndice. Para esto debemos
marcar el o los campos deseados y oprimir la flecha que apunta hacia la otra lista. En caso
que queramos que un campo ya no forme parte de este ndice hacemos el proceso inverso.

13

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.
Ejercicio sobre creacin de tabla.
1- Creemos una tabla con los siguientes campos: nombre de la escuela, nombre del
alumno, carne de identidad, grupo, edad, sexo y foto.

Solucin
1- Para ello abramos el Database Desktop. Escojamos en el men la opcin new/table.
Al mostrarse la ventana para escoger el tipo de tabla escojamos el tipo Paradox que
es con el que vamos a trabajar. Al pulsar el botn OK nos mostrar el Field Roster
para crear la lista de campos. En el escribiremos el nombre de los campos y sus
caractersticas.
Nombre del campo
Type
Size
Nombre de la escuela
A
15
Nombre del Alumno
A
15
C.I
I
Grupo
A
7
Edad
I
Sexo
A
1
Foto
Graphic

14
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.
4.4.5- Creacin de Alias.
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.
Por el SQL Explorer.
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.
Por el Database Desktop.
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
Dentro de Tools (Herramientas) tenemos la opcin alias manager vista anteriormente y
Utilities (utilidades, conveniencias). Entre algunas de las utilidades tiene Copy, Delete,
Empty, Info Structure, Rename, Restructure.
Copy (copiar): Permite copiar una tabla de un lugar hacia otro.
Delete (eliminar): Borra la tabla que selecciones.
Empty (vaciar): Vaca o borra todos los registros que tenga la tabla.
Info Structure :Te muestra la estructura de la tabla que escojas en el Field Roster pero no
permite hacerle cambios.
Rename (renombrar): Permite cambiar el nombre a una tabla.
Restructure: Hace lo mismo que Info Structure pero si te permite hacer cambios en la
estructura de la tabla.
La opcin help es lo mismo que en los dems software.
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).
En men edit tenemos:
Undo (deshacer): Permite deshacer lo ltimo que haya hecho si no te agrada.
Cut(cortar), copy, paste (pegar), delete, select all (seleccionar todo): Permite cortar,
copiar, pegar, eliminar y seleccionar todos los registros respectivamente.
En el men Record encontramos las opciones:
Next (prximo), previous (previo), first (primero), last (ltimo): Permite ir al prximo,
anterior, primero y ltimo registro de nuestra tabla.
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.

4.5- Componentes de bases de datos.


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

4.5.1- Componentes para acceder a tablas. Pestaa BDE.


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.
Este componente cuenta con las propiedades Aliasname y DatabaseName.
Aliasname: En ella especificamos el nombre del alias al cual va a hacer referencia.
DatabaseName: Aqu introducimos el nombre que va a tener esta base de datos.
Aunque ahora se ve un poco turbia estas propiedades porque no se ve la aplicacin
prctica de estas, ms adelante veremos que es lo que hace ella exactamente y
comprenderemos ms claramente estas propiedades.
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

Ella a la hora de comunicarse lo hace por medio de la propiedad databasename de la


misma forma que el componente table.
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.
Para comprender mejor estos componentes vamos a realizar un ejemplo en el cual
utilizaremos algunos de estos componentes y los insertaremos por dos vas que nos ofrece
el Delphi, la primera es utilizando la forma automtica en que Delphi nos inserta los
componentes y la otra que es insertndolos nosotros uno por uno.
Automticamente con el Delphi.
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.

Fig 4.8

Fig 4.9

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.
Los componentes que se han colocado automticamente se encuentran en las pestaas
DataAccess y DataControl y se llaman:
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:
Enabled: Permite habilitar o no el DataSource. Si est inactivo no podrn realizarse las
conexiones entre la tabla y los componentes de acceso a datos.

21
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.
ReadOnly: Permite escoger si el Dbedit ser de solo lectura o no.
DataSource: Esta propiedad es la que permite conectarse con el datasource, el cual a su
vez est conectado al componente table. Al hacer clic a la izquierda de esta propiedad se
desplegar una lista con todos los datasources insertados en nuestro formulario, para
nosotros escoger con cual de ellos conectar este componentes.
DataField: Esta propiedad, luego de haber conectado el componente con el datasource,
permite escoger con cual de los campos de la tabla a la cual est conectada el datasource
quieres enlazar este componente. En este componente se mostrar el valor de los registros
que pertenecen al campo que hayas escogido en esta propiedad.
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:
Stretch: Por medio de ella podemos escoger si la imagen que se va a mostrar en l se
ajustar a su tamao o no.
DataSource y DataField: Funcionan de la misma manera que en el componente DbEdit.
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:
if opendialog1.execute then// si se ejcuta el opendialog
dbimage1.picture.loadfromfile(opendialog1.filename);//carga la imagen buscada en el
opendialog en el dbimage
Nota:Este componente slo soporta imgenes con formato BMP.
Colocando los componentes nosotros mismos sin ayuda.
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.
Ya tenemos entonces un componente para realizar el enlace entre la tabla y los
componentes que mostrarn los datos, as que ya ahora slo nos falta colocar los
componentes que permitirn mostrar los datos.
Para esto coloquemos 5 label para mostrar los textos correspondientes a cada campo
(Nombre del centro, Nombre, Grupo, Edad, Sexo, Foto). Luego coloquemos los
componentes que mostrarn los datos que se encuentran en la petaa DataControls. Estos
componetes sern 5 Dbedit y un dbimage para mostrar las fotos.
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.
4.5.3- Insercin de otros componentes enlazados a datos.
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.
Para comprender totalmente el funcionamiento de este componente debemos conocer lo
que es un cursor. Sabemos ya que los datos de una tabla se almacenan en registros. Ahora
un cursor es como un marcador de posicin, este se ubica sobre una fila de la tabla (un
registro) y nos da acceso a sus datos. La nica manera de acceder a los valores almacenados
en un registro particular de un campo es posicionar un cursor sobre ese registro y a travs
de los controles de datos -que ven lo que el cursor les muestra- modificar el contenido de
los campos.
Esto es lo que nos permite al navegador navegar por los registros. Este posiciona un cursor
al principio, final, al registro anterior o posterior, para acceder a los valores de estos
registros. Tambin permite editar el contenido de los campos agregando, eliminando y
modificando registros.
Los botones del navegador y sus funciones son los siguientes:

24

Figura 4.10: Navegador de tablas con la funcin de cada botn

Veamos ahora como se llama cada botn y la funcin especfica que realiza.
First(primero) Coloca el cursor en el primer registros dndonos acceso a sus datos.
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.
Append (anexar) - La BDE crea un registro nuevo en memoria -virtual- y posiciona el
cursor en l. Vemos entonces en los controles de datos el contenido por defecto de los
campos.
Delete (eliminar) Elimina el registro activo en ese momento.
Edit (editar) Hace que la BDE cree una copia virtual del registro en memoria para
que podamos modificarla.
Post Valida lo que hayas hecho (al crear un nuevo registro o modificarlo). Observe
que slo se activa cuando ests agregando o modificando un registro.
Cancel (cancelar) Cancela lo que ests haciendo(al crear un nuevo registro o
modificarlo).
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:
table1.first; //coloca el cursor en el primer registro, permitindonos acceder a este.
Ya hemos visto las funciones de este componente, ahora veamos algunas de sus
propiedades.

25

ConfirmDelete: Pregunta si desea eliminar el registro si tiene el valor true, en caso


contrario elimina el registro sin hacer ninguna pregunta.
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.
En la fig 4.11 se muestra la tabla correspondiente al ejercicio que estamos realizando
luego de trabajar con sus propiedades:

Fig4.11 Tabla correspondiente al ejercicio que estamos realizando


Datasource: Funciona de la misma forma que el resto de los componentes enlazados a
datos.
ReadOnly: Permite que la tabla sea de solo lectura o no, o sea puedes decidir si en ella se
podr escribir o no. Es importante esta propiedad ya que si deseamos podemos tomar la
tabla slo para mostrar los datos y modificarlos slo por medio de los otros componentes,
evitando as el problema con los usuarios inexpertos expuesto anteriormente.

26
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.
Tambin en tiempo de ejecucin podemos cambiar la posicin de las columnas (campos)
haciendo clic sobre el mismo y arrastrndole hasta el lugar que deseamos que ocupe.
Observe tambin que en la primera fila aparece por defecto el nombre de los campos.
Modos de una tabla
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.
La tabla est en modo insercin (insert). Se est trabajando de insertar en un registro
nuevo.
Teclas para modificar en una tabla.
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:
Insert: Para insertar un nuevo registro ante el que est activo.
Ctrl+Delete: Para borrar el contenido del registro activo.
Escape: Para cancelar los cambios que hayamos hecho.
Para aceptar las modificaciones slo tenemos que movernos hacia otra fila (registro).

Ejercicio con el DBNavigator y el DBGrid.

1- Para esto vamos a continuar con el ejercicio que estabamos realizando


anteriormente el cual insertaremos un DBNavigator y un DBGrid.
2- Luego de colocados estos componentes pasemos a conectarlos con el componente
table. La forma de hacerlo es enlazarlo por medio del DataSource a travs de la

27
propiedad DataSource, en la cual escogeremos el datasource con el cual nos
queremos enlazar que en este caso ser el datasource1.
3- Ya entonces tenemos enlazados los componentes con la tabla. Ahora solo nos
faltara evitar que el usuario pueda modificar sin querer un registro a travs del
componente DBGrid, para lo cual le daremos en la propiedad ReadOnly el valor
False.
4- Pruebe a correr el programa y ver con que eficiencia puede navegar por los
registros y modificar los campos de la tabla.
Nota: Darle true en la propiedad ReadOnly no siempre es necesario. Pruebe a darle el
valor false para que pueda probar el peligro que puede ocasionar un usuario inexperto y
adems pruebe las teclas que te permiten modificar la tabla.
4.6- Trabajo con los mtodos, funciones y propiedades de la tabla
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.
Recordemos los mtodos de la tabla que utiliza el DBNavigator que se encuentran en la
seccin 4.5.3. Recuerden tambin de esta seccin que estos mtodos lo que hacen es
posicionar el cursor en una determinada posicin (registro) y te da acceso a todos sus datos.
Por ejemplo si lamas al mtodo Next lo que hace la tabla es colocar el cursor en el siguiente
registro permitindote as acceder a los datos de ese prximo registro.
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.
procedure TForm1.Button2Click(Sender: TObject);//boton que muestra el primero
begin
table1.first;//lamada a la tabla para que coloque el cursor en el primer registro.
end;
procedure TForm1.Button3Click(Sender: TObject); //boton que muestra el anterior
begin
table1.prior;//llamada a la tabla para que coloque el cursor en el registro anterior
end;

28
procedure TForm1.Button4Click(Sender: TObject); //boton que muestra el prximo
begin
table1.next; //llamada a la tabla para que coloque el cursor en el registro siguiente
end;
procedure TForm1.Button5Click(Sender: TObject); //boton que muestra el ltimo
begin
table1.last; //llamada a la tabla para que coloque el cursor en el ltimo registro
end;
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.
Las conversiones posibles se resumen en el siguiente cuadro:
Tipo

AsString

tStringField

tIntegerField
tSmallIntField
tWordField
tFloatField
tCurrencyField
tBCDField
tDateTimeField
tDateField
tTimeField

AsInteger
Convierte a
integer si es
posible

Convierte a
String
Convierte a
String
Convierte a
String

AsFloat /
AsCurrency
Convierte a
Float
si es posible
Convierte
Float

Redondea al
entero ms
cercano
Convierte a
String

AsDateTime

AsBoolean

Convierte a
DateTime si
es posible

a No permitido

Convierte a
Boolean si
es
posible
No permitido

No permitido

No permitido

Convierte la
fecha
a la cantidad
de
das desde el
01/01/0001.
Convierte la
hora
a
una

Si no se
No permitido
especifica la
hora o la
fecha
valen cero.

29

tBooleanField

tBytesField
tVarBytesField
tBlobField
tMemoField
tGraphicField

Convierte a
string True
o
False
Convierte a
string
(generalmente
slo tiene
sentido para
los
Memo)

No
permitido
No
permitido

fraccin de
24 hs.
No permitido

No permitido

No permitido

No permitido

No permitido

Accediendo a los campos y registros.


Para poder accede a los datos de un registro de un campo determinado lo primero es
colocar el cursor en el registro del cual desees extraer los datos. Esta accin se hace en
dependencia de lo que necesites, si necesitas colarte en el primero, anterior, prximo o
ltimo ya conocemos los mtodos, pero si queremos colocar el cursor en un determinado
registro, por ejemplo el 5 debemos pararnos en el primero (first), y luego hacer un ciclo
hasta 5 llamando dentro de l al mtodo next para que vaya colocando el cursor en el
prximo registro hasta que llegue al quinto y termine el ciclo. Esto tambin se utiliza
cuando vas a buscar un dato en la tabla o campo de la tabla que vas llamando al mtodo
next, pasas el cursor al prximo accedes a sus datos y comparas. O sea para acceder a un
valor de un registro tienes que poner el cursor en l.
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:=table1.fieldbyname(' Nombre ').value;


Edit1.text:=table1.Fields[1].Value;
o como el edit va a mostrar un texto podemos poner:
Edit1.text:=table1.fieldbyname(' Nombre ').asstring;
Edit1.text:=table1.Fields[1]. asstring;
Tambin en lugar de de especificar el nmero o nombre del campo podemos hacerlo
llamando al componente que se crea al hacer doble clic sobre el componente table que se
muestra la ventanita que te permite adicionar los campos al proyecto y mostrar
automticamente los componentes enlazados a datos. Haga doble clic en un componente
table que ya est conectado con la tabla y adiciones todos los campos a la ventanita, luego
seleccione uno de los campos adicionados y observe en el inspector de objetos el nombre
del componente creado. Por ejemplo si seleccionas el campo nombre se observar que su
nombre en el inspector de objetos ser table1nombre. Entonces otra forma de acceder a los
valores de los campos es pidindole a estos componentes de campo su valor, o sea:
Edit1.text:=table1Nombre.value;
Edit1.text:=table1Nombre.asstring;
Observe que el nombre de la tabla y el campo va junto.
Otra de las formas es pidindole el valor del campo por su nombre:
Edit1.text:=table1.fieldvalue['nombre'];
Ahora continuemos con el ejercicio.
Entonces tomemos y abramos una nueva aplicacin de Delphi. Coloquemos un
componente Table para conectarnos con la tabla, un datasource para que permita la relacin
de la tabla con el DBGrid que vamos a colocar. Tambin coloquemos 5 edit y un dbimage
para mostrar y/o modificar los valores de los registros de cada campo. Coloquemos 6 label
para mostrar sobre cada edit e image el nombre del campo que va a mostrar. Ya para
terminar coloquemos 10 bitbtn (ms conocidos por bitbutton) para imitar al DBnavigator.
Utilizaremos el Bitbtn porque este componente es muy parecido al botn pero tiene la
posibilidad de mostrar una imagen adems del texto.
Resolvamos este ejercicio por fases.
Solucion por fases.(inc a)
Fase de diseo.
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:
1- Arrow1L.bmp para el de ir al primero
2- Arrow1UL.bmp para el de ir al anterior
3- Arrow1UR.bmp para el de ir al siguiente
4- Arrow1lR.bmp para el de ir al ltimo
5- Insert.bmp para el de insertar
6- Delete.bmp para el de eliminar
7- Edit.bmp para el de modificar los registros.
8- Check.bmp para el de validar los cambios
9- Ignore.bmp para el de cancelar los cambios
10- Retry.bmp para el de deshacer
4- Los bitbtn1, 2, 8 y 9 debern estar inhabilitados al correr el programa ya que se
supone que inicialmente el cursor est puesto en el primer elemento y por lo tanto
no se podra ir al anterior ni al primero ya que est en l. El 8 y el 9 tambin porque
inicialmente no ests modificando nada ni tienes nada que cancelar.

Fase de diseo ejecucin.

1- Ahora comencemos a programar cada uno de los bitbtn.


procedure TForm1.BitBtn1Click(Sender: TObject);//el botn de ir al primero.
begin
table1.first;//llama al mtodo first y coloca el cursor en el primer registro dndonos acceso
a sus datos.
bitbtn1.enabled:=false;//inhabilita el bitbtn 1 y 2 ya que est en el primer registro y no hay
bitbtn2.enabled:=false;//ms ningn registro delante de l.
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
end;
procedure TForm1.BitBtn2Click(Sender: TObject);//el botn de ir al anterior.

32
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;
procedure TForm1.BitBtn3Click(Sender: TObject); //el botn de ir al prximo.
begin
table1.next; //llama al mtodo next y coloca el cursor en el prximo registro dndonos
acceso a sus datos.
bitbtn1.enabled:=true; //se manda a habilitar el 1 y el 2 por si estn inhabilitados o sea por
bitbtn2.enabled:=true; //si anteriormente estaban en el ltimo
if table1.RecNo=table1.recordcount then //para saber si el nmero del registro activo es
igual a la cantidad de registro que tiene la tabla que en caso de ser verdadero
entonces est en el ltimo registro.
begin
bitbtn3.enabled:=false;
bitbtn4.enabled:=false;
end;
end;
procedure TForm1.BitBtn4Click(Sender: TObject); //el botn de ir al ltimo.
begin
table1.last;// llama al mtodo last y coloca el cursor en el ltimo registro dndonos
acceso a sus datos.
bitbtn1.enabled:=true;// se manda a habilitar el 1 y el 3 por si estn inhabilitados o sea por
bitbtn2.enabled:=true;//si estaba el cursor anteriormente en el primer registro
bitbtn3.enabled:=false;// inhabilita el bitbtn 1 y 2 ya que est en el ltimo registro y no hay
bitbtn4.enabled:=false;//ninguno despus de l
end;
procedure TForm1.BitBtn5Click(Sender: TObject); //el botn para insertar.
begin
table1.insert;//se llama al mtodo insert para que cree un registro virtual para guardar
//nuevos datos
edit1.clear;//se limpian todos los edit para escribir datos en ellos.

33
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;
procedure TForm1.BitBtn6Click(Sender: TObject);//el botn de eliminar
begin
if MessageDlg('Desea eliminar este registro?',//primero se le debe dar a escoger si en
mtConfirmation, [mbYes, mbNo], 0) = mrYes then //realidad desea eliminar el registro
begin
table1.delete;//se llama al mtodo delete para que elimine el registro activo
end;
end;
procedure TForm1.BitBtn7Click(Sender: TObject);//el botn de abrir en modo de edicin
begin
table1.edit;//se llama al mtodo edit para que ponga la tabla en modo de edicin y as poder
//modificar los datos del registro activo.
bitbtn7.enabled:=false;//como est en modo edicin no es necesario que est habilitado
bitbtn8.enabled:=true;//lo habilita para poder validar los cambios
bitbtn9.enabled:=true;//lo habilita para poder cancelar la edicion
end;
procedure TForm1.BitBtn8Click(Sender: TObject);//el botn de validar los cambios
begin
table1.fields[0].value:=edit1.text;//se le asigna al campo 0 el texto del edit1
table1.fieldbyname('nombre').value:=edit2.text;// se le asigna por el nombre del campo.
table1grupo.value:=edit3.text;//se le asigna pore l nombre del componente de campo.
table1.fieldvalue['edad'].value:=strtoint(edit4.text);
table1.fields[4].value:=edit5.text;
table1.fields[6].asstring:=edit6.text;
bitbtn7.enabled:=true;//se habilita para tener la posibilidad de editar este u otro registro
bitbtn8.enabled:=false;//se inhabilitan porque no est en modo de edicion as que no hay
bitbtn9.enabled:=false;//nada que validar o cancelar.
table1.post;//se llama al mtodo post para que guarde en la tabla el cambio o registro
end;

34
procedure TForm1.BitBtn9Click(Sender: TObject);//el botn de cancelar
begin
table1.cancel;//se llama al mtodo cancel para que cancele lo que hayas hecho
bitbtn7.enabled:=true;//se habilita para tener la posibilidad de editar este u otro registro
bitbtn8.enabled:=false;//se inhabilitan porque no est en modo de edicin as que no hay
bitbtn9.enabled:=false;//nada que validar o cancelar.
end;
procedure TForm1.BitBtn10Click(Sender: TObject);//botn de deshacer
begin
table1.cancel;//se llama al mtodo cancel para que cancele lo que hayamos tratado de hacer
bitbtn7.enabled:=true;//se habilita para tener la posibilidad de editar este u otro registro
bitbtn8.enabled:=false;//se inhabilitan porque no est en modo de edicin as que no hay
bitbtn9.enabled:=false;//nada que validar o cancelar
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).
Ahora pongamos en los procedimientos de los botones de ir al principio, anterior,
prximo, ltimo, eliminar, cancelar y deshacer o sea en los bitbtn1, 2, 3 ,4, 6, 9, 10 la
llamada a este procedimiento. Lo pondremos justo debajo de la llamada al mtodo que
necesita el botn para realizar su tarea. Por ejemplo al botn 1 de ir al principio se pone:
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.
4.7- Bsquedas y marcas.
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:

El mtodo FindKey (componente tTable)

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:
table1.FindKey(['79111645960',16]); // observe que el campo edad puede ser escrito entre
//comillas o no porque es un campo de tipo entero.

El mtodo FindNearest (tTable)

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.

Este mtodo tiene la siguiente estructura:


Locate(campo de bsqueda, dato a buscar, opcin) donde:
Campo de bsqueda: Es el nombre del campo donde se va a buscar.
Dato a buscar: Es el dato que vas a buscar en este campo para ver si se encuentra.
Opcin: Es una constante que puede tener dos valores.
loCaseInsensitive: Busca con independencia de mayscula o minscula, o sea sin
importar si el texto a buscar est escrito con mayscula o minscula.
loPartialKey: Busca el texto que comience exactamente con el primercaracter de la
cadena que mandaste buscar.
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.
L:=table1.locate('nombre', 'O' ,[locaInsensitive]);
Si deseas buscar los nombres que comiencen con (a) sera:
L:=table1.locate('nombre', 'a',[]);

37
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.
El mtodo Locate es un nuevo procedimiento de bsqueda agregado en las ltimas
versiones de Delphi. En breve, este mtodo determina cul es la forma ms rpida y
eficiente de cumplir con nuestro pedido de bsqueda de datos, y lo ejecuta; si existe un
ndice se utiliza y si no, la bsqueda ser un poco ms lenta pero se realizar igual.
Ejercicio sobre bsqueda.
1- En el ejercicio de trabajo con el Dbnavigator en la seccin 4.5.3, hagamos una
bsqueda de datos de la siguiente forma.
a- Hagamos una bsqueda sobre un ndice principal que crearemos el cual incluir el
carn de identidad y la edad.
b- Hagamos una bsqueda de un carn de identidad pero que no nos diga si lo encontr
o no, tan solo nos muestre el registro que cumple con estas condiciones.
c- Hagamos una bsqueda de un nombre y busque este nombre que se escriba
exactamente igual a l.
d- Hagamos una bsqueda de un nombre y busque este nombre sin importar si estn
escritos diferentes mientras diga el mismo nombre.
e- Hagamos una bsqueda de un nombre dndole el primer carcter de ese nombre.
Solucion por fases.(inc a)

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

Fase de diseo - ejecucin.

Inciso a.
1- En el evento Onclic de este botn escribiremos el siguiente cdigo:

38

procedure TForm1.Button2Click(Sender: TObject);


begin
table1.FindKey([edit1.text,edit2.text]);// buscar los textos escritos en el edit1 y 2 en los
//indices primarios C.I y edad.
end;
Inciso b.
1- En el evento Onclic de este botn escribiremos el siguiente cdigo:
procedure TForm1.Button2Click(Sender: TObject);
begin
table1. FindNearest ([edit1.text,edit2.text]);// buscar los textos escritos en el edit1 y 2 en
//los indices primarios C.I y edad.
end;
Inciso c.
1- Escribamos el siguiente cdigo en el evento Onclic de este botn:
procedure TForm1.Button4Click(Sender: TObject);
var l:boolean;//variable boolena para que almacene el valor true si lo encuentra o false
//dependencia de si lo encontr o no.
begin
L:=table1.locate('nombre', edit3.text,[]);//a la variable L se le asigna un valor booleano
//que se corresponde con el resultado de la bsqueda realizada. Observe que el
//corchete est vaco indicando que la bsqueda ser de un valor que sea idntico a l.
if L then //se le pregunta a L para saber que mensaje mostrar como resultado de la
//bsqueda
showmessage('el nombre '+edit3.text+' si aparece en la tabla')
else
showmessage('el nombre '+edit3.text+' no aparece en la tabla o esta mal escrito')
end;
Inciso d.
1- Escribamos este cdigo en el evento OnClic del botn.
procedure TForm1.Button5Click(Sender: TObject);
var l:boolean;
begin
L:=table1.locate('nombre', edit3.text,[loCaseInsensitive]);// aqu locaseinsensitive indica
//que la bsqueda ser de cualquier texto que coincida sin
importar //que se hayan intercambiado maysculas por minsculas o
viceversa.

39
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.
1- Escribamos este cdigo en el evento OnCLic de este botn:
procedure TForm1.Button6Click(Sender: TObject);
var l:boolean;
begin
L:=table1.locate('nombre', edit3.text,[lopartialkey]);// aqu lopartialkey indica que la
//bsqueda ser de cualquier texto que comience con el primer
//carcter del texto buscado.
if l then
showmessage('el nombre '+table1.fieldbyname('nombre').asstring+' comienza con
'+edit3.text)
else
showmessage('no hay ningun nombre que comience con '+edit3.text)
end;
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.
GetBookmark: crea un marcador a la posicin actual del cursor en la tabla.
GotoBookmark: mueve el cursor al marcador dado como parmetro.
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

El marcador ms sencillo y que es el que vamos a utilizar es utilizando el componente


Tbookmarkstr . Para hacer uso de este marcador tienes que declarar una variable del tipo
Tbookmarkstr. Ahora veamos un pequeo ejercicio donde se utiliza la bsqueda y los
marcadores, primero lo haremos de una forma ms compleja o sea sin valernos de las
herramientas que nos brinda el Delphi para hacer las bsquedas y luego lo haremos con las
herramientas del Delphi para ver que no siempre es necesario las herramientas de Delphi y
as desarrollar un poco los conocimientos adquiridos, porque en un final las funciones y
mtodos que nos brinda Delphi no es ms que un conjunto de estas que Delphi trae y que al
nosotros hacer referencia a ellas l las ejecuta.
Ejercicio sobre bsqueda.
1- Hagamos una bsqueda de un nombre sin utilizar ninguno de los mtodos de
bsqueda conocidos anteriormente.
a- Introduzcamos los marcadores para mantener la posicin del cursor en el registro
donde estamos trabajando antes de hacer la bsqueda.
Solucion por fases.(inc a)

Fase de diseo.

1- Para realizar este ejercicio colocaremos en el ejercicio anterior otro groupbox y


dentro de l colocaremos un botn para hacer la bsqueda y un edit para introducir
el texto a buscar.
2- Para el inciso b necesitamos insertar otro botn dentro del groupobox al cual le
pondremos el texto buscar y marcar.

Fase de diseo ejecucin.

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.
procedure TForm1.Button7Click(Sender: TObject);
var i:integer;
begin
table1.first; //colocamos el cursor en el primer registro para as comenzar la bsqueda.
for i:=1 to table1.recordcount do //havemos n ciclo desde 1 hasta l cantidad de
//registros que tenga la tabla.
begin
if table1.fieldbyname('nombre').asstring=edit4.text then //preguntamos si el texto del
//registro activo en este momento es igual al nombre que
//hemos mandado a buscar.

41
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.
1- Vamos ahora a darle solucin al problema de que al encontrar el registro que
coincide con el dato a buscar el programa coloca el cursor en el este registro
mostrando sus datos. Ahora introduciremos un marcador para marcar la
posicin del registro donde estamos para luego de la bsqueda mandar a
colocar el cursor en la posicin que indica el marcador y as poder continuar
trabajando en el registro que estbamos.
2- Para solucionar este problema tenemos que declarar una variable que ser
del tipo TBookmarkstr , asignarle antes de comenzar la bsqueda la
posicin del cursor en la tabla y luego que termine la bsqueda asignarle al
cursor de la tabla la marca que est guardada en la variable. Entonces en el
botn que buscar y marca escribiremos el siguiente cdigo.
procedure TForm1.Button8Click(Sender: TObject);
var p:tbookmarkstr;//variable en la cual se va a guardar la marca
i:integer;//variable de ciclo
begin
p:=table1.Bookmark;//se hace la marca y se le asigna a p
table1.first; //ya los vimos anteriormente
for i:=1 to table1.recordcount do //ya lo vimos anteriormente
begin
if table1.fieldbyname('nombre').asstring=edit4.text then
begin
showmessage('el nombre esta en la lista');
table1.bookmark:=p; //luego de encontrar el registro coincidente vuelve a colocar el
//cursor donde estaba antes de comenzar la bsqueda.
exit;
end;
table1.next;
end;
showmessage('el nombre no esta en la lista');
table1.bookmark:=p; // si no encontr un registro que coincida que coloque entonces el
//cursor donde estaba antes de comenzar la bsqueda.

42
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.
Nota: Si quisieras trabajar con los punteros Getbookmark, gotobookmark y
freebookmark, tan slo tendras que hacer las siguientes sustituciones.
p:Tbookmarkstr por p:pointer
p:=table1.Bookmark por - p:=table1.getBookmark
Adems debemos aadir una lnea de cdigo para liberar los recursos ocupados por el
bookmark.
table1.FreeBookmark(p);

S-ar putea să vă placă și