TprxADOTransaction

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

Introducción

Todas las operaciones de actualización de la base de datos se hacen dentro de transacciones. Por ejemplo: si grabamos una factura el sistema aplicará como si fuera una sola operación el grabado de la cabecera, del detalle de esa factura y la carga impositiva. Si alguna de esas operaciones fallara en el grabado toda la transacción será ignorada. De este modo la información grabada es consistente.

El componente TprxADOTransaction (Manejo de transacciones con la base de datos.) administra las transacciones.

Identidad

  • Ancestro: TComponent
  • Carpeta: C:\DevelopPrx\library
  • Archivo: prxADOTransaction.pas

Declaración

type
  TprxADOTransaction = class(TComponent)
  private
    FQuery: TprxADOQuery;
    FTransactionQuery: TprxADOQuery;

    Freplicacion_activa: Boolean;

    FTransactionTimeStamp: String;
    FTransactionLevel: Integer;
    FTransactionErrors: Integer;
    FErrorMessages: TStringList;

    FRowsAffected: Integer;

    Fon_get_db_timestamp: Tprx_get_db_timestamp;

    FTransactionData: TComponent;
    FReplicaMsg: TComponent;
  protected
    procedure   Loaded; override;
    function    Connection: TADOConnection;

    procedure   devlog_Catalog_Set(aValue: String);
    function    devlog_Catalog_Get: String;

    procedure   devlog_Tipo_Set(aValue: String);
    function    devlog_Tipo_Get: String;

    procedure   devlog_Codigo_Set(aValue: String);
    function    devlog_Codigo_Get: String;

    procedure   devlog_Subcodigo_Set(aValue: String);
    function    devlog_Subcodigo_Get: String;

    procedure   devlog_Operacion_Set(aValue: String);
    function    devlog_Operacion_Get: String;

    procedure   ErrorMessage_Show;

    property    Query: TprxADOQuery read FQuery write FQuery;

    property    TransactionQuery: TprxADOQuery read FTransactionQuery write FTransactionQuery;
    property    TransactionLevel: Integer read FTransactionLevel write FTransactionLevel;
    property    TransactionErrors: Integer read FTransactionErrors write FTransactionErrors;
    property    ErrorMessages: TStringList read FErrorMessages write FErrorMessages;

    property    TransactionData: TComponent read FTransactionData write FTransactionData;

    property    ReplicaMsg: TComponent read FReplicaMsg write FReplicaMsg;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;

    function    SQLCommands_Count: Integer;
    procedure   SQLCommands_Clear;
    procedure   SQLCommands_Add(aSQL: String; aCheckCommand: Boolean);

    function    Transaction_Start(aDataSet: TDataSet): Integer;

    function    TransactionCommit(aEndTransaction: Boolean = True): Boolean;
    procedure   TransactionRollback;

    function    Replicacion_Inicializar: Boolean;

    property    on_get_db_timestamp: Tprx_get_db_timestamp read Fon_get_db_timestamp write Fon_get_db_timestamp;

    property    RowsAffected: Integer read FRowsAffected;

    property    replicacion_activa: Boolean read Freplicacion_activa;

    property    TransactionTimeStamp: String read FTransactionTimeStamp;

    property    devlog_Catalog: String read devlog_Catalog_Get write devlog_Catalog_Set;
    property    devlog_Tipo: String read devlog_Tipo_Get write devlog_Tipo_Set;
    property    devlog_Codigo: String read devlog_Codigo_Get write devlog_Codigo_Set;
    property    devlog_Subcodigo: String read devlog_Subcodigo_Get write devlog_Subcodigo_Set;
    property    devlog_Operacion: String read devlog_Operacion_Get write devlog_Operacion_Set;
  published
  end;

Componentes TprxADOQuery

Administran las operaciones de actualización de la base de datos.

Propiedades devlog

Las propiedades devlog se usan cuando la transacción pertenece a algún objeto del catálogo. Por ejemplo, la modificación a una tabla. Sino no se usan.

Identifican a:

  • devlog_Catalog es el catálogo al que pertenece el objeto modificado.
  • devlog_Tipo es el tipo de objeto modificado, por ejemplo 'prxclases' para identificar a una clase.
  • devlog_Codigo es el código del objeto modificado. Por ejemplo, el nombre de una tabla.
  • devlog_Subcodigo es el subcódigo del objeto modificado, solo cuando corresponde. Por ejemplo, el nombre de un trigger asociado a una clase.
  • devlog_Operacion es el tipo de operación (insert, log, update o delete).

Implementación

function Transaction_Start(aDataSet: TDataSet): Integer

Inicia la transacción inicializando las propiedades necesarias.

function TransactionCommit(aEndTransaction: Boolean = True): Boolean

Intenta grabar la transacción en la base de datos usando el comando CommitTrans de la conexión a la BD, si tiene éxito retorna True, si no pudo grabar ejecuta un rollback usando el comando RollbackTrans de la conexión a la BD y retorna False. Los mensajes de error se guardan en la propiedad ErrorMessages.

Si es una operación de catálogo graba los comandos en el Registro:

// Aunque no haya líneas si es un _catálogo de los nuevos aplica la
// transacción, mientras coexista con el anterior éste tiene que ir al final...

if AnsiCompareText(TprxADOTransactionData(TransactionData).msg_dev_operacion, TprxADOTransaction_Text_Null) <> 0 then
   TprxADOTransactionData(TransactionData).SaveToDevlog(True);

Si la replicación está activa graba la transacción en la bandeja de salida de Replicación:

// Si hay replicación agregamos los registros correspondientes en base
// al contenido de SQLCommands, REPLICACIÓN DROPBOX...

if (replicacion_activa = True) and (TransactionErrors = 0) and (TprxADOTransactionData(TransactionData).msg_contenido.Count > 0) then
    TprxADOTransactionData(TransactionData).SaveToBS;

procedure TransactionRollback

Ejecuta un rollback si falló el grabado de la transacción.

Uso

Este componente se usa exclusivamente para el grabado de una transacción, invocado desde TprxADOConnection.

Obsoletos

ReplicaMsg

La propiedad property ReplicaMsg: TComponent se encuentra osboleta y debería ser eliminada.

El componente TfvaTextMessageReplica también debería ser eliminado.