<-- Capítulo

Índice del tutor de Delphi
© Copyright 1998
por David Martínez.

Todos los derechos reservados

Capítulo -->

Capitulo 6.2. Continuando con nuestro Catálogo - Manejando Parámetros

En éste capítulo agregaremos parametros a nuestra aplicacion utilizando el IDE de Delphi. También veremos como Delphi interpreta los parámetros que agregamos para enviar comandos al servidor SQL.

Creando parámetros con el IDE

En el Capítulo 6, ya utilizamos el IDE para crear un parámetro (cuando estábamos diseñando la forma). Ahora veremos como podemos realizar consultas programáticamente para hacer el uso del programa más sencillo para el usuario.

Lo primero que debemos hacer es crear una forma para que el usuario pueda hacer consultas. Así que seleccione File-New en el menú de Delphi para crear una nueva forma.

Dentro de la página de "Dialogs", seleccione "Standard Dialog", ya sea el de los botones abajo o a la derecha (según su preferencia).

Utilizando las ayudas de diseño que se encuentran en la página "Standard" de la barra de herramientas de Delphi, diseñe una forma que contenga un componente TEdit (con su respectivo TLabel) llamado edtCampo. Este componente será utilizado para que el usuario teclee el apellido de la persona.

TODO: Añadir grafico

En nuestra forma principal, añada un botón llamado "Consultar..." para que pueda mostrar el diálogo. Seleccione "File-Use Unit" del menú para decirle a Delphi que la forma de consulta utiliza el diálogo. Esto añade el diálogo a la clausula de USES en la sección implementation. Después haga doble click en el botón para que Delphi escriba un evento, y escriba lo siguiente:


procedure TfrmClientes.btnConsultarClick(Sender: TObject);
begin

  // Muestra el diálogo de consultas
  dlgConsulta.ShowModal;
  if dlgConsulta.ModalResult = mrOK then begin
      qryClientes.Close;
      qryClientes.ParamByName('Apellido').AsString :=
          dlgConsulta.edtApellido.Text+'%';
      qryClientes.Open;
      if qryClientes.EOF then
         ShowMessage('No encontré ningún Cliente!');
  end;


end;

Como podrá ver, esta seccion le dice a Delphi lo siguiente:

Ya tenemos el código que reemplazará el parámetro apellido para buscar un apellido en específico. Ahora lo que necesitamos hacer es modificar la propiedad SQL del TQuery para que diga lo siguiente:

  SELECT * FROM "CLIENTS.DBF" CLIENTES
  WHERE Last_Name LIKE :Apellido

En Delphi, cuando usted añade una palabra precedida por un signo de dos puntos (:), la palabra es automáticamente convertida en un parámetro, el cual es agregado a la propiedad Params, la cual es una lista de objetos que serán reemplazados por lo que usted especifique antes de ejecutar el comando. Una vez que usted haya añadido el texto, Vaya a la propiedad "Params" dentro del inspector de objetos y haga doble click. A continuación podrá ver una lista de parametros que usted puede examinar (que por ahora solo contiene el apellido). Seleccione el parámetro y modifique la propiedad "DataType" para que diga ftString. Es importante decirle a Delphi que clase de parametro vamos a enviar para que Delphi sepa si le debe añadir comillas (para especificar texto) o dejarlo como número.

Recordemos que el código SQL no es interpretado por Delphi, sino que es convertido a comandos SQL para un servidor como Oracle o MS-SQL (vea el capítulo 6.1 para mayor información.

Ejecutemos el programa para probarlo. Ahora presione el botón consulta y escriba el nombre "Davis" como apellido, y seleccione "Ok". A continuación verá a la Srita. Davis aparecer en la pantalla. Experimente con distintos apellidos.

Si experimenta suficiente notará algo especial: Si usted sólo teclea una "D" en el campo de apellido, también recuperará el registro! Hicimos esto aprovechando que el lenguage SQL soporta la comparación LIKE, que devuelve todos los registros que se parezcan a la cadena que enviamos. Cuando escribimos nuestro código en el OnClick, habrá notado que la línea que asigna el parámetro añade un signo de porcentaje al final:


      qryClientes.ParamByName('Apellido').AsString :=
          dlgConsulta.edtApellido.Text+'%';

Esto quiere decir que queremos que el query nos devuelva todo lo que comienza con el texto que tecleamos. Tenga en cuenta que el servidor SQL es el que interpreta este signo, así que como se interpreta el signo de porcentaje depende del servidor que este proporcionándonos los datos.

Código de Ejemplo

Comenzando en esta sección estoy añadiendo archivos zip de ejemplo (ya que comenzamos a escribir código). En el Zip de esta sección he avanzado de tal forma que el diálogo soporta consultas a varios registros importantes.

Hay varias maneras en las cuales pude haber hecho esto, pero lo que decidí hacer para este ejemplo fué crear varios componentes TQuery diferentes, uno con cada tipo de consulta. Despues añadí un RadioButton al diálogo de consulta para que el usuario decida qué tipo de consulta voy a hacer. El radioButton cambia la etiqueta del campo para reflejar la consulta adecuada.

Notará que, aunque hay varios Queries, solo hay un DataSource. Este es otro ejemplo de la versatilidad de Delphi. Para hacer que todos los campos de la forma apunten a otro query, todo lo que tengo que hacer es modificar la propiedad DataSet del componente DataSource para apuntar a esta nueva consulta, y todos los componentes visuales que apuntan al DataSource automáticamente cambiarán a la consulta adecuada. Estoy tomando esta decisión aprovechando la selección en el RadioButton. El código que realiza la consulta ahora tiene la siguiente apariencia:


procedure TfrmClientes.btnConsultarClick(Sender: TObject);
var
  QueryAUsar : TQuery;
begin

  // Muestra el diálogo de consultas
  dlgConsulta.ShowModal;
  QueryAUsar := Nil;
  if dlgConsulta.ModalResult = mrOK then begin

    // Primero decide que query vamos a usar.
    case dlgConsulta.rgConsulta.ItemIndex of
       0: QueryAUsar := qryClientesporApellido;
       1: QueryAUsar := qryClientesPorCuenta;
       2: QueryAUsar := qryClientesPorRiesgo;
    end; //case
    if QueryAUsar = Nil then Exit;
    QueryAUsar.Close;
    // Nota: El Número de cuenta es un Integer y no un String. Este IF
    // se encarga de eso. Note además que todos los queries que contienen
    // parametros tipo string tienen la sentencia LIKE para que podamos añadir
    // signo de porcentaje para busqueda parcial.
    if QueryAUsar.Params[0].DataType = ftFloat
    then
      QueryAUsar.Params[0].AsFloat := StrToFloat(dlgConsulta.edtConsultaTexto.Text)
    else
      QueryAUsar.Params[0].AsString := dlgConsulta.edtConsultaTexto.Text+'%';
    QueryAUsar.Open;
    dsClientes.DataSet := QueryAUsar;
    if QueryAUsar.EOF then ShowMessage('No encontré ningún Registro!');
    sbStatus.Panels.Items[0].Text := 'Encontré '+FormatFloat('###,###,##0', QueryAUsar.RecordCount)+' registros.';

  end; // if


end;

Copiar el Código fuente (7K, formato Zip) para esta sección

Capítulo -->