Diferencia entre revisiones de «TprxADOQuerySelect»
Sin resumen de edición |
|||
(No se muestran 29 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
Í<!-- | |||
[[Category:DELPHI]] | [[Category:DELPHI]] | ||
[[Category:DELPHI/DATASETS]] | [[Category:DELPHI/DATASETS]] | ||
--> | |||
=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. | |||
== | =[[QUEESESTO/IDENTIDAD|Identidad]]= | ||
[[Category:MANUAL/PROGRAMADOR]] | |||
[[Category:DATASETS/QUERIES]] | |||
*Ancestro: [[TADOQuery]] | |||
*Carpeta: C:\DevelopPrx\library | |||
*Archivo: prxADOQuerySelect.pas | |||
(Ver [https://docwiki.embarcadero.com/Libraries/Sydney/en/Data.Win.ADODB.TADOQuery TADOQuery]). | |||
== | ==Declaración== | ||
<pre> | |||
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; | |||
</pre> | |||
===FAutoFindConnection: Boolean=== | |||
El sentido de esta propiedad era indicar si el dataset debía encontrar automáticamente 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. | |||
Este GUID se usa en [[DEV AUXILIARES/SELECCION CRITERIOS]]. | |||
=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 '''First''' del dataset 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 '''Prior''' del dataset 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 '''Next''' del dataset 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 '''Last''' del dataset 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. | |||
Ejemplo del comando: | |||
<pre> | |||
SELECT | |||
FCODIGO | |||
, FDESCRIPCION | |||
FROM CUENTA | |||
</pre> | |||
===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> | |||
===function Refresh(aSilent: Boolean = False): Boolean=== | |||
Esta función vuelve a ejecutar el último comando SELECT conocido refrescando el resultado, el último comando ejecutado se encuentra en la propiedad nativa '''SQL''' | |||
===procedure VerSentenciaClickAdd(Sender: TprxPopupMenu)=== | |||
Agrega la opción "Ver sentencia SQL..." a un menú: | |||
[[Archivo:20250515 1605 VER SENTENCIA.png|miniaturadeimagen|no|Opción para ver sentencia SQL en un menú.]] | |||
Si la opción es elegida entonces llama a la siguiente función. | |||
===procedure VerSentenciaClick(Sender: TObject)=== | |||
Abre el form [[TTfvsShowOnMemoForm]] y muestra la última sentencia usada en el componente, por ejemplo: | |||
[[Archivo:20250515 1609 VER SENTENCIA MEMO.png|miniaturadeimagen|no|Memo con la sentencia SQL.]] | |||
La última sentencia ejecutada se encuentra en la propiedad nativa '''SQL''' | |||
===procedure Traducir=== | |||
Traduce la propiedad '''DisplayLabel''' de cada columna usando el lenguaje asociado al usuario. Esta propiedad corresponde al título de cada columna (o sea, nombre del campo). | |||
=Uso= | |||
Este componente se usa en algunos casos instanciado como TprxADOQuerySelect, pero más que nada como ancestro de [[TprxADOQuery]] y de [[TprxADOQueryDetail]]. | |||
<!-- | |||
**************************************************************** | |||
**************************************************************** | |||
**************************************************************** | |||
**************************************************************** | |||
**************************************************************** | |||
**************************************************************** | |||
**************************************************************** | |||
== 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 37: | Línea 251: | ||
== Funcionalidad relevante == | == Funcionalidad relevante == | ||
Los procedimientos [[Create]], [[Loaded]] y [[Destroy]] no se describen, su funcionalidad está clara en el código. | |||
{| class="wikitable" | {| class="wikitable" | ||
Línea 43: | Línea 259: | ||
|- | |- | ||
| prxADOQuerySelectCreate || Se define por fuera de la clase y sirve para simplificar la instanciación de un objeto. || public || TprxADOQuerySelect. | | prxADOQuerySelectCreate || Se define por fuera de la clase y sirve para simplificar la instanciación de un objeto. || public || TprxADOQuerySelect. | ||
|- | |- | ||
| FindConnection || Busca en la aplicación hasta encontrar un DataModule que contenga un TADOConnection cuya propiedad 'ppMainConnection' sea True. || protected || Boolean: True cuando encontró la conexión, sino False. | | FindConnection || Busca en la aplicación hasta encontrar un DataModule que contenga un TADOConnection cuya propiedad 'ppMainConnection' sea True. || protected || Boolean: True cuando encontró la conexión, sino False. | ||
Línea 66: | Línea 276: | ||
| Select || Recibe un texto que representa un comando SQL de SELECT y lo aplica a la BD. || public || Retorna True si pudo aplicar el comando, False sino. | | Select || Recibe un texto que representa un comando SQL de SELECT y lo aplica a la BD. || public || Retorna True si pudo aplicar el comando, False sino. | ||
|- | |- | ||
| | | Select || Similar anterior pero recibe un array de textos como argumento. || public || Retorna True si pudo aplicar el comando, False sino. | ||
|- | |||
| SelectRecordCount || Recibe un texto que representa un comando SQL de SELECT, lo ejecuta y retorna la cantidad de registros. || public || Integer que representa la cantidad de registros. | |||
|- | |||
| SelectRecordCount || Similar anterior pero recibe un array de textos como argumento. || public || Integer que representa la cantidad de registros. | |||
|- | |||
| SelectFieldValue || Recibe un comando SELECT y el nombre de un campo, aplica el comando y retorna el valor del campo solicitado. || public || Variant que representa el valor del campo solicitado. | |||
|- | |||
| SelectFieldValue || Similar anterior pero el comando SELECT es un array de strings. || public || Variant que representa el valor del campo solicitado. | |||
|- | |||
| SelectToList || Hace un SELECT y vuelca los valores del campo solicitad a un stringlist. || public || NA. | |||
|- | |||
| Refresh || Vuelve a hacer SELECT con la última sentencia conocida (guardada en la propiedadSQL) || public || Boolean, retorna True si tuvo éxito, sino retorna False. | |||
|- | |||
| VerSentenciaClick || Muestra en [[TTfvsShowOnMemoForm]] la última sentencia cargada, existente en la propiedad SQL. || public || NA | |||
|- | |||
| VerSentenciaClickAdd || Agrega la opción '''Ver sentencia''' a cualquier menú para llamar al procedimiento'''VerSentenciaClick'''. || public || NA. | |||
|- | |||
| Traducir || Traduce los '''DisplayLabel''' de cada campo del dataset sando el lenguaje asociado al usuario. || public || NA. | |||
|} | |} | ||
== Relaciones == | |||
Esta clase es ancestro para [[TprxADOQuery]]. | |||
La clase también se usa instanciándola directamente. | |||
--> |
Revisión actual - 21:59 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
(Ver TADOQuery).
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 automáticamente 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.
Este GUID se usa en DEV AUXILIARES/SELECCION CRITERIOS.
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 First del dataset 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 Prior del dataset 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 Next del dataset 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 Last del dataset 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.
Ejemplo del comando:
SELECT FCODIGO , FDESCRIPCION FROM CUENTA
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:

Llamado para el campo FCODIGO guardaría los siguientes valores en la lista:
11101001 11101002 11101003 11101004
function Refresh(aSilent: Boolean = False): Boolean
Esta función vuelve a ejecutar el último comando SELECT conocido refrescando el resultado, el último comando ejecutado se encuentra en la propiedad nativa SQL
procedure VerSentenciaClickAdd(Sender: TprxPopupMenu)
Agrega la opción "Ver sentencia SQL..." a un menú:

Si la opción es elegida entonces llama a la siguiente función.
procedure VerSentenciaClick(Sender: TObject)
Abre el form TTfvsShowOnMemoForm y muestra la última sentencia usada en el componente, por ejemplo:

La última sentencia ejecutada se encuentra en la propiedad nativa SQL
procedure Traducir
Traduce la propiedad DisplayLabel de cada columna usando el lenguaje asociado al usuario. Esta propiedad corresponde al título de cada columna (o sea, nombre del campo).
Uso
Este componente se usa en algunos casos instanciado como TprxADOQuerySelect, pero más que nada como ancestro de TprxADOQuery y de TprxADOQueryDetail.