Diferencia entre revisiones de «TprxADOQuerySelect»

De Pragma Wiki
Ir a la navegación Ir a la búsqueda
Sin resumen de edición
(No se muestran 4 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
<!--
[[Category:DELPHI]]
[[Category:DELPHI]]
[[Category:DELPHI/DATASETS]]
[[Category:DELPHI/DATASETS]]
[[Category:MANUAL/DELPHI]]
-->
=Introducción=
El objeto '''[[TprxADOQuerySelect]]''' (Query con funcionalidad básica.) implementa funcionalidad básica para simplificar el código relacionado con las operaciones de base de datos.


== Descripción ==
=[[QUEESESTO/IDENTIDAD|Identidad]]=
El objeto TprxADOQuerySelect simplifica el acceso a la funcionalidad de su ancestro [[TADOQuery]], implementando código de uso común en el resto del sistema.
[[Category:MANUAL/PROGRAMADOR]]
[[Category:DATASETS/QUERIES]]
*Ancestro: [[TADOQuery]]
*Carpeta: C:\DevelopPrx\library
*Archivo: prxADOQuerySelect.pas


== Ancestro ==
==Declaración==
[[TADOQuery]]
<pre>
type
  TprxADOQuerySelect = class(TADOQuery)
  private
    FAutoFindConnection: Boolean;
    FSQLX: TStringList;
    FMensajeError: String;
    Ffvs: Boolean;
    FSilentError: Boolean;
    FMasterDataSet: TDataSet;
    Ffbn_parser_object: Tfva_parser_fbn;


== Carpeta ==
    FGUID: String;
C:\DevelopPrx\Library
  protected
    function    FindConnection: Boolean;


    procedure  Traducir;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure  Loaded; override;
    procedure  FirstRecord(Sender: TObject);
    procedure  PriorRecord(Sender: TObject);
    procedure  NextRecord(Sender: TObject);
    procedure  LastRecord(Sender: TObject);
    function    DatabaseExists(aBaseDatos: String): Boolean;
    function    TableExists(aTabla: String): Boolean;
    function    Select(aSQLCommand: String; aSilent: Boolean = False): Boolean; overload;
    function    Select(aStrings: TStrings; aSilent: Boolean = False): Boolean; overload;
    function    SelectRecordCount(aSQLCommand: String; aSilent: Boolean = False): Integer; overload;
    function    SelectRecordCount(aStrings: TStrings; aSilent: Boolean = False): Integer; overload;
    function    SelectFieldValue(aSQLCommand: String; aFieldName: String): Variant; overload;
    function    SelectFieldValue(aStrings: TStrings; aFieldName: String): Variant; overload;
    procedure  SelectToList(aComando: String; aCampo: String; aLista: TStrings);
    function    Refresh(aSilent: Boolean = False): Boolean;
    procedure  VerSentenciaClickAdd(Sender: TprxPopupMenu);
    procedure  VerSentenciaClick(Sender: TObject);
    property    SilentError: Boolean read FSilentError write FSilentError;
    property    SQLX: TStringList read FSQLX write FSQLX;
    property    MensajeError: String read FMensajeError write FMensajeError;
    property    fvs: Boolean read Ffvs write Ffvs;
    property    MasterDataSet: TDataSet read FMasterDataSet write FMasterDataSet;
    property    fbn_parser_object: Tfva_parser_fbn read Ffbn_parser_object;
    property    GUID: String read FGUID;
  published
    property    ppAutoFindConnection: Boolean read FAutoFindConnection write FAutoFindConnection;
  end;
</pre>
===FAutoFindConnection: Boolean===
El sentido de esta propiedad era indicar si el dataset debía encontrar en forma automática la conexión a la base de datos, pero finalmente ese es el comportamiento por defecto por lo que esta propiedad está OSBSOLETA y debería eliminarse.
===FMasterDataSet: TDataSet===
En el frame [[TTfvsDBClientFrameGridConsultas]] que administra las [[:Category:DEV CONSULTAS|Consultas]] existen dos datasets:
*Uno que administra los argumentos de la consulta.
*Otro que retorna el resultado.
La propiedad FMasterDataSet del dataset que administra el resultado se setea con el valor del dataset que maneja los argumentos, solo para el caso de usarse el comando FBN que toma valores de campos de un dataset.
===Ffbn_parser_object: Tfva_parser_fbn===
Es el componente encargado de traducir usando los [[:Category:LENGUAJES|Lenguajes]], el componente es Tfva_parser_fbn.
===FGUID: String===
Cada vez que se instancia el componente toma un [https://es.wikipedia.org/wiki/Identificador_%C3%BAnico_global GUID / UUID] que sirve como un identificador único, no puede haber dos componentes con el mismo código.
=Implementación=
===constructor Create(AOwner: TComponent)===
Los componentes ADO de acceso a datos tienen una propiedad llamada '''CommandTimeout''' que indica la cantidad de segundos que tiene un determinado componente para completar una operación, si la misma se excede de ese tiempo la aplicación dará un error de timeout. En este caso está seteada a 360 segundos = 6 minutos.
<pre>
constructor TprxADOQuerySelect.Create(AOwner: TComponent);
var
  vGuid: TGUID;
begin
  inherited Create(AOwner);
  if csDesigning in ComponentState = False then
    begin
    FSQLX              := TStringList.Create;
    CommandTimeout    := 360;
    Ffbn_parser_object := Tfva_parser_fbn.Create(Self);
    // Toma GUID...
    CreateGUID(vGuid);
    FGUID := GUIDToString(vGuid);
    end;
end;
</pre>
===function FindConnection: Boolean===
Busca entre los componentes de la aplicación hasta encontrar uno que sea de tipo [[TprxADOConnection]] y tenga la propiedad ppMainConnection = True.
===procedure FirstRecord(Sender: TObject)===
Llama al procedimiento nativo del dataset llamado '''First''' que lleva el cursor de los datos al primer registro. Se define como un evento para poder asignarse directamente al OnClick de un botón.
===procedure PriorRecord(Sender: TObject)===
Llama al procedimiento nativo del dataset llamado '''Prior''' que lleva el cursor de los datos al registro anterior al activo. Se define como un evento para poder asignarse directamente al OnClick de un botón.
===procedure NextRecord(Sender: TObject)===
Llama al procedimiento nativo del dataset llamado '''Next''' que lleva el cursor de los datos al registro siguiente al activo. Se define como un evento para poder asignarse directamente al OnClick de un botón.
===procedure LastRecord(Sender: TObject)===
Llama al procedimiento nativo del dataset llamado '''Last''' que lleva el cursor de los datos al último registro. Se define como un evento para poder asignarse directamente al OnClick de un botón.
===function Select(aSQLCommand: String; aSilent: Boolean = False): Boolean===
Ejecuta una sentencia SELECT usando:
*aSQLCommand es el comando SQL a ejecutar como un string.
*aSilent cuando se setea a 0 el componente dará un error si algo falla, cuando se setea a 1 el mensaje de error no será visible, pero se informará al componente que llamó a la función para que lo procese.
Retorna True si pudo ejecutar la sentencia, False sino.
Ejemplo del comando:
<pre>
SELECT FCODIGO, FDESCRIPCION FROM CUENTA
</pre>
===function Select(aStrings: TStrings; aSilent: Boolean = False): Boolean===
Similar anterior, pero recibe una lista de strings que componen el comando SQL.
===function SelectRecordCount(aSQLCommand: String; aSilent: Boolean = False): Integer===
Ejecuta una sentencia SELECT y retorna la cantidad de registros, usa:
*aSQLCommand es el comando SQL a ejecutar como un string.
*aSilent cuando se setea a 0 el componente dará un error si algo falla, cuando se setea a 1 el mensaje de error no será visible, pero se informará al componente que llamó a la función para que lo procese.
===function SelectRecordCount(aStrings: TStrings; aSilent: Boolean = False): Integer===
Similar anterior, pero usa una lista de strings para el comando.
===function SelectFieldValue(aSQLCommand: String; aFieldName: String): Variant===
Dado un comando SQL '''aSQLCommand''', lo ejecuta y retorna el valor del campo '''aFieldName'''.
El valor de retorno es Variant indicando que puede ser cualquier cosa:
*Un string.
*Un número.
*Una fecha.
*Etc.
===function SelectFieldValue(aStrings: TStrings; aFieldName: String): Variant===
Similar anterior pero recibe una lista de strings que componen el comando.
===procedure SelectToList(aComando: String; aCampo: String; aLista: TStrings)===
Ejecuta el comando '''aComando''' y retorna el valor del campo '''aCampo''' para cada registro en una lista TStrings.
Por ejemplo, la sentencia:
<pre>
SELECT TOP 4 * FROM CUENTA ORDER BY FCODIGO
</pre>
Que retorna:
[[Archivo:20250515 1539 QUERY TO LIST.png|miniaturadeimagen|no|Resultado del query.]]
Llamado para el campo FCODIGO guardaría los siguientes valores en la lista:
<pre>
11101001
11101002
11101003
11101004
</pre>
Ejemplo del comando:
<pre>
SELECT
FCODIGO
, FDESCRIPCION
FROM CUENTA
</pre>
=Uso=
<!--
== Propiedades ==
== Propiedades ==
Se describen las funciones de visibilidad '''public''' o '''published'''. Las funciones con visibilidad más baja solo sirven como propiedades físicas para las descriptas abajo.
Se describen las funciones de visibilidad '''public''' o '''published'''. Las funciones con visibilidad más baja solo sirven como propiedades físicas para las descriptas abajo.


Línea 89: Línea 274:


La clase también se usa instanciándola directamente.
La clase también se usa instanciándola directamente.
-->

Revisión del 20:41 15 may 2025

Introducción

El objeto TprxADOQuerySelect (Query con funcionalidad básica.) implementa funcionalidad básica para simplificar el código relacionado con las operaciones de base de datos.

Identidad

  • Ancestro: TADOQuery
  • Carpeta: C:\DevelopPrx\library
  • Archivo: prxADOQuerySelect.pas

Declaración

type
  TprxADOQuerySelect = class(TADOQuery)
  private
    FAutoFindConnection: Boolean;
    FSQLX: TStringList;
    FMensajeError: String;
    Ffvs: Boolean;
    FSilentError: Boolean;
    FMasterDataSet: TDataSet;
    Ffbn_parser_object: Tfva_parser_fbn;

    FGUID: String;
  protected
    function    FindConnection: Boolean;

    procedure   Traducir;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure   Loaded; override;

    procedure   FirstRecord(Sender: TObject);
    procedure   PriorRecord(Sender: TObject);
    procedure   NextRecord(Sender: TObject);
    procedure   LastRecord(Sender: TObject);

    function    DatabaseExists(aBaseDatos: String): Boolean;
    function    TableExists(aTabla: String): Boolean;

    function    Select(aSQLCommand: String; aSilent: Boolean = False): Boolean; overload;
    function    Select(aStrings: TStrings; aSilent: Boolean = False): Boolean; overload;

    function    SelectRecordCount(aSQLCommand: String; aSilent: Boolean = False): Integer; overload;
    function    SelectRecordCount(aStrings: TStrings; aSilent: Boolean = False): Integer; overload;

    function    SelectFieldValue(aSQLCommand: String; aFieldName: String): Variant; overload;
    function    SelectFieldValue(aStrings: TStrings; aFieldName: String): Variant; overload;

    procedure   SelectToList(aComando: String; aCampo: String; aLista: TStrings);

    function    Refresh(aSilent: Boolean = False): Boolean;

    procedure   VerSentenciaClickAdd(Sender: TprxPopupMenu);
    procedure   VerSentenciaClick(Sender: TObject);

    property    SilentError: Boolean read FSilentError write FSilentError;
    property    SQLX: TStringList read FSQLX write FSQLX;
    property    MensajeError: String read FMensajeError write FMensajeError;
    property    fvs: Boolean read Ffvs write Ffvs;

    property    MasterDataSet: TDataSet read FMasterDataSet write FMasterDataSet;

    property    fbn_parser_object: Tfva_parser_fbn read Ffbn_parser_object;

    property    GUID: String read FGUID;
  published
    property    ppAutoFindConnection: Boolean read FAutoFindConnection write FAutoFindConnection;
  end;

FAutoFindConnection: Boolean

El sentido de esta propiedad era indicar si el dataset debía encontrar en forma automática la conexión a la base de datos, pero finalmente ese es el comportamiento por defecto por lo que esta propiedad está OSBSOLETA y debería eliminarse.

FMasterDataSet: TDataSet

En el frame TTfvsDBClientFrameGridConsultas que administra las Consultas existen dos datasets:

  • Uno que administra los argumentos de la consulta.
  • Otro que retorna el resultado.

La propiedad FMasterDataSet del dataset que administra el resultado se setea con el valor del dataset que maneja los argumentos, solo para el caso de usarse el comando FBN que toma valores de campos de un dataset.

Ffbn_parser_object: Tfva_parser_fbn

Es el componente encargado de traducir usando los Lenguajes, el componente es Tfva_parser_fbn.

FGUID: String

Cada vez que se instancia el componente toma un GUID / UUID que sirve como un identificador único, no puede haber dos componentes con el mismo código.

Implementación

constructor Create(AOwner: TComponent)

Los componentes ADO de acceso a datos tienen una propiedad llamada CommandTimeout que indica la cantidad de segundos que tiene un determinado componente para completar una operación, si la misma se excede de ese tiempo la aplicación dará un error de timeout. En este caso está seteada a 360 segundos = 6 minutos.

constructor TprxADOQuerySelect.Create(AOwner: TComponent);
var
  vGuid: TGUID;
begin
  inherited Create(AOwner);

  if csDesigning in ComponentState = False then
     begin
     FSQLX              := TStringList.Create;
     CommandTimeout     := 360;
     Ffbn_parser_object := Tfva_parser_fbn.Create(Self);

     // Toma GUID...

     CreateGUID(vGuid);
     FGUID := GUIDToString(vGuid);
     end;
end;

function FindConnection: Boolean

Busca entre los componentes de la aplicación hasta encontrar uno que sea de tipo TprxADOConnection y tenga la propiedad ppMainConnection = True.

procedure FirstRecord(Sender: TObject)

Llama al procedimiento nativo del dataset llamado First que lleva el cursor de los datos al primer registro. Se define como un evento para poder asignarse directamente al OnClick de un botón.

procedure PriorRecord(Sender: TObject)

Llama al procedimiento nativo del dataset llamado Prior que lleva el cursor de los datos al registro anterior al activo. Se define como un evento para poder asignarse directamente al OnClick de un botón.

procedure NextRecord(Sender: TObject)

Llama al procedimiento nativo del dataset llamado Next que lleva el cursor de los datos al registro siguiente al activo. Se define como un evento para poder asignarse directamente al OnClick de un botón.

procedure LastRecord(Sender: TObject)

Llama al procedimiento nativo del dataset llamado Last que lleva el cursor de los datos al último registro. Se define como un evento para poder asignarse directamente al OnClick de un botón.

function Select(aSQLCommand: String; aSilent: Boolean = False): Boolean

Ejecuta una sentencia SELECT usando:

  • aSQLCommand es el comando SQL a ejecutar como un string.
  • aSilent cuando se setea a 0 el componente dará un error si algo falla, cuando se setea a 1 el mensaje de error no será visible, pero se informará al componente que llamó a la función para que lo procese.

Retorna True si pudo ejecutar la sentencia, False sino.

Ejemplo del comando:

SELECT FCODIGO, FDESCRIPCION FROM CUENTA

function Select(aStrings: TStrings; aSilent: Boolean = False): Boolean

Similar anterior, pero recibe una lista de strings que componen el comando SQL.

function SelectRecordCount(aSQLCommand: String; aSilent: Boolean = False): Integer

Ejecuta una sentencia SELECT y retorna la cantidad de registros, usa:

  • aSQLCommand es el comando SQL a ejecutar como un string.
  • aSilent cuando se setea a 0 el componente dará un error si algo falla, cuando se setea a 1 el mensaje de error no será visible, pero se informará al componente que llamó a la función para que lo procese.

function SelectRecordCount(aStrings: TStrings; aSilent: Boolean = False): Integer

Similar anterior, pero usa una lista de strings para el comando.

function SelectFieldValue(aSQLCommand: String; aFieldName: String): Variant

Dado un comando SQL aSQLCommand, lo ejecuta y retorna el valor del campo aFieldName.

El valor de retorno es Variant indicando que puede ser cualquier cosa:

  • Un string.
  • Un número.
  • Una fecha.
  • Etc.

function SelectFieldValue(aStrings: TStrings; aFieldName: String): Variant

Similar anterior pero recibe una lista de strings que componen el comando.

procedure SelectToList(aComando: String; aCampo: String; aLista: TStrings)

Ejecuta el comando aComando y retorna el valor del campo aCampo para cada registro en una lista TStrings.

Por ejemplo, la sentencia:

SELECT TOP 4 * FROM CUENTA ORDER BY FCODIGO

Que retorna:

Resultado del query.

Llamado para el campo FCODIGO guardaría los siguientes valores en la lista:

11101001
11101002
11101003
11101004

Ejemplo del comando:

SELECT 
FCODIGO
, FDESCRIPCION 
FROM CUENTA


Uso