Delphi – Ejecutar Sentencias SQL de PostgreSql usando ADO

Aprovecharemos el artículo que muestra cómo instalar la base de datos Booktown en PostgreSQL para aprender a ejecutar consultas SQL usando Delphi y ADO.  Antes de iniciar recomiendo leer el artículo “Conectarse a PostgreSql con Delphi y ADO” para instalar el conector ODBC y crear un DSN que será necesario para poder realizar las conexiones a PostgreSQL y ejecutar las sentencias SQL.

Lo primero que haremos será crear una nueva aplicación VCL y sobre el formulario principal colocaremos un componente TPageControl con dos pestañas, una con la leyenda “Consultar libros” y otra con la leyenda “Modificar un  libro” y en seguida colocaremos los siguientes componentes en el formulario:

Componente Propiedad Valor
AdoConnection1 LoginPrompt false
AdoTable1 Connection AdoConnection1
DataSource Dataset AdoQuery1

Hecho lo anterior vamos a colocar en la pestaña “Consultar libros” los siguientes controles:

Componente Propiedad Valor
TButton Caption Mostrar Libros
DbGrid1 DataSource DataSource1

Y por último vamos a configurar la cadena de conexión de nuestro control ADOConnection para dejarla con el valor:

Provider=MSDASQL.1;Persist Security Info=False;Data Source=DSNbooktown;

donde DSNbooktown es el DSN creado para establecer conexiones a PostgreSql usando ODBC. Si tienes dudas sobre como crear un DSN para conectarnos a PostgreSQL te recomiendo leer:  “Conectarse a PostgreSql con Delphi y ADO“.  La pantalla debe quedar así:

 

ejecutar_consultas_postgresql_delphi

 

Ejecutar una sentencia de selección de registros.

Una vez que tenemos nuestros controles listos y configurados agregaremos el código necesario para consultar los libros existentes en la tabla Books para ello vamos a dar doble click en el botón “Mostrar Libros” y en el editor de código de Delphi agregaremos lo siguiente:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.SQL.Text :=
  '      SELECT LIBROS.ID, LIBROS.TITLE, ' +
  '             AUTORES.LAST_NAME || '' '' || AUTORES.FIRST_NAME NOMBRE_AUTOR  ' +
  '        FROM BOOKTOWN.PUBLIC.BOOKS LIBROS ' +
  '   LEFT JOIN BOOKTOWN.PUBLIC.AUTHORS AUTORES ' +
  '          ON LIBROS.AUTHOR_ID = AUTORES.ID ';
 ADOQuery1.Open;
end;

La sentencia SQL debe asignarse a la propiedad Text de la propiedad SQL del componente ADOQuery. Esta propiedad tiene como propósito almacenar la sentencias SQL por ejecutar. Después invocaremos al método OPEN del componente ADOQuery para ejecutar la consulta. Es importante mencionar que el método Open solo aplica en sentencias o consultas SQL que devuelven resultados.  Ejecutamos nuestra aplicación y obtendremos lo siguiente al presionar el botón “Mostrar Libros”:

 

select_postgresql_delphi

 

Como puede apreciarse, ejecutar sentencias SQL de selección y mostrar su resultado en la pantalla es realmente muy sencillo y requiere apenas un par de pasos.

Ejecutar una sentencia de borrado de registros.

Ahora vamos a agregar el código necesario para eliminar un registro. Para ello vamos a dar doble click en el botón “Eliminar seleccionado” y en el editor de código que se nos mostrará colocaremos el siguiente código:

  Var
    IdLibro: String;
begin
  IdLibro := ADOQuery1.Fields[0].AsString;
  ADOQuery1.SQL.Text :=
  '      DELETE ' +
  '        FROM BOOKTOWN.PUBLIC.BOOKS  ' +
  '       WHERE ID = :ID';
  ADOQuery1.Parameters.ParamByName('ID').Value := IdLibro;
 ADOQuery1.ExecSQL;
end;

Al igual que en la consulta de selección, el código SQL por ejecutar debe asignarse a la propiedad Text de la propiedad SQL del AdoQuery. Como puede notarse, en la consulta se ha establecido el valor de  la condición “Where ID =” haciendo uso de un parámetro. En Delphi, cuando colocamos dentro de una sentencia SQL el signo “:” seguido de un identificador le estamos pidiendo a delphi que considere ese valor como un parámetro. Este parámetro puede recibir valores a través de la propiedad Parameters del componente ADOQuery,  como podemos ver en la línea:

  ADOQuery1.Parameters.ParamByName('ID').Value := IdLibro;

Analizando el código veremos que el valor de la variable IdLibro se establece tomando el valor de  “ADOQuery1.Fields[0].AsString” es decir, de la columna 0 del registro activo al momento de presionarl botón. Es importante mencionar que cuando seleccionamos registros en el Grid, el apuntador de registro activo en el recordset cargado por el ADOQuery se posiciona en la fila seleccionada del dbgrid. Esto nos garantiza que siempre se eliminará lo seleccionado en el grid.

Por último, para ejecutar la consulta, se hará uso del método ExecSQL, que a diferencia del ejemplo anterior solo es usado para aquellas consultas o sentencias SQL que no devuelven registros.

Ejecutar una sentencia de actualización de registros.

Para realizar esto vamos a agregar los siguientes controles a la segunda pestaña de  nuestro TPageControl que se llama “Modificar un libro”:

Componente Propiedad Valor
DbEdit1 DataField id
DbEdit2 DataField nombre_autor
Edit1 text

Luego selecionaremos el componente AdoQuery1 y en el edito de eventos daremos doble click en el evento: AfterScroll y copiaremos el siguiente código:

procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
  Edit1.Text := ADOQuery1.Fields[1].AsString;
end;

Esto permitirá que al seleccionar una fila en el grid o cargarse el grid, el título del libro será copiado al componente Edit. La pantalla resultante será la siguiente:

edit_postgresql_delphi

Y teniendo lista nuestra pantalla de edición de valores vamos a agregar el código para modificar el título de cualquier libro. Daremos doble click al botón “Guardar Cambio” y colocaremos el siguiente código:

procedure TForm1.Button4Click(Sender: TObject);
  Var
    IdLibro: String;
    Title: String;
begin
  IdLibro := ADOQuery1.Fields[0].AsString;
  Title  := Edit1.Text;
  ADOQuery1.SQL.Text :=
  '  UPDATE BOOKTOWN.PUBLIC.BOOKS LIBROS ' +
  '    SET TITLE = :TITLE ' +
  '       WHERE ID = :ID';
  ADOQuery1.Parameters.ParamByName('ID').Value := IdLibro;
  ADOQuery1.Parameters.ParamByName('TITLE').Value := Title;
 ADOQuery1.ExecSQL;
end;

Como puede notarse, la sentencia solo modificará el título del libro seleccionado en el grid y esto se establece copiando el ID de libro del registro activo en el ADOQuery y el valor de Title del EditBox, ambos claro pasados como parámetros de la consulta.

Como puede verse ejecutar consultas SQL desde nuestras aplicaciones es muy sencillo pero poco recomendable para sistemas de gran envergadura pues se desperdiciaría la optimización que hace el motor al tener las consultas en procedimientos almacenados.

Si lo deseas puedes descargar el código fuente del proyecto aquí

 

Sé el primero en comentar

Deja un comentario