Anda di halaman 1dari 30

2/3/2003

Prctica 3. Componentes de BD en Delphi


Laboratorio de Ingeniera del Software
Antonio Garrido
Eliseo Marzal
M Carmen Penads

ndice
1. Qu es un componente de BD?
2. Componentes de acceso a datos
3. Controles de visualizacin de datos
4. Dos ejemplos sencillos. Trabajo bsico con tablas
5. Operaciones sobre conjuntos de datos (TDataSet )
6. Campos. El componente TField
7. TTable con ms detalle
8. TQuery con ms detalle
9. Mdulos de datos (TDataModule)
LIS 2003 - 2

2/3/2003

Qu es un componente de BD?

Definicin: es el objeto que permite trabajar con


BD en Delphi, bien sea para acceder a los datos
de la BD (DataAccess) o para visualizar informacin asociada a la BD (DataControls)

Los componentes de BD conectan el programa


de forma transparente a las fuentes de datos

componentes de acceso a los datos

controles de visualizacin
de datos
LIS 2003 - 3

Componentes de acceso a datos

No tienen representacin grfica en la IGU

Proporcionan la conexin a los datos simplificando


el acceso a las BD mediante la encapsulacin de
la informacin sobre la fuente de datos

Sus propiedades determinan la BD, la tabla y los


registros a los que se accede

Algunos ejemplos tpicos son: TTable, TQuery,


TDataSource...
LIS 2003 - 4

2/3/2003

Componentes de acceso a datos

Los conjuntos de datos que manejan las aplicaciones de BD descienden de la clase TDataSet
TDataSet
TClientDataSet

TBDEDataSet

TNestedTable
TTable

TDBDataSet
Jerarqua de conjuntos de datos
en Delphi

TQuery
TStoredProc

LIS 2003 - 5

Componentes de acceso a datos

TTable
representa a una tabla relacional, conectando la
aplicacin con la tabla de la BD (esta conexin es
en los dos sentidos
aplicacin tabla de la BD
propiedades:
DatabaseName: directorio donde est la BD o alias que
contiene la tabla (si es una BD en SQL)
TableName: nombre de la tabla a acceder
Active: indica si la TTable est abierta o no
Filter, Filtered, Fields, IndexName, Exclusive
LIS 2003 - 6

2/3/2003

Componentes de acceso a datos

TQuery
permite acceder a los datos de una BD mediante
sentencias SQL (locales o en servidores SQL)
ms verstil que TTable pues no necesita estar
asociada a una tabla en concreto
propiedades:
DatabaseName: directorio donde est la BD o alias que
contiene la tabla (si es una BD en SQL)
SQL: sentencia SQL a ejecutar (se puede construir con el
asistente SQL Builder)
Active: indica si la TQuery est abierta o no
Filter, Fields, RequestLive, UniDirectional, Params
LIS 2003 - 7

Componentes de acceso a datos

TDataSource
acta como un interfaz enlazando un componente
de acceso a datos (TTable o TQuery) con un control de visualizacin de datos
tambin se utiliza para vincular tablas o consultas
en formularios maestro / detalle
propiedades:
DataSet: fuente de datos que proporciona los datos de la
BD (generalmente un TTable o TQuery)
Enabled: indica si la conexin est realmente activa o no
AutoEdit
LIS 2003 - 8

2/3/2003

Componentes de acceso a datos

TDataBase
encapsula la conexin a una BD completa
resulta especialmente til cuando se desea
un control explcito de las transacciones
gestionar logins personalizados de conexin
gestin dinmica de alias

propiedades:

DatabaseName: nombre de la BD (directorio o alias)


Connected: indica si la conexin con la BD est activa
SessionName: nombre de la sesin utilizada
LoginPrompt, KeepConection, Exclusive...
LIS 2003 - 9

Componentes de acceso a datos

Consideraciones importantes:
los componentes TTable y TQuery contienen un
grupo de componentes TField que se corresponden
con los campos (columnas) de la tabla. Estos
TField se crean:
automticamente al activarse el TTable o TQuery
durante el diseo (Fields Editor...) con el nombre de la
tabla o query concatenado con el nombre del campo.
Ej. Table1Area, MiQueryApellidos

una aplicacin que visualice datos de una BD deber contar obligatoriamente con un DataSet y un
DataSource
LIS 2003 - 10

2/3/2003

Controles de visualizacin de datos

Incluyen controles tradicionales para visualizar


datos asociados a BD

Son como los controles estndar, pero su contenido se recupera directamente de algn campo de
una tabla o incluso de una tabla completa

Todos tienen la propiedad DataSource indicando


el enlace entre el control y la fuente de datos

No garantizan la integridad de los datos

Algunos ejemplos son: TDBGrid, TDBEdit,


TDBText, TDBNavigator...
LIS 2003 - 11

Controles de visualizacin de datos

TDBEdit
cuadro de edicin para mostrar y modificar los datos de un campo del registro activo en la BD
propiedades:

DataField: campo de la tabla con el que est asociado


Text: con el valor del campo asociado en DataField
MaxLegth: longitud mxima permitida en el control
AutoSelect, AutoSize, Modified, PasswordChar (con el
mismo significado que en un TEdit)

lo que aparezca en este control es lo que aparecer


en el campo de la tabla de la BD (la asociacin es
bidireccional)
LIS 2003 - 12

2/3/2003

Controles de visualizacin de datos

De forma similar se pueden utilizar los controles:


TDBText: muestra un campo que no se desea modificar
TDBMemo y TDBRichEdit: memo que contiene
mltiples lneas de texto plano (o RTF)
TDBCheckBox: casilla de verificacin
TDBRadioGroup: muestra un conjunto de radio
buttons
TDBImage: imagen de mapa de bits
TDBListBox y TDBComboBox: muestran una lista
de posibles valores para un campo
LIS 2003 - 13

Controles de visualizacin de datos

Componentes Lookup o cuadros de referencia:


TDBLookupListBox y TDBLookupComboBox

visualizan valores de campos de una tabla principal relacionada con una secundaria mediante una clave ajena
propiedades:
DataSource: qu fuente proporciona los datos a editar
(tabla principal)
de tabla

DataField: campo a editar para enlazar con la tabla


principal
que contiene los datos a visualizar (clave ajena)
ListSource: qu fuente proporciona los datos a visualizar (tabla secundaria, donde est la clave ajena)
de tabla
KeyField: campo de ListSource igual a DataField (suesecundaria
le ser la clave primaria de tabla secundaria)
ListField: campo de ListSource a visualizar
LIS 2003 - 14

2/3/2003

Controles de visualizacin de datos

TDBGrid
visualiza una tabla completa de una BD que se puede modificar (todo ello en forma de tabla o rejilla)
propiedades:
Options: personaliza la forma en que se aparece y se
comporta el grid (editable, bordes, multiseleccin...)
con el editor de
columnas (Columns
Editor...) se puede
limitar las columnas
a visualizar, modificar el orden, etc.
LIS 2003 - 15

Controles de visualizacin de datos

TDBControlGrid
visualiza campos de una tabla en una rejilla de controles definida por el usuario
propiedades:
AllownInsert, AllownDelete: si se permite insertar y eliminar registros
Orientation: si los registros
aparecern en bandas horizontales o verticales
RowCount y ColCount: n
de campos que se muestran
simultneamente
LIS 2003 - 16

2/3/2003

Controles de visualizacin de datos

Consideraciones importantes sobre las rejillas


inicialmente no cuenta con definiciones de columnas (se recuperan de los campos asociados)
slo se puede personalizar la rejilla en diseo si se
conocen los campos de la tabla asociada
Con el editor de columnas se pueden
modificar muchas propiedades de cada campo:
alineacin, color, fuente, ttulo...
Editor de
columnas

estilo del botn, tipo combobox con


sus valores (picklist)...
LIS 2003 - 17

Controles de visualizacin de datos

TDBNavigator
permite desplazarse por los datos de una tabla
mediante el uso de botones, adems de realizar
operaciones de insercin, modificacin, borrado...
propiedades:
VisibleButtons: determina los botones a visualizar
ShowHints: indica si se deben mostrar los hints
Hints: permite modificar los hints para cada uno de los
botones
ConfirmDelete, Flat...

LIS 2003 - 18

2/3/2003

Dos ejemplos sencillos

DataBaseName: DBDEMOS
TableName: animals.dbf
Active: True

DataSource: MiDataSrc
DataField: Name

DataSet: TablaAnimals

DataSource: MiDataSrc
DataSource: MiDataSrc
LIS 2003 - 19

Dos ejemplos sencillos


DataSet: TablaBiolife
DataBaseName: DBDEMOS
TableName: biolife.db
Active: True

buttonStyle:
cbsEllipsis

DataSource: MiDataSrc

DataSource: MiDataSrc
DataField: Graphic

DataSource: MiDataSrc
DataField: Notes
LIS 2003 - 20

10

2/3/2003

Operaciones sobre conjuntos de datos

Estados del DataSet


Insert
Append
Post (sin
xito)

dsInsert

dsInactive

Close

Open

dsBrowse
Post (con xito)
Delete
Edit
Cancel

La propiedad State (slo lectura)


indica el estado actual del DataSet
El evento OnStateChange indica el
cambio de estado
Existen otros estados manejados automticamente
y no visibles por la aplicacin:

SetKey*
SetRange*
EditKey*

dsSetKey

Post Cancel
Gotokey* Findkey*
ApplyRange* CancelRange*

Post (con xito)


Delete Cancel

dsEdit
*

slo TTable

Post (sin xito)

dsCurValue, dsNewValue, dsOldValue, dsCalcFields,


dsFilter
LIS 2003 - 21

Operaciones sobre conjuntos de datos

Apertura de un DataSet
DataSet.Active := True
DataSet.Open

Cierre de un DataSet
DataSet.Active := False
DataSet.Close

La propiedad Active se puede utilizar en tiempo de


diseo (mediante el Object Inspector) y en tiempo
de ejecucin. Los mtodos slo en ejecucin
LIS 2003 - 22

11

2/3/2003

Operaciones sobre conjuntos de datos

Desplazamiento por un DataSet


DataSet.First primer registro
DataSet.Last ltimo registro
DataSet.Prior anterior registro
DataSet.Next siguiente registro
DataSet.MoveBy (n registros) desplaza n

Bof y Eof indican si estamos al principio o al final


del DataSet

En iteraciones deshabilitar controles

>0
<0

DisableControls
EnableControls
LIS 2003 - 23

Operaciones sobre conjuntos de datos

Insercin en un DataSet
DataSet.Insert inserta registro
DataSet.Append aade registro (al final)
el DataSet se queda en estado dsInsert (CanModify
debe estar a True)

Insercin de registros enteros


Realizan
un post
implcito

DataSet.AppendRecord ([Values])
DataSet.InsertRecord ([Values])

MiTabla.AppendRecord([MiNombre,MiApellido, Null])
LIS 2003 - 24

12

2/3/2003

Operaciones sobre conjuntos de datos

Edicin de un DataSet
DataSet.Edit edita registro actual
AutoEdit del DataSource = True
el DataSet se queda en estado dsEdit (CanModify
debe estar a True y ReadOnly a False)

Modificacin de los campos de un DataSet


DataSet.SetFields ([Values])
MiTabla.SetFields([Nuevo nombre, Nil, Nueva direc.])
No sobrescribe informacin
LIS 2003 - 25

Operaciones sobre conjuntos de datos

Eliminacin de datos
DataSet.Delete elimina el registro actual y
deja el DataSet en estado dsBrowse

Almacenamiento en un DataSet
DataSet.Post para que la insercin / modificacin tenga efecto (imprescindible). Deja al
DataSet en estado dsBrowse

Cancelacin de cambios
DataSet.Cancel deshace los cambios y deja el DataSet en estado dsBrowse
LIS 2003 - 26

13

2/3/2003

Operaciones sobre conjuntos de datos

Bsquedas

Set Of (loCaseInsensitive, loPartialKey)

DataSet.Locate
Locate (const campos: string; const valores: Variant;
Opciones: TLocateOptions): Boolean

devuelve True si se encuentra el registro (y pasa a


ser el registro actual) y False si no se encuentra (el
registro actual no cambia)
MiTabla.Locate (Compania,MiCompania,[])
MiTabla.Locate (Compania;Contacto;Telefono,
VarArrayOf ([MiCompania,Persona,12345]),
[loPartialKey])
Array variante
LIS 2003 - 27

Operaciones sobre conjuntos de datos

Bsquedas
DataSet.Lookup
Lookup (const campos: string; const valores: Variant; const
CamposSolicitados: string): Variant

devuelve un array variante con los valores de los


CamposSolicitados y Null en caso contrario (en
ningn caso modifica el registro actual)
Rdo := MiTabla.Lookup(Compania,MiCompania, Compania;
Contacto;Telefono)
if VarType(Rdo) <> varNull then
ShowMessage (Format(%s, contactar con %s en telf.%s,
[Rdo[0], Rdo[1], Rdo[2]]))
LIS 2003 - 28

14

2/3/2003

Operaciones sobre conjuntos de datos

Filtrados para restringir la vista de los datos


propiedades: Filter, FilterOptions y Filtered
evento: OnFilterRecord

Los pasos necesarios son:

foCaseInsensitive,
foNoPartialCompare

1. Crear el filtro (Filter)


2. Definir las opciones del filtro (FilterOptions)
3. Activar el filtro (Filtered)
Slo estarn disponibles los registros que cumplan el
filtro. Una vez se desactive el filtro (Filtered = False),
todos los registros volvern a estar disponibles se

trata de una condicin temporal

LIS 2003 - 29

Operaciones sobre conjuntos de datos

Ejemplo de creacin de filtros


utilizando la propiedad Filter
Dataset1.Filter:= Ciudad=Valencia (en el ObjectBrowser)
Dataset1.Filter:= Ciudad=Valencia (por cdigo)

condicin de filtro en una sola cadena


puede cambiarse en tiempo de ejecucin

asociando un mtodo al evento OnFilterRecord


Procedure TForm1.Table1FilterRecord (DataSet: TDataSet;
var Accept: Boolean);
Begin
Accept:= DataSet[Ciudad]=Valencia;
End;

condiciones de filtrado ms complejas (funciones, bucles...)


puede cambiarse en tiempo de ejecucin
LIS 2003 - 30

15

2/3/2003

Operaciones sobre conjuntos de datos

Desplazamiento entre el conjunto de datos con


filtro
DataSet.FindFirst primer registro que
cumple el filtro
DataSet.FindLast ltimo registro
DataSet.FindNext siguiente registro
DataSet.FindPrior anterior registro
devuelven True si se ha encontrado algn registro
que cumpla el filtro (y posiciona el cursor en l)
slo tienen efecto si se ha definido un filtro. Si est
inactivo lo activan temporalmente
LIS 2003 - 31

Operaciones sobre conjuntos de datos

Marcado de registros: Bookmarks


identifica a un puntero que marca una posicin en
un DataSet para poder volver rpidamente a l
propiedad
BookMark con el marcador actual

mtodos
GetBookMark genera un BookMark al registro actual
GotoBookMark (TBookMark) salta a un BookMark
FreeBookMark (TBookMark) libera el BookMark
BookMarkValid (TBookMark) BookMark en uso?
CompareBookMark (TBookMark1, TBookMark2)
LIS 2003 - 32

16

2/3/2003

Operaciones sobre conjuntos de datos

Ejemplo de marcado de registros


var
BMark: TBookMark;
Begin
BMark := MiTabla.GetBookMark; {capturamos el cursor de la tabla}
{moverse y realizar operaciones sobre la tabla}
MiTabla.BookMark:=BMark; {restauramos el cursor de la tabla}
End;

Se pueden mantener colecciones de BookMarks


mediante TBookMarkList
LIS 2003 - 33

Operaciones sobre conjuntos de datos

Eventos de cambio de estado


cuando un DataSet cambia de estado se produce
alguno de los siguientes eventos Before o After
BeforeOpen, AfterOpen mtodo Open
BeforeClose, AfterClose mtodo Close
BeforeInsert, AfterInsert mtodo Insert
BeforeEdit, AfterEdit mtodo Edit
BeforePost, AfterPost mtodo Post
BeforeCancel, AfterCancel mtodo Cancel
BeforeDelete, AfterDelete mtodo Delete
LIS 2003 - 34

17

2/3/2003

Operaciones sobre conjuntos de datos

Existen otros eventos que se lanzan cuando se


produce una excepcin en la ejecucin de alguna
operacin
OnDeleteError Delete errneo
OnEditError Edit errneo
OnPostError Post errneo

Otros eventos
OnNewRecords se crea un nuevo registro
OnCalcFields es necesario recalcular el
valor para un campo calculado
LIS 2003 - 35

Operaciones sobre conjuntos de datos

Ejemplos con eventos de cambio de estado


generacin automtica de un identificador para cada
nuevo registo
Procedure TForm1.Table1AfterInsert (DataSet:TDataSet);
Begin
Inc (Identificador); DataSet[cod]:= Identificador;
End;

cerrar una tabla almacenando los cambios


Procedure TForm1.Table1BeforeClose (DataSet:TDataSet);
Begin
if Application.MessageBox(Cerrando tabla...,Guardar?,
mb_IconQuestion+mb_YesNo)=IdYes
Then DataSet.Post;
End;
LIS 2003 - 36

18

2/3/2003

Campos. El componente TField

Encapsula el comportamiento de todos los campos


de una tabla, permitiendo:
acceder a cada uno de los campos
definir campos calculados y de referencia
convertir el valor de un campo de un tipo a otro
especificar propiedades de visualizacin

Se pueden crear automticamente en tiempo de


ejecucin o en tiempo de diseo sobre la propiedad Fields (mediante Fields Editor...)
LIS 2003 - 37

Campos. El componente TField


Fields Editor...
Definicin de un
nuevo campo

Campos
seleccionados

Campos
disponibles
en la BD

Tipo de campo:
Dato
Calculado
Lookup

LIS 2003 - 38

19

2/3/2003

Campos. El componente TField

La forma de acceder a los campos en tiempo de


ejecucin es:
mediante la propiedad Fields (que es un array de
campos [0..DataSet.FieldCount-1])
mediante el nombre del campo con el mtodo
FieldsByName(NombreCampo)
mediante el nombre explcitamente creado en tiempo de diseo: NombreDataSet+NombreCampo
para acceder al valor de los campos se puede usar
la propiedad Value o las propiedades As+Tipo
LIS 2003 - 39

Campos. El componente TField

Ejemplo de acceso al valor de un campo TField


MiTabla.Fields[0].AsString
MiTablaFechaActual.AsDateTime
MiTabla.Fields[1].Value
MiTabla.FieldByName(ValorActual).AsFloat

Algunas propiedades del TField:


FieldName, con el nombre del campo de la tabla
FieldNo, con el n de orden que tiene en la tabla
FieldKind, con el tipo de campo al que representa
(calculado, lookup, de datos, etc.)
Text, IsNull, IsIndexField, Required...
LIS 2003 - 40

20

2/3/2003

Campos. El componente TField

Eventos de un campo TField


OnChange tras cambiar el dato
OnGetText tras referenciar a la propiedad Text
OnSetText tras modificar la propiedad Text
OnValidate utilizado para validar el dato

Ejemplo
Procedure TForm1.Table1FechaValidate(Sender: TField);
Begin
if Table1Fecha.AsDateTime > Now Then
Raise Exception.Create('No puede ser una fecha futura');
End;
LIS 2003 - 41

Campos. El componente TField

Campos calculados
se utiliza un campo calculado cuando su valor se
puede obtener de los datos existentes en el registro
(desde Fields Editor... | New field | Calculated)
su valor se debe calcular en tiempo de ejecucin en
respuesta al evento OnCalcFields del DataSet
ejemplo
Procedure TForm1.Table1CalcFields(DataSet: TDataset);
Begin
MiTablaDensidad.Value := MiTablaMasa.Value /
MiTablaVolumen.Value;
End;
LIS 2003 - 42

21

2/3/2003

Campos. El componente TField

Campos de referencia (lookup)


se utiliza un campo lookup cuando se necesita
referenciar a un campo definido en otra tabla distinta
(desde Fields Editor... | New field | Lookup)

Campo que sirve de


base al nuevo campo
(C. Ajena)

Campo sobre el
que buscamos en
el Dataset especificado
(campo en Table2)

Dataset sobre el que


queremos buscar
(otra tabla adicional)

Campo del Dataset


que deseamos mostrar
(campo en Table2)
LIS 2003 - 43

Campos. El componente TField

Ejemplo de campos de referencia (lookup)


dada una tabla de pedidos, se desea visualizar la
informacin de la misma y tambin el nombre de la
compaa a la que pertenece el proveedor

Campo lookup
LIS 2003 - 44

22

2/3/2003

TTable con ms detalle

Formularios maestro / detalle


establece relaciones uno a muchos entre dos tablas
Tabla Orders.DB de
DBDEMOS

Tabla Customer.DB
de DBDEMOS
DataSource enlaza
la tabla con el Grid

MasterSource de la
tabla con DataSource
maestra
MasterFields de la
tabla con el campo
comn a ambas
tablas (separadas por
; si hay varios)
join en IndexName
DataSource enlaza la
tabla con el Grid
LIS 2003 - 45

TTable con ms detalle

Asistente de formularios de BD
(Repository | Business | DataBase Form Wizard)

facilita la creacin de formularios que trabajan con


BD (incluso maestro / detalle)

LIS 2003 - 46

23

2/3/2003

TTable con ms detalle

Bsqueda especfica en tablas basada en campos indexados


SetKey + GotoKey

(FindKey)

SetKey + GotoNearest

(FindNearest)

es necesario que los campos por los que se busque


estn indexados
si la bsqueda no se realiza por el ndice primario
de la tabla, se debe introducir el nombre del ndice
secundario a utilizar en la propiedad IndexName
(para cambiar esta propiedad la tabla debe estar
cerrada)
LIS 2003 - 47

TTable con ms detalle

Ejemplo de bsquedas sobre campos indexados


mediate GotoKey

permite que la asignacin siguiente


no modifique el valor del campo

MiTabla.SetKey;
MiTabla.FieldByName(Capital).AsString := Madrid;
MiTabla.GotoKey;

devuelve True si se encuentra y


posiciona el cursor en el registro

mediate GotoNearest

mueve el cursor al registro que

ms se parece
MiTabla.SetKey;
MiTabla.FieldByName(Capital).AsString := Madrid;
MiTabla.GotoNearest;

FindKey y FindNearest simplifican la bsqueda


LIS 2003 - 48

24

2/3/2003

TTable con ms detalle

Utilizacin de rangos sobre campos indexados


delimita un conjunto consecutivo de registros comprendidos entre unos lmites marcados
flexibilidad vs. eficiencia: los filtros son ms flexibles, pero los rangos son ms eficientes al delimitar
un bloque consecutivo de registros
creacin y aplicacin de rangos
1. SetRangeStart y asignar valor de inicio del rango
2. SetRangeEnd y asignar valor de final de rango
3. ApplyRange
LIS 2003 - 49

TTable con ms detalle

Ejemplo de creacin de rango


With MiTabla Do Begin
SetRangeStart;
FieldValues[NumCliente ]:=1;
SetRangeEnd;
FieldValues[NumCliente ]:=15;
ApplyRange;
End;

{empieza la definicin del rango}


{fin de la definicin del rango}
{activa el rango}

SetRange (const ValorInicial, ValorFinal: array of const)


simplifica la definicin del rango:
MiTabla.SetRange([1], [15]);

un rango se cancela mediante CancelRange y se


puede volver a aplicar mediante ApplyRange
LIS 2003 - 50

25

2/3/2003

TTable con ms detalle

Creacin de tablas en ejecucin mediante el componente TTable


mtodo CreateTable
var Tabla: TTable;
begin
Tabla:=TTable.Create(Self);
with Tabla do begin
{Tabla.Exists indica si la tabla existe}
DatabaseName:= 'DBDEMOS';
{ubicacin de la tabla}
TableName:= 'IMG.DB';
TableType:= ttParadox;
{tipo de la tabla}
FieldDefs.Add('Codigo',ftstring,10,true);
{campos de la tabla}
FieldDefs.Add('Descripcin',ftstring,20,false);
FieldDefs.Add('Fecha',ftstring,10,false);
IndexDefs.Add('Codigo','Codigo',[ixPrimary,ixUnique]); {ndices}
CreateTable;
{se crea la tabla}
end;
end;
LIS 2003 - 51

TTable con ms detalle

Otros mtodos para trabajar con TTable en tiempo


de ejecucin:
EmptyTable: elimina todos los registros de la tabla
(pero mantiene su estructura, ndices, etc.)
DeleteTable: elimina la tabla
RenameTable: renombra la tabla
LockTable: bloquea la tabla ante lectura / escritura
por otras aplicaciones
UnlockTable: desbloquea la tabla para que pueda
ser leda / escrita por otras aplicaciones
LIS 2003 - 52

26

2/3/2003

TQuery con ms detalle

La principal ventaja es que se puede trabajar con


sentencias SQL (siguiendo el estndar SQL-92)
con SQL Builder...

directamente sobre la
propiedad SQL
LIS 2003 - 53

TQuery con ms detalle

La sentencia SQL tambin se puede modificar en


ejecucin
mediante cdigo
MiQuery.Close;
{se cierra la query para modificar SQL}
MiQuery.SQL.Clear;
{se vaca el contenido de SQL}
MiQuery.SQL.Add (Select * From Customer where State = +
StateEdit.Text + );
{nueva sentencia}
MiQuery.Prepare;
MiQuery.Open;

{optimiza el rendimiento en servidores remotos}


{se abre de nuevo la query, ejecutndose}

leyndola de un fichero de texto


MiQuery.Close;

{se cierra la query para modificar SQL}

MiQuery.SQL.LoadFromFile (NombreFichero);
{nueva sentencia}
MiQuery.ExecSQL;
{ejecuta la query que no devuelve registros}
LIS 2003 - 54

27

2/3/2003

TQuery con ms detalle

Las sentencias SQL pueden ser estticas o dinmicas, segn estn totalmente instanciadas o no
Cmo hacer una sentencia SQL dinmica?
utilizando parmetros en la sentencia (precedidos por :)
se da valores a los parmetros mediante Query.Params[ ]: Por
ejemplo, Query.Params[0].AsString:= MiNombre

utilizando el mtodo ParamByName que permite acceder al parmetro de la Query por su nombre:
Query.ParamByName(Total).AsInteger:=1000

construyendo la sentencia directamente (funciones de


formateo de cadenas)
SQL.Add (Format (Select * from %s Order By %s, [Tabla,
CampoOrden]))
LIS 2003 - 55

TQuery con ms detalle

Ejemplo de SQL dinmica


SELECT *
FROM "Persona.db"
WHERE Nombre = :par_nombre And
Apellidos = :par_apellidos

Propiedad SQL del query


con la definicin de 2 parmetros
Ejecucin de la SQL

:par_nombre
:par_apellidos

With Query Do
Begin
Close;
ParamByName(par_nombre) Params[0].AsString := EditNombre.Text;
ParamByName(par_apellidos) Params[1].AsString := EditApellidos.Text;
Open;
End;
Es imprescindible darle valor a
todos los parmetros !
LIS 2003 - 56

28

2/3/2003

TQuery con ms detalle

Formularios maestro / detalle


se construyen enlazando la sentencia SQL a travs de la
clusula where que contendr un parmetro que se instanciar con el campo del mismo nombre de la query
maestra
adems, la propiedad DataSource del query detalle deber conectarse con el DataSource asociado al query
maestro
Query1

DataSource

Select * From Customer

Query2

Select * From Orders


DataSource
Where CustNo = :CustNo
Query3

Select * From Items


Where OrderNo = :OrderNo

LIS 2003 - 57

TQuery con ms detalle

Ejemplo de formularios maestro / detalle


Query1

Query2

Query3

LIS 2003 - 58

29

2/3/2003

TQuery con ms detalle

Mediante sentencias SQL se pueden crear tablas,


eliminar tablas, realizar joins, etc.
Crear una tabla:
create table prueba
(Nombre char(30), Apelidos char(40),
Direccion char(30), Ciudad char(20),
Provincia char(2), CodigoPostal char(10))

Borrar una tabla:


drop table prueba

Creacin de joins entre tablas:


select * from customer C, orders O, items I
where (C.custno = O.custno) and (O.orderno = I.orderno)
LIS 2003 - 59

Mdulos de datos

Un mdulo de datos (TDataModule) se utiliza como contenedor de componentes no visuales


son unos formularios especiales que centralizan los componentes
comunes de la aplicacin
la parte conceptual es independiente de la visual (en la
aplicacin se separa la parte
visual de la no-visual)
se definen una vez los componentes y se reutilizan en el
resto de la aplicacin
en el Repositorio:
New | Data Module
LIS 2003 - 60

30