GrialQuery

De GrialWIKI

Introducción al Framework Grial

Índice

Contenido

Manejo de Recordsets, Objeto GrialQuery

El Objeto GrialQuery representa el Recordset resultante luego de la ejecución de un comando. Puede definirse el comando con lenguaje SQL o cualquiera de las extensiones aceptadas por el GrialDataServer. El objeto GrialQuery se inicializa con el comando a ejecutar (método Init) y los datos se cargan desde la base mediante el método GrialCont.LoadData

Por ejemplo:

Dim PreForm23Grq as New GrialQuery
PreForm23Grq.Init "Select * From PreForm23 where RELA_PREFORM22=" &  IDPreform22Elegido
GrialCont.LoadData PreEjec21_Scb, PreForm23Grq
If PreForm23Grq.RecCount = 0 then Err.Raise 5,"No se hallaron datos en PRE_FORM_23"

El objeto GrialQuery posee una serie de métodos y propiedades para el manejo del Rst interno, que simplifican manejo de recordsets ADO.

Propiedades:

  • CurrentQuery: Propiedad tipo string conteniendo el texto del comando a ejecutar
  • Rst: Propiedad tipo recordset conteniendo el recordset resultante de la consulta.
  • RecCount: Cantidad de registros en Rst.

Métodos y Funciones:

Function Find(Criteria As String) As Boolean Busca el primer registro que coincida con el criterio especificado, retorna False si no halla ningún registro. Criteria, puede ser: "CAMPO [oper] [Valor]" donde la operación puede ser " =, > , < , >= , <= , LIKE", y pueden combinarse condiciones con los operadores AND y OR

Function Position (ID_Field As String, ID) As Boolean Se posiciona en el registro que cumpla la condición "ID_FIELD = ID"

Function Sum(FieldName As String) Retorna la suma los valores del campo indicado para todos los registros actuales

Function ValueList(FieldName As String, [Separ As String = ","]) Retorna un string con los valores del campo indicado, separados por coma. Es útil para conformar un filtro a se utilizado con la cláusula IN.

Por Ejemplo:

   PreEjec21_scb.ExtraFilterCondition = "RELA_EJEREND01 IN ( " _
                       & ER01Habilitadas_Grq.ValueList("ID_EJEREND01") & ")"

MovePreStart y NextRecord

MovePreStart posiciona el recordset en una posición anterior al primer registro para iniciar un recorrido de todos los registros. NextRecord avanza un registro y devuelve False en caso que no haya mas registros. Usados en conjunto facilitan un bucle de recorrido de todos los registros del recordset.

Por Ejemplo:

With ER01Habilitadas_Grq
   .MovePreStart
   While .Nextrecord
       'Imprimo cada registro...
       GrialPrint_Gpr.WtCol "Cod", .Rst!EJEREDN01_CODIGO
       GrialPrint_Gpr.WtCol "Descri", .Rst!EJEREDN01_DESCRI
   Wend
End With
   
Function RecCount() As Long
Retorna la cantidad de registros. NO da error en caso que nunca se hallan cargado los datos, solo retorna 0.
Function Modified() As Boolean
Retorna true si se ha modificado algún dato dentro del recordset
Function PrepareAddNew() As Boolean
Crea un nuevo registro en blanco dentro del recordset
Sub DeleteRecord()
Elimina el registro actual del recordset
Sub DeleteAllRecords()
Elimina todos los registros del recordset

Todas las funciones de los recordsets ADO, pueden accederse directamente desde el objeto Rst

Por Ejemplo:

With ER01Habilitadas_Grq
   .Rst.Filter = "EJEREND01_PRINCIPAL = 1 " 'Solo los registros principales
   .Rst.Sort = "EJEREND01_CODIGO, EJEREND01_FAPL " 'Ordenado por codigo y Fecha
   .MovePreStart
   While .Nextrecord
       'Imprimo cada registro...
       GrialPrint_Gpr.WtCol "Cod", .Rst!EJEREDN01_CODIGO
       GrialPrint_Gpr.WtCol "Descri", .Rst!EJEREDN01_DESCRI
       ...
   Wend
End With

Recordsets Troncales

Para el manejo y actualización de datos dentro del entorno grial, definiremos los conceptos de "ViewRecordset" o "Recordset de Visualización" y "MainRecordset" o "Recordset Troncal".

  • Un "ViewRecordset" surge de una vista definida en la base de datos (Conjunción de varias tablas) y es mostrado al usuario a través de un Control Grial (Combo, Tree o Grilla).
  • Un Recordset "Troncal" contiene generalmente datos de una sola tabla, es recuperado por programa mediante un objeto GrialQuery, y es utilizado internamente para actualizar datos y preparar la transacción para el servidor.

Esta diferenciación es necesaria ya que los ViewRecordset por lo general no son "updateables", es decir, al ser conjunciones de varias tablas, no pueden ser modificados para actualizar la base de datos. En cambio, un recordset "troncal" contiene los datos de una única tabla, incluyendo su ID, por lo que las modificaciones puede ser aplicadas a la Base de Datos. Es este recordset "Troncal" es el que es enviado en la transacción.

Registro Cabecera

Como el usuario ve y opera con los controles en pantalla, es necesario al aceptar la transacción transferir los cambios realizados por el usuario hacia el recordset Troncal. Para el caso del registro cabecera se utiliza el método UpdateField

Método UpdateField

Para estandarizar la asignación de valores desde la pantalla a los campos en un registro, se utiliza el método UpdateField

Formato:

Sub UpdateField ( Dest As Object, Source, [ DebeIndicar_CheckMsg As String ] )

El parámetro "Dest" es un objeto tipo Field (dentro de un Recordset). El parámetro "Source" es el dato a colocar en el objeto Field El parámetro Opcional "DebeIndicar_CheckMsg" permite controlar que el valor no sea nulo.

Ejemplo:

With PreForm20_grq.Rst
   UpdateField !PREFORM23_DECRI, DescriTxt, "la descripción"
   UpdateField !RELA_PREFORM23, ID_PreForm23_Scb.CurrentValue, "la unidad de medida"

El parámetro Opcional "DebeIndicar_CheckMsg" facilita la validación automática para evitar que el campo quede por null o vacío, permitiendo realizar la validación y la actualización en un solo paso. Si se especifica El parámetro Opcional "DebeIndicar_CheckMsg", se controlará que el valor a actualizar no sea nulo y en caso contrario se generará un error. En el ejemplo dado, en caso que el TextBox "DescriTxt" este vacío, se generará un error (Run-Time Error 5 de Visual Basic) con el mensaje "Error: Debe indicar la descripción".

Nota: El Método UpdateField no realiza modificaciones en el registro si el valor a actualizar es igual al valor existente en el campo, optimizando así las transacciones al no incluir registros sin modificaciones reales. Debe utilizarse siempre este método en lugar de una asignación directa de un valor al registro.

Registros del Detalle

Como el usuario ve y opera con los ViewRecordset , es necesario al aceptar la transacción transferir los cambios realizados por el usuario hacia el recordset Troncal. Para el caso de varios regsitros (detalle) que el usuario edita en una grilla, se utiliza el método del GrialCont ChangeMainRst

Método ChangeMainRst

Formato:

 Sub ChangeMainRst ( MainRecordset As Recordset, ViewRecordset As Recordset, ID_Field As String
                     ,[CreateRecords As Boolean = Falso]
                     ,[PreCancelModifications As Boolean = Verdadero])

El parámetro ID_Field es el nombre del campo que vincula los registros en el Troncal con los registros en el ViewRecordset. En todos los casos, la tabla principal de la vista debe ser la misma tabla del recordset troncal, y también todos los campos que se deseen actualizar deben tener el mismo nombre en la vista y en el troncal.

Todas las modificaciones, altas y bajas realizadas sobre el ViewRecordset por el usuario serán duplicadas en el Troncal, sincronizando los registros que posean el mismo valor del campo ID_Field, y transfiriendo todos los valores entre los campos de igual nombre.

Ejemplo:

Dim PreForm23Grq as New GrialQuery
Dim IDPreform19Elegido as Long
 
Sub PrepararTransaccion…
PreForm20Grq.Init "Select * From PreForm20" & _
                  " Where RELA_PREFORM19=" & IDPreform19Elegido
GrialCont.LoadData ID_Periodos_Scb, Instituciones_Ste, PreForm23Grq
 
Sub BottomButtonClick….
Dim Txn As New [[GrialTransaction]]
' Actualizo el recordset troncal
GrialCont.ChangeMainRst PreForm20_grq.Rst, PreForm20_sgr.Rst, "ID_PREFORM20"
'Lo incorporo a la transacción
Txn.Cmd PreForm20_grq.Rst
'Lo envío al server
Txn.Apply GrialCont

Opción "CreateRecords"

En ciertos casos, puede ser necesario 'crear copias' de los registros de un recordset, por ejemplo cuando se dispone de un "modelo" default para insertar datos en un detalle.

En estos casos como se toman los registros del "modelo" (mediante un select), dichos registros no tendrán la marca de "Nuevo Registro" en el ViewRecordset (ya que el usuario no los dio de alta, si no que provienen de un select previo)

En estos casos, se puede usar el parametro "CreateRecords:=true" y de ese modo, si existe un ID en el ViewRecordset que no se encuentre en el Troncal, se crea el registro en el troncal -por mas que el registro del ViewRecordset no provenga de un alta-.

Sólo se recomienda usar esta opción en los casos especiales en que se sabe que han de crearse registros nuevos aunque no tengan la marca de "Nuevo Registro".



GrialApl <<< >>> GrialTransaction

Herramientas personales