TTprxSelectFromGridForm

De Pragma Wiki
Ir a la navegación Ir a la búsqueda

Descripción

El objeto TTprxSelectFromGridForm (Form para seleccionar valores.) permite seleccionar valores durante la edición de cualquier tabla. Normalmente se accede a este form presionando F5 sobre cualquier campo que tenga una clave foránea sobre otra tabla (por ejemplo: el campo cliente en una factura).

En su versión más sencilla ejecuta una sentencia SQL que completa la grilla con los registros producto del SQL y el usuario puede seleccionar un registro posicionándose sobre el mismo y picando el botón Seleccionar. Pero el form admite más de una sentencia.

Selección de valores.

Por ejemplo, Elegir sentencia SQL tiene tres elementos:

  • primitivo: el SQL trae los atributos primitivos.
  • clase: el SQL trae los atributos de tipo clase.
  • enumeraciones: el SQL trae los atributos de tipo enumeración.

(Ver Catalogos, tipos de datos disponibles).

Si el form contiene más de una sentencia, cuando cambiamos la sentencia en el combo se refrescan los resultados de la pantalla.

El form también permite importar datos de una planilla Excel, en ese caso habilita un panel superior para elegir la planilla (y hoja) de la computadora:

Importar datos de una planilla.

El form puede tener dos tipos de selección de registros:

  • Simple: solo se puede elegir un registro.
  • Múltiple: se pueden elegir varios registros a la vez.

Identidad

  • Ancestro: TTprxForm
  • Carpeta: C:\DevelopPrx\classes
  • Archivo: prxSelectFromGridForm.PAS

Declaración

El form primero declara una clase que permite guardar las distintas sentencias SQL:

type
  TTprxSelectFromGridFormSentencia = class(TComponent)
  private
    FNombre: String;
    FComandos: TStringList;
  protected
  public
    property    Nombre: String read FNombre write FNombre;
    property    Comandos: TStringList read FComandos write FComandos;
  published
  end;

Y la declaración finalmente es:

type
  TTprxSelectFromGridForm = class(TTprxForm)
    ActionSELECCION_F5: TAction;
    Panel3: TPanel;
    Panel2: TPanel;
    SpeedButtonVERSENTENCIA: TSpeedButton;
    ButtonSELECCIONAR: TButton;
    ButtonCANCELAR: TButton;
    ComboBoxSENTENCIA: TComboBox;
    Panel1: TPanel;
    prxDBGridSELECCION: TfvsDBGrid;
    PanelPLANILLA: TPanel;
    GroupBox1: TGroupBox;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Panel9: TPanel;
    prxStaticText1: TStaticText;
    EditPLANILLA: TEdit;
    Panel10: TPanel;
    Panel11: TPanel;
    prxStaticText2: TStaticText;
    Panel12: TPanel;
    Panel13: TPanel;
    StaticText2: TStaticText;
    OpenDialog1: TOpenDialog;
    ComboBoxHOJA: TComboBox;
    prxADODataSetExcel1: TprxADODataSetExcel;
    CheckBoxTODOS: TCheckBox;
    ButtonSELECCIONAR_PLANILLA: TButton;
    ButtonCARGAR_PLANILLA: TButton;
    ComboSetFocus: TAction;
    GrillaSetFocus: TAction;
    procedure FormShow(Sender: TObject);
    procedure ButtonSELECCIONARClick(Sender: TObject);
    procedure ButtonCANCELARClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ComboBoxSENTENCIASelect(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SpeedButtonVERSENTENCIAClick(Sender: TObject);
    procedure ActionSELECCION_F5Execute(Sender: TObject);
    procedure SpeedButtonPLANILLAClick(Sender: TObject);
    procedure EditPLANILLAExit(Sender: TObject);
    procedure SpeedButtonCARGARClick(Sender: TObject);
    procedure ComboSetFocusExecute(Sender: TObject);
    procedure GrillaSetFocusExecute(Sender: TObject);
    procedure FormProgresoClose(Sender: TObject);
    procedure prxDBGridSELECCIONMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure prxDBGridSELECCIONKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure CheckBoxTODOSClick(Sender: TObject);
  private
    FListo: Boolean;
    FSeleccionMultiple: Boolean;
    FImportarPlanilla: Boolean;
    FComando: String;

    FSentenciaDefecto: String;
    FCampoDefecto: String;
    FValorDefecto: String;
    FProgresoForm: TTprxProgresoForm;
    FSeleccionar: Boolean;
  protected
    Sentencias: array of TTprxSelectFromGridFormSentencia;
    SentenciasCount: Integer;

    procedure   SetComando(aValue: String);

    function    PanelPlanillaVisible: Boolean;

    procedure   SetSeleccionar(aValue: Boolean);

    procedure   ImprimirCantidadSeleccionada;

    property    Listo: Boolean read FListo write FListo;
    property    ProgresoForm: TTprxProgresoForm read FProgresoForm write FProgresoForm;
  public
    procedure   AgregarSentencia(aNombre: String; aSentencia: String); overload;
    procedure   AgregarSentencia(aNombre: String; aSentencia: TStringList); overload;
    procedure   Recorrer(aCall: TTprxSelectFromGridFormOnRecord);

    function    ComboBoxELEGIDO: String;

    property    SeleccionMultiple: Boolean read FSeleccionMultiple write FSeleccionMultiple;
    property    ImportarPlanilla: Boolean read FImportarPlanilla write FImportarPlanilla;

    property    SentenciaDefecto: String read FSentenciaDefecto write FSentenciaDefecto;
    property    CampoDefecto: String read FCampoDefecto write FCampoDefecto;
    property    ValorDefecto: String read FValorDefecto write FValorDefecto;
    property    Seleccionar: Boolean read FSeleccionar write SetSeleccionar;
  published
    property    Comando: String read FComando write SetComando;
  end;

Implementación

procedure FormShow(Sender: TObject)

Si el form tiene varias sentencias elige a la primera.

Si el form permite tener selección múltiple de registros agrega la propiedad dgMultiSelect a la grilla usando:

if SeleccionMultiple then
   prxDBGridSELECCION.Options := prxDBGridSELECCION.Options + [dgMultiSelect];

procedure AgregarSentencia(aNombre: String; aSentencia: String)

Permite agregar una sentencia SQL indicando:

  • aNombre es el nmbre de la sentencia (primitivo, clase, enumeracion en la imagen).
  • aSentencia es la sentencia como un string.

procedure AgregarSentencia(aNombre: String; aSentencia: TStringList)

Similar anterior, pero informa la sentencia como una lista de strings.

procedure ButtonSELECCIONARClick(Sender: TObject)

Si existe por lo menos un registro seleccionado retorna ModalResult := mrOk, si no hay registros seleccionados retorna ModalResult := mrCancel. Luego cierra el form.

procedure ButtonCANCELARClick(Sender: TObject)

Retorna ModalResult := mrCancel y cierra el form.

procedure ComboBoxSENTENCIASelect(Sender: TObject)

Ejecutado cuando cambia la sentencia SQL en el combo ejecuta los comandos asociados y refresca los registros de la grilla.

procedure SpeedButtonVERSENTENCIAClick(Sender: TObject)

Pedrmite ver la sentencia SQL elegida picando el botón con una lupa a la izquierda del combo.

procedure Recorrer(aCall: TTprxSelectFromGridFormOnRecord)

Recorre el resultado de un dataset y llama al procedimiento informado en el argumento aCall.

Importar planilla

function PanelPlanillaVisible: Boolean

Visibiliza el panel con los datos necesarios para importar registros desde una planilla.

procedure SpeedButtonPLANILLAClick(Sender: TObject)

Abre el diálogo de selección de Windows para seleccionar una planilla.

procedure EditPLANILLAExit(Sender: TObject)

Al salir del campo planilla carga la lista de hojas.

procedure SpeedButtonCARGARClick(Sender: TObject)

Carga los datos de la planilla.

Uso

Ejemplo de uso tomado de TpAUX_CAMPO_SELECT_F5_unit.SELECT.

var
  vF: TTprxSelectFromGridForm;
begin
  vF           := TTprxSelectFromGridForm.Create(Self);
  vF.Caption   := 'Seleccionar';
  vF.AgregarSentencia('SELECT', SQL_COMANDO);

  vF.ShowModal;

  if vF.ModalResult = mrOk then
     begin
     DataSet.FieldValues[Campo] := vF.prxADOQueryAUXDeBase.Fields[0].AsString;
     Result                     := True;
     end
  else
     Result := False;

  vF.Release;
end;

Instanciamos el form y definimos su título:

vF           := TTprxSelectFromGridForm.Create(Self);
vF.Caption   := 'Seleccionar';

Agregamos la sentencia llamada SELECT, los comandos se encuentran en la lista SQL_COMANDO:

  vF.AgregarSentencia('SELECT', SQL_COMANDO);

Mostramos el form en modo Modal para que no pueda usarse ninguna otra pantalla de la aplicación hasta que cerrems ésta:

  vF.ShowModal;

Como el form se abrió en modo Modal, al cerrarlo va a setear su propiedad ModalResult a mrOk indicando éxito o a mrCancel indicando fracaso. Entonces si el valor de retorno del form es mrOk:

  if vF.ModalResult = mrOk then
     begin
     DataSet.FieldValues[Campo] := vF.prxADOQueryAUXDeBase.Fields[0].AsString;
     Result                     := True;
     end
  else
     Result := False;
<pre>

Asignamos el valor del primer campo de la grilla (vF.prxADOQueryAUXDeBase.Fields[0].AsString) al campo que abrió el form (DataSet.FieldValues[Campo]): 
<pre>
DataSet.FieldValues[Campo] := vF.prxADOQueryAUXDeBase.Fields[0].AsString;

Finalmente cerramos el form y liberamos la memoria que había ocupado:

  vF.Release;

Usos