Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Actualización Master/Details

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Actualización Master/Details Responder citando

Como realizo actualizaciones en varias tablas (más de 2) de manera atómica ??? es decir, si tengo que actualizar la tabla A, después la B, etc, pero si existe algún problema en la actualización de alguna, se de un rollback para que no se actualize.

Es posible esto utilizando storeprocedures en Interbase ???

Saludos !!!

[/code]
Volver arriba
Mensaje    Asunto: Responder citando

Hola Maximus, Hola a todos: Si usas Interbase la atomicidad esta asegurada incluso cuando se trabaja sobre varias Databases inclusive en servidores distintos.

Tienes que poner la propiedad de todas las tablas pertinentes apuntando
a la misma IBTransaction, para descartar los cambios aunque hayas hecho varios post sobre las diversas tablas:

IBTransaction1->Rollback(); //esto revierte los cambios hechos desde el ultimo Rollback() , Commit() o inicio explicito de una transaction (IBTransaction1->StartTransaction()Wink

Hay algunos detalles a tener en cuenta:
.-Tanto Commit como Rollback cierran las tablas involucradas al ejecutarse y debes reabrirlas.
.-Es bueno que exista un indice unico en todas las tablas para localizar el registro activo antes de finalizar la transaction pues desde el punto de vista del usuario al finalizar la operacion se encontrara en el primer registro de las tablas y esto causa confusion y es molesto.

Aqui algunos consejos y practicas que uso metodicamente y me han simplificado bastante el trabajo.

Creè un pequeño programa para diseñar tablas en interbase de modo
que cumplan con los siguentes requisitos:

Crea un campoi artificial autonumerico con su indice respectivo.
Crea un trigger activo al insertar registro para generar la autonumeracion.

Aqui esta parte de la metadata:

Código:

   create table MI_TABLA
(
ID Integer,
mas campos ....
)
create index mi_tabla_id on MI_TABLA (ID);
create generator mi_tabla_id_gen;
create trigger mi_tabla_ins active before insert
as
begin
new.id=gen_id(mi_tabla_id_gen,1);
end


Si usas Buttons o MenuItems para aceptar o rechazar los cambios puedes hacer esto:
Código:
void __fastcall AceptarClick(TObject * Sender)
{
Table1->Post();
int Posicion=Table1->FieldByName("ID")->AsInteger;
IBTransaction->Commit();
Table1->Open();
TLocateOptions Opciones;
Table1->Locate("ID",Posicion,Opciones);
}
//*****************************************************
void __fastcall CancelarClick(TObject * Sender)
{
int Posicion=Table1->FieldByName("ID")->AsInteger;
IBTransaction->Rollback();
Table1->Open();
TLocateOptions Opciones;
Table1->Locate("ID",Posicion,Opciones);
}
//*****************************************************


Bueno esto es parte de lo que tengo implementado, pues tambien registro quien y cuando crea o modifica cada registro, un log de los registros borrados (Algo como la papelera de reciclaje)

ahh.. una ultima recomendacion utiliza IBDataSets en vez de tablas con la SelectSQL trayendo los registros minimos necesarios.
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.