Ver Mensaje Individual
  #7  
Antiguo 06-06-2012
4PS_MultiPass 4PS_MultiPass is offline
Registrado
 
Registrado: may 2008
Posts: 5
Reputación: 0
4PS_MultiPass Va por buen camino
Muchas gracias compañeros, sin vuestra ayuda me hubiese quedado atascado demasiado tiempo intentando resolver este tema.

Bueno, pues finalmente me he decidido por el siguiente grupo de instrucciones. Espero que no parezca muy chapucero, pero después de algunas pruebas, esto me encaja para lo que quiero llevar a cabo, es decir, funciona, no sé si será la mejor opción, pero al menos me funciona.

Finalmente no he recurrido ni a un procedimiento almacenado ni a transacciones anidadas pero encajará (creo ).

Tomando el ejemplo de mightydragonlor, he visto la sintaxis para referenciar tablas de distintas bases de datos, es decir [base de datos 1].dbo.tabla1

Con ese dato lo que voy a hacer es componer una transacción que implique cambios en las dos bases de datos y... o todo va bien, o no se hace nada.

Nota: cSentencia es una variable de tipo WideString, dbDatos es un TADOConnection y zComillaSimple es una función que agrega una comilla simple ' al principio y al final de la cadena de caracteres que se le pasa como parámetro.
Código:
...
// preparo la transacción que implica dos bases de datos.
cSentencia := 
' INSERT INTO [HISTORIC].[dbo].[ARTICULO] (cCodigoArt,cDescriArt) ' + 
'     SELECT cCodigoArt,cDescriArt ' + 
'     FROM [DATA].dbo.ARTICULO ' + 
'     WHERE cCodigoArt = ' + zComillaSimple('009999') + ';';

cSentencia := cSentencia + 
' DELETE FROM [DATA].dbo.ARTICULO'+
'     WHERE cCodigoArt = ' + zComillaSimple('009999') + ';'

// Inicio la transacción.
dbDatos.BeginTrans;
try
    frmPrincipal.dbDatos.Execute(cSentencia);
    dbDatos.CommitTrans;
    // si se hace el cut & paste de manera correcta, saldrá por aquí.
    showMessage('todo correcto');
except
    dbDatos.RollbackTrans;
    // si algo va mal, se deshacen los cambios y saldrá por aquí.
    showMessage('Oh, oh. Algo ha ido mal.');
end;
Este trozo de código traspasa el artículo con código 009999 de la tabla ARTICULO de la base de datos DATA a la tabla ARTICULO de la base de datos HISTORIC, es decir una especie de Cut and paste.

Vuelvo a insistir en agradecer vuestra ayuda, sois fabulosos.
Responder Con Cita