Componentes de BD en Delphi

download Componentes de BD en Delphi

of 30

Transcript of Componentes de BD en Delphi

  • 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