Sign in Join
Wiki copytemporary

Lazarus Tdbf Tutorial/es: what changed

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

Title: Lazarus Tdbf Tutorial/es

OldNewLine
1+## Resumen
2+
3+   Esta tutoría trata sobre el desarrollo elemental de bases de datos usando el componente [TDbf](http://tdbf.sf.net) (de Micha Nelissen) con Lazarus. Hay disponible documentación adicional para TDbf. Esta página fue creada por Tony Maro, pero ¡se agradecen otras colaboraciones!
4+
5+   En Lazarus, el componente DbfLaz utiliza el código de FPC TDbf.
6+
7+### Documentación
8+
9+   Para documentación de TDbf en PDF ir a [SourceForge](https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371). Puede ser útil tener este pdf junto con este documento durante su lectura.
10+
11+Este artículo sirve como documentación adicional para nuevas características respecto a la documentación original.
12+
13+### Alternativas y problemas conocidos
14+
15+   Alternativas para bases de datos embedias tales como Firebird embebido (ventaja: fácilmente escalable para cliente / servidor), SQLite (ventaja: fácil implementación), o ZMSQL (usa archivos CSV; ventaja: sólo necesita código Pascal).
16+
17+   Problemas conocidos: El código TDbf careció de mantenedor por largo tiempo. Actualmente (marzo de 2013), tanto el proyecto *upstream* de Sourceforge (centrado en Delphi) como los desarrolladores de bases de datos FPC están de nuevo para arreglar errores de TDbf. Los errores corregidos en el trunk de FPC necesitarán fusionarse con la versión de SourceForge y viceversa.
18+
19+Incidencias actuales: por favor ver bugs en el seguimiento de errores, especialmente <http://bugs.freepascal.org/view.php?id=22177>
20+
21+#### Limitaciones
22+
23+- TDBF establece la codificación de la base de datos basándose en las configuraciones del lenguaje del sistema operativo (puedes establecer el tuyo estableciendo LanguageID; ver documentación). Mover una de estas bases de datos a un computador que no soporta dicha codificación puede ocasionar que la base de datos se quede como de solo lectura. *Nota: investigar cuando esto se aplica a Tablelevel 7 (Visual DBase) y 25/30 (Foxpro/Visual Foxpro)*
24+
25+- Ninguno de los formatos DBF utilizados soporta codicación Unicode (si UTF-8, UTF-16 o UTF-32). Podría haber una solución utilizando campos binarios, pero entonces perderiamos habilidades de reordenación, etc.
26+
27+- El indexado de un fichero DBase con \[ixCaseInsensitive\] no funciona actualmente.
28+- No soporta todavía integridad referencial en formatos de fichero que si lo soportan (DBase VII, Visual FoxPro).
29+- No soporta (ahora o bien para siempre) encriptación interna de ficheros .dbf: el mecanismo de encriptación de DbaseIV es bastante debil de todos modos. Por favor utiliza uno de los métodos de encriptación que se mencionan más abajo.
30+
31+FPC 2.6.x y anteriores:
32+
33+- En procesadores ARM, el códigoTDBF es sabido que no funciona debido a incidencias de alineación de bus. Esto está siendo addressed en la versión de desarrollo/trunk.
34+- Escoger el tablelevel (25) de FoxPro generará ficheros que no se podrán leer mediante drivers Visual Foxpro. Esto se ha solucionado en la versión de desarrollo/trunk de FPC.
35+
36+### No necesita instalación
37+
38+  El paquete DbfLaz (dbflaz.lpk) viene instalado por defecto tanto en FPC como en Lazarus. Este paquete utiliza TDbf y sus unidades asociadas en Free Pascal Free Component Library. En otras palabras, no es necesario instalar nada si tienes justamente una versión reciente de Lazarus. Está situado en la carpeta lazarus/components/tdbf/.
39+
40+### ¿Qué se puede hacer con TDbf?
41+
42+   El componente TDbf proporciona a Lazarus (y otros entornos) acceso a tablas dBase y FoxPro. Permite la lectura, escritura y creación de tablas dBase III+, dBase IV, Visual dBase VII y FoxPro. Y sin necesitar librerías o gestores de bases de datos adicionales. Simplemente ponga el componente TDbf en su formulario y tendrá acceso inmediato a un entorno de bases de datos de para múltiples plataformas. TDbf funciona tanto en Windows como en Linux usando Lazarus.
43+
44+## Cómo crear una nueva tabla
45+
46+   Como no hay todavía una aplicación "Database Desktop" para Lazarus, debemos crear las tablas de la base de datos mediante código, o utilizando herramientas externas.
47+
48+Puedes probar esta aplicación (windows - funciona con ***wine***): <http://www.dirfile.com/cdbf_explorer.htm>
49+
50+### Establecer la ruta de acceso
51+
52+   Es recomendable crear una carpeta para sus aplicaciones de bases de datos. Esto simplifica la realización de copias de seguridad de los datos. Hay dos maneras de establecer la ruta de acceso. Puede fijar la ruta completa usando la propiedad FilePathFull, o puede establecer una ruta relativa a la ruta del programa con FilePath. Por ejemplo, estableciendo "FilePath" en tiempo de ejecución a "datos/" utilizaría una subcarpeta de datos dentro de la carpeta del archivo ejecutable. Fijar la propiedad "FilePathFull" a "/var/datos/" colocaría todo en esa carpeta, no teniendo en cuenta la ubicación del programa.
53+
54+### Elegir un tipo de tabla con *TableLevel*
55+
56+   Por omisión, TDbf creará tablas dBase IV. Aunque son muy compatibles, hay características que puede desear usar que no están disponibles. Para poder utilizar campos *autoincrementales*, debe usar algo más nuevo. Los tipos de tabla posibles son:
57+
58+<center>
59+
60+<table style="text-align: center; " border="1">
61+
62+<tr>
63+
64+<td>
65+
66+Tipos de tabla
67+
68+</td>
69+
70+<td>
71+
72+TableLevel
73+
74+</td>
75+
76+</tr>
77+
78+<tr>
79+
80+<td>
81+
82+dBase III+
83+
84+</td>
85+
86+<td>
87+
88+3
89+
90+</td>
91+
92+</tr>
93+
94+<tr>
95+
96+<td>
97+
98+dBase IV
99+
100+</td>
101+
102+<td>
103+
104+4
105+
106+</td>
107+
108+</tr>
109+
110+<tr>
111+
112+<td>
113+
114+Visual dBase VII
115+
116+</td>
117+
118+<td>
119+
120+7
121+
122+</td>
123+
124+</tr>
125+
126+<tr>
127+
128+<td>
129+
130+FoxPro
131+
132+</td>
133+
134+<td>
135+
136+25
137+
138+</td>
139+
140+</tr>
141+
142+</table>
143+
144+</center>
145+
146+   Para elegir un tipo de tabla de el valor adecuado a la propiedad TableLevel.
147+
148+### Añadir campos
149+
150+   La creación de campos para su nueva tabla en tiempo de ejecución se realiza como en Delphi. Una vez establecidas las propiedades FilePath, TableLevel, y TableName, hay que utilizar la propiedad FieldDefs para determinar su estructura. Por ejemplo:
151+
152+``` pascal
153+ MyDbf.FilePathFull := '/ubicacion/para/mis/datos';
154+ MyDbf.TableLevel := 7;
155+ MyDbf.TableName := 'clientes.dbf'; // nota: ¿es realmente necesario .dbf?
156+ With MyDbf.FieldDefs do begin
157+ Add('Id', ftAutoInc, 0, True);
158+ Add('Nombre', ftString, 80, True);
159+ End;
160+```
161+
162+   Los tipos de campo definidos son:
163+
164+- ftUnknown
165+- **ftString**
166+- **ftSmallInt**
167+- **ftInteger**
168+- **ftWord**
169+- **ftBoolean**
170+- **ftFloat**
171+- **ftCurrency** (TableLevel 25)
172+- **ftBCD** (TableLevel 25)
173+- **ftDate**
174+- ftTime
175+- **ftDateTime**
176+- **ftBytes** (TableLevel 25)
177+- ftVarBytes
178+- **ftAutoInc** (TableLevel 7 or 25)
179+- **ftBlob**
180+- **ftMemo**
181+- ftGraphic
182+- ftFmtMemo
183+- ftParadoxOle
184+- **ftDBaseOle**
185+- ftTypedBinary
186+- ftCursor
187+- **ftFixedChar**
188+- **ftWideString**
189+- **ftLargeInt**
190+- ftADT
191+- ftArray
192+- ftReference
193+- ftDataSet
194+- ftOraBlob
195+- ftOraClob
196+- ftVariant
197+- ftInterface
198+- ftIDispatch
199+- ftGuid
200+- ftTimeStamp
201+- ftFMTBcd
202+
203+   Los tipos que aparecen en negrita son los soportados en la actualidad.
204+
205+### ¡Siga adelante y créela!
206+
207+   Una vez que ha definido los campos deseará usarlos en su nueva tabla, puede seguir adelante y crearla con:
208+
209+``` pascal
210+ MyDbf.CreateTable;
211+```
212+
213+## Añadir índices a una tabla
214+
215+   Si su base de datos es bastante grande, deberá definir índices para hacer búsquedas más rápidas. Para cambiar la estructura de índices de una tabla, deberemos tener acceso exclusivo a la tabla -mientras los creamos.
216+
217+``` pascal
218+ MyDbf.Exclusive := True;
219+ MyDbf.Open;
220+```
221+
222+   Justo ahora, tenemos que añadir el índice.
223+
224+``` pascal
225+ MyDbf.AddIndex('clienteid', 'Id', [ixPrimary, ixUnique]);
226+ MyDbf.AddIndex('nombrecliente','Nombre', [ixCaseInsensitive]);
227+ MyDbf.Close;
228+```
229+
230+## Lo unimos todo y ... ¡ya está!
231+
232+   El siguiente ejemplo crea una tabla "clientes" mediante código. Esto, por supuesto, sólo es necesario hacerlo una vez para cada tabla, y de ahí en adelante, **abrir la tabla, no crearla ;-)**
233+
234+``` pascal
235+ {Necesitamos que las siguientes unidades aparezcan en la clásula USES:}
236+ uses {otras unidades, } Dbf, db, Dbf_Common;
237+ { "Dbf" aparecerá, automáticamente, cuando pongamos el componente TDbf en el formulario... }
238+ { pero necesitamos la unidad "db" para el objeto DataSet
239+ { y la unidad "Dbf_Common" para las definiciones de tipos de campo, por ejemplo }
240+ var
241+ MyDbf: TDbf;
242+ begin
243+ MyDbf := TDbf.Create(nil);
244+ try
245+
246+ MyDbf.FilePath := 'datos/'; // usamos una ruta de acceso relativa para la carpeta "datos"
247+ MyDbf.TableLevel := 7; // utilizaremos tablas de tipo "Visual dBase VII"
248+ MyDbf.Exclusive := True; // imprescindible para poder modificar la estructura añadiendo campos
249+ MyDbf.TableName := 'clientes.dbf';
250+ With MyDbf.FieldDefs do begin
251+ Add('Id', ftAutoInc, 0, True);
252+ Add('Nombre', ftString, 80, True);
253+ End;
254+ MyDbf.CreateTable;
255+ MyDbf.Open;
256+ MyDbf.AddIndex('clienteid', 'Id', [ixPrimary, ixUnique]);
257+ { añadimos un índice secundario }
258+ MyDbf.AddIndex('nombrecliente','Nombre', [ixCaseInsensitive]);
259+ MyDbf.Close;
260+ finally
261+ MyDbf.Free;
262+ end;
263+```
264+
265+## Archivos índice externos
266+
267+   El componente TDBF también soporta índices secundarios que se almacenan en un archivo separado. Esto será útil cuándo la base de datos sea muy grande, al poder separar en varios archivos los distintos índices. Los archivos de índice secundarios se crean de forma muy parecida a los índices normales, pero con la adición de la extensión '.ndx ' en el nombre:
268+
269+``` pascal
270+ MyDbf.AddIndex('nombrecliente.ndx','Nombre', [ixCaseInsensitive]);
271+```
272+
273+   Estos índices no se gestionan de forma automática, por ello cada vez que se abre la tabla, se deberán cargar los archivos de índice que deseamos utilizar, usando el método *OpenIndexFile*, así:
274+
275+``` pascal
276+ MyDbf.OpenIndexFile('nombrecliente.ndx');
277+```
278+
279+   Por la misma razón los índices se empaquetan por separado, para ello utilizaremos el método *CompactIndexFile*, de esta forma:
280+
281+``` pascal
282+ MyDbf.CompactIndexFile('nombrecliente.ndx');
283+```
284+
285+   Y al dar el valor a la propiedad *IndexName*, para seleccionar el que estará activo, debemos incluir el nombre y la extensión:
286+
287+``` pascal
288+ MyDbf.IndexName := 'nombrecliente.ndx';
289+```
290+
291+## Cómo enlazar TDbf a componentes de datos
292+
293+   Los ejemplos anteriores muestran como crear una nueva tabla de base de datos mediante código. Usar la tabla es aún más simple.
294+
295+   Los componentes de acceso a datos en Lazarus (como *TDBEdit* y *TDbNavigator* por ejemplo) se vinculan a un componente *TDataSource* mediante las propiedades *DataSource* y *DataField*. El componente *TDataSource* controla la comunicación entre el gestor de bases de datos y los componentes de acceso a datos. Un *TDataSource* se vincula al componente *TDbf* mediante su propiedad *DataSet*. La conexión sería así:
296+
297+<code>` TDbEdit------\`\
298+`              |`\
299+` TDbEdit------|-->TDataSource-->TDbf`\
300+`              |`\
301+` TDbNavigator-/`</code>
302+
303+   No olvides establecer las propiedades *FilePath* (o *FilePathFulll*), *TableLevel*, y *TableName* del componente *TDbf* a los valores adecuados antes de activarlos mediante
304+
305+``` pascal
306+ TDbf.Active := True;
307+```
308+
309+   Se podría decir mucho más sobre programación con bases de datos en Lazarus, y yo recomendaría un buen libro de programación de bases de datos con Delphi porque los conceptos fundamentales son los mismos. Constantemente hago referencia a mi ejemplar de "Liberado Delphi 2" porque los conceptos y el código básico no han cambiado mucho en 8 años.
310+
311+## Empaquetar y reconstruir índices
312+
313+   Cuando se borra un registro, realmente no desaparece físicamente del archivo que guarda la tabla. De vez en cuando debe *empaquetar* la tabla para eliminar realmente los registros y así recuperar ese espacio desaprovechado del archivo. Esto hay que hacerlo teniendo la tabla abierta en modo exclusivo.
314+
315+``` pascal
316+ MyDbf.Exclusive := True;
317+ MyDbf.Open;
318+ MyDbf.PackTable;
319+ // reconstruimos todos los índices
320+ MyDbf.RegenerateIndexes;
321+ MyDbf.Close;
322+ MyDbf.Exclusive := False;
323+```
324+
325+## Relaciones de tabla principal
326+
327+   La verdadera potencia de la programación de bases de datos comienza cuando tenemos múltiples tablas que se hacen referencia mutuamente. Mientras que TDbf aún no soporta la integridad referencial, si soporta una relación del tipo maestro/detalle entre componentes TDbf.
328+
329+   Cuando hay dos tablas relacionadas, por ejemplo:
330+
331+` [`**`clientes`**`]`\
332+` Id       <----\`\
333+` Nombre        |`\
334+` Telefono      |`\
335+` Direccion     |`\
336+`               |  ClienteID en facturas hace referencia a un campo primario de clientes`\
337+` [`**`facturas`**`]    |`\
338+` Id            |`\
339+` Importe       |`\
340+` ClienteID   --\---|  * Campo indexado como "idxclienteid"`
341+
342+   Si desea mostrar todas las facturas para un cliente determinado, la tabla detalle (facturas) puede sincronizarse con la tabla principal (clientes) automáticamente.
343+
344+   En el componente TDbf de facturas seleccione lo siguiente:
345+
346+``` pascal
347+ InvDbf.IndexName := 'idxclienteid'; // campo que se emparejará con el campo ID de la tabla clientes
348+ InvDbf.MasterSource := dsClientes; // fuente de datos que se enlaza al componente TDbf de clientes
349+ InvDbf.MasterFields := 'Id'; // campo en la tabla clientes que emparejamos con nuestro índice
350+```
351+
352+## Cómo filtrar las Fechas vacías
353+
354+   Voy a mostrar aquí como podemos filtrar las fechas en blanco con el componente de Lazarus TDbf.
355+
356+   Considérese que en este ejemplo, el componente se denomina datos dbf1 y la base de datos tiene un campo, DT_ENCERRA, que indica cuando el caso se completó. Imagina también que necesitas crear un informe utilizando LazReport que enumera todos los casos que siguen pendientes, con el campo DT_ENCERRA en blanco.
357+
358+   La forma más sencilla de hacerlo es utilizando el controlador de eventos OnFilterRecord y poner el siguiente código:
359+
360+``` pascal
361+ if not dfb1.FieldByName('DT_ENCERRA').IsNull then Accept := False;
362+```
363+
364+   Cuando ponemos el valor de Accept a False todos los registros que no cumplen con esa condición particular, no se tienen en cuenta, es decir, no se muestran en el informe.
365+
366+   También es necesario poner la propiedad Dbf1.Filtered a True, pero fuera de este evento.
367+
368+``` pascal
369+ dfb1.Filtered := True;
370+```
371+
372+## Cómo filtrar un valor con TDbf
373+
374+   Supón que tienes una base de datos que identifica los productos con un código, por ejemplo, B019, y es necesario filtrar sólo aquellos productos que son de este código (B019, en este ejemplo) de manera que se genera un informe con LazReport. El componente se llama Dbf1. El campo que almacena el valor es "product_no"
375+
376+   Tenemos dos maneras de filtrar. La primera sería la de utilizar el siguiente código:
377+
378+``` pascal
379+ Dbf1.filter:= 'product_no "=" B019 "';
380+```
381+
382+   Resulta que esto funciona muy bien con varios componentes, pero no funciona con LazReport.
383+
384+   Para resolver el problema con LazReport puede utilizar el controlador de eventos OnFilterRecord y utilizar el siguiente código:
385+
386+``` pascal
387+ Accept:= Copy(Trim(Dbf1.FieldByName('product_no').AsString),1,4)='B019';
388+```
389+
390+   También es necesario poner la propiedad Dbf1.Filtered a True, pero fuera de este evento.
391+
392+   Como se dijo antes, cuando el valor de Accept es false los registros no se tienen en cuenta y de esta manera puede evitar mostrar todos los productos con ese código en el informe LazReport
393+
394+## Programa de ejemplo - navegador DB
395+
396+   He escrito un programa sencillo que utiliza el componente TDbf para abrir y mostrar tablas de bases de datos mediante el control dbGrid. El ejecutable Linux, junto con las fuentes del proyecto, que debería compilarse bien en Windows, está disponible en
397+
398+` `[`tony.maro.net`](http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1)
399+
400+## See also
401+
402+- [[Example: TDbf (creating table and indexes, selecting of index)]]
403+
404+## A tener en cuenta
405+
406+   Actualmente no se soporta la integridad referencial, ni los archivos .db encriptados internamente.
407+
408+- Traducido por Usuario: Mgsalvador
409+- Normalización de estilo y formato, y algún añadido menor, por iskraelectrica (jldc). 11 de junio de 2008.
410+
411+---
412+*From the Free Pascal wiki, page "Lazarus Tdbf Tutorial/es", as it stood on 2020-02-18 after a change by Trev, 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).*
413+Category: Castellano
414+Category: Español

Back to history