Mostrando entradas con la etiqueta TDBLookUpComboBox. Mostrar todas las entradas
Mostrando entradas con la etiqueta TDBLookUpComboBox. Mostrar todas las entradas

jueves, 16 de agosto de 2018

TDBLookupComboBox: Validar.

Validar un combo del tipo TDBLookupComboBox con las siguientes propiedades:

Style: cdDropDown
ArrowKeysTravers: True
AutoComplete: True

Es una configuración muy cómoda para el usuario, pero permite que deje el valor del combo en blanco o con un valor que no coincide con ningún elemento, por el motivo que sea (distracción o "a ver que pasa").
Nota: para combos con pocos elementos conviene utilizar el estilo (style) csDropDownList y deshabilitar la propiedad de autocompletado.
Volviendo al tema de inicio, la validación se realiza a través del evento OnExit:

procedure TFCRegCompras.cmbProvExit(Sender: TObject);
begin
  if cmbProv.KeyValue=Null then
  begin
    ShowMessage('Seleccione un proveedor.');
    cmbProv.SetFocus;
  end;

end;

Desde ya es muy conveniente antes de cargar y habilitar el combo, verificar que el dataset no esté vacío, si esto sucediese, el programa no se colgaría, pero una vez que el usuario entra al combo, no podría salir nunca porque KeyValue siempre sería Null y al utilizar SetFocus vuelve a entrar al combo. Es una validación muy útil pero deben tomarse ciertas precauciones. Por ejemplo, en un programa de registración de compras, donde otros combos y valores dependen del proveedor seleccionado, usando el evento OnChange del combo de proveedores, es fundamental tomar este tipo de medidas.

miércoles, 4 de julio de 2018

TDBLookupComboBox validar e impedir NULL.

Lo más simple es definir la propiedad Style en csDropDownList pero no siempre es lo que necesitamos. Por ejemplo cuando son muchos los registros que se cargan en el combo, le damos al usuario la posibilidad de que escriba las primeras letras y le traiga coincidencias, esto se logra estableciendo a True la propiedad AutoComplete. La contra es que el usuario puede abandonar el combo sin ninguna coincidencia, dejando el KeyValue (que es del tipo Variant) en Null. Esto a su vez lanzará un error si la validación la hacemos con números enteros, por ejemplo if combo.KeyValue<0 then...

Opción 1: no permitir que el usuario abandone el combo sin la correcta selección de un elemento.

Definir el evento OnExit.

procedure TFCProv.cmbLocalidadExit(Sender: TObject);
begin
  if cmbLocalidad.KeyValue=Null then
  begin
    ShowMessage('Seleccione una localidad.');
    cmbLocalidad.SetFocus;
  end;
end;


Opción 2: en algún caso en que se permite no seleccionar nada en el combo y debemos guardar 0 (cero) en la base de datos.


Por ejemplo, las actividades de 2 a 5 son opcionales y al crear el Form se les estable el valor de KeyValue en 0 para que no muestre nada. (La normalización y desnormalización de bases de datos está fuera del alcance de este ejemplo.).

if cmbActividad2.KeyValue=Null then
  DMProv.ZQProv.FieldByName('actividad2').AsInteger:=0
else
  DMProv.ZQProv.FieldByName('actividad2').AsInteger:=cmbActividad2.KeyValue;


Esta validación se hace al momento de guardar el registro y en todos los combos excepto el 1, si KeyValue es Null se guarda 0, caso contrario el valor de KeyValue.

sábado, 3 de febrero de 2018

TDBLookUpComboBox validar OnExit

Cuando damos al usuario la posibilidad del autocompletado en un ComboBox y no validamos, existe la posibilidad de que salte un error y es correcto, porque siempre hay que validar. Por ejemplo puede pasar esto:


O esto otro:


que de paso, no puede pasar en el combo de bancos, porque es del tipo lista y de manera predeterminada ya seleccionamos el primer elemento, ahí no hay que validar nada, el usuario no puede hacer de las suyas. Pues bien, en cualquiera de los dos casos, si presiona imprimir y no se valida, el programa mostrará un mensaje de error. En cambio con una simple validación, obligamos al usuario a seleccionar un ítem del combo, mediante el evento OnExit:

procedure TFRepCuentas.cmbCtaExit(Sender: TObject);
begin
   if cmbCta.ItemIndex=-1 then
   begin
     ShowMessage('Debe seleccionar una cuenta.');
     cmbCta.SetFocus;
   end;
end;   

Entonces si el usuario lo deja en blanco o escribe xx (no coincidiendo xx con ningún elemento del combo) le aparecerá el siguiente mensaje y le enviará el cursor nuevamente al combo y de ahí no sale hasta que seleccione un ítem.


Y tendrá que seleccionar una cuenta sí o sí o cerrar la ventana (lo cual también podríamos evitar si quisiéramos).




lunes, 4 de septiembre de 2017

TDBLookUpComboBox 1

Cómo configurar, tanto en modo diseño como en ejecución, un DBLookUpComboBox.

Para este ejemplo se da por hecho que ya hay una conexión con una base de datos, una Query y DataSource. Para este caso utilizo para ellos los componentes de Zeos Lib.

En tiempo de diseño:

Con la base de datos conectada, el query activo y un DBLookUpComboBox1 en el Form, desde el inspector de objetos vamos configurar el combo en este orden:

  1. DataSource:=DataSource1
  2. ListSource:=DataSource1
  3. DataField:='tabla_ID';
  4. KeyField:='tabla_ID';
  5. ListField:='tabla_Descrip';
El ListField es el que se muestra en el combo, puede ser cualquier campo o columna de la tabla.



En modo diseño nuestro combo ya muestra los datos. No hemos escrito ni una sola línea de código, solo una consulta SQL.



En tiempo de ejecución:

Me ha pasado y todavía leo en los foros, que el combo se ve bien pero a la hora de ejecutar el programa, no se carga; o cómo hacer todo en tiempo de ejecución. Pues veamos el mismo caso:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, db, FileUtil, Forms, Controls, Graphics, Dialogs,
        DbCtrls, ZConnection, ZDataset;

type

        { TForm1 }

    TForm1 = class(TForm)
                DataSource1: TDataSource;
                DBLookupComboBox1: TDBLookupComboBox;
                ZConnection1: TZConnection;
                ZQuery1: TZQuery;
                procedure FormCreate(Sender: TObject);
    private
        { private declarations }
    public
        { public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  ZConnection1.Database:='datos.db';
  ZConnection1.Connect;
  ZQuery1.SQL.Text:='SELECT * FROM turnos;';
  ZQuery1.Open;
  DBLookupComboBox1.DataSource:=DataSource1;
  DBLookupComboBox1.ListSource:=DataSource1;
  DBLookupComboBox1.DataField:='turid';
  DBLookupComboBox1.KeyField:='turid';
  DBLookupComboBox1.ListField:='turdesc';
end;

end.  

Primero que nada, desde el inspector de objetos asegurarse de tener desconectada la base de datos y el SQL del query en blanco.

Es importante seguir un orden, primero establecer la conexión con la base de datos, luego definir la consulta SQL y paso siguiente abrirla, si es mediante Open mejor, el código es más claro, además active:=True lo único que hace es invocar a Open y en False, a Close.

Lo que sigue es lo mismo que hicimos desde el inspector de objetos y en el mismo orden.