Difference between revisions of "Databases/es"

From Free Pascal wiki
Jump to navigationJump to search
m (OSX -> macOS)
 
(120 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Databases}}[[category:Castellano|D]][[category:Español]]
+
{{Databases}}
 +
 
 +
{{Infobox databases}}
  
 
Trabajo en curso...
 
Trabajo en curso...
Line 7: Line 9:
 
== Introducción ==
 
== Introducción ==
  
   Esta página será una introducción al tema "Lazarus y las bases de datos. La tabla que sigue proporciona una visión general sobre las bases de datos soportadas. Es necesario actualizarla en breve, ya que se basa en el momento en que FPC 1.9.7 fue liberado. '''Advertencia''': Sólo debe instalar los componentes de base de datos para los que ha instalado las librerías cliente, si la base de datos necesita de ellas; de lo contrario Lazarus podría no iniciarse debido a que faltan archivos. A continuación, no tendrías más remedio que volver a instalar Lázaro, porque desinstalar el componente no es posible. (En realidad no es tan grave, hay una alternativa: borrar el nombre del paquete o paquetes del archivo '''staticpackages.inc''' -en las últimas versiones este archivo se crea a partir del contenido de '''miscellaneousoptions.xml''', y es este el archivo que hay que editar- y compilar el IDE desde la línea de órdenes con '''lazbuild --build-ide=''')
+
   Esta página será una introducción al tema "Lazarus y las bases de datos. La tabla que sigue proporciona una visión general sobre las bases de datos soportadas. Es necesario actualizarla en breve, ya que se basa en el momento en que FPC 1.9.7 fue liberado. '''Advertencia''': Sólo debe instalar los componentes de base de datos para los que ha instalado las librerías cliente, si la base de datos necesita de ellas; de lo contrario Lazarus podría no iniciarse debido a que faltan archivos. A continuación, no tendrías más remedio que volver a instalar Lazarus, porque desinstalar el componente no es posible. (En realidad no es tan grave, hay una alternativa: borrar el nombre del paquete o paquetes del archivo '''staticpackages.inc''' -en las últimas versiones este archivo se crea a partir del contenido de '''miscellaneousoptions.xml''', y es este el archivo que hay que editar- y compilar el IDE desde la línea de órdenes con '''lazbuild --build-ide=''')
  
 
=== Bases de Datos soportadas ===
 
=== Bases de Datos soportadas ===
Line 19: Line 21:
 
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Plataformas<br>compatibles'''
 
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Plataformas<br>compatibles'''
 
|----
 
|----
|'''Textfiles'''||sdf||No||No|| - || Todas
+
|[http://www.advantagedatabase.com/ '''Advantage''']||TAdsDataSet||Si||No||10.1 y superior|| i386: Linux, Win32
 +
|----
 +
|'''DBase'''||[[Lazarus_Tdbf_Tutorial/es | DBFLaz]]||No||No|| III+, IV, VII || Todas
 
|----
 
|----
 
|'''In memory'''||memds||No||No|| - || Todas
 
|'''In memory'''||memds||No||No|| - || Todas
Line 25: Line 29:
 
|'''In memory'''||bufdataset||No||No|| - || Todas
 
|'''In memory'''||bufdataset||No||No|| - || Todas
 
|----
 
|----
|'''DBase'''||[[Lazarus_Tdbf_Tutorial/es | DBFLaz]]||No||No|| III+, IV, VII || Todas
+
|[http://www.embarcadero.com/products/interbase-smp '''Interbase''']||SQLdb||Si||Si||4 - 6|| i386: Linux, Win32
 +
|----
 +
|[http://www.firebirdsql.org/ '''Firebird''']||SQLdb||Yes||Depende<sup id="supported_db_1_back">[[#supported_db_1|(1)]]</sup>||1 - 2.5|| i386: Linux, Win32
 
|----
 
|----
 
|'''FoxPro'''||[[Lazarus_Tdbf_Tutorial/es | DBFLaz]]||No||No|| 2.0, 2.5, 3.0 (parcial) || Todas
 
|'''FoxPro'''||[[Lazarus_Tdbf_Tutorial/es | DBFLaz]]||No||No|| 2.0, 2.5, 3.0 (parcial) || Todas
 
|----
 
|----
|'''Paradox'''||[[TParadoxDataSet | TParadoxDataSet]]||No||No|| hasta tablas de nivel 7 (¿y más ?) || Todas
+
|[http://www.microsoft.com/sqlserver/ '''Microsoft SQL Server''']||SQLdb||Si||Si||6-||Linux, macOS, Win32, probablemente *BSD, probablemente Solaris<sup id="supported_db_2_back">[[#supported_db_2|(2)]]</sup>
 +
|----
 +
|[http://www.mysql.com/ '''MySQL''']||SQLdb||Si||Si|| 3.0 - 5.5 || i386: Linux, Win32
 
|----
 
|----
|[http://www.sqlite.org/ '''SQLite''']||SQLite||Sí||No|| - || i386: Linux, Win32
+
|'''ODBC'''||[[ODBCConn/es|SQLdb]]||Sí||Según SGDB|| 3.x <sup id="supported_db_3_back">[[#supported_db_3|(3)]]</sup> || i386: Linux, Win32
 
|----
 
|----
|[http://www.mysql.com/ '''MySQL''']||SQLdb|||||| 3.0 - 5.1 || i386: Linux, Win32
+
|[http://www.oracle.com/ '''Oracle''']||SQLdb||Si||Si|| - || -
 
|----
 
|----
|[http://www.firebirdsql.org/ '''Firebird''']||IBase||||||1 - 2.0|| i386: Linux, Win32
+
|'''Paradox'''||[[TParadoxDataSet | TParadoxDataSet]]||No||No|| hasta tablas de nivel 7 (¿y más ?) || Todas
 
|----
 
|----
|[http://www.embarcadero.com/products/interbase-smp '''Interbase''']||SQLdb||Yes||Yes||4 - 6|| i386: Linux, Win32
+
|[http://www.postgresql.org/ '''PostgreSQL''']||SQLdb||Si||Si|| 6.6 - 8 || i386: Linux, Win32
 
|----
 
|----
|[http://www.postgresql.org/ '''PostgreSQL''']||SQLdb|||||| 6.6 - 8 || i386: Linux, Win32
+
|[http://www.sybase.com/products/databasemanagement/adaptiveserverenterprise '''Sybase Adaptive Server Enterprise (ASE) ''']||SQLdb||Si||Si||Cualquiera||Linux, macOS, Win32, probablemente *BSD, probablemente Solaris<sup id="supported_db_2_back">[[#supported_db_2|(2)]]</sup>
 
|----
 
|----
|'''ODBC'''||[[ODBCConn/es|SQLdb]]||Sí||Según SGDB|| 3.x <sup>1)</sup> || i386: Linux, Win32
+
|[http://www.sqlite.org/ '''SQLite''']||SQLite||Sí||No|| - || i386: Linux, Win32
 
|----
 
|----
|[http://www.oracle.com/ '''Oracle''']||SQLdb|||||| - || -
+
|'''Textfiles'''||sdf||No||No|| - || Todas
 
|}
 
|}
 
</center>
 
</center>
<sup>1)</sup> Se puede utilizar una versión embebida de Firebird en Windows al menos (posiblemente en Linux / OSX con algunas modificaciones), o puede conectarse a un servidor Firebird que corre en Windows/Unix/OSX/FreeBSD/y otras plataformas soportadas por Firebird
 
  
&nbsp;&nbsp;&nbsp;<sup>2)</sup> Este número de versión se refiere al estándar ODBC, no al número de versión de un controlador o un gestor de controladores. Hay controladores ODBC 3.x para la mayoría de los DBMS.
+
 
 +
<cite id="supported_db_1">[[Databases/es#supported_db_1_back|Nota <sup>(1)</sup>]]</cite> Se puede utilizar una versión embebida de Firebird en Windows y Linux(posiblemente en macOS también), o puede conectarse a un servidor Firebird que corre en Windows/Unix/macOS/FreeBSD/y otras plataformas soportadas por Firebird.
 +
 
 +
<cite id="supported_db_2">[[Databases/es#supported_db_2_back|Nota <sup>(2)</sup>]]</cite> Estos conectores utilizan la librería FreeTDS como driver. La documentación FreeTDS indica que debería contruir en al menos estas plataformas.
 +
 
 +
<cite id="supported_db_3">[[Databases/es#supported_db_3_back|Nota <sup>(3)</sup>]]</cite> Este número de versión se refiere al estándar ODBC, no al número de versión de un controlador o un gestor de controladores. Hay controladores ODBC 3.x para la mayoría de los DBMS.
  
 
== Los enlaces con los ''clientes'' de base de datos ==
 
== Los enlaces con los ''clientes'' de base de datos ==
  
&nbsp;&nbsp;&nbsp;Si deseas utilizar una de las librerías cliente de bases de datos, las librerías tienen que estar instaladas,no sólo en el equipo en que se programa, sino también en los equipos en que sen ejecutará la aplicación. Ten en cuenta que algunas bases de datos (MySQL, en particular) sólo funcionará si los enlaces usados al compilar la aplicación son de la misma versión que los de las librerías instaladas. Puedes averiguar cómo instalar las librerías (archivos .so en sistemas *nix, y .dll en windows) en la página web de los desarrolladores de la base de datos. Las unidades de enlace se pueden encontrar en los directorios base de los paquetes base en el fuente FPC. Básicamente consisten en llamadas al API de cliente como ''mysql_connect_database'', que son completamente diferentes para cada base de datos. Es posible escribir aplicaciones de base de datos con estas unidades, pero por lo general es mucho más trabajo y propenso a errores quee utilizar los componentes dela unidad DB de Lazarus.
+
&nbsp;&nbsp;&nbsp;Si deseas utilizar alguna de las bases de datos que requieren de librerías cliente entonces dichas librerias tienen tienen que estar instaladas,no sólo en el equipo en que se programa, sino también en los equipos en que sen ejecutará la aplicación. Ten en cuenta que algunas bases de datos (MySQL, en particular) sólo funcionará si los vínculos usados al compilar la aplicación son '''de la misma versión''' que los de las librerías instaladas. Puedes averiguar cómo instalar las librerías (archivos .so en sistemas *nix, y .dll en windows) en la página web de los desarrolladores de la base de datos. Las unidades de enlace se pueden encontrar en los directorios base de los paquetes base en el fuente FPC. Básicamente consisten en '''llamadas al API''' de cliente como ''mysql_connect_database'', que son completamente diferentes para cada base de datos. Es posible escribir aplicaciones de base de datos utilizando estas unidades, pero por lo general implica mucho más trabajo y se hace propenso a errores que la opción de utilizar los componentes de la unidad DB de Lazarus.
 +
 
 +
&nbsp;&nbsp;&nbsp;La mayoría de estos paquetes de enlace están muy vinculadas a la librería clientes. Esto implica que si la aplicación se compila con una de estas unidades, toda la aplicación no podrá enlazarse si las librerías cliente no están disponibles en el equipo.Esto significa que tu programa ejecutable no se generará si no tienes instalado - por ejemplo - un cliente MySQL en tu ordenador y en cambio estás utilizando la unidad mysql14.pp.
  
&nbsp;&nbsp;&nbsp;La mayoría de estos paquetes de enlace están muy vinculadas a la librería clientes. Esto implica que si la aplicación se compila con una de estas unidades, toda la aplicación no podrá enlazarse si las librerías cliente no están disponibles en el equipo. Esto significa que, si no tienes instalado -por ejemplo- MySQL en el equipo, y si estás usando la unidad mysql4.pp en tu programa, el programa no se enlazará.
+
&nbsp;&nbsp;&nbsp;Si tienes éxito al compilar el programa en un equipo que tiene instaladas las librerias cliente de MySQL, ni siquiera se iniciará en otra máquina sin las librerías MySQL adecuadas. En otras palabras: para estas bases de datos, es necesario instalar las librerías de cliente en el equipo de desarrollo, y es necesario instalar estas bibliotecas de cliente con tu aplicación para que también funcione en otros equipos.
&nbsp;&nbsp;&nbsp;Si tienes éxito al compilar el programa en un equipo que tiene instalado MySQL, ni siquiera se iniciará en otra máquina sin las librerías MySQL adecuadas.
 
&nbsp;&nbsp;&nbsp;En otras palabras: para estas bases de datos, es necesario instalar las librerías de cliente en el equipo de desarrollo, y es necesario instalar estas bibliotecas de cliente con tu aplicación.
 
  
&nbsp;&nbsp;&nbsp;Para evitar estos problemas algunos de los paquetes también son capaces de enlazar dinámicamente las librerías. Antes de hacer cualquier llamada a la librería, la unidad debe ser 'iniciada'. Este inicio falla si la base de datos de cliente no está instalada en el equipo. Al terminar de utilizar las librerías cliente el programa estas tienen que ser "liberadas".
+
&nbsp;&nbsp;&nbsp;Para evitar estos problemas algunos de los paquetes también son capaces de enlazar dinámicamente las librerías. Antes de hacer cualquier llamada a la librería, la unidad debe ser 'iniciada' (initialized). Este inicio falla si la base de datos de cliente no está instalada en el equipo. Al terminar de utilizar las librerías cliente la correspondiente unidad tiene que ser 'liberada' (released).
  
 
==Conjuntos de datos (''Datasets'')==
 
==Conjuntos de datos (''Datasets'')==
&nbsp;&nbsp;&nbsp;La utilización de bases de datos en Lazarus (o FreePascal) se basa fundamentalmente en la clase '''''TDataset'''''. Esta representa una tabla o consulta de tu aplicación. Sin embargo, al igual que con muchas otras clases fundamentales, no se utiliza la clase TDataset en sí, se utiliza una derivada de ella. Hay muchas de estas, que proporcionan acceso a los diferentes tipos de bases de datos, como archivos locales dBase o de texto, o en servidores tales como bases de datos PostgreSQL, Firebird, MySQL, etc. Algunos descendientes de DataSet son una conexión directa a las tablas de base de datos, mientras que otros utilizan componentes o bibliotecas para llevar a cabo la conexión
+
&nbsp;&nbsp;&nbsp;La utilización de bases de datos en Lazarus (o FreePascal) se basa fundamentalmente en la clase '''''TDataset'''''. Esta representa una tabla o consulta de tu aplicación. Sin embargo, al igual que con muchas otras clases fundamentales, no se utiliza la clase TDataset en sí, sino una descendiente de ella. Hay muchas de este tipo, que proporcionan acceso a los diferentes tipos de bases de datos, como archivos locales dBase o de texto, o en servidores tales como bases de datos PostgreSQL, Firebird, MySQL, etc. Algunos descendientes de DataSet enlazan directamente a tablas de la base de datos, mientras que otros utilizan componentes o bibliotecas adicionales para establecer el enlace.
 +
 
 +
&nbsp;&nbsp;&nbsp;Los descendientes de TDataSet, del tipo componentes no visuales forman parte (usualmente) de la Librería de Componentes Libre (FCL: Free Component Library) en lugar de la Librería de Componentes de Lazarus (LCL: Lazarus Component Library).
 +
 
 +
&nbsp;&nbsp;&nbsp;Los conjuntos de datos (''DataSet'') se pueden utilizar tanto mediante programación directa como utilizando los controles visuales. En una aplicación típica de base de datos de Lazarus a menudo se utilizan ambos métodos. En cualquier caso, el primer paso es crear el descendiente TDataset, a continuación iniciarlo para conectar a la tabla, y abrirlo para realizar la consulta deseada. Esto se puede hacer tanto mediante código, en tiempo de ejecución, como situando un componente en el formulario y configurando sus propiedades en tiempo de diseño. Los detalles de este proceso varían considerablemente con cada diferente descendiente del TDataset, por tanto debes consultar las distintas guías disponibles para cada Base de Datos concreta.
 +
 
 +
&nbsp;&nbsp;&nbsp;Cuando se abre (opened) el ''DataSet''  se crea un conjunto de componentes de campo (field), uno para cada campo o columna de la tabla o consulta que se abrió. Cada componente de campo es un descendiente de '''''TField''''', apropiado para el [[Database_field_type|tipo de datos en particular del campo]] como por ejemplo TStringField para una cadena, pero hay más.
 +
 
 +
=== Utilizando conjuntos de datos mediante código ===
 +
 
 +
Se explicará en mas detalle en [[Using Dataset and Field components]], pero haciendo una simple descripción:
 +
Programmatic access will be explained in more detail in  but as a very simple overview:
 +
* Utilizar el descenciente de TDataset para abrir la tabla o consulta (query), filtrar las filas que se necesitan y mover fila a fila. 
 +
* Utilizar los descendientes de TField para:
 +
**Acceso general de información de los campos.
 +
**Acceso a los valores específicos de la fila actual.  (utilizar las propiedades de '''As'''..., tales como AsString, AsInteger, etc.)
 +
* Acceder a los campos de un descendiente TDataset utilizando ambos:
 +
**Las propiedades del campo, eg Fields[0] es el primer campo,
 +
**El método FieldByName , eg FieldByName('EDAD') retorna el campo asociado con el campo de tabla de la base de datosasociado con el campo llamado 'EDAD'. (Cuidado con el uso de mayúsculas/minúsculas en los nombres de campo, ante la duda o fallos probar a poner el nombre en minúsculas, por ejemplo en PostgreSQL).
 +
 
 +
Ver [[Database_field_type]] para un listado de tipos de campo.
 +
 
 +
=== Utilizando los controles visuales (data-aware) ===
 +
 
 +
&nbsp;&nbsp;&nbsp;Para utilizar las bases de datos en un estilo simple de Lazarus "RAD: Rapid Application Deployment" se configura el descendiente de dataset en tiempo de diseño y se utilizan los controles data-aware.
 +
Para hacer esto:
 +
 
 +
* Añadir el descendiente dataset para la base de datos elegida, junto con cualquier componente de soporte, al formulario. Asignarle la conexión y establecer la consulta SQL, luego abrirlo (establecer la propiedad 'Active' a True).
  
&nbsp;&nbsp;&nbsp;Los descendientes de TDataSet, son componentes no visuales y forman (en general) parte de la Librería de Componentes Libre (FCL) en lugar de la Librería de Componentes de Lazarus (LCL)
+
* Añadir un componente TDataSource(desde la solapa "Data Access") al formulario, y "enlazarlo" al dataset (establecer para ello la propiedad DataSet).
  
&nbsp;&nbsp;&nbsp;Los conjuntos de datos (''DataSet'') se puede utilizar mediante programación y con los controles visuales. En una aplicación típica de base de datos de Lazarus a menudo se utilizan ambos métodos. En cualquier caso, el primer paso es crear el descendiente TDataset, iniciar su conexión a la tabla o consulta que desee, y abrirlo. Esto se puede hacer ya sea en el código, en tiempo de ejecución, o situando un componente en su formulario y configurando sus propiedades en tiempo de diseño. Los detalles de este proceso varían considerablemente con cada diferente descendiente de TDataset, así que consulta las distintas guías  en [[Bases de datos]] por ver lo que tienes que hacer de tu base de datos.
+
* Añadir controles data-aware desde la solapa "Data Controls" al formulario, y enlazar cada uno de los componentes DataSource (fuente de los datos), pero no el dataset.
  
&nbsp;&nbsp;&nbsp;Cuando el ''DataSet'' se crea un conjunto de componentes de campo, uno para cada campo o columna de la tabla o consulta que se abrió. Cada componente de campo es un descendiente de '''''TField''''', apropiado para el tipo de datos en particular del campo.
+
Conector-->DataSet-->DataSource<--Data Controls
  
===Using datasets from code===
+
* La mayor parte de los controles enlazan un simple campo, por lo tanto necesitas establecer además el campo (field) para cada solapa.
  
Programmatic access will be explained in more detail in [[Using Dataset and Field components]], but as a very simple overview:
+
Ver [[#Data Controls]] más abajo para más detalles sobre los controles.
* Use the TDataset descendant to open the table or query, filter the rows you want to see, and to move from row to row.
 
* Use the TField descendants to:
 
**Access general information about fields
 
**Access the specific data values for the current row.  (use the As... properties, such as AsString, AsInteger, etc.)
 
* Access the fields of a TDataset descendant by using either:
 
**The fields property, eg Fields[0] is the first field,
 
**The FieldByName method, eg FieldByName('AGE') returns the field associated with the database field called 'AGE'
 
  
See [[Database_field_type]] for a list of field types.
+
=== Estado de un Dataset ===
 +
Los Datasets puede encontrarse en varios estados. Mientras tanto aqui tenemos unos pocos(buscar por TDataSetState en la fuente), los principales que podemos encontrar inicialmente son:
  
===Using the visual (data-aware) controls===
+
<center>
 +
{| BORDER="1" CELLSPACING="0" STYLE="text-ALIGN:CENTER;"
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Estado'''
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Función'''
  
To use databases in a simple, "RAD" style Lazarus application, you usually configure the dataset descendant at design time and  the use the data-aware controls.  To do this:
+
|----
*Add the dataset descendant for the database of your choice, together with any supporting components, to your form, and open it (Set the 'Active' property to true)
+
|'''dsInactive'''||dataset status Inactive indica que el dataset está cerrado
*Add a TDatasource component (from the "Data Access" tab) to the form, and "link" it to the dataset (set the DataSet property)
 
*Add data-aware controls from the "Data Controls" tab to the form, and link each one to the DataSource (not dataset) component
 
*Most controls link to a single field, so you also need to set the Field for each tab.
 
See [[#Data Controls]] below for more details on the controls
 
  
=== Dataset State ===
+
|----
Datasets can be in a number of states.  While there are quite a few (look up TDataSetState in the source), the main ones to be aware of initally are
+
|'''dsBrowse'''|| dataset status dsBrowse indica que el usuario puede moverse por el dataset, buscando valores
<table>
 
  <tr>
 
    <th>State</th>
 
    <th>Function</th>
 
  </tr>
 
  <tr>
 
    <td>dsInactive</td>
 
    <td>The dataset is closed</td>
 
  </tr>
 
  <tr>
 
    <td>dsBrowse</td>
 
    <td>The user can browse through the dataset, looking at values</td>
 
  </tr>
 
  <tr>
 
    <td>dsEdit</td>
 
    <td>The user can edit values on the current row.  Values are not saved until a post is performed.</td>
 
  </tr>
 
  <tr>
 
    <td>dsInsert</td>
 
    <td>A new row has been added, and the user can set the values.  The record is not saved until a post is performed</td>
 
  </tr>
 
</table>
 
The other states are fairly transitory, and are usually handled "automatically".  They are used internally and in more complicated code.  If your database only views data, and you open the dataset at design time, you can largely ignore the state, as it will mostly be dsBrowse.  However, most applications will want to change the data at some stage.  If you are using data-aware controls, they will handle a lot of this automatically.  If you change the text in a DBEdit control, for example, it will put the dataset into dsEdit state - unless you are already in dsEdit or dsInsert.  If you "scroll" to a different record while the current state is dsEdit or dsInsert, that record will be "posted" and the dataset revert to dsBrowse.  However, if you are accessing the dataset from code, you will often have to change the state in code as well.  The dbNavigator control (see below) allows the user to change the state explicitly.
 
  
===Post and Cancel===
+
|----
If you have edited or inserted a record, the new values are held in a buffer.
+
|'''dsInsert'''||dataset status Insert indica que e ha insertado una nueva fila (registro), y el usuario puede establecer valores. El campo no se salva hasta que no se realiza el post
*Calling the dataset cancel method removes the new record (insert) or reverts the values to their previous values (edit).  
+
|}
*Calling the dataset post method saves the values (edit) or record (insert).  In some dataset descendants, they will be written to the database immediately, while in others they will be stored in a list of updates until a further call is made to save all changes to the database.  Finally, even when they are written to the database, you may still have to call a "commit" method to make the database write them permanently.  All of this also varies considerably with the dataset descendant, so look up the details for the one you are using.
+
</center>
  
===Inserting a new record===
 
To insert a new record into a TDataset descendent, one should use the method [http://www.freepascal.org/docs-html/fcl/db/tdataset.insert.html Insert]. After that one can set the field values and then finally call Post to commit the new record, as the example below shows:
 
  
<delphi> MyDataset.Insert;
+
Los otros estados son claramente transitorios, y son manejados "automaticamente". Se utilizan internamente y en código más complejo. Si tu base de datos solo ve datos y abres el dataset en tiempo de ejecución entonces puedes ignorar ampliamente el estado, ya que se encontrará primordialmente como dsBrowse.  Sin embargo, muchas aplicaciones necesitarán cambiar el dato a algún estado. Si estás utilizando controles data-aware, entonces ellos mismos manejarán la mayor parte de esto automáticamente. Si cambias el texto en un control DBEdit, por ejemplo, esto pondrá el dataset en estado dsEdit - al menos que ya se esté en estado dsEdit o dsInsert (ds=data state).  Si te desplazas "scroll" a un campo diferente mientras el estado actual se encuentra en dsEdit o dsInsert, entonces este campo será posteado "posted" y el dataset se revierte a dsBrowse.  A pesar de ello, si estás accediendo el dataset desde código, obtendrás un cambio de estado en código también. El control dbNavigator (ver más abajo) permite al usuario cambiar el estado explícitamente.
 +
 
 +
=== Envío (Post) y Cancelación (Cancel) ===
 +
 
 +
Si has editado o insertado un campo entonces los valored se mantienen almacenados en un buffer, por lo que están preparados para realizar una acción sobre ellos tales como Post o Cancel.
 +
 
 +
* Llamando al método "cancel" del dataset remueve el nuevo campo (si hemos realizado un "insert") o revierte los valores a sus valores previos (si hemos realizado un "edit")
 +
* Llamando al método "post" del dataset salva los valores (si hemos realizado un "edit") o campos (si hemos realizado un "insert"). En algunos descendientes del dataset deben grabarse en la base de datos inmediatamente, mientras que en otros se almacenan en una lista hasta que se realiza una llamada posterior que produce el salvado de todos los cambios a la base de datos. Finalmente, incluso cuando son escritos a la base de datos, todavía habría que realizar una llamada al método "commit" para que la que la escritura se realice de forma permanente. Todo esto varía considerablemente con cada descendiente del dataset por lo que se hace necesario revisar los detalles para cada uno que se utiliza.
 +
 
 +
=== Insertando un nuevo registro (record) ===
 +
 
 +
Para insertar un nuervo registro dentro de un descendiente de TDataset se debe utilizar el método [http://www.freepascal.org/docs-html/fcl/db/tdataset.insert.html Insert]. Después de esto, ya se pueden establecer los valores del campo y finalmente llamar a Post para realizar el commit (acometer) del nuevo registro, tal como muestra el siguiente ejemplo:
 +
 
 +
<syntaxhighlight lang=pascal>
 +
MyDataset.Insert;
 
  MyDataset.Fields[0].AsInteger := 4;
 
  MyDataset.Fields[0].AsInteger := 4;
  MyDataset.Fields[1].AsString := 'First Name';
+
  MyDataset.Fields[1].AsString := 'Nombre';
  MyDataset.Post;</delphi>
+
  MyDataset.Post;</syntaxhighlight>
  
===How to quickly jump to 1 particular record in the table===
+
=== Como saltar rápidamente a un registro de la tabla en particular ===
  
====After selecting all records of the table====
+
====Después de seleccionar todos los registros de la tabla====
If you use SELECT * FROM to select all records of the table and then desires to quickly jump between them, you will have to build an index and search on it. It is more efficient to select only the record that you want.
 
====Selecting only the desired record====
 
One fast solution to jump to a particular record is to select only it, for example doing:
 
  
<delphi> var
+
Si utilizas SELECT * FROM tabla para seleccionar todos los registros de la tabla y entonces deseas saltar rápidamente entre ellos, entonces tienes que construir un índice y buscar en el mismo. Es mucho más eficiente seleccionar únicamente el registro que necesitas que la totalidad.
MyDataset: TSQLQuery;
+
 
 +
==== Selecionando únicamente el registro deseado ====
 +
 
 +
Una solución rápida para saltar a un registro en particular es simplemente "seleccioarlo en exclusiva", lo cual se puede realizar
 +
acotando con la cosulta de SQL, tal como se puede observar en el siguiente ejemplo:
 +
 
 +
<syntaxhighlight lang=pascal>
 +
var
 +
  MyDataset: TSQLQuery;
 
  begin
 
  begin
 
   //...
 
   //...
   MyDataset.FieldDefs.Add('SessionId', ftLargeint);
+
   MyDataset.FieldDefs.Add('SessionId', ftLargeint); {0} {ft = fieldtype}
   MyDataset.FieldDefs.Add('GameEvent', ftLargeint);
+
   MyDataset.FieldDefs.Add('GameEvent', ftLargeint); {1}
   MyDataset.FieldDefs.Add('TableId', ftInteger);
+
   MyDataset.FieldDefs.Add('TableId', ftInteger);   {2}
   MyDataset.FieldDefs.Add('LoggedIn', ftBoolean);
+
   MyDataset.FieldDefs.Add('LoggedIn', ftBoolean);   {3}
   MyDataset.FieldDefs.Add('PlayerId', ftInteger);
+
   MyDataset.FieldDefs.Add('PlayerId', ftInteger);   {4 <=== este es el que queremos obtener}
 
   MyDataset.Active := False;
 
   MyDataset.Active := False;
 
   SQLText := Format('select * from "GameSession" WHERE "SessionId"=%d', [ASessionId]);
 
   SQLText := Format('select * from "GameSession" WHERE "SessionId"=%d', [ASessionId]);
 
   MyDataset.SQL.Text := SQLText;
 
   MyDataset.SQL.Text := SQLText;
 
   try
 
   try
     MyDataset.Active := True;
+
     MyDataset.Active := True; { Probamos a activar el dataset dentro de un bloque de intercepción de errores de forma que }
 +
    {si no logra conectar podamos obtener retornado un tipo de error bien sea uno genérico (por defecto) u otro más especí-}
 +
    {fico de la base de datos en particular pero eso lo tenemos que especificar.........}
 
   except
 
   except
 
     //...
 
     //...
  end;</delphi>
+
  end;</syntaxhighlight>
 +
 
 +
Entonces ya se puede leer información utilizando algo como lo siguiente:
 +
 
 +
<syntaxhighlight lang=pascal> lPlayerId := MyDataset.Fields[4].AsInteger;</syntaxhighlight>
 +
 
 +
=== Utilizando TSQLQuery ===
 +
 
 +
Para más información sobre TSQLQuery ver [[Working With TSQLQuery/es]]
 +
 
 +
== Controles de datos ==
 +
 
 +
&nbsp;&nbsp;&nbsp;Para utilizar cualquiera de estos controles, hay que añadir cualquiera de estos controles al formulario (form) y establecer al menos la propiedad datasource para indicarle la fuente de datos con que se asocia. Adicionalmente van a requerir establecer otras propiedades para su correcto funcionamiento.
 +
 
 +
Tomando como referencia la información contenida en
  
You can then read information using something like this:
+
http://lazarus-ccr.sourceforge.net/docs/lcl/dbctrls/howtousedataawarecontrols.html la descripción de los mismos sería:
  
<delphi> lPlayerId := MyDataset.Fields[4].AsInteger;</delphi>
+
Como utilizar controles DataAware - Sugerencias para el acceso a bases de datos.
  
===Using TSQLQuery===
+
Se aporta un conjunto de componentes Data-Aware, para hacer más fácil el acceso a la información contenida en bases de datos.
For more information about TSQLQuery see [[Working With TSQLQuery]]
 
  
==Data Controls==
+
Antes de utilizar los componentes Data-Aware, es necesario establecer una conexión con una base de datos, lo cual debería realizarse utilizando bien a través del componente TSQLConnection o del TDBf, dependiendo del tipo de base de datos que se esté utilizando. En cualquier caso, los componentes para la conexión con la base de datos necesitan estar ubicados en $Lazdir/components/sqldb/, $Lazdir/components/tdbf/ o en cualquier otro lugar que actue como fuente de forma apropiada. Necesitan ser añadidos utilizando el menú de elementos del IDE, además de estar previamente compilados. Una vez añadidos el IDE necesita reconstruirse para incluir los nuevos componentes.
  
To use any of these controls, add the control to a form and set at least the datasource propertyOther key properties will be noted.
+
Para realizar la conexión con la base de datos, primeramente emplaza una conexión a la base de datos en el formulario (invisible en tiempo de ejecución (run-time), ponlo por tanto en cualquier lugar que creas conveniente); establece sus propiedades para conectar el usuario (con su nombre y contraseña) al servidor, base de datos y tabla adecuados (el componente de conexión debería lidiar con todos los asuntos de autentificación de usuario, abriendo y cerrando la base de datos, etc). A continuación añadimos un TDataSource desde la solapa Data Access de la paleta de componentes, y tal vez elementos tales como TSQLTransaction y TSQLQuery, dependiendo de la base de datos en particular que se esté utilizando. Los variados componentes de bases de datos necesitan enlazarse entre ellos, por ejemplo estableciendo la propiedad Transaction de un conector de la base de datos al componente de transacción apropiado, y enlazando la propiedad DataBase del componente Transaction al conector de la base de datos; enlaza la propiedad DataSet del DataSource al SQLQuery u otro conjunto de datos, y su propiedad Transaction al componente transaction.
  
===Single Field Controls===
+
Cada control Data-Aware (en la solapa Data Controls de la paleta de componentes) tiene el conjunto de propiedades habitual para determinar su shape y tamaño, posición, color, fuente, etc. Pero además  tiene propiedades especiales para definir el dato a mostrar o modificar. Estas incluyen la propiedad DataSource que debe establecerse para enlazar con el conjunto de datos definido, y a menudo un componente Field para determinar la columna de la base de datos se mostrará.
  
These controls all attach to a single field.  As well as datasource, set the field name. Controls include:
+
La mayor parte de los componentes operan con una simple fila (Row) o campo (record) de la base de datos, (en cambio TDBGrid es capaz de mostrar y operar con múltiples filas y columnas, ver más abajo), permitiendo mostrar contenido incluso en tiempo de diseño, a condición de que varios componentes estén habilitados o establecidos activos; esto permite al diseñador asegurarse de que todas las conexiones a la base de datos se han realizado correctamente.
  
*[[doc:lcl/dbctrls/tdbtext.html|DBText control]] Displays a text field (readonly, no border)
+
 
*[[doc:lcl/dbctrls/tdbedit.html|DBEdit control]] Displays / edits a text field as an edit box  
+
La manera en que funciona la programación con bases de datos es la siguiente:
*[[doc:lcl/dbctrls/tdbmemo.html|DBMemo control]] Displays / edits a text field in a multi-line edit box
+
 
*[[doc:lcl/dbctrls/tdbimage.html|DBImage control]] Displays a picture stored in a database as a BLOB
+
* Se abre una base de datos para el acceso por parte del usuario (DataBase Connection).
*[[doc:lcl/dbctrls/tdblistbox.html|DBListBox control]] and [[doc:lcl/dbctrls/tdbcombobox.html|DBComboBox Control]] Allow the user to insert values into a database field from the list of values in the Items property of the controls
+
* Se realiza un mandato (e.g mediante TSQLQuery) para seleccionar o extraer alguno o todos los campos, los cuales se almacenan localmente es el DataSet   
*[[doc:lcl/dbctrls/tdbcheckbox.html|DBCheckBox control]] Displays / edits a boolean field by checking/clearing a check box
+
* El contenido del DataSet es utilizado por los componentes Data-Aware, mostrando una fila (Row) o campos a un tiempo desde las columnas seleccionadas, o por otro lado el DataSet completo si se utiliza un DBGrid, editando, insertando o borrando campos, o utilizando datos para realizarun test estadístico o cálculos.
*[[doc:lcl/dbctrls/tdbradiogroup.html|DBRadioGroup control]] Displays the items as in a normal radio group, reading/setting the field value from a matching values list
+
* A intervalos normalmente determinados por el usuario (algunas veces después de cada cambio, otras después de una serie de cambios completos), se envía el contenido del DataSet local a la base de datos, causando una actualización de su contenido. Esto es referido como un 'Commit' o 'Post' o a menudo como 'Update'.
*[[doc:lcl/dbctrls/tdbcalendar.html|DBCalendar control]] Displays / edits a date field using a calendar panel
+
 
 +
El programador puede determinar que eventos estan asociados con una acción Commit utiliando manejadores de eventos apropiados para
 +
OnClick, OnChange, OnFinishedEdit etc.
 +
 
 +
 
 +
=== Controles de un solo campo ===
 +
 
 +
En el caso de todos estos controles se vincula '''únicamente''' a un campo. Al igual que datasource hay que establecer el nombre de campo:
 +
 
 +
*[[doc:lcl/dbctrls/tdbtext.html|DBText control]] Muestra un campo de texto (solo lectura, sin borde).
 +
*[[doc:lcl/dbctrls/tdbedit.html|DBEdit control]] Muestra / edita un campo de texto como en un edit box.
 +
*[[doc:lcl/dbctrls/tdbmemo.html|DBMemo control]] Muestra / edita un campo de texto en una caja de edición multilínea.
 +
*[[doc:lcl/dbctrls/tdbimage.html|DBImage control]] Muestra una imagen almacenada en una base de datos como BLOB.
 +
*[[doc:lcl/dbctrls/tdblistbox.html|DBListBox control]] y [[doc:lcl/dbctrls/tdbcombobox.html|DBComboBox Control]] Permite al usuario insertar valores en los campos de una base de datos desde un listado de valores en la propiedad Items (elementos) de los controles.
 +
*[[doc:lcl/dbctrls/tdblookuplistbox.html|DBLookupListBox control]] y [[doc:lcl/dbctrls/tdblookupcombobox.html|DBLookupComboBox control]], ver además [[dblookupcombobox]] Permite al usuario insertar valores dentro de un campo de la base de datos mostrando el contenido de un campo lookup en otra tabla. Aunque estos controles almacenan su resultado en un solo campo, se necesita otro campo para los valores lookup. '''Nota''': al menos para DBLookupComboBox, hay un error con FPC 2.6.0 que requiere que listfield esté presente en el datasource pero se puede saltar esto declarando un campo con el mismo nombre de listfield en el dataset del datasource que no hace nada.
 +
*[[doc:lcl/dbctrls/tdbcheckbox.html|DBCheckBox control]] Muestra/ edita un campo booleano mediante el marcado(checking)/(desmarcado (clearing) de un check box.
 +
*[[doc:lcl/dbctrls/tdbradiogroup.html|DBRadioGroup control]] Muestra los elementos tal como en un radio group, leyendo/estableciendo el valor del campo desde un listado de valores de correspondencia (matching values list).
 +
*[[doc:lcl/dbctrls/tdbcalendar.html|DBCalendar control]] Muestra / edita un campo fecha utilizando un panel tipo calendario.
 
*[[doc:lcl/dbctrls/tdbgroupbox.html|DBGroupBox control]]
 
*[[doc:lcl/dbctrls/tdbgroupbox.html|DBGroupBox control]]
  
===[[doc:lcl/dbgrids/tdbgrid.html|DBGrid control]]===
+
La siguiente tabla muestra la correspondencia aproximada entre las clases de controles convencionales y las data-aware:
  
This control can show a number of fields in a row/column layout - in fact by default it shows them all.  However, you can put entries into the [[doc:lcl/dbgrids/tdbgrid.columns.html|columns collection]] to restrict it to specific fields and to set the widths and titles of each column.
+
 
 +
<center>
 +
{| BORDER="1" CELLSPACING="0" STYLE="text-ALIGN:CENTER;"
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Control Estandar'''
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Control de Datos'''
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Comentario'''
 +
 
 +
|----
 +
|'''TCalendar'''||'''TDBCalendar'''||Selecciona una fecha desde un calendario emergente
 +
|----
 +
|'''TCheckBox'''||'''TDBCheckBox'''||Check una casilla para mostrar la opción que se ha seleccionado
 +
|----
 +
|'''TComboBox'''||'''TDBComboBox'''||Selecciona una opción desde un listado y lo retorna (o algún texto personalizado) en el casillero de edición principal
 +
|----
 +
|'''TEdit'''||'''TDBEdit'''||Casillero de edición de texto de línea simple
 +
|----
 +
|'''TGroupBox'''||'''TDBGroupBox'''||Contenedor para varios controles relacionados
 +
|----
 +
|'''TImage'''||'''TDBImage'''||Una imagen
 +
|----
 +
|'''TListBox'''||'''TDBListBox'''||Una lista de elementos cadena
 +
|----
 +
|'''TMemo'''||'''TDBMemo'''||Casillero de edición de texto multi-línea
 +
|----
 +
|'''TRadioGroup''' ||'''TDBRadioGroup'''||Un grupo de Radio Buttons mutuamente exclusivos; solamente se puede tener checked y seleccionado uno al mismo tiempo. Ten en cuenta que no hay equivalente en data-aware a un solo TRadioButton
 +
|----
 +
|'''TText'''||'''TDBText'''||Una simple cadena de texto, usualmente de solo lectura
 +
|}
 +
</center>
 +
 
 +
 
 +
Los controles estandar pueden, por supuesto, utilizarse para mostrar información de la base de datos, pero carecen de la vinculación directa con el DataSet y sus ayudas a la navegación por el mismo, de forma que el programador debe en este caso escribir código explícitamente para extraer datos desde el DataSet y ponerlos en el control estandar.
 +
 
 +
===[[doc:lcl/dbgrids/tdbgrid.html|Control DBGrid]]===
 +
 
 +
Este control muestra n número de campos en una disposición de fila (registro) / columna (campo)- de hecho por defecto muestra todos.
 +
This control can show a number of fields in a row/column layout - in fact by default it shows them all.  Sin embargo, se pueden poner entradas dentro de [[doc:lcl/dbgrids/tdbgrid.columns.html|columns collection]] para restringirlos a unos campos específicos y establecer la anchura y títulos de cada columna.
 +
 
 +
Su equivalencia con el control convencional es:
 +
 
 +
<center>
 +
{| BORDER="1" CELLSPACING="0" STYLE="text-ALIGN:CENTER;"
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Control Estandar'''
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Control de Datos'''
 +
!STYLE="background:#ffdead;text-ALIGN:CENTER;"|'''Comentario'''
 +
 
 +
|----
 +
|'''TStringGrid'''||'''TdbGrid'''||Una rejilla para mostrar información en formato filas y columnas
 +
|}
 +
</center>
  
 
===[http://lazarus-ccr.sourceforge.net/docs/lcl/dbctrls/tdbnavigator.html Navigator Control]===
 
===[http://lazarus-ccr.sourceforge.net/docs/lcl/dbctrls/tdbnavigator.html Navigator Control]===
  
This control gives the user some direct control over the dataset.  It allows the user to:
 
* Move to the next or previous record, or to the start or end of the records
 
* Add a new record (equivalent to a dataset.insert method call)
 
* Put the dataset into edit mode
 
* Delete a record
 
* Post or Cancel current changes
 
* Refresh the data (useful in multiuser database applications)
 
  
Key Properties:
+
[[image:dbnavigator.PNG|center|450px]]
* VisibleButtons:  Lets you control what the user can do. For example, if deletes are not allowed, hide the delete button. If you have a DBGrid attached to the same dataset, you may decide you do not need the next and prior buttons.  
+
 
* Width:  If you do not show all buttons, you may want to set the width to (height*number_of_visible_buttons)
+
 
 +
Este control consistente en una barra de botones de utilidad ofrece al usuario algo de control directo sobre el DataSet, permitiendo al usuario:
 +
 
 +
* Mover al registro siguiente ('''next''') y previo ('''prior'''),  así como al principio ('''first''') y final ('''last''').
 +
* Añadir un registro nuevo (equivalente a la llamada a un método  dataset.insert).
 +
* Poner el  dataset en modo edición ('''edit'''), necesario cuando ya existe dicho registro y deseamos modificarlo.
 +
* Borrar un registro ('''delete''') el registro actual.
 +
* Envíar ('''post''') o Cancelar ('''cancel''') los cambios actuales del DataSet a la base de datos.
 +
* Refresca ('''refresh''') los datos (útil en aplicaciones de bases de datos multiusuario) desde la base de datos.
 +
 
 +
El programador puede determinar, en tiempo de diseño, que botones quiere dejar visibles o no, ajustando algunas de sus propiedades en el inspector de objetos:
 +
 
 +
* VisibleButtons:  Permite controlar lo que puede hacer el usuario. Por ejemplo, si los borrados (delete) no están permitidos se oculta este pulsador. Si se tiene un DBGrid anexado a un dataset puede decidirse que no se necesitan los pulsadores previo ('''prior''') y siguiente ('''next''').
 +
Los botones que posee esta barra son del tipo [http://lazarus-ccr.sourceforge.net/docs/lcl/dbctrls/tdbnavbuttonset.html tdbnavbuttonset] admitiendo los siguientes:
 +
 
 +
*Comienzan por nb de navigator button:
 +
**nbFirst: navigator button First (mueve al primer registro).
 +
**nbPrior: navigator buttor Prior (mueve al registro previo).
 +
**nbNext: navigator button Next (mueve al registro siguiente).
 +
**nbLast: navigator button Last (muesve al último registro).
 +
**nbInsert: navigator button Insert (inserta un nuevo registro).
 +
**nbDelete: navigator button Delete (borra el registro actual).
 +
**nbEdit: navigator button Edit (edita un registro existente).
 +
**nbPost: navigator button Post (envía el DataSet a la base de datos).
 +
**nbCancel: navigator button Cancel (cancela los cambios realizados).
 +
**nbRefresh navigator button Refresh (refresca el contenido del DataSet desde la base de datos).
 +
 
 +
Por ejemplo para un control de este tipo y su dataset asociado, vinculado a una fuente de datos:  '''dbnavigator1.DataSource.DataSet.First;''' nos situaría en el primer registro.
 +
 +
* Width:  Si no se muestran todos los pulsadores, posiblemente se necesite establecer la anchura al valor altura*número de pulsadores visibles( height*number_of_visible_buttons).
 +
 
 +
Para su funcionamiento se debe especificar el conjunto de datos al que se asocia mediante su propiedad DataSource.
 +
 
 +
Si se utiliza en conjunción con otros controles de datos (data-aware) tales como TDBGrid o TDBMemo entonces controla que registros se mostrarán, la posición del cursor de selección de registro y la iniciación de cambios del dataset y en última instancia de la base de datos.
 +
 
 +
Por otro lado cabe indicar que la mayor parte de la funcionalidad de esta barra se encuentra ya implementada, pero en el caso de que el programador necesite especificar acciones asociadas a un pulsadores individuales, hay un procedimiento [http://lazarus-ccr.sourceforge.net/docs/lcl/dbctrls/tdbcustomnavigator.btnclick.html tdbcustomnavigator.btnclick] al cual se puede enviar un argumentocon el valor de índice del botón pulsado, y el procedimiento escoge que acción llamar dependiendo del indice del botón.
 +
 
 +
== Corriendo los test de bases de datos de FPC ==
  
== Running FPC database tests ==
+
&nbsp;&nbsp;&nbsp;Los componentes de bases de datos FreePascal incluyen un framework de prueba que se puede utilizar para probar la funcionalidad. Ver el directorio source\packages\fcl-db\tests\ en el árbol de directorios de instalación de FPC.
FreePascal database components include a test framework that can be used to verify functionality.  
 
See the directory source\packages\fcl-db\tests\ in your FPC source tree.
 
Included is a test framework that can be run on various database components, as well as some other tests (e.g. test of database export in XMLXSDExportTest.lpr).
 
  
To run the test framework on a certain database:
+
Lo incluido es un framework de prueba que se puede arrancar en varios componentes de bases de datos, así como en otros test (e.g. test de exportacion de bases de datos en XMLXSDExportTest.lpr).
  
1. Save
+
Para arrancar el framework de prueba para una cierta base de datos hacer lo siguiente:
source\packages\fcl-db\tests\database.ini.txt  
+
 
as
+
1. Salvar
source\packages\fcl-db\tests\database.ini
+
"source\packages\fcl-db\tests\database.ini.txt"
 +
como
 +
"source\packages\fcl-db\tests\database.ini"
  
2. Modify
+
2. Modificar
 
source\packages\fcl-db\tests\database.ini
 
source\packages\fcl-db\tests\database.ini
to choose which database type you will use.
+
para escoger el tipo de base de datos a utilizar.
  
<code>Example: use Interbase or Firebird:
+
<code>Example: utilizar Interbase o Firebird:
 
[Database]
 
[Database]
 
type=interbase</code>
 
type=interbase</code>
  
3. In the same file, customize settings for your database. E.g. if you chose interbase before:
+
3. En el mismo fichero, configurar los valores para la base de datos a utilizar. E.g. si se escogió interbase anteriormente:
 +
 
 +
01 [interbase]
 +
02 connector=sql
 +
03 connectorparams=interbase
 +
04 ; esto es un comentario, ya que comienza por ; los números de inicio de línea se han puesto para más claridad.
 +
05 ;nombre de la base de datos. obviamente cambiar por el de la base de datos a utilizar.
 +
06 name=testdb
 +
07 user=sysdba
 +
08 password=masterkey
 +
09 ; tu hostname o nombre de equipo puede diferir del utilizado en este ejemplo (lógico).
 +
10 hostname=192.168.0.42
  
<code>[interbase]
+
4. Compila y arranca "source\packages\fcl-db\tests\dbtestframework.pas"
connector=sql
 
connectorparams=interbase
 
;name of the database. obviously change to your own playground database
 
name=testdb
 
user=sysdba
 
password=masterkey
 
;your hostname may very will differ to
 
hostname=192.168.0.42</code>
 
  
4. Compile and run source\packages\fcl-db\tests\dbtestframework.pas
+
La salida se obtendrá en formato XML.
The output will be in XML format.
 
  
Please see source\packages\fcl-db\tests\README.txt for more details.
+
 
 +
Para más detalles leer el fichero "source\packages\fcl-db\tests\README.txt"
  
 
== Paquetes de Bases de Datos suministrados con Lazarus ==
 
== Paquetes de Bases de Datos suministrados con Lazarus ==
Line 240: Line 379:
  
 
&nbsp;&nbsp;&nbsp;Este paquete provee acceso a diferentes bases de datos. Incluye:
 
&nbsp;&nbsp;&nbsp;Este paquete provee acceso a diferentes bases de datos. Incluye:
 +
 
* Interbase/Firebird
 
* Interbase/Firebird
* MySQL
+
* MySQL (Versiones: 4.0/4.1/5.0/5.1/5.5 en Lazarus 1.0.4).
 
* Oracle
 
* Oracle
* PostgreSQL
+
* PostgreSQL (Versiones: hasta la 8.x en Lazarus 1.0.4)
* SQLite
+
* SQLite (Versión: 3 en Lazarus 1.0.4)(con soporte para la extensión [[Spatialite]])
* any database that has an ODBC driver.
+
* Cualquier base de datos que tenga un driver ODBC.
  
 
&nbsp;&nbsp;&nbsp;Los componentes (TSQLQuery, TSQLTransaction, TIBConnection, TODBCConnection, TOracleConnection, TMySQL40Connection, TMySQL41Connection, TMySQL50Connection, TPQConnection) se encuentran en la pestaña 'SQLdb' en la paleta de componentes.
 
&nbsp;&nbsp;&nbsp;Los componentes (TSQLQuery, TSQLTransaction, TIBConnection, TODBCConnection, TOracleConnection, TMySQL40Connection, TMySQL41Connection, TMySQL50Connection, TPQConnection) se encuentran en la pestaña 'SQLdb' en la paleta de componentes.
Line 316: Line 456:
 
=== TechInsite Object Persistence Framework (tiOPF) ===
 
=== TechInsite Object Persistence Framework (tiOPF) ===
 
&nbsp;&nbsp;&nbsp;Más información acerca de tiOPF se puede encontrar en esta [[tiOPF|página]].
 
&nbsp;&nbsp;&nbsp;Más información acerca de tiOPF se puede encontrar en esta [[tiOPF|página]].
[[Category:Databases/es]]
 

Latest revision as of 02:53, 16 February 2020

Deutsch (de) English (en) español (es) français (fr) italiano (it) 日本語 (ja) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Databases portal

References:

Tutorials/practical articles:

Databases

Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

Trabajo en curso...

Artículos de programación de Bases de Datos

Referencias:

Tutoriales / artículos prácticos:

Introducción

   Esta página será una introducción al tema "Lazarus y las bases de datos. La tabla que sigue proporciona una visión general sobre las bases de datos soportadas. Es necesario actualizarla en breve, ya que se basa en el momento en que FPC 1.9.7 fue liberado. Advertencia: Sólo debe instalar los componentes de base de datos para los que ha instalado las librerías cliente, si la base de datos necesita de ellas; de lo contrario Lazarus podría no iniciarse debido a que faltan archivos. A continuación, no tendrías más remedio que volver a instalar Lazarus, porque desinstalar el componente no es posible. (En realidad no es tan grave, hay una alternativa: borrar el nombre del paquete o paquetes del archivo staticpackages.inc -en las últimas versiones este archivo se crea a partir del contenido de miscellaneousoptions.xml, y es este el archivo que hay que editar- y compilar el IDE desde la línea de órdenes con lazbuild --build-ide=)

Bases de Datos soportadas

Base
de Datos
Nombre
Paquete
¿Necesita
librerías?
¿Necesita
servidor?
Versiones
compatibles
Plataformas
compatibles
Advantage TAdsDataSet Si No 10.1 y superior i386: Linux, Win32
DBase DBFLaz No No III+, IV, VII Todas
In memory memds No No - Todas
In memory bufdataset No No - Todas
Interbase SQLdb Si Si 4 - 6 i386: Linux, Win32
Firebird SQLdb Yes Depende(1) 1 - 2.5 i386: Linux, Win32
FoxPro DBFLaz No No 2.0, 2.5, 3.0 (parcial) Todas
Microsoft SQL Server SQLdb Si Si 6- Linux, macOS, Win32, probablemente *BSD, probablemente Solaris(2)
MySQL SQLdb Si Si 3.0 - 5.5 i386: Linux, Win32
ODBC SQLdb Según SGDB 3.x (3) i386: Linux, Win32
Oracle SQLdb Si Si - -
Paradox TParadoxDataSet No No hasta tablas de nivel 7 (¿y más ?) Todas
PostgreSQL SQLdb Si Si 6.6 - 8 i386: Linux, Win32
Sybase Adaptive Server Enterprise (ASE) SQLdb Si Si Cualquiera Linux, macOS, Win32, probablemente *BSD, probablemente Solaris(2)
SQLite SQLite No - i386: Linux, Win32
Textfiles sdf No No - Todas


Nota (1) Se puede utilizar una versión embebida de Firebird en Windows y Linux(posiblemente en macOS también), o puede conectarse a un servidor Firebird que corre en Windows/Unix/macOS/FreeBSD/y otras plataformas soportadas por Firebird.

Nota (2) Estos conectores utilizan la librería FreeTDS como driver. La documentación FreeTDS indica que debería contruir en al menos estas plataformas.

Nota (3) Este número de versión se refiere al estándar ODBC, no al número de versión de un controlador o un gestor de controladores. Hay controladores ODBC 3.x para la mayoría de los DBMS.

Los enlaces con los clientes de base de datos

   Si deseas utilizar alguna de las bases de datos que requieren de librerías cliente entonces dichas librerias tienen tienen que estar instaladas,no sólo en el equipo en que se programa, sino también en los equipos en que sen ejecutará la aplicación. Ten en cuenta que algunas bases de datos (MySQL, en particular) sólo funcionará si los vínculos usados al compilar la aplicación son de la misma versión que los de las librerías instaladas. Puedes averiguar cómo instalar las librerías (archivos .so en sistemas *nix, y .dll en windows) en la página web de los desarrolladores de la base de datos. Las unidades de enlace se pueden encontrar en los directorios base de los paquetes base en el fuente FPC. Básicamente consisten en llamadas al API de cliente como mysql_connect_database, que son completamente diferentes para cada base de datos. Es posible escribir aplicaciones de base de datos utilizando estas unidades, pero por lo general implica mucho más trabajo y se hace propenso a errores que la opción de utilizar los componentes de la unidad DB de Lazarus.

   La mayoría de estos paquetes de enlace están muy vinculadas a la librería clientes. Esto implica que si la aplicación se compila con una de estas unidades, toda la aplicación no podrá enlazarse si las librerías cliente no están disponibles en el equipo.Esto significa que tu programa ejecutable no se generará si no tienes instalado - por ejemplo - un cliente MySQL en tu ordenador y en cambio estás utilizando la unidad mysql14.pp.

   Si tienes éxito al compilar el programa en un equipo que tiene instaladas las librerias cliente de MySQL, ni siquiera se iniciará en otra máquina sin las librerías MySQL adecuadas. En otras palabras: para estas bases de datos, es necesario instalar las librerías de cliente en el equipo de desarrollo, y es necesario instalar estas bibliotecas de cliente con tu aplicación para que también funcione en otros equipos.

   Para evitar estos problemas algunos de los paquetes también son capaces de enlazar dinámicamente las librerías. Antes de hacer cualquier llamada a la librería, la unidad debe ser 'iniciada' (initialized). Este inicio falla si la base de datos de cliente no está instalada en el equipo. Al terminar de utilizar las librerías cliente la correspondiente unidad tiene que ser 'liberada' (released).

Conjuntos de datos (Datasets)

   La utilización de bases de datos en Lazarus (o FreePascal) se basa fundamentalmente en la clase TDataset. Esta representa una tabla o consulta de tu aplicación. Sin embargo, al igual que con muchas otras clases fundamentales, no se utiliza la clase TDataset en sí, sino una descendiente de ella. Hay muchas de este tipo, que proporcionan acceso a los diferentes tipos de bases de datos, como archivos locales dBase o de texto, o en servidores tales como bases de datos PostgreSQL, Firebird, MySQL, etc. Algunos descendientes de DataSet enlazan directamente a tablas de la base de datos, mientras que otros utilizan componentes o bibliotecas adicionales para establecer el enlace.

   Los descendientes de TDataSet, del tipo componentes no visuales forman parte (usualmente) de la Librería de Componentes Libre (FCL: Free Component Library) en lugar de la Librería de Componentes de Lazarus (LCL: Lazarus Component Library).

   Los conjuntos de datos (DataSet) se pueden utilizar tanto mediante programación directa como utilizando los controles visuales. En una aplicación típica de base de datos de Lazarus a menudo se utilizan ambos métodos. En cualquier caso, el primer paso es crear el descendiente TDataset, a continuación iniciarlo para conectar a la tabla, y abrirlo para realizar la consulta deseada. Esto se puede hacer tanto mediante código, en tiempo de ejecución, como situando un componente en el formulario y configurando sus propiedades en tiempo de diseño. Los detalles de este proceso varían considerablemente con cada diferente descendiente del TDataset, por tanto debes consultar las distintas guías disponibles para cada Base de Datos concreta.

   Cuando se abre (opened) el DataSet se crea un conjunto de componentes de campo (field), uno para cada campo o columna de la tabla o consulta que se abrió. Cada componente de campo es un descendiente de TField, apropiado para el tipo de datos en particular del campo como por ejemplo TStringField para una cadena, pero hay más.

Utilizando conjuntos de datos mediante código

Se explicará en mas detalle en Using Dataset and Field components, pero haciendo una simple descripción: Programmatic access will be explained in more detail in but as a very simple overview:

  • Utilizar el descenciente de TDataset para abrir la tabla o consulta (query), filtrar las filas que se necesitan y mover fila a fila.
  • Utilizar los descendientes de TField para:
    • Acceso general de información de los campos.
    • Acceso a los valores específicos de la fila actual. (utilizar las propiedades de As..., tales como AsString, AsInteger, etc.)
  • Acceder a los campos de un descendiente TDataset utilizando ambos:
    • Las propiedades del campo, eg Fields[0] es el primer campo,
    • El método FieldByName , eg FieldByName('EDAD') retorna el campo asociado con el campo de tabla de la base de datosasociado con el campo llamado 'EDAD'. (Cuidado con el uso de mayúsculas/minúsculas en los nombres de campo, ante la duda o fallos probar a poner el nombre en minúsculas, por ejemplo en PostgreSQL).

Ver Database_field_type para un listado de tipos de campo.

Utilizando los controles visuales (data-aware)

   Para utilizar las bases de datos en un estilo simple de Lazarus "RAD: Rapid Application Deployment" se configura el descendiente de dataset en tiempo de diseño y se utilizan los controles data-aware. Para hacer esto:

  • Añadir el descendiente dataset para la base de datos elegida, junto con cualquier componente de soporte, al formulario. Asignarle la conexión y establecer la consulta SQL, luego abrirlo (establecer la propiedad 'Active' a True).
  • Añadir un componente TDataSource(desde la solapa "Data Access") al formulario, y "enlazarlo" al dataset (establecer para ello la propiedad DataSet).
  • Añadir controles data-aware desde la solapa "Data Controls" al formulario, y enlazar cada uno de los componentes DataSource (fuente de los datos), pero no el dataset.

Conector-->DataSet-->DataSource<--Data Controls

  • La mayor parte de los controles enlazan un simple campo, por lo tanto necesitas establecer además el campo (field) para cada solapa.

Ver #Data Controls más abajo para más detalles sobre los controles.

Estado de un Dataset

Los Datasets puede encontrarse en varios estados. Mientras tanto aqui tenemos unos pocos(buscar por TDataSetState en la fuente), los principales que podemos encontrar inicialmente son:

Estado Función
dsInactive dataset status Inactive indica que el dataset está cerrado
dsBrowse dataset status dsBrowse indica que el usuario puede moverse por el dataset, buscando valores
dsInsert dataset status Insert indica que e ha insertado una nueva fila (registro), y el usuario puede establecer valores. El campo no se salva hasta que no se realiza el post


Los otros estados son claramente transitorios, y son manejados "automaticamente". Se utilizan internamente y en código más complejo. Si tu base de datos solo ve datos y abres el dataset en tiempo de ejecución entonces puedes ignorar ampliamente el estado, ya que se encontrará primordialmente como dsBrowse. Sin embargo, muchas aplicaciones necesitarán cambiar el dato a algún estado. Si estás utilizando controles data-aware, entonces ellos mismos manejarán la mayor parte de esto automáticamente. Si cambias el texto en un control DBEdit, por ejemplo, esto pondrá el dataset en estado dsEdit - al menos que ya se esté en estado dsEdit o dsInsert (ds=data state). Si te desplazas "scroll" a un campo diferente mientras el estado actual se encuentra en dsEdit o dsInsert, entonces este campo será posteado "posted" y el dataset se revierte a dsBrowse. A pesar de ello, si estás accediendo el dataset desde código, obtendrás un cambio de estado en código también. El control dbNavigator (ver más abajo) permite al usuario cambiar el estado explícitamente.

Envío (Post) y Cancelación (Cancel)

Si has editado o insertado un campo entonces los valored se mantienen almacenados en un buffer, por lo que están preparados para realizar una acción sobre ellos tales como Post o Cancel.

  • Llamando al método "cancel" del dataset remueve el nuevo campo (si hemos realizado un "insert") o revierte los valores a sus valores previos (si hemos realizado un "edit")
  • Llamando al método "post" del dataset salva los valores (si hemos realizado un "edit") o campos (si hemos realizado un "insert"). En algunos descendientes del dataset deben grabarse en la base de datos inmediatamente, mientras que en otros se almacenan en una lista hasta que se realiza una llamada posterior que produce el salvado de todos los cambios a la base de datos. Finalmente, incluso cuando son escritos a la base de datos, todavía habría que realizar una llamada al método "commit" para que la que la escritura se realice de forma permanente. Todo esto varía considerablemente con cada descendiente del dataset por lo que se hace necesario revisar los detalles para cada uno que se utiliza.

Insertando un nuevo registro (record)

Para insertar un nuervo registro dentro de un descendiente de TDataset se debe utilizar el método Insert. Después de esto, ya se pueden establecer los valores del campo y finalmente llamar a Post para realizar el commit (acometer) del nuevo registro, tal como muestra el siguiente ejemplo:

 MyDataset.Insert;
 MyDataset.Fields[0].AsInteger := 4;
 MyDataset.Fields[1].AsString := 'Nombre';
 MyDataset.Post;

Como saltar rápidamente a un registro de la tabla en particular

Después de seleccionar todos los registros de la tabla

Si utilizas SELECT * FROM tabla para seleccionar todos los registros de la tabla y entonces deseas saltar rápidamente entre ellos, entonces tienes que construir un índice y buscar en el mismo. Es mucho más eficiente seleccionar únicamente el registro que necesitas que la totalidad.

Selecionando únicamente el registro deseado

Una solución rápida para saltar a un registro en particular es simplemente "seleccioarlo en exclusiva", lo cual se puede realizar acotando con la cosulta de SQL, tal como se puede observar en el siguiente ejemplo:

 var
   MyDataset: TSQLQuery;
 begin
  //...
  MyDataset.FieldDefs.Add('SessionId', ftLargeint); {0} {ft = fieldtype}
  MyDataset.FieldDefs.Add('GameEvent', ftLargeint); {1}
  MyDataset.FieldDefs.Add('TableId', ftInteger);    {2}
  MyDataset.FieldDefs.Add('LoggedIn', ftBoolean);   {3}
  MyDataset.FieldDefs.Add('PlayerId', ftInteger);   {4 <=== este es el que queremos obtener}
  MyDataset.Active := False;
  SQLText := Format('select * from "GameSession" WHERE "SessionId"=%d', [ASessionId]);
  MyDataset.SQL.Text := SQLText;
  try
    MyDataset.Active := True; { Probamos a activar el dataset dentro de un bloque de intercepción de errores de forma que }
    {si no logra conectar podamos obtener retornado un tipo de error bien sea uno genérico (por defecto) u otro más especí-}
    {fico de la base de datos en particular pero eso lo tenemos que especificar.........}
  except
    //...
 end;

Entonces ya se puede leer información utilizando algo como lo siguiente:

 lPlayerId := MyDataset.Fields[4].AsInteger;

Utilizando TSQLQuery

Para más información sobre TSQLQuery ver Working With TSQLQuery/es

Controles de datos

   Para utilizar cualquiera de estos controles, hay que añadir cualquiera de estos controles al formulario (form) y establecer al menos la propiedad datasource para indicarle la fuente de datos con que se asocia. Adicionalmente van a requerir establecer otras propiedades para su correcto funcionamiento.

Tomando como referencia la información contenida en

http://lazarus-ccr.sourceforge.net/docs/lcl/dbctrls/howtousedataawarecontrols.html la descripción de los mismos sería:

Como utilizar controles DataAware - Sugerencias para el acceso a bases de datos.

Se aporta un conjunto de componentes Data-Aware, para hacer más fácil el acceso a la información contenida en bases de datos.

Antes de utilizar los componentes Data-Aware, es necesario establecer una conexión con una base de datos, lo cual debería realizarse utilizando bien a través del componente TSQLConnection o del TDBf, dependiendo del tipo de base de datos que se esté utilizando. En cualquier caso, los componentes para la conexión con la base de datos necesitan estar ubicados en $Lazdir/components/sqldb/, $Lazdir/components/tdbf/ o en cualquier otro lugar que actue como fuente de forma apropiada. Necesitan ser añadidos utilizando el menú de elementos del IDE, además de estar previamente compilados. Una vez añadidos el IDE necesita reconstruirse para incluir los nuevos componentes.

Para realizar la conexión con la base de datos, primeramente emplaza una conexión a la base de datos en el formulario (invisible en tiempo de ejecución (run-time), ponlo por tanto en cualquier lugar que creas conveniente); establece sus propiedades para conectar el usuario (con su nombre y contraseña) al servidor, base de datos y tabla adecuados (el componente de conexión debería lidiar con todos los asuntos de autentificación de usuario, abriendo y cerrando la base de datos, etc). A continuación añadimos un TDataSource desde la solapa Data Access de la paleta de componentes, y tal vez elementos tales como TSQLTransaction y TSQLQuery, dependiendo de la base de datos en particular que se esté utilizando. Los variados componentes de bases de datos necesitan enlazarse entre ellos, por ejemplo estableciendo la propiedad Transaction de un conector de la base de datos al componente de transacción apropiado, y enlazando la propiedad DataBase del componente Transaction al conector de la base de datos; enlaza la propiedad DataSet del DataSource al SQLQuery u otro conjunto de datos, y su propiedad Transaction al componente transaction.

Cada control Data-Aware (en la solapa Data Controls de la paleta de componentes) tiene el conjunto de propiedades habitual para determinar su shape y tamaño, posición, color, fuente, etc. Pero además tiene propiedades especiales para definir el dato a mostrar o modificar. Estas incluyen la propiedad DataSource que debe establecerse para enlazar con el conjunto de datos definido, y a menudo un componente Field para determinar la columna de la base de datos se mostrará.

La mayor parte de los componentes operan con una simple fila (Row) o campo (record) de la base de datos, (en cambio TDBGrid es capaz de mostrar y operar con múltiples filas y columnas, ver más abajo), permitiendo mostrar contenido incluso en tiempo de diseño, a condición de que varios componentes estén habilitados o establecidos activos; esto permite al diseñador asegurarse de que todas las conexiones a la base de datos se han realizado correctamente.


La manera en que funciona la programación con bases de datos es la siguiente:

  • Se abre una base de datos para el acceso por parte del usuario (DataBase Connection).
  • Se realiza un mandato (e.g mediante TSQLQuery) para seleccionar o extraer alguno o todos los campos, los cuales se almacenan localmente es el DataSet
  • El contenido del DataSet es utilizado por los componentes Data-Aware, mostrando una fila (Row) o campos a un tiempo desde las columnas seleccionadas, o por otro lado el DataSet completo si se utiliza un DBGrid, editando, insertando o borrando campos, o utilizando datos para realizarun test estadístico o cálculos.
  • A intervalos normalmente determinados por el usuario (algunas veces después de cada cambio, otras después de una serie de cambios completos), se envía el contenido del DataSet local a la base de datos, causando una actualización de su contenido. Esto es referido como un 'Commit' o 'Post' o a menudo como 'Update'.

El programador puede determinar que eventos estan asociados con una acción Commit utiliando manejadores de eventos apropiados para OnClick, OnChange, OnFinishedEdit etc.


Controles de un solo campo

En el caso de todos estos controles se vincula únicamente a un campo. Al igual que datasource hay que establecer el nombre de campo:

  • DBText control Muestra un campo de texto (solo lectura, sin borde).
  • DBEdit control Muestra / edita un campo de texto como en un edit box.
  • DBMemo control Muestra / edita un campo de texto en una caja de edición multilínea.
  • DBImage control Muestra una imagen almacenada en una base de datos como BLOB.
  • DBListBox control y DBComboBox Control Permite al usuario insertar valores en los campos de una base de datos desde un listado de valores en la propiedad Items (elementos) de los controles.
  • DBLookupListBox control y DBLookupComboBox control, ver además dblookupcombobox Permite al usuario insertar valores dentro de un campo de la base de datos mostrando el contenido de un campo lookup en otra tabla. Aunque estos controles almacenan su resultado en un solo campo, se necesita otro campo para los valores lookup. Nota: al menos para DBLookupComboBox, hay un error con FPC 2.6.0 que requiere que listfield esté presente en el datasource pero se puede saltar esto declarando un campo con el mismo nombre de listfield en el dataset del datasource que no hace nada.
  • DBCheckBox control Muestra/ edita un campo booleano mediante el marcado(checking)/(desmarcado (clearing) de un check box.
  • DBRadioGroup control Muestra los elementos tal como en un radio group, leyendo/estableciendo el valor del campo desde un listado de valores de correspondencia (matching values list).
  • DBCalendar control Muestra / edita un campo fecha utilizando un panel tipo calendario.
  • DBGroupBox control

La siguiente tabla muestra la correspondencia aproximada entre las clases de controles convencionales y las data-aware:


Control Estandar Control de Datos Comentario
TCalendar TDBCalendar Selecciona una fecha desde un calendario emergente
TCheckBox TDBCheckBox Check una casilla para mostrar la opción que se ha seleccionado
TComboBox TDBComboBox Selecciona una opción desde un listado y lo retorna (o algún texto personalizado) en el casillero de edición principal
TEdit TDBEdit Casillero de edición de texto de línea simple
TGroupBox TDBGroupBox Contenedor para varios controles relacionados
TImage TDBImage Una imagen
TListBox TDBListBox Una lista de elementos cadena
TMemo TDBMemo Casillero de edición de texto multi-línea
TRadioGroup TDBRadioGroup Un grupo de Radio Buttons mutuamente exclusivos; solamente se puede tener checked y seleccionado uno al mismo tiempo. Ten en cuenta que no hay equivalente en data-aware a un solo TRadioButton
TText TDBText Una simple cadena de texto, usualmente de solo lectura


Los controles estandar pueden, por supuesto, utilizarse para mostrar información de la base de datos, pero carecen de la vinculación directa con el DataSet y sus ayudas a la navegación por el mismo, de forma que el programador debe en este caso escribir código explícitamente para extraer datos desde el DataSet y ponerlos en el control estandar.

Control DBGrid

Este control muestra n número de campos en una disposición de fila (registro) / columna (campo)- de hecho por defecto muestra todos. This control can show a number of fields in a row/column layout - in fact by default it shows them all. Sin embargo, se pueden poner entradas dentro de columns collection para restringirlos a unos campos específicos y establecer la anchura y títulos de cada columna.

Su equivalencia con el control convencional es:

Control Estandar Control de Datos Comentario
TStringGrid TdbGrid Una rejilla para mostrar información en formato filas y columnas

Navigator Control

dbnavigator.PNG


Este control consistente en una barra de botones de utilidad ofrece al usuario algo de control directo sobre el DataSet, permitiendo al usuario:

  • Mover al registro siguiente (next) y previo (prior), así como al principio (first) y final (last).
  • Añadir un registro nuevo (equivalente a la llamada a un método dataset.insert).
  • Poner el dataset en modo edición (edit), necesario cuando ya existe dicho registro y deseamos modificarlo.
  • Borrar un registro (delete) el registro actual.
  • Envíar (post) o Cancelar (cancel) los cambios actuales del DataSet a la base de datos.
  • Refresca (refresh) los datos (útil en aplicaciones de bases de datos multiusuario) desde la base de datos.

El programador puede determinar, en tiempo de diseño, que botones quiere dejar visibles o no, ajustando algunas de sus propiedades en el inspector de objetos:

  • VisibleButtons: Permite controlar lo que puede hacer el usuario. Por ejemplo, si los borrados (delete) no están permitidos se oculta este pulsador. Si se tiene un DBGrid anexado a un dataset puede decidirse que no se necesitan los pulsadores previo (prior) y siguiente (next).

Los botones que posee esta barra son del tipo tdbnavbuttonset admitiendo los siguientes:

  • Comienzan por nb de navigator button:
    • nbFirst: navigator button First (mueve al primer registro).
    • nbPrior: navigator buttor Prior (mueve al registro previo).
    • nbNext: navigator button Next (mueve al registro siguiente).
    • nbLast: navigator button Last (muesve al último registro).
    • nbInsert: navigator button Insert (inserta un nuevo registro).
    • nbDelete: navigator button Delete (borra el registro actual).
    • nbEdit: navigator button Edit (edita un registro existente).
    • nbPost: navigator button Post (envía el DataSet a la base de datos).
    • nbCancel: navigator button Cancel (cancela los cambios realizados).
    • nbRefresh navigator button Refresh (refresca el contenido del DataSet desde la base de datos).

Por ejemplo para un control de este tipo y su dataset asociado, vinculado a una fuente de datos: dbnavigator1.DataSource.DataSet.First; nos situaría en el primer registro.

  • Width: Si no se muestran todos los pulsadores, posiblemente se necesite establecer la anchura al valor altura*número de pulsadores visibles( height*number_of_visible_buttons).

Para su funcionamiento se debe especificar el conjunto de datos al que se asocia mediante su propiedad DataSource.

Si se utiliza en conjunción con otros controles de datos (data-aware) tales como TDBGrid o TDBMemo entonces controla que registros se mostrarán, la posición del cursor de selección de registro y la iniciación de cambios del dataset y en última instancia de la base de datos.

Por otro lado cabe indicar que la mayor parte de la funcionalidad de esta barra se encuentra ya implementada, pero en el caso de que el programador necesite especificar acciones asociadas a un pulsadores individuales, hay un procedimiento tdbcustomnavigator.btnclick al cual se puede enviar un argumentocon el valor de índice del botón pulsado, y el procedimiento escoge que acción llamar dependiendo del indice del botón.

Corriendo los test de bases de datos de FPC

   Los componentes de bases de datos FreePascal incluyen un framework de prueba que se puede utilizar para probar la funcionalidad. Ver el directorio source\packages\fcl-db\tests\ en el árbol de directorios de instalación de FPC.

Lo incluido es un framework de prueba que se puede arrancar en varios componentes de bases de datos, así como en otros test (e.g. test de exportacion de bases de datos en XMLXSDExportTest.lpr).

Para arrancar el framework de prueba para una cierta base de datos hacer lo siguiente:

1. Salvar "source\packages\fcl-db\tests\database.ini.txt" como "source\packages\fcl-db\tests\database.ini"

2. Modificar source\packages\fcl-db\tests\database.ini para escoger el tipo de base de datos a utilizar.

Example: utilizar Interbase o Firebird: [Database] type=interbase

3. En el mismo fichero, configurar los valores para la base de datos a utilizar. E.g. si se escogió interbase anteriormente:

01 [interbase]
02 connector=sql
03 connectorparams=interbase
04 ; esto es un comentario, ya que comienza por ; los números de inicio de línea se han puesto para más claridad.
05 ;nombre de la base de datos. obviamente cambiar por el de la base de datos a utilizar.
06 name=testdb
07 user=sysdba
08 password=masterkey
09 ; tu hostname o nombre de equipo puede diferir del utilizado en este ejemplo (lógico).
10 hostname=192.168.0.42

4. Compila y arranca "source\packages\fcl-db\tests\dbtestframework.pas"

La salida se obtendrá en formato XML.


Para más detalles leer el fichero "source\packages\fcl-db\tests\README.txt"

Paquetes de Bases de Datos suministrados con Lazarus

sqldblaz.lpk

   Este paquete provee acceso a diferentes bases de datos. Incluye:

  • Interbase/Firebird
  • MySQL (Versiones: 4.0/4.1/5.0/5.1/5.5 en Lazarus 1.0.4).
  • Oracle
  • PostgreSQL (Versiones: hasta la 8.x en Lazarus 1.0.4)
  • SQLite (Versión: 3 en Lazarus 1.0.4)(con soporte para la extensión Spatialite)
  • Cualquier base de datos que tenga un driver ODBC.

   Los componentes (TSQLQuery, TSQLTransaction, TIBConnection, TODBCConnection, TOracleConnection, TMySQL40Connection, TMySQL41Connection, TMySQL50Connection, TPQConnection) se encuentran en la pestaña 'SQLdb' en la paleta de componentes.

dbflaz.lpk

   Este paquete provee acceso a las bases de datos dBase y FoxPro.Puedes obtener más información en la Tutoría de Lazarus Tdbf. El componente TDbf se localiza en la pestaña 'Data Access' en la paleta de componentes.

sqlitelaz.lpk

   Este paquete provee acceso a las bases de datos SQLite. Puedes obtener más información en la Tutoría de Bases de Datos Lazarus.

sdflaz.lpk

   El componente TSdfDataSet se encuentran en la pestaña 'Data Access' en la paleta de componentes.

lazreport.lpk

   La página principal del generador de informes es http://lazreport.sourceforge.net/. Más información y enlaces adicionales se encuentran en aquí. LazReport depende del paquete Printer4Lazarus. Con la revisión 11950 LazReport fué incluido el repositorio SVN de Lazarus.

Paquetes y librerías externas

Zeos DataBase Objects

   Los componentes de este paquete proveen acceso a diferentes bases de datos. Puedes obtener más información aquí. Este wiki contiene una tutoría Zeos.

Pascal Data Objects

Ahora hay una alternativa.

Soporta:

  • MySQL 4.1 y 5.0
  • sqlite-2 y sqlite-3
  • pgsql-8.1
  • interbase-5, interbase-6, firebird-1.0, firebird-1.5, firebird-1.5E, firebird-2.0, firebird-2.0E
  • mssql (librería Microsoft) y sybase (librería FreeTDS)
  • oracle
  • así como sentencias preparadas, enlace, y procedimientos almacenados son soportados por la API de base de datos llamada Pascal Data Objects, que se inspira en PHP Data Objects. Todo el código y la documentación necesaria para utilizar esta nueva API está disponible en aquí en Sourceforge:

TPSQL

   Los componentes de este paquete proveen acceso vía TCP/IP a bases de datos PostgreSQL. Puedes obtener más información en esta página.

FIBL

   Los componentes de este paquete proveen acceso a bases de datos Interbase y Firebird. La página principal está aquí.

FBLib Firebird, librería

   FBLib es una librería de fuente abierta sin componentes ligados a datos (No Data Aware) para acceso directo a bases de datos relacionales Firebird desde Borland Delphi/Kylix, Free Pascal y Lazarus.

   Las características actuales incluyen:

  • Acceso directo a to Firebird 1.0.x, 1.5.x y 2.x Classic o SuperServer
  • Multiplataforma [Win32,Gnu/Linux,FreeBSD)
  • Selección automática de la librería cliente 'fbclient' o 'gds32'
  • Consultas con parámetros
  • Soporte del dialecto SQL 1/3
  • Acuerdo de Licencia LGPL
  • Extracción de Metadata
  • Analizador simple de secuencias de comandos
  • Únicamente añade 100-150 KB al EXE final
  • Soporta campos BLOB
  • Exporta datos a HTML SQL Script
  • Administrador de servicios (copia de seguridad, restauración,gfix...)
  • Eventos de alerta

   Puedes descargar la documentación desde el sitio web FBLib's.

Unified Interbase

   UIB provee acceso a bases de datos Interbase, Firebird y YAFFIL. TLa página principal es www.progdigy.com. Un repositorio SVN está disponible aquí .

TechInsite Object Persistence Framework (tiOPF)

   Más información acerca de tiOPF se puede encontrar en esta página.