 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
MAXIMUS Invitado
|
Publicado: Jue 18 Ago, 2005 3:24 am Asunto: Actualización Master/Details |
|
|
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 |
|
 |
Invitado
|
Publicado: Jue 18 Ago, 2005 8:16 pm Asunto: |
|
|
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()
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|