Upload
fizuma
View
256
Download
0
Embed Size (px)
Citation preview
7/26/2019 Componentes de BD en Delphi
1/30
Prctica 3. Componentes de BD en Delphi
Laboratorio de Ingeniera del Software
Antonio Garrido
Eliseo MarzalM Carmen Penads
LIS 2003 - 2
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)
7/26/2019 Componentes de BD en Delphi
2/30
LIS 2003 - 3
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 informa-
cin 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 visualizacinde datos
LIS 2003 - 4
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...
7/26/2019 Componentes de BD en Delphi
3/30
LIS 2003 - 5
Componentes de acceso a datos
Los conjuntos de datos que manejan las aplicacio-
nes de BD descienden de la clase TDataSet
Jerarqua de conjuntos de datos
en Delphi
TDataSet
TClientDataSet
TDBDataSet
TStoredProc
TQuery
TTable
TBDEDataSet TNestedTable
LIS 2003 - 6
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
7/26/2019 Componentes de BD en Delphi
4/30
LIS 2003 - 7
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 - 8
Componentes de acceso a datos
TDataSource
acta como un interfaz enlazando un componente
de acceso a datos (TTable o TQuery) con un con-
trol 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
7/26/2019 Componentes de BD en Delphi
5/30
LIS 2003 - 9
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 - 10
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 debe-
r contar obligatoriamente con un DataSet y un
DataSource
7/26/2019 Componentes de BD en Delphi
6/30
LIS 2003 - 11
Controles de visualizacin de datos
Incluyen controles tradicionales para visualizar
datos asociados a BD
Son como los controles estndar, pero su conte-
nido 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 - 12
Controles de visualizacin de datos
TDBEdit cuadro de edicin para mostrar y modificar los da-
tos 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)
7/26/2019 Componentes de BD en Delphi
7/30
LIS 2003 - 13
Controles de visualizacin de datos
De forma similar se pueden utilizar los controles:
TDBText: muestra un campo que no se desea mo-dificar
TDBMemo y TDBRichEdit: memo que contienemltiples lneas de texto plano (o RTF)
TDBCheckBox: casilla de verificacin
TDBRadioGroup: muestra un conjunto de radiobuttons
TDBImage: imagen de mapa de bits
TDBListBox y TDBComboBox: muestran una listade posibles valores para un campo
LIS 2003 - 14
Controles de visualizacin de datos
Componentes Lookup o cuadros de referencia:
TDBLookupListBox y TDBLookupComboBox visualizan valores de campos de una tabla principalrela-
cionada con una secundaria mediante una clave ajena
propiedades:DataSource: qu fuente proporciona los datos a editar
(tabla principal)
DataField: campo a editar para enlazar con la tablaque contiene los datos a visualizar (clave ajena)
ListSource: qu fuente proporciona los datos a visua-lizar (tabla secundaria, donde est la clave ajena)
KeyField: campo de ListSource igual a DataField (sue-le ser la clave primaria de tabla secundaria)
ListField: campo de ListSource a visualizar
de tabla
principal
de tabla
secundaria
7/26/2019 Componentes de BD en Delphi
8/30
LIS 2003 - 15
Controles de visualizacin de datos
TDBGrid
visualiza una tabla completa de una BD que se pue-
de 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, modi-ficar el orden, etc.
LIS 2003 - 16
Controles de visualizacin de datos
TDBControlGrid
visualiza campos de una tabla en una rejilla de con-
troles definida por el usuario
propiedades: AllownInsert, AllownDelete: si se permite insertar y elimi-
nar registros
Orientation: si los registros
aparecern en bandas hori-
zontales o verticales
RowCount y ColCount: n
de campos que se muestran
simultneamente
7/26/2019 Componentes de BD en Delphi
9/30
LIS 2003 - 17
Controles de visualizacin de datos
Consideraciones importantes sobre las rejillas
inicialmente no cuenta con definiciones de colum-
nas (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 ca-
da campo:
alineacin, color, fuente, ttulo...
estilo del botn, tipo comboboxcon
sus valores (picklist)...Editor decolumnas
LIS 2003 - 18
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...
7/26/2019 Componentes de BD en Delphi
10/30
LIS 2003 - 19
Dos ejemplos sencillos
DataBaseName: DBDEMOS
TableName: animals.dbfActive: True
DataSet: TablaAnimals
DataSource: MiDataSrc
DataSource: MiDataSrc
DataField: Name
DataSource: MiDataSrc
LIS 2003 - 20
Dos ejemplos sencillos
DataBaseName: DBDEMOS
TableName: biolife.db
Active: True
DataSet: TablaBiolife
DataSource: MiDataSrc
buttonStyle:
cbsEllipsis
DataSource: MiDataSrc
DataField: Notes
DataSource: MiDataSrc
DataField: Graphic
7/26/2019 Componentes de BD en Delphi
11/30
LIS 2003 - 21
Existen otros estados manejados automticamente
y no visibles por la aplicacin:
dsCurValue, dsNewValue, dsOldValue, dsCalcFields,dsFilter
Operaciones sobre conjuntos de datos
Estados del DataSet
dsEdit
dsBrowse dsSetKey
dsInactive
dsInsert
OpenClose
Post (sin xito)
Post (con xito)
Delete
CancelPost (con xito)
Delete Cancel
Edit
Post Cancel
Gotokey* Findkey*
ApplyRange* CancelRange*
* slo TTable
La propiedad State (slo lectura)indica el estado actual del DataSet
El evento OnStateChange indica el
cambio de estado
SetKey*
SetRange*
EditKey*Insert
Append
Post (sin
xito)
LIS 2003 - 22
Operaciones sobre conjuntos de datos
Apertura de un DataSet
DataSet.Active := True
DataSet.Open
Cierre de un DataSet
DataSet.Active := False
DataSet.Close
La propiedadActive se puede utilizar en tiempo de
diseo (mediante el Object Inspector) y en tiempo
de ejecucin. Los mtodos slo en ejecucin
7/26/2019 Componentes de BD en Delphi
12/30
LIS 2003 - 23
Operaciones sobre conjuntos de datos
Desplazamiento por un DataSet
DataSet.First
primer registroDataSet.Last ltimo registro
DataSet.Prior anterior registro
DataSet.Next siguiente registro
DataSet.MoveBy (n registros) desplaza n
Bofy Eofindican si estamos al principio o al final
del DataSet
En iteraciones deshabilitar controles
> 0
< 0
DisableControlsEnableControls
LIS 2003 - 24
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 (CanModifydebe estar a True)
Insercin de registros enteros
DataSet.AppendRecord ([Values])
DataSet.InsertRecord ([Values])
MiTabla.AppendRecord([MiNombre,MiApellido, Null])
Realizan
unpost
implcito
7/26/2019 Componentes de BD en Delphi
13/30
LIS 2003 - 25
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 - 26
Operaciones sobre conjuntos de datos
Eliminacin de datos
DataSet.Delete elimina el registro actual y
deja el DataSet en estado dsBrowse
Almacenamiento en un DataSetDataSet.Post para que la insercin / modifi-
cacin tenga efecto (imprescindible). Deja al
DataSet en estado dsBrowse
Cancelacin de cambios
DataSet.Cancel deshace los cambios y de-
ja el DataSet en estado dsBrowse
7/26/2019 Componentes de BD en Delphi
14/30
LIS 2003 - 27
Operaciones sobre conjuntos de datos
Bsquedas
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
Set Of (loCaseInsensitive, loPartialKey)
LIS 2003 - 28
Operaciones sobre conjuntos de datos
Bsquedas
DataSet.LookupLookup (const campos: string; const valores: Variant; const
CamposSolicitados: string): Variant
devuelve un array variante con los valores de losCamposSolicitados 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]]))
7/26/2019 Componentes de BD en Delphi
15/30
LIS 2003 - 29
Operaciones sobre conjuntos de datos
Filtrados para restringir la vista de los datos
propiedades: Filter, FilterOptions y Filtered
evento: OnFilterRecord
Los pasos necesarios son:
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 setrata de una condicin temporal
foCaseInsensitive,
foNoPartialCompare
LIS 2003 - 30
Operaciones sobre conjuntos de datos
Ejemplo de creacin de filtros
utilizando la propiedad FilterDataset1.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 OnFilterRecordProcedure TForm1.Table1FilterRecord (DataSet: TDataSet;
varAccept: Boolean);
Begin
Accept:= DataSet[Ciudad]=Valencia;
End;
condiciones de filtrado ms complejas (funciones, bucles...)
puede cambiarse en tiempo de ejecucin
7/26/2019 Componentes de BD en Delphi
16/30
LIS 2003 - 31
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 estinactivo lo activan temporalmente
LIS 2003 - 32
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
propiedadBookMark 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)
7/26/2019 Componentes de BD en Delphi
17/30
LIS 2003 - 33
Operaciones sobre conjuntos de datos
Ejemplo de marcado de registrosvar
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 - 34
Operaciones sobre conjuntos de datos
Eventos de cambio de estado
cuando un DataSet cambia de estado se produce
alguno de los siguientes eventos Before oAfter
BeforeOpen, AfterOpen
mtodo OpenBeforeClose, AfterClose mtodo Close
BeforeInsert, AfterInsert mtodo Insert
BeforeEdit, AfterEdit mtodo Edit
BeforePost, AfterPost mtodo Post
BeforeCancel, AfterCancel mtodo Cancel
BeforeDelete, AfterDelete mtodo Delete
7/26/2019 Componentes de BD en Delphi
18/30
LIS 2003 - 35
Operaciones sobre conjuntos de datos
Existen otros eventos que se lanzan cuando se
produce una excepcin en la ejecucin de alguna
operacin
OnDeleteErrorDelete errneo
OnEditErrorEdit errneo
OnPostErrorPost errneo
Otros eventos
OnNewRecords se crea un nuevo registro
OnCalcFields es necesario recalcular el
valor para un campo calculado
LIS 2003 - 36
Operaciones sobre conjuntos de datos
Ejemplos con eventos de cambio de estado
generacin automtica de un identificador para cada
nuevo registoProcedure TForm1.Table1AfterInsert (DataSet:TDataSet);
BeginInc (Identificador); DataSet[cod]:= Identificador;
End;
cerrar una tabla almacenando los cambiosProcedure TForm1.Table1BeforeClose (DataSet:TDataSet);
Begin
if Application.MessageBox(Cerrando tabla...,Guardar?,
mb_IconQuestion+mb_YesNo)=IdYes
Then DataSet.Post;
End;
7/26/2019 Componentes de BD en Delphi
19/30
LIS 2003 - 37
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 propie-
dad Fields (mediante Fields Editor...)
LIS 2003 - 38
Campos. El componente TField
Fields Editor...
Campos
seleccionados
Definicin de un
nuevo campo
Campos
disponibles
en la BD
Tipo de campo:
Dato
Calculado
Lookup
7/26/2019 Componentes de BD en Delphi
20/30
LIS 2003 - 39
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 tiem-
po de diseo: NombreDataSet+NombreCampo
para acceder al valor de los campos se puede usarla propiedad Value o las propiedades As+Tipo
LIS 2003 - 40
Campos. El componente TField
Ejemplo de acceso al valor de un campo TFieldMiTabla.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...
7/26/2019 Componentes de BD en Delphi
21/30
LIS 2003 - 41
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 - 42
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;
7/26/2019 Componentes de BD en Delphi
22/30
LIS 2003 - 43
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)
Dataset sobre el quequeremos buscar(otra tabla adicional)
Campo sobre elque buscamos enel Dataset especificado(campo en Table2)
Campo que sirve debase al nuevo campo(C. Ajena)
Campo del Dataset
que deseamos mostrar(campo en Table2)
LIS 2003 - 44
Campos. El componente TField
Ejemplo de campos de referencia (lookup)
dada una tabla depedidos, se desea visualizar la
informacin de la misma y tambin el nombre de la
compaa a la que pertenece el proveedor
Campo lookup
7/26/2019 Componentes de BD en Delphi
23/30
LIS 2003 - 45
TTable con ms detalle
Formularios maestro / detalle establece relaciones uno a muchos entre dos tablas
Tabla Customer.DB
de DBDEMOS
DataSource enlaza
la tabla con el Grid
Tabla Orders.DBde
DBDEMOS
MasterSource de la
tabla con DataSource
maestra
MasterFields de la
tabla con el campo
comn a ambas
tablas (separadas por
; si hay varios)
joinen IndexName
DataSource enlaza la
tabla con el Grid
LIS 2003 - 46
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)
7/26/2019 Componentes de BD en Delphi
24/30
LIS 2003 - 47
TTable con ms detalle
Bsqueda especfica en tablas basada en cam-pos 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 estarcerrada)
LIS 2003 - 48
TTable con ms detalle
Ejemplo de bsquedas sobre campos indexados
mediateGotoKey
MiTabla.SetKey;
MiTabla.FieldByName(Capital).AsString := Madrid;
MiTabla.GotoKey;
mediateGotoNearest
MiTabla.SetKey;
MiTabla.FieldByName(Capital).AsString := Madrid;
MiTabla.GotoNearest;
FindKey y FindNearest simplifican la bsqueda
devuelve True si se encuentra y
posiciona el cursor en el registro
permite que la asignacin siguiente
no modifique el valor del campo
mueve el cursor al registro que
ms se parece
7/26/2019 Componentes de BD en Delphi
25/30
LIS 2003 - 49
TTable con ms detalle
Utilizacin de rangos sobre campos indexados
delimita un conjunto consecutivo de registros com-prendidos entre unos lmites marcados
flexibilidad vs. eficiencia: los filtros son ms flexi-
bles, 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 - 50
TTable con ms detalle
Ejemplo de creacin de rangoWith MiTabla Do Begin
SetRangeStart; {empieza la definicin del rango}
FieldValues[NumCliente ]:=1;
SetRangeEnd; {fin de la definicin del rango}
FieldValues[NumCliente ]:=15;
ApplyRange; {activa el rango}
End;
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
7/26/2019 Componentes de BD en Delphi
26/30
LIS 2003 - 51
TTable con ms detalle
Creacin de tablas en ejecucin mediante el com-
ponente TTable
mtodo CreateTablevar 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 - 52
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
7/26/2019 Componentes de BD en Delphi
27/30
LIS 2003 - 53
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 - 54
TQuery con ms detalle
La sentencia SQL tambin se puede modificar en
ejecucin
mediante cdigoMiQuery.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; {optimiza el rendimiento en servidores remotos}
MiQuery.Open; {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}
7/26/2019 Componentes de BD en Delphi
28/30
LIS 2003 - 55
TQuery con ms detalle
Las sentencias SQL pueden ser estticas o din-micas, 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 acce-
der 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 - 56
TQuery con ms detalle
Ejemplo de SQL dinmica
SELECT *
FROM "Persona.db"
WHERE Nombre = :par_nombreAnd
Apellidos = :par_apellidos
Propiedad SQL del query
con la definicin de 2 pa-
rmetros
With Query Do
Begin
Close;
Params[0].AsString := EditNombre.Text;
Params[1].AsString := EditApellidos.Text;
Open;
End;
Es imprescindible darle valor a
todos los parmetros !
Ejecucin de la SQL
:par_nombre
:par_apellidos
ParamByName(par_nombre)
ParamByName(par_apellidos)
7/26/2019 Componentes de BD en Delphi
29/30
LIS 2003 - 57
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 ins-tanciar con el campo del mismo nombre de la query
maestra
adems, la propiedad DataSource del query detalle de-
ber conectarse con el DataSource asociado al query
maestro
Select * From Customer
Select * From OrdersWhere CustNo = :CustNo
Select * From Items
Where OrderNo = :OrderNo
DataSource
DataSource
Query1
Query2
Query3
LIS 2003 - 58
TQuery con ms detalle
Ejemplo de formularios maestro / detalle
Query1
Query2
Query3
7/26/2019 Componentes de BD en Delphi
30/30
LIS 2003 - 59
TQuery con ms detalle
Mediante sentencias SQL se pueden crear tablas,
eliminar tablas, realizarjoins, 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 dejoins entre tablas:
select * from customer C, orders O, items Iwhere (C.custno = O.custno) and (O.orderno = I.orderno)
Mdulos de datos
Un mdulo de datos (TDataModule) se utiliza co-
mo contenedorde componentes no visuales
son unos formularios especiales que centralizan los componentes
comunes de la aplicacin
la parte conceptual es inde-pendiente de la visual (en laaplicacin se separa la partevisual de la no-visual)
se definen una vez los com-
ponentes y se reutilizan en el
resto de la aplicacin
en el Repositorio:
New | Data Module