Sign in Join
Wiki copytemporary

Databases in Lazarus/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Objetivo
22
33   Esta página pretende ofrecer un panorama general de la utilización de bases de datos en Lazaraus, y para proporcionar un punto en el que relacionar otras páginas sobre bases de datos.
44
55## Conjunto de Datos (*Datasets*)
66
77   La utilización de Bases de Datos en Lazarus (o FreePascal) está fundamentada principalmente en la clase ***TDataset***, que representa una tabla o consulta en la aplicación. Como con muchas otras clases fundamentales, no se usará la misma de forma directa, sino que se hará mediante una clase derivada. Esto tiene su porqué: para ofrecer acceso a distintas clase de Bases d Datos, como archivos de dBase o texto locales, o bases de datos remotas como PostgreSQL, Firebird, MariaDB, MySQl y muchas otras. Algunas de las clase derivadas de *TDataset* acceden a las tablas de las bases de datos directamente, mientras otras utilizan componentes adicionales o librerías para llevar a cabo el acceso.
88
99   Ver las [[Databases/es|clases derivadas de acceso a datos]] en esta página.
1010
1111   Las clases derivadas de *TDataset*, que no son componentes visuales son (habitualmente) parte del Librería de Componentes Libres -*Free Component Library* (FCL)- en lugar de formar parte de la librería de Componentes de Lazarus -*Lazarus Component Library* (LCL)-.
1212
1313## Utilizando *Datasets*
1414
1515   Los components *Datasets* se pueden utilizar indistintamente por código o cómo componentes visuales. En una aplicación Lazarus normal se suelen utilizar ambos métodos. En cualquier caso, el primer paso es crear el descendiente de *TDataSet*, iniciarlo para conectarlo con la tabla o consulta, por último realizar la conexión, *abriendo* el conjunto de datos. Esto se puede hacer por código en tiempo de ejecución o colocando el componente en el formulario y dando valores a las propiedades durante el diseño. Los detalles concretos varían bastante según las diferentes clases derivadas de *TDataset*, por ello hay que ver las distintas guías para los componentes de acceso a distintas [[Databases|Bases de Datos]].
1616
1717   Cuando se abre el conjunto de datos (*Dataset*) se crean una serie de componentes de campos, uno por cada campo o columna de la tabla o consulta que se ha abierto. Cada componente de campo es descendiente de ***TField***, adecuado al tipo particular del campo, v.gr., *TStringField*, para campos de tipo alfabético.
1818
1919### Utilizando *datasets* desde código
2020
2121El acceso mediante código está explicado con más detalle en [[Using Dataset and Field components|Utilizando componentes Dataset y de campo]](página que parece no existir), esta es una visión general muy simple:
2222
2323- Usar el derivado de *TDataset* para abrir la tabla o consulta, filtrar para ver las filas deseadas y moverse de una fila a otra.
2424- Usar un componente derivado de *TField* para:
2525 - Acceder a la información general sobre los campos
2626 - Acceder a los valores concretos para la fila actual. (mediante las propiedades ***As...***, como *AsString*, *AsInteger*, etc.)
2727- Acceder a los campos de un componente derivado de *TDataset* de esta forma:
2828 - La propiedad ***Fields*** (Campos), v.gr. Fields\[0\] es el primer campo,
2929 - Con el método FieldByName, v.gr. FieldByName('EDAD') devuelve el contenido del campo asociado con el campo de la Base de datos de nombre 'EDAD'.
3030
3131### Utilizando componentes visuales enlazados a datos (*data-aware components*)
3232
3333   Para utilizar bases de datos en una aplicación Lazarus al estilo *RAD*, normalmente se configura el componente de datos *Dataset* en el momento del diseño y se usan componentes enlazados a datos, de la forma siguiente
3434
3535- Añadir el componente de datos deseado, junto con los componentes adicionales si son necesarios, en el formulario, y abrirlo, poniendo el valor la propiedad ***Active*** a verdadera.
3636- Añadir un componente ***TDatasource*** (de la pestaña *Data Access*) al formulario, y enlazarlo con el componente *dataset*, dando como valor de su propiedad *Dataset* el nombre dado a este.
3737- Situar los componentes ligados a datos desde la pestaña *Data Controls* en el formulario y enlazarlos con el componente *DataSource* (no con el *dataset*)
3838- La mayoría de los controles enlazan un único campo, por lo que es necesario, seleccionar el que deseamos mostrar.
3939
4040   Ver #Componentes de Datos más adelante para más detalles sobre los mismos.
4141
4242### Estados de los *Dataset*
4343
4444   Los conjuntos da datos *Dataset* pueden estar es diversos estados. Aunque hay bastantes (échale un vistazo a la definición de *TDataSetState* en el código fuente de la unidad *db.pas*), los más importantes para conocer inicialmente son los marcados con asterisco (*):
4545
46-<center>
47-
48-<table border="1" width="90%" cellpadding="5">
49-
50-<tr>
51-
52-<th>
53-
5446Estado
5547
56-</th>
57-
58-<th>
59-
6048Comportamiento
6149
62-</th>
63-
64-</tr>
65-
66-<tr>
67-
68-<td>
69-
7050dsInactive (*)
7151
72-</td>
73-
74-<td>
75-
7652El conjunto de datos (*Dataset*) está cerrado
7753
78-</td>
79-
80-</tr>
81-
82-<tr>
83-
84-<td>
85-
8654dsBrowse (*)
8755
88-</td>
89-
90-<td>
91-
9256El usuario puede moverse por el conjunto de datos, viendo los valores que contiene
9357
94-</td>
95-
96-</tr>
97-
98-<tr>
99-
100-<td>
101-
10258dsEdit (*)
10359
104-</td>
105-
106-<td>
107-
10860El usuario puede editar los valores de la fila activa. Los datos no son guardados hasta que se llama al método *post*.
10961
110-</td>
111-
112-</tr>
113-
114-<tr>
115-
116-<td>
117-
11862dsInsert (*)
11963
120-</td>
121-
122-<td>
123-
12464Una fila nueva se ha añadido y el usuario puede dar valores a los campos. El registro no se guarda hasta que se llama a *post*
12565
126-</td>
127-
128-</tr>
129-
130-<tr>
131-
132-<td>
133-
13466dsOpening
13567
136-</td>
137-
138-<td>
139-
14068---
14169
142-</td>
143-
144-</tr>
145-
146-<tr>
147-
148-<td>
149-
15070dsSetKey
15171
152-</td>
153-
154-<td>
155-
15672---
15773
158-</td>
159-
160-</tr>
161-
162-<tr>
163-
164-<td>
165-
16674dsFilter
16775
168-</td>
169-
170-<td>
171-
17276---
17377
174-</td>
175-
176-</tr>
177-
178-<tr>
179-
180-<td>
181-
18278dsBlockRead
18379
184-</td>
185-
186-<td>
187-
18880---
18981
190-</td>
191-
192-</tr>
193-
194-<tr>
195-
196-<td>
197-
19882dsCalcFields
19983
200-</td>
201-
202-<td>
203-
20484---
20585
206-</td>
207-
208-</tr>
209-
210-<tr>
211-
212-<td>
213-
21486dsCurValue
21587
216-</td>
217-
218-<td>
219-
22088---
22189
222-</td>
223-
224-</tr>
225-
226-<tr>
227-
228-<td>
229-
23090dsNewValue
23191
232-</td>
233-
234-<td>
235-
23692---
23793
238-</td>
239-
240-</tr>
241-
242-<tr>
243-
244-<td>
245-
24694dsOldValue
24795
248-</td>
249-
250-<td>
251-
25296---
25397
254-</td>
255-
256-</tr>
257-
258-<tr>
259-
260-<td>
261-
26298dsInternalCalc
26399
264-</td>
265-
266-<td>
267-
268100---
269101
270-</td>
271-
272-</tr>
273-
274-<tr>
275-
276-<td>
277-
278102dsIRefreshFields
279103
280-</td>
281-
282-<td>
283-
284104---
285105
286-</td>
287-
288-</tr>
289-
290-</table>
291-
292-</center>
293-
294106    Los otros estados son transitorios y son habitualmente manejados de forma automática. Se usan internamente y en código más complicado. Si la aplicación sólo visualiza los datos y se abren los *dataset* en diseño, se pueden ignorar los estados, ya que será *dsBrowse* casi siempre. Sin embargo, la mayoría de las aplicaciones cambiarán los datos en algún momento. Si se están usando componentes ligados a datos, estos manejarán la mayoría de los estados de forma automática. Si se cambia texto en un *DBEdit*, por ejemplo, el *dataset* se pondrá en el estado *dsEdit*, a menos que ya esté en *dsEdit* o *dsInsert*. Si se cambia a otro registro, y el estado es *dsEdit* o *dsInsert*, el registro es actualizado con los nuevos datos y el *dataset* vuelve al estado *dsBrowse*. Por contra, si se accede a los datos mediante código, el responsable de cambiar de estado es el código del programa (es decir, el programador). El componente *dbNavigator* (ver más adelante) permite al usuario cambiar los estados explícitamente.
295107
296108### Actualizar (*Post*) y Cancelar
297109
298110   Si has editado o insertado un registro, los nuevos valores son guardados en una memoria intermedia.
299111
300112- Llamando el método *Cancel* del *Dataset* se elimina el registro nuevo (insertar) o recupera los valores anteriores del registro (editar)
301113- Con el método *Post* se guardan los valores nuevos o el registro insertado. El algunos derivados de *Dataset*, los datos son escritos inmediatamente en las tablas de la BD, en otros son escritos en listas de cambios hasta que la siguiente llamada los guarda en la BD. Por último, aunque se han guardado en la DB puede ser necesario hacer una llamada a *commit* para hacer permanentes los cambios en la BD. Todo o anterior depende mucho del componente utilizado y de la BD, por lo que hay que ver los detalles concretos de utilización
302114
303115## Componentes de Datos
304116
305117Para usar cualquiera de estos componentes, se añade a un formulario y se establece, como mínimo, la propiedad de fuente de datos *Datasource*. Sin olvidar otras propiedades importantes.
306118
307119### Componentes de campo único
308120
309121Estos componentes se enlazan a un único campo. Además del nombre del *Datasource*, hay que dar el nombre del campo al que enlazan. Son estos:
310122
311123- [[doc:lcl/dbctrls/tdbtext.html|DBText]], muestra el valor del campo como un texto no editable y sin borde.
312124- [[doc:lcl/dbctrls/tdbedit.html|DBEdit]], muestra y permite editar un campo de texto en una caja, para ello seleccionamos una fuente de datos y uno de los campos disponibles. Mediante el inspector de objetos podemos ver el listado de los mismos si tenemos la conexión establecida y la consulta activa en tiempo de diseño.
313125
314126
315127Aquí cabe decir que la justificación del texto dentro del recuadro de DBEdit es posible, al menos en la versión 1.4, por medio de la propiedad **Alignment** al igual que se utiliza con Edit. Sería cómodo tenerla como una propiedad más publicada en el inspector de objetos pero por el momento no está incluida, con lo cual hay que realizarlo con código.
316128
317129
318130TDBEdit.Alignment = taLefttJustify;
319131
320132TDBEdit.Alignment = tacenter;
321133
322134TDBEdit.Alignment = taRightJustify;
323135
324136- [[doc:lcl/dbctrls/tdbmemo.html|DBMemo]], muestra y permite editar un campo de texto en un caja de varias líneas.
325137- [[doc:lcl/dbctrls/tdbimage.html|DBImage]], muestra una imágen guardada en la base de datos en un campo tipo *BLOB*.
326138- [[doc:lcl/dbctrls/tdblistbox.html|DBListBox]] y [[doc:lcl/dbctrls/tdbcombobox.html|DBComboBox]], permite al usuario introducir valores en el campo de la Base de Datos de entre los mostrados en la lista.
327139- [[doc:lcl/dbctrls/tdbcheckbox.html|DBCheckBox]], muestra y permite asignar valores lógicos a un campo, marcando o desmarcando el componente.
328140- [[doc:lcl/dbctrls/tdbradiogroup.html|DBRadioGroup]], muestra los elementos en un grupo de selección, permitiendo así asignar de entre ellos el valor del campo.
329141- [[doc:lcl/dbctrls/tdbcalendar.html|DBCalendar]], muestra y permite editar un campo de tipo fecha mediante un calendario gráfico.
330142- [[doc:lcl/dbctrls/tdbgroupbox.html|DBGroupBox]], versión de *TGroupBox*, que permite agrupar una serie de componentes de datos en un formulario.
331143
332144### [[doc:lcl/dbgrids/tdbgrid.html|Componente DBGrid]]
333145
334146   Este componente muestra, por defecto todos los campos en forma de tabla. No obstante, poniendo valores en la colección [[doc:lcl/dbgrids/tdbgrid.columns.html|Columns]] se pueden restringir los campos que se visualizan y dar el ancho y los títulos de las columnas.
335147
336148   Al parecer hay todavía algunos problemas con la edición en DBGrid, por lo que aunque la edición es, sin duda, posible, puede ser más seguro utilizarlo sólo para mostrar datos (poner *readonly* a verdadero) y utilizar componentes de campo único para la edición.
337149
338150### Componente navegador (''[[doc:lcl/dbctrls/tdbnavigator.html|DBNavigator'']])
339151
340-<figure>
341152<img src="dbnavigator.PNG" title="dbnavigator.PNG" width="450" />
342-<figcaption>dbnavigator.PNG</figcaption>
343-</figure>
344153
345154   Este componente le da al usuario control directo sobre el conjunto de datos, permitiéndole:
346155
347156- Moverse al registro siguiente, al anterior, al primero o al último.
348157- Añadir un nuevo registro (igual que llamar al método *dataset.insert*)
349158- Poner el conjunto de datos en modo de edición
350159- Borrar un registro
351160- Guardar (*Post*) o Cancelar los cambios actuales
352161- Refrescar los datos (útil en aplicaciones con varios usuarios concurrentes)
353162
354163##### Principales propiedades:
355164
356165- DataSource: que permite enlazar a la fuente de los datos que se manejarán con el componente.
357166- VisibleButtons: permite controlar lo que el usuario puede hacer. Por ejemplo, si no puede borrar, se oculta el botón de borrar. Si se tiene un *DBGrid* enlazado al *dataset*, se puede prescindir de los botones para siguiente y anterior.
358167- Width: Si no se muestran todos los botones, se puede poner el ancho a la altura por el número de botones.
359168
360169---
361170*From the Free Pascal wiki, page "Databases in Lazarus/es", as it stood on 2017-05-04 after a change by Jma sp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
362171Category: Castellano
363172Category: Databases/es
364173Category: Español

Back to history