Documente Academic
Documente Profesional
Documente Cultură
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
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.
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;
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)
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)
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.
18
19
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
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
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:
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).
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
30
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.
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:
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.
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.
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
Inciso a.
1- En el evento Onclic de este botn escribiremos el siguiente cdigo:
38
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
Fase de diseo.
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);