GrialTransaction

De GrialWIKI

Revisión a fecha de 02:02 8 ago 2009; Admin (Discutir | contribuciones)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)

Actualización de la Base de Datos: GrialTransaction

Las transacciones en el Entorno Grial son preparadas en el cliente, y luego enviadas como un conjunto único al Servidor intermedio. El objeto utilizado para componer una transacción es el GrialTransaction. Los objetos de esta clase funcionan como una "pila" en la cual se acumulan los ítems que conforman la transacción recordsets con modificaciones y/o comandos SQL (con las extensiones aceptadas por el GrialDataServer). Una vez armada la transacción, mediante el método GrialCont.Apply se envía el conjunto al servidor para su proceso.

Nota: El Objeto SqlQuery pertenece a una versión anterior y se mantiene por compatibilidad, posee las mismas funciones del objeto GrialTransaction, con la única diferencia del método para aplicar la transacción: El objeto GrialTransaction se aplica con el método Apply en tanto que en el SqlQuery se invoca el método "UpdateRecords"

La transacción se prepara mediante el método "Cmd", que es el que coloca en la pila cada uno de los ítems que la componen. Los ítems deben ser agregados en la transacción en un orden cabecera-detalle, haciendo seguir a cada recordset con registros de cabecera del recordset con registros de detalle dependientes de los anteriores. Por default, al aplicar la transacción, el GrialDataServer asume que los registros de cabecera de un ítem dado se hallan en el ítem inmediato anterior.

Formato: Sub Cmd ( SqlCmd_or_Recordset, [Rela_String As String] ) Sub Item( SqlCmd_or_Recordset, [Rela_String As String] ) Ejemplo:

Dim Txn As New GrialTransaction
Txn.Cmd PreForm20_grq.Rst , "ID_PREFORM20"
Txn.Cmd PreForm21_grq.Rst , "ID_PREFORM21;RELA_PREFORM20"
Txn.Cmd PreForm23_grq.Rst , ";RELA_PREFORM21"
' Aplico la transacción en el Servidor 
Txn.Apply GrialCont

El primer parámetro del método Cmd es un recordset con las modificaciones realizadas o puede ser también un string conteniendo un query o un comando a ejecutar en la BD. El segundo parámetro establece propiedades para el ítem dentro de la transacción, mediante una sintaxis especial. Cuenta con dos secciones separadas el carácter dos puntos (":"), la sección principal indica hasta tres nombres de campo, indicando qué campo es el ID de la tabla, cuál contiene la relación con el recordset de cabecera y opcionalmente que campo representa el RELA_PADRE para las tablas de tipo ARB (árboles). Estos tres nombres de campo se separan por punto y coma (" ; "). Dentro de la transacción se asume que si en un Cmd se indica un campo RELA, la tabla cabecera es la indicada en el ítem inmediato anterior. Esto es consecuente con la necesidad de ordenar en la transacción primero las tablas cabeceras y luego los detalles.

Por ejemplo:

Txn.Cmd PreForm20_grq.Rst , "ID_PREFORM20" ' Cabecera
Txn.Cmd PreForm21_grq.Rst , "ID_PREFORM21;RELA_PREFORM20" ' Detalle de la 20
Txn.Cmd PreForm07_grq.Rst , "ID_PREFORM07;;RELA_PADRE" ' Actualizo el arbol

Existe una sección de datos opcionales, que debe indicarse antes de la sección principal y se separa de la misma mediante dos puntos (":"). La sección opcional contiene propiedades para el ítem de la transacción y da la posibilidad de modificar el orden cabecera-detalle o de actualizar tablas con múltiples campos RELA.

Por ejemplo:

Txn.Cmd PreForm20_grq.Rst , "Name=PF20: ID_PREFORM20 " ' Cabcera
Txn.Cmd PreForm07_grq.Rst , "ID_PREFORM07;;RELA_PADRE" ' Actualizo el arbol
Txn.Cmd PreForm21_grq.Rst , "Header = PF20: ID_PREFORM21;RELA_PREFORM20" 'Detalle

El Formato para el segundo parámetro del método Cmd es: "[ Param = valor, Param = valor... : ] ID_FieldName ; RELA_FieldName ; RELA_PADRE"

Detalle de cada parte:

Seccion Opcional (hasta el caracter :)

Los parámetros (opcionales) para la sección "Param = valor ;" son:

NAME = xxxx -- Identifica el ítem con un nombre

HEADER = hhhh -- Indica cual es el ítem (identificado previamente mediante NAME = xxxx ) que contiene los registros cabecera. Es necesario sólo cuando la cabecera y el detalle no se pueden colocar uno a continuación de otro en la transacción, o cuando hay más de un detalle para una cabecera.

RelaField= FIELD_NAME / HEADER_NAME -- Se usa para actualizar un registro que tiene más de un campo RELA. Reemplaza el valor del campo indicado por el valor de ID tomado del header indicado. Por ejemplo: RelaField= rela_preform21/Pe21


SysDateField = FIELD_NAME/FIELD_NAME... -- Se usa para los campos que deben ser actualizados con la fecha del sistema. Reemplaza los campos indicados por el Sysdate de la máquina donde corre el Servidor de Aplicaciones. Debe indicarse para efectuar un registro preciso de fechas y horas, ya que la máquina cliente donde se prepara la transacción puede tener mal la fecha. En caso de un ALTA, se actualizarán los campos indicados, siempre que contengan valores no-nulos. En caso de MODIFICACION, se actualizarán los campos indicados con la fecha del sistema sólo si fue modificado su valor original

En el módulo cliente, debe indicarse siempre el "SysdateField=field1/field2/..." y se deben cargar/modificar los campos utilizando la función "Now" (sysdate de la terminal, valor no-confiable).

Cuando el servidor actualice el recordset en la base, reemplazará los valores por el sysdate del servidor (valor confiable).

Para los campos con nombre: FAPL, FBAJA, FANULADO, WFFECHACURSO, WFFECHA se realizará esta actualización automáticamente.

Seccion Normal (Separados por ;)

ID_FieldName: Nombre del Campo que contiene el ID de la tabla. Se usará para tomar el valor que debe ser grabado en los campos RELA de los siguientes detalles.

RELA_FieldName: Nombre del campo que contiene el ID de la cabecera (por default en el recordset anterior). La combinación de ID_FieldName de un ítem y el RELA_FieldName del ítem siguiente establecen una relación cabecera-detalle.

RELA_PADRE: Cuando un recordset establece relaciones dentro de sí mismo. Por ejemplo una tabla tipo árbol. RELA_PADRE es el nombre del campo que representa la relación padre-hijo dentro de la jerarquía del árbol. La combinación ID_FieldName + RELA_PADRE en un mismo recordset se utiliza para las tablas tipo árbol.


Ejemplos de Armado y Aplicación de Transacciones

1.- CABECERA + DETALLE

    Dim Cabecera_PAREXA02_grq as New GrialQuery
    Dim Detalle_PAREXA03_grq as New GrialQuery
    ...
    Dim Txn As New GrialTransaction
 
    Txn.CMD Cabecera_PAREXA02_grq.Rst,"ID_PAREXA02"
    Txn.CMD Detalle_PAREXA03_grq.Rst,";RELA_PAREXA02"
 
    GrialCont.Apply Txn

2.- CABECERA + DETALLE + Detalle Extra

    Dim Cabecera_EXACDA01_grq as New GrialQuery
    Dim Detalle_EXACDA03_grq as New GrialQuery
    Dim Detalle_EXACDA04_grq as New GrialQuery
    ...
 
    Dim Txn As New GrialTransaction
 
    Txn.CMD Cabecera_EXACDA02_grq.Rst,"Name=CabeceraGeneral:ID_EXACDA01"
 
    ' Este detalle toma el header por default 
    ' (recordset en el CMD anterior)
    Txn.CMD Detalle_EXACDA03_grq.Rst,";RELA_EXACDA01"
 
    ' Este detalle toma el ID del item "CabeceraGeneral"
    Txn.CMD Detalle_EXACDA04_grq.Rst,"Header=CabeceraGeneral;RELA_EXACDA01"
 
    Txn.Apply GrialCont


3.- CABECERA, DETALLE + Relación

    Dim Tabla_REACDO12_grq as New GrialQuery
    Dim Cabecera_EXACDA01_grq as New GrialQuery
    Dim Detalle_EXACDA03_grq as New GrialQuery
    ...
 
    Dim Txn As New GrialTransaction
 
    SqlQ.CMD Tabla_REACDO12_grq.Rst,"Name=TablaDescripciones:;ID_REACDO12"
    SqlQ.CMD Cabecera_EXACDA02_grq.Rst,"ID_EXACDA01"
 
    ' Este detalle toma el header por default (recordset en el CMD anterior) 
    'y además actualiza un rela al primer recordset de la transacción
    SqlQ.CMD Detalle_EXACDA03_grq.Rst, _
        "RelaField=RELA_REACDO12/TablaDescripciones : ; RELA_EXACDA01"
 
    Txn.Apply GrialCont
Herramientas personales