Sign in Join
Wiki copytemporary

Zeos tutorial/es: what changed

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

OldNewLine
11## Descripción
22
33Este tutorial trata acerca de como obtener, instalar y utilizar Zeoslib con [[Glossary|Lazarus]] y [[Glossary|FPC]].\
44
55**El equipo de Zeos tiene su propio foro. Es el mejor sitio para obtener más información acerca de ZeosLib y para hacer/responder cuestiones sobre su utilización y reporte de errores. Podéis acceder al mismo a través de [foro sobre ZeosLib](http://zeoslib.sourceforge.net/).**.
66
77Gracias al equipo de ZeosDBO y colaboradores por hacer posible que este paquete esté disponible también para Lazarus / FPC. Han realizado un magnífico trabajo. Si alguno de ellos quiere contribuir a documentar en más profundidad el uso de este paquete o aportar ejemplos sencillos para su uso con diferentes bases de datos ayudaría a los que estamos empezando.
88
99Adicionalmente existe un interesante tuorial en este sitio, tiene la opción de traducción al idioma del visitante:
1010
1111<http://serge-girard.developpez.com/tutoriels/temp/ZeosDBO/>
1212
1313## Obteniendo Zeos
1414
1515Zeos ha sido portado a [[Glossary|Lazarus]] y se puede descargar desde [Sourceforge.net](http://sourceforge.net/projects/zeoslib/)aunque también hay releases que pueden obtenerse fácilmente desde su SVN siguiendo los pasos siguientes:
1616
1717### Windows
1818
1919- Conseguir un cliente SVN, por ejemplo [TortoiseSVN](http://tortoisesvn.tigris.org) e instalarlo
2020- Ver [Getting Started with TortoiseSVN](http://tortoisesvn.net/docs/release/TortoiseSVN_en/help-onepage.html#tsvn-dug-general)
2121- Hacer un Checkout desde Windows Explorer: <http://svn.code.sf.net/p/zeoslib/code-0/trunk>
2222
2323### Linux/BSD
2424
2525- Conseguir un cliente SVN (esvn, kdesvn, etc.)
2626- Crear el directorio zeosdbo, acceder al mismo y desde consola hacer
2727- svn checkout <http://svn.code.sf.net/p/zeoslib/code-0/trunk>
2828
2929## Instalando los componentes
3030
3131Esta es una parte complicada por lo que debes tener un poco de paciencia y leer este apartado cuidadosamente.
3232
3333- Comprueba que tienes al menos la versión 1.0.4 de Lazarus (diciembre 2012) y al menos la versión 7.0.3 estable de ZeosLib.
3434
3535- Comenzar una instancia de Lazarus.
3636
37371. Pulsar en **Paquete/Abrir archivo de paquete (.lpk)** desde el menú principal.
38382. Ve a **.\ZEOSDBO-7.0.3-stable\packages\lazarus** y abre **zcomponent.lpk**
39393. Presiona **\[Compilar\]** solamente si no necesitas instalar los componentes en el IDE.
40404. Presiona **\[Usar \>\>\]** para ver las opciones que ofrece.
41415. Selecciona **Agregar al Proyecto** si no quieres añadirlo al IDE o bien **Instalar** para que se añada a la solapa del IDE de Lazarus
42426. Pregunta si necesitas recompilar Lazarus, en concreto con el mensaje emergente '''El paquete "zcomponent 7.0" se marcó para instalar. Actualmente lazarus solo soporta paquetes enlazados estáticamente. La instalación completa necesita reconstruir y reiniciar Lazarus ¿Desea reconstruir ahora Lazarus?
4343
4444- Responde **\[Si\]** esta vez.
4545- Espera a que la compilación termine, la ventana emergente de mensajes nos va mostrando la evolución del proceso, Lazarus debería reiniciarse después de esto.
4646- Si todo está bien se debería ver la solapa **\[Zeos Access\]** en la paleta de componentes.
4747
4848![](/wiki-images/2/25/Zeos_Components.png)
4949
5050Si se presenta el error "Cannot find unit ZClasses" o algo similar, entonces hay que chequear cuidadósamente como están escritos los nombres de fichero (en cuanto a mayúsculas/minúsculas) en sus ficheros de código fuente.
5151
5252- Incluso si cuadran exactamente, el paquete autogenerado del fichero fuente puede dar lugar a un tipificado incorrecto (mayúsculas/minúsculas) en la claúsula "uses" (Lazarus 0.9.18), i.e.:
5353
5454Si lo anterior falla, tal como se explica en el foro de ZeosLib es conveniente ir compilando cada uno de los paquetes siguiendo el siguiente orden:
5555
56-`  - 1º. zcore.lpk`
56+```text
57+ - 1º. zcore.lpk
58+```
5759
58-`  - 2º. zparsesql.lpk`
60+```text
61+ - 2º. zparsesql.lpk
62+```
5963
60-`  - 3º. zplain.lpk`
64+```text
65+ - 3º. zplain.lpk
66+```
6167
62-`  - 4º. zdbc.lpk`
68+```text
69+ - 4º. zdbc.lpk
70+```
6371
64-`  - 5º. zcomponent.lpk `
72+```text
73+ - 5º. zcomponent.lpk
74+```
6575
6676Si el resultado de la compilación individual de todos es correcto, entonces ya estaríamos en condiciones de escoger el paquete Zcomponent y con la opción de **Usar \>\>\>** y a continuación **Instalar** tenerlo en nuestro IDE como una solapa más de componentes visuales.
6777
6878``` pascal
6979
7080 { Este fichero ha sido generado automáticamente por Lazarus. ¡No se debe editar!
7181 Esta fuente solo se utiliza para compilar e instalar el paquete.
7282 }
7383 unit Zcore;
7484 interface
7585 uses
7686 Zclasses, Zcollections, Zcompatibility, Zexprparser, Zexprtoken, Zexpression,
7787 Zfunctions, Zmatchpattern, Zmessages, Zsysutils, Ztokenizer, Zvariables,
7888 Zvariant;
7989 implementation
8090 end.
8191```
8292
8393- Fíjate que Lazarus ha renombrado la unit ZClasses como Zclasses, dando lugar a un conflicto de nombres. Presumiblemente este es un error en Lazarus, no de los paquetes Zeos. Un camino a seguir para solucionarlo es renombrar todos los ficheros fuente de Zeos a minúsculas. Accede a cada subdirectorio bajo src/ y ejecuta este mandato en una ventana de bash (shell) de windows:
8494
85-` rename -v 'y/A-Z/a-z/' *`
95+```text
96+ rename -v 'y/A-Z/a-z/' *
97+```
8698
8799- Entonces, en Lazarus, reabre el paquete (.lpk) y corrige el nombre de fichero (mayúsculas/minúsculas) seleccionando en "More..."/"Fix Files Case"
88100- El paquete debería poderse compilar entonces.
89101
90102## Descripción de la paleta de componentes ZeosDBO
91103
92104**La descripción detallada de cada uno de los componentes de la paleta es:**
93105
94106![](/wiki-images/2/2d/PaletaComponentesZeos.png)
95107
96108### Componente TZConnection (ZConnection):
97109
98110![Componente TZConnection (ZConnection)](/wiki-images/5/5c/TZConnection.png) ===\>**Componente TZConnection (ZConnection):**
99111
100112**Nos va a permitir conectar con la base de datos (BBDD). Tiene una serie de propiedades (disponibles también en el inspector de objetos) como son:**
101113
102114- **AutoCommit**: boolean (**true**/**false**).
103115
104116- **AutoEncodeStrings**: boolean (**true**/**false**).
105117
106118- **Catalog**: ejemplo **public**
107119
108120- **ClientCodepage**: ejemplo **Spanish_Spain.1252**
109121
110122- **Connected**( * ): boolean (**true**/**false**), si establecemos su valor a **true** podremos ver en tiempo de diseño si la conexión es aceptada, caso contrario nos volverá a establecer automáticamente **false**.
111123
112124- **ControlsCodePage**:
113125
114126:* **cCP_UTF16**
115127
116128:* **cCP_UTF8**
117129
118130:* **cGET_ACP**
119131
120132- **Database**: aquí especificamos el nombre de la base de datos a la cual queremos conectar y que contendrá una o más tablas. Atención que si utilizamos SQLite, si la BBDD no existe, la crea.
121133
122134- **DesignConnection**: boolean (**true**/**false**), establecemos su valor a true en caso de que queramos tener activa la conexión en tiempo de diseño de forma que se autorellenen los controles de bases de datos que situemos en el formulario.
123135
124136- **HostName**( * ): es el nombre del equipo que contiene la(s) base(s) de datos a las que deseamos conectar. Pueden encontrarse en una ubicación local con lo que podríamos poner **localhost** o bien **127.0.0.1**, pero también en una ubicación en red local o incluso en internet, siendo por ejemplo para una red local **192.168.1.12**. En el caso de resolver mediante resolución de nombre DNS también valdría el nombre del equipo.
125137
126138- **LibraryLocation**: aquí especificamos la ubicación de los ficheros librería que vamos a necesitar para el caso concreto del protocolo que escojamos. Por ejemplo si en protocolo escogemos **postgresql-9** y nuestro programa lo tenemos en C:\test\\ entonces como valor de **LibraryLocation** podríamos poner **C:\test\libpq.dll**. Para Linux la librería podría ser libpq.o e igualmente la situariamos en la carpeta de nuestro programa por ejemplo **/opt/test/libpq.so**. En Linux hay que tener en cuenta que quizá necesitemos establecer un enlace simbólico dado que la libería la podemos encontrar con el nombre adaptado a la versión de PostgreSQL para que el genérico libpq enlace a la versión instalada (Linux utiliza ampliamente el nombre del fichero para especificar las versiones del fichero independientemente que en algunos casos el formato interno también pueda contener información del formato, ver por ejemplo mandato readelf de Linux). Estas liberías (puede que necesitemos para nuestro programa otras adicionales) las podemos coger de la instalación de PostgreSQL (C:\Archivos de programa\PostgreSQL\9.x\bin) para otras bases de datos habrá que mirar donde se encuentran. En el caso de Windows también podemos ubicar esta libería en c:\windows\system32 o bien c:\windows\syswow64. Y luego decidir si se registra también o no.
127139
128140- **LoginPromt**: boolean (**true**/**false**). En caso de valer **true** debería presentarnos un cuadro de solicitud de login.
129141
130142- **Name**( * ): simplemente nos deja establecer el nombre personalizado del componente de forma que es la referencia que vamos a utilizar en nuestro programa.
131143
132144- **Password**( * ): aquí especificamos la palabra de paso o contraseña. Durante el periodo de diseño también la podemos rellenar en el inspector de objetos o bien en tiempo de ejecución del programa.
133145
134146- **Port**: es el número de puerto que se utiliza junto a **HostName** para identificar de forma inequívoca el equipo con el que queremos conectar. Para el caso de PostgreSQL sería por ejemplo el **5432** o **3306** para MariaDB..... Para cada tipo de base de datos suele haber uno característico aunque en la configuración se puede cambiar (Para cada tipo de base de datos es conveniente revisar la documentación para ver las que soporta).
135147
136148- **Properties**: algunas propiedades para la conexión a la base de datos (para cada tipo de base de datos es conveniente revisar la documentación para ver las que soporta), por ejemplo:
137149
138150:***AutoEncodeStrings=ON**
139151
140152:***codepage=Spanish_Spain.1252**
141153
142154- **Protocol**( * ):
143155
144156:* ASA: **ASA12** / **ASA7** / **ASA8** / **ASA9**
145157
146158:* firebird-x.x: **firebird-1.0** / **firebird-1.5** / **firebird-2.0** / **firebird-2.1** / **firebird-2.5**
147159
148160:* firebirdd-x.x: **firebirdd-1.5** / **firebirdd-2.0** / **firebirdd-2.1** / **firebirdd-2.5**
149161
150162:* [FreeTDS_MsSQL](http://www.freetds.org/): **FreeTDS_MsSQL\<=6.5** / **FreeTDS_MsSQL\>=2005** / **FreeTDS_MsSQL-2000** / **FreeTDS_MsSQL-7**
151163
152164:* [FreeTDS_Sybase](http://www.freetds.org/): **FreeTDS_Sybase\<10** / **FreeTDS_Sybase-10+**
153165
154166:* **interbase-6**
155167
156168:* **MariaDB-5**
157169
158170:* **mssql**
159171
160172:* mysql: **mysql** / **mysql-4.1** / **mysql-5** / **mysqld-4.1** / **mysqld-5**
161173
162174:* **oracle**
163175
164176:* **oracle-9i**
165177
166178:* **pooled.***
167179
168180:* postgresql: **postgresql** / **postgresql-7** / **postgresql-8** / **postgresql-9**
169181
170182:* sqlite: **sqlite** / **sqlite-3**
171183
172184:* **sybase**
173185
174186- **ReadOnly**: boolean (**true**/**false**). Permite especificar si nuestra conexión va a ser de solo lectura (valor a **true**) o de lectura/escritura (valor a **false**).
175187
176188- **SQLHourGlass**: boolean (**true**/**false**). En caso de establecer su valor a **true**, entonces nos mostrará un reloj de arena mientras se espera que termine algún proceso SQL en curso.
177189
178190- **Tag**: etiqueta que en el inspector de objetos nos la pone predeterminada a **0**.
179191
180192- **TransactIsolationLevel**: permite definir el nivel de aislamiento de las transacciones que se realicen:
181193
182194:* **tiNone**
183195
184196:* **tiReadCommitted**
185197
186198:* **tiReadUnCommitted**
187199
188200:* **tiRepeatableRead**
189201
190202:* **tiSerializable**
191203
192204- **UseMetaData**: boolean (**true**/**false**). Permite especificar si se utilizan o no metadatos.
193205
194206- **User**( * ): el nombre de usuario que utilizaremos para conectar a la base de datos seleccionada para esta conexión. Dado que permite establecer múltiples conexiones podríamos conectarnos con otro nombre de usuario y a otra base de datos distinta al mismo tiempo utilizando otro componente ZConnection.
195207
196208- **Version**: nos muestra la versión de Zeos DBO que estemos utilizando. A modo de ejemplo nos podría mostrar **7.1.4-stable**.
197209
198210### Componente TZReadOnlyQuery (ZDataSet)
199211
200212![Componente TZReadOnlyQuery (ZDataSet)](/wiki-images/6/6a/TZReadOnlyQuery.png) ===\> **Componente TZReadOnlyQuery (ZDataSet)**
201213
202214**Nos va a permitir realizar una consulta (query) en modo solo lectura. Tiene una serie de propiedades (disponibles también en el inspector de objetos) como son:**
203215
204216- **Active'': boolean (**true**/**false''').
205217- **AutoCalcFields**: Por defecto establecido a **true**.
206218- **Connection**: lo vinculamos a un componente connection de los que tengamos disponibles.
207219- **DataSource**:
208220- **FetchRow**: por defecto a 0.
209221- **Filter**: define la cadena de filtrado que deseamos establecer aplicada a la información retornada en la consulta.
210222- **Filtered**: boolean (**true**/**false**). Por defecto establecido a **false**. Filtrado habilitado si **true**.
211223- **IndexFieldNames**:
212224- **IsUniDirectional**: por defecto a **false**.
213225- **LinkedFields**:
214226- **MasterFields**:
215227- **MasterSource**:
216228- **Name**: aquí podemos cambiar el nombre del componente que por defecto es **ZReadOnlyQuery1**.
217229- **Options**:
218230
219231
220232**doAlwaysDetailResync**: boolean (**true**/**false**).
221233
222234**doCalcDefaults**: boolean (**true**/**false**).
223235
224236**donDontSortOnPost**: boolean (**true**/**false**).
225237
226238**doOemTraslate**: boolean (**true**/**false**).
227239
228240**doPreferPrepared**: boolean (**true**/**false**).
229241
230242**doSmartOpen**: boolean (**true**/**false**).
231243
232244**doUpdateMasterFirst**: boolean (**true**/**false**).
233245
234246- **ParamCheck**: boolean (**true**/**false**). Por defecto establecido a **true**.
235247- **Params**: parámetros adicionales para realizar la consulta. Si no se añade ninguno aparece como **0 items**.
236248- **Properties**: propiedades (del tipo TStrings).
237249- **ShortedFields**: Campos para ordenación, permite seleccionar (si tenemos conexión establecida en tiempo de ejecución y la query activa) del listado de campos disponibles.
238250- **ShortType**: tipo de ordenación, podemos escoger entre:
239251
240252
241253**stAscending**: orden ascendente.
242254
243255**stDescending**: orden descendente.
244256
245257**stIgnored**: se ignora el orden.
246258
247259- **SQL**: aquí podemos definir la(s) sentencias de consulta (querys) que se adapten a nuestras necesidades. A modo de ejemplo podemos poner **SELECT * FROM tabla** que nos seleccionará todo el contenido de la tabla **tabla** (cambiar por el nombre de la tabla que cada uno tenga creada) de la base de datos a la que estemos conectados. Se puede establecer perfectamente mediante código de forma que cambie según nuestras necesidades.
248260- **Tag**: etiqueta establecida por defecto a **0**.
249261
250262### Componente TZQuery (ZDataSet)
251263
252264![Componente TZQuery](/wiki-images/a/af/TZQuery.png) ===\> **Componente TZQuery (ZDataSet)**
253265
254266**Nos va a permitir realizar una consulta (query) en modo lectura-escritura. Tiene una serie de propiedades (disponibles también en el inspector de objetos) como son:**
255267
256268- **Ative**( * ): boolean (**true**/**false**).
257269- **AutoCalcFields**:
258270- **CachedUpdates**:
259271- **Connection**( * ): lo vinculamos a algún componente ZConnection, por ejemplo ZConnection1, eso ya según el nombre que le pongamos que es modificable.
260272- **DataSource**:
261273- **FetchRow**:
262274- **Filter**: define la cadena de filtrado que deseamos establecer aplicada a la información retornada en la consulta.
263275- **Filtered**: boolean (**true**/**false**). Por defecto establecido a false. Filtrado habilitado si true.
264276- **IndexFieldNames**:
265277- **LinkedFields**:
266278- **MasterFields**:
267279- **MasterSource**:
268280- **Name**: aquí podemos cambiar el nombre del componente que por defecto es ZQuery1.
269281- **Options**:
270282
271283
272284**doAlwaysDetailResync**: boolean (**true**/**false**).
273285
274286**doCalcDefaults**: boolean (**true**/**false**).
275287
276288**donDontSortOnPost**: boolean (**true**/**false**).
277289
278290**doOemTraslate**: boolean (**true**/**false**).
279291
280292**doPreferPrepared**: boolean (**true**/**false**).
281293
282294**doSmartOpen**: boolean (**true**/**false**).
283295
284296**doUpdateMasterFirst**: boolean (**true**/**false**).
285297
286298- **ParamChar**: por defecto viene establecido a **:**
287299- **ParamCheck**: boolean (**true**/**false**).
288300- **Params**: parámetros adicionales para realizar la consulta. Si no se añade ninguno aparece como **0 items**.
289301- **Properties**:
290302- **ReadOnly**: boolean (**true**/**false**). Por defecto establecido a false.
291303- **Secuence**:
292304- **SecuenceField**: campo para **Secuence**, permite seleccionar (si tenemos conexión establecida en tiempo de ejecución y la query activa) del listado de campos disponibles.
293305- **ShowRecordTypes**: puede tener los siguientes valores que se mostrarán u ocultarán dependiendo de si se establecen a true o false, por defecto muestra estos: \[usUnmodified,usModified,usInserted\]
294306
295307
296308**usDeleted**: boolean (**true**/**false**).
297309
298310**usInserted**: boolean (**true**/**false**).
299311
300312**usModified**: boolean (**true**/**false**).
301313
302314**usUnmodified**: boolean (**true**/**false**).
303315
304316- **ShortedFields**: Campos para ordenación, permite seleccionar (si tenemos conexión establecida en tiempo de ejecución y la query activa) del listado de campos disponibles.
305317- **ShortType**: tipo de ordenación, podemos escoger entre:
306318
307319
308320**stAscending**: orden ascendente.
309321
310322**stDescending**: orden descendente.
311323
312324**stIgnored**: se ignora el orden.
313325
314326- **SQL**( * ): aquí podemos definir la(s) sentencias de consulta (querys) que se adapten a nuestras necesidades. A modo de ejemplo podemos poner **SELECT * FROM tabla** que nos seleccionará todo el contenido de la tabla **tabla** (cambiar por el nombre de la tabla que cada uno tenga creada) de la base de datos a la que estemos conectados. Se puede establecer perfectamente mediante código de forma que cambie según nuestras necesidades.
315327- **Tag**: etiqueta establecida por defecto a **0**.
316328- **UpdateMode**: modo de actualización, puede tomar los siguientes valores:
317329
318330
319331**umUpdateChanged**: modo de actualización únicamente del contenido modificado.
320332
321333**umUpdateAll**: modo de actualización de todo el contenido.
322334
323335- **UpdateObject**:
324336- **WhereMode**:
325337
326338
327339**wmWhereKeyOnly**
328340
329341**wmWhereAll**
330342
331343### Componente TZTable (ZDataSEt)
332344
333345![Componente TZTable](/wiki-images/6/6f/TZTable.png) ===\> **Componente TZTable (ZDataSEt)**
334346
335347- **Active**: boolean (**true**/**false**). Para activar/desativar la tabla. Por defecto establecido a **false**.
336348- **AutoCalcFields**: boolean (**true**/**false**). Permite autocalcular los campos. Por defecto establecido a **true**.
337349- **CachedUpdates**: boolean (**true**/**false**). Por defecto establecido a **false**.
338350- **Connection**: Permite escoger entre la(s) conexiones disponibles para nuestra tabla.
339351- **FetchRow**: por defecto a **0**.
340352- **Filter**:
341353- **Filtered**: Por defecto establecido a **false**.
342354- **IndexFieldNames**:
343355- **LinkedFields**:
344356- **MasterFields**:
345357- **MasterSource**:
346358- **Name**: Permite definir el nombre para este componente, por defecto se asigna ZTable1 para el primer componente de este tipo.
347359- **Options**:
348360
349361
350362**doAlwaysDetailResync**: boolean (**true**/**false**). Por defecto establecido a **false**.
351363
352364**doCalcDefaults**: boolean (**true**/**false**). Por defecto establecido a **true**.
353365
354366**doDontSortOnPost**: boolean (**true**/**false**). Por defecto establecido a **false**.
355367
356368**doOemTranslate**: boolean (**true**/**false**). Por defecto establecido a **false**.
357369
358370**doPreferPrepared**: boolean (**true**/**false**). Por defecto establecido a **false**.
359371
360372**doSmartOpen**: boolean (**true**/**false**). Por defecto establecido a **false**.
361373
362374**doUpdateMasterFirst**: boolean (**true**/**false**). Por defecto establecido a **false**.
363375
364376- **Properties**: cadenas para especificar propiedades (TStrings).
365377- **ReadOnly**: boolean (**true**/**false**). Por deecto establecido a **false**.
366378- **Secuence**:
367379- **SecuenceField**:
368380- **ShowRecordTypes**: permite mostrar los tipos de registro de acuerdo a sus posibles \[usUnmodified,usModified,usInserted\].
369381- **SortedFields**: Campos ordenados, en el desplegable nos muestra los campos disponibles en la tabla seleccionada.
370382- **ShortType**: tipo de ordenación, para ello disponemos de tres posibilidades stAscending, stDescending, stIgnored.
371383- **TableName**: establecemos su valor con el nombre de la tabla con la que deseamos trabajar dentro de la base de datos que estemos utilizando.
372384- **Tag**: Etiqueta, establecida por defecto a **0**.
373385- **UpdateMode**: modo de actualización, dispone de dos modalidades:
374386
375387
376388**umUpdateChanged**.
377389
378390**umUpdateAll**.
379391
380392- **UpdateObject**:
381393- **WhereMode**: dispone de dos modalidades:
382394
383395
384396**wmWhereKeyOnly**.
385397
386398**wmWhereAll**.
387399
388400![Componente TZUpdateSQL](/wiki-images/a/a2/TZUpdateSQL.png) ===\> **Componente TZUpdateSQL (ZSqlUpdate)**
389401
390402![Componente TZConnectionGroup](/wiki-images/d/d5/TZConnectionGroup.png) ===\> **Componente TZConnectionGroup (ZConnectionGroup)**
391403
392404![Componente TZGroupedConnection](/wiki-images/0/02/TZGroupedConnection.png) ===\> **Componente TZGroupedConnection (ZGroupedConnection)**
393405
394406![Componente TZStoredProc](/wiki-images/f/fd/TZStoredProc.png%E2%80%8E) ===\> **Componente TZStoredProc (ZStoredProcedure)**
395407
396408![Componente TZSQLMetadata](/wiki-images/d/d9/TZSQLMetadata.png) ===\> **Componente TZSQLMetadata (ZSqlMetadata)**
397409
398410![Componente TZSQLProcessor](/wiki-images/7/72/TZSQLProcessor.png) ===\> **Componente TZSQLProcessor (ZSqlProcessor)**
399411
400412![Componente TZSQLMonitor](/wiki-images/2/2d/TZSQLMonitor.png) ===\> **Componente TZSQLMonitor (ZSQLMonitor)**
401413
402414![Componente TZSecuence](/wiki-images/2/20/TZSecuence.png) ===\> **Componente TZSecuence (ZSecuence)**
403415
404416![Componente TZIBEventAlerter](/wiki-images/b/ba/TZIBEventAlerter.png) ===\> **Componente TZIBEventAlerter (ZIBEventAlerter)**
405417
406418![Componente TZPgEventAlerter](/wiki-images/e/e3/TZPgEventAlerter.png) ===\> **Componente TZPgEventAlerter (ZPgEventAlerter)**
407419
408420Las entradas añadidas aquí sobre componentes de ZeosDBO son para animar a otros a completar la explicación sobre los mismos, no soy un experto y hay componentes de los cuales no tengo conocimiento sobre su uso. Las pruebas que he realizado son utilizando Lazarus 1.4.0 y PostgreSQL 9.2 en local y me ha permitido establecer conexiones con BBDD y sus correspondientes tablas de una manera fluida incluyendo tipos BLOB definidos en la parte de postgres como bytea, sin problemas. Animo a que gente con más conocimiento complete las entradas. Por mi parte en la medida que tenga tiempo y vaya aprendiendo más trataré de plasmarlo aquí.
409421
410422## Comentarios
411423
412424En el momento actual Zeos CVS para Lazarus tiene paquetes rotos. Algunos comentarios de IgD:
413425
414426Utilizando una instalación limpia de Lazarus 0.9.12 (última versión estable) fuí capaz de instalar ZeosLib (13 Octubre 2005). Primero corrige los siguientes errores en ZeosLib:
415427
416428- 1\. Cambia ZplainPostgreSql81.pas a ZPlainPostgresSql8x.pas en zplain.lpk
417429
418-`<Item22>`\
419-`  <Filename Value="../../src/plain/ZPlainPostgreSql81.pas"/>`\
420-`  <UnitName Value="ZPlainPostgreSql8x"/>`\
421-`</Item22>`\
430+```text
431+<Item22>
432+ <Filename Value="../../src/plain/ZPlainPostgreSql81.pas"/>
433+ <UnitName Value="ZPlainPostgreSql8x"/>
434+</Item22>
435+```
422436
423437- 2\. Fix the following typos in zdbc.lpk:
424438
425439a\. Remove extra "/" from "build/" (remove the one that is inside the quotes)
426440
427-`<SearchPaths>`\
428-`  <OtherUnitFiles Value="../../src/dbc/"/>`\
429-`  <UnitOutputDirectory Value="build/"/>`\
430-`</SearchPaths>`\
441+```text
442+<SearchPaths>
443+ <OtherUnitFiles Value="../../src/dbc/"/>
444+ <UnitOutputDirectory Value="build/"/>
445+</SearchPaths>
446+```
431447
432448b\. Add missing quote to unitname value
433449
434-`<Item43>`\
435-`  <Filename Value="../../src/dbc/ZDbcASA.pas"/>`\
436-`  <UnitName Value="ZDbcASA/>`\
437-`</Item43>`
450+```text
451+<Item43>
452+ <Filename Value="../../src/dbc/ZDbcASA.pas"/>
453+ <UnitName Value="ZDbcASA/>
454+</Item43>
455+```
438456
439457Ahora, aquí están las instrucciones de instalación:
440458
441459Antes de la versión 0.9.13 de Lazarus era necesario abrir cada uno de los paquetes de Zeos a través de Paquetes/Abrir Paquete en el siguiente orden:
442460
4434611. zcore.lpk
4444622. zparsesql.lpk
4454633. zplain.lpk
4464644. zdbc.lpk
447465
448466Entonces finalmente abre zcomponent.lpk para compilarlo e instalarlo. En Lazarus 0.9.13 \> solamente puede abrir zcomponent.lpk. El IDE abrirá el resto automáticamente.
449467
450468Nota: los cuatro primeros paquetes solamente necesitan ser compilados y no pueden ser instalados.
451469
452470--Forest 17:41, 2 Nov 2005 (CET)
453471
454472- 3\. Si compilas e instalas Lazarus con éxito, pero después de compilarse, comienza con:
455473
456474![](/wiki-images/5/57/Zeoserror.gif)
457475
458476Entonces se puede hacer:
459477
460478Dentro del fichero Zeos.Inc reemplazar, en la sección "// Settings for Debug mode": {\$R-} a {\$R+}
461479
462480--Junior 19:48, 15 Apr 2006 (GMT)
463481
464482Si aún así después de mostrar un error no recuperable que permita arrancar Lazarus, nos queda la alternativa de buscar el fichero ejecutable tal como estaba antes de compilar todo y que figura como lazarus.old.exe
465483
466484## Hacer la primera aplicación Zeos
467485
468486Las propiedades elementales necesarias para una aplicación simple funcional que se describen aquí se han marcado como referencia en los componentes de arriba como ( * ) para que esté más claro.
469487
470488- Sitúa un componente **ZConnection** en el formulario.
471489 - Establecer las propiedades de User, Password, Host, Port y Protocol (y cualquier otro parámetro que se necesite).
472490 - Establecer la propiedad "Set Connected" con el valor True.
473491
474492- Sitúa un componente **ZQuery** en el formulario (cuidado con confundirlo con ZReadOnlyQuery).
475493 - Establecer la propiedad "Connection" al valor de ZConnection activo.
476494 - Establecer la propiedad Sql a algo similar a **SELECT * FROM MyTable** (selecciona todo el contenido de la tabla especificada de la base de datos que se haya abierto previamente, es una sentencia SQL).
477495 - Establecer la propiedad "ACTIVE" al valor True.
478496
479497- Sitúa un componente **DataSource** de la solapa **\[Data Access\]**.
480498 - Establecer la propiedad "DataSet" con valor igual a la ZQuery activa.
481499
482500- Sitúa un componente **DBGrid** de la solapa **\[Data Controls\]**.
483501 - Establece el parámetro Datasource con el valor DataSource.
484502 - Si todo está bien se deberían ver los registros rellenos con datos en la tabla.
485503
486504## Más información sobre como trabajar con Zeos
487505
488506En los siguientes enlaces se pueden encontrar artículos realmente útiles explicando el uso de Zeos y su uso interno, alguno de los cuales además tratan además sobre materias específicas de Delphi pero que pueden ser utilizadas con Lazarus también.\
489507
490508- [Tutorial en español de Zeos+Lazarus+Sqlite:](http://lazaruszeos.blogspot.com/2010/07/uso-de-componentes-zeos-en-lzarus-y.html)
491509- [ZeosLib DBOs 6.1.5 - con Delphi 7 y Firebird 1.5 \[Enlaze roto](http://zeos.firmos.at/kb.php?mode=article&k=12)\]
492510- [Descripción de la arquitectura de los objetos de ZeosDB \[Enlaze roto](http://zeos.firmos.at/kb.php?mode=article&k=8)\]
493511- [Una introducción a la API de ZDBC \[Enlaze roto](http://zeos.firmos.at/kb.php?mode=article&k=7)\]
494512
495513**Por favor completar esto :)**
496514
497515## Posibles fallos e incidencias
498516
499517- He notado que en algunas ocasiones cuando se construye Lazarus no es capaz de encontrar algunos ficheros de Zeos, como un método rápido puedes probar esto:
500518 - Use **Components/Package Graph** from the main menu.
501519 - Abre el paquete **ZComponent**.
502520 - Right Click on the **Files** item in the list.
503521 - Selecciona **\[Recompile all required\]**.
504522 - Cuando pregunte "Re-Compile this and all required packages?" responder **\[Yes\]**.
505523 - Recompila Lazarus normalmente (con paquetes).\
506524 \
507525
508526- Hay un error en [[Glossary|FPC's]] [AnsiStrComp](http://lazarus-ccr.sourceforge.net/docs/rtl/sysutils/ansistrcomp.html) que causa comparación no fiable PChar, esto es obvio cuando se utiliza DBGrid para editar datos, **AnsiStrComp('abc', 'abcd')** no puede detectarlo ya que son diferentes pero detecta **AnsiStrComp('abd', 'abcd')** ignorando múltiples caracteres de la segunda cadena. Este error fue encontrado por Jesusrmx. Este error probablemente será subsanado pronto, ver [Bug Report](http://www.freepascal.org/bugs/showrec.php3?ID=4325).\
509527 \
510528
511529- \[Ya arreglado en trunk 1013\] Tratando de compilar la revisión 903 de ZeosDBO trunk (20110806) sobre GNU/Linux amd64 x86_64 da errores en el archivo ZClasses.pas como los siguientes:
512530 - Error: No matching Implementation for interface method "IUnknown.QueryInterface (constref TGuid, out \<Formal type\>) LongInt; Cdecl;"
513531 - El problema se debe a cambios en FPC relacionados con la compatibilidad entre plataformas (http://wiki.freepascal.org/User_Changes_2.6.0#IInterface.QueryInterface.2C_._AddRef_and_._Release_definitions_have_been_changed)
514532 - y la solución es editar el archivo ZClasses.pas como en el siguiente parche:
515533
516-`-    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;                                                      `\
517-`-    function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};                                                                                                                                                 `\
518-`-    function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};                                                                                                                                                `\
519-`+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; virtual;`\
520-`+    function _AddRef: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};`\
521-`+    function _Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};`\
522-`  public`\
523-`    constructor Create(const Controller: IInterface);`\
524-`    property Controller: IInterface read GetController;`\
525-`@@ -89,7 +93,8 @@`\
526-`  TContainedObject = class(TAggregatedObject, IInterface)`\
527-`  protected`\
528-`-    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; override;`\
529-`+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; override;`\
530-`  end;`\
531-`  {$ENDIF}`\
532-`@@ -221,7 +226,8 @@`\
533-`  Result := IInterface(FController)._AddRef;`\
534-`end;`\
535-`-function TAggregatedObject._Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};`\
536-`+function TAggregatedObject._Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};`
534+``` pascal
535+- function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;
536+- function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
537+- function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
538++ function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; virtual;
539++ function _AddRef: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};
540++ function _Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};
541+ public
542+ constructor Create(const Controller: IInterface);
543+ property Controller: IInterface read GetController;
544+@@ -89,7 +93,8 @@
545+ TContainedObject = class(TAggregatedObject, IInterface)
546+ protected
547+- function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; override;
548++ function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; override;
549+ end;
550+ {$ENDIF}
551+@@ -221,7 +226,8 @@
552+ Result := IInterface(FController)._AddRef;
553+end;
554+-function TAggregatedObject._Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
555++function TAggregatedObject._Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};
556+```
537557
538558* \[Ya arreglado en trunk 1013\] Tratando de compilar la revisión 903 of ZeosDBO trunk en GNU/Linux con FPC 2.6.0 o superior, da el siguiente error en ZAbstractRODataset.pas: "Error: Expected another 2 array elements". El problema es que FPC2_1UP no está definido porque el archivo src/Zeos.inc no verifica las versiones nuevas. Si estamos usando solo versiones nuevas de FPC (2.6, 2.7 o superiores) podemos modificar src/Zeos.inc agregando las lineas siguientes justo antes de {\$IFDEF VER2_5}, y el error no aparece mas.
539559
540-`+  {$DEFINE FPC2_5UP}`\
541-`+  {$DEFINE FPC2_4UP}`\
542-`+  {$DEFINE FPC2_3UP}`\
543-`+  {$DEFINE FPC2_2UP}`\
544-`+  {$DEFINE FPC2_1UP}`\
545-`+  {$DEFINE FPC2_UP}`\
546-`+`\
547-`   {$IFDEF VER2_5}`\
548-`     {$DEFINE FPC2_5UP}`
560+```text
561++ {$DEFINE FPC2_5UP}
562++ {$DEFINE FPC2_4UP}
563++ {$DEFINE FPC2_3UP}
564++ {$DEFINE FPC2_2UP}
565++ {$DEFINE FPC2_1UP}
566++ {$DEFINE FPC2_UP}
567++
568+ {$IFDEF VER2_5}
569+ {$DEFINE FPC2_5UP}
570+```
549571
550572---
551573*From the Free Pascal wiki, page "Zeos tutorial/es", as it stood on 2020-03-03 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).*
552574Category: Castellano
553575Category: Español

Back to history