Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Donde confirmo la Transacción (https://www.clubdelphi.com/foros/showthread.php?t=54822)

Esau 31-03-2008 23:26:24

Donde confirmo la Transacción
 
Hola Amigos..
tengo una duda e intente buscar información en la red y en los foros pero no encontre nada.
Estoy haciendo una aplicación de tres capas en Delphi 7 con SQL Server 2000
tengo dos tablas una maestro y un detalle.
la capa intermedia tengo una ADOConection con sus propiedades y valores luego tengo un ADOQuery son la siguiente Sentencia
Código SQL [-]
 
Select * from Cab_Factura where Numero = :Numero
luego tengo otro ADOQuery con la Siguiente Sentencia
Código SQL [-]
Select * from Det_Factura where Numero = :numero order by Item
la primera consulta es para la cabecera de la factura y la segunda consulta es para el detalle de la factura.
luego tengo dos TdataSetprovider cada uno apuntando a su respectivo ADOQuery.
Hasta Aquí tengo la capa intermedia.
en la capa cliente tengo un formulario con datos de la cabecera y del detalle
tambien tengo dos TClientdataSet, uno para la cabecera y otro para el detalle.
tengo un boton Guardar en donde pongo esta sentencia
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Cabecera.ApplyUpdates(0);
  Detalle.ApplyUpdates(0);
end;
// graba los cambios de la cabecera y el detalle de la factura
mi problema es el siguiente:
¿Como hago para encerrar en una transacción ambos ApplyUpdates?
lo que sucede es que no quisiera que solo se grabe la cabecera y si el detalle posee un error ninguno de los datos deben confirmarse.

Gracias de antemano por la Ayuda.

kuan-yiu 01-04-2008 09:09:40

Yo lo hago así, aunque no uso ADO.
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    database1.starttransaction;

    Cabecera.ApplyUpdates(0);
    Detalle.ApplyUpdates(0);

    database1.commit;
  except
    On E: Exception do
    begin
// Esto o lo que sea que necesites hacer cuando se produce un error.
      ShowMessage('Error actualizando.' + chr(13) + E.Message);
      database1.rollback;
    end;
end;
// graba los cambios de la cabecera y el detalle de la factura

Esau 01-04-2008 16:40:31

Correcto, eso esta bien pero recordemos que la aplicacion esta separada en capas, por lo tanto el componente DataBase no se encuentra en la capa cliente, se encuentra en la capa intermedia, y es ahi donde surge el problema por que no encuentro la forma de hacer el BeginTran y el commit. desde la capa cliente.

sigo investigando..

Saludos

kuan-yiu 01-04-2008 17:09:11

Pues esa capa intermedia la puedes llamar de algún modo, ¿o no? ¿Dónde tienes el componente DataBase?
Ahí es donde debes tener este procedimiento y en el formulario simplemente llamar al procedimiento en que incluirás lo que te he puesto.

Yo todas las consultas, borrados, inserciones... las tengo en DataModules a los que incluyo en la sección uses del formulario que los necesita.

Esau 01-04-2008 18:39:57

Te explico mejor,
El ClientDataSet se conecta a un DCOMConnection, en la capa Cliente, luego el DCOMConnection tiene una propiedad ServerName, en esta propiedad se enlaza este componente a la capa intermedia, Esta capa intermedia es un DLL que esta registrada en la PC. Las consultas y el componente database o ADOConnection en mi caso estan en la capa intermedia.
Ahi es donde surge el problema,
no puedo acceder al ADOConecction por que esta en la capa intermedia.

espero haber sido especifico.
Saludos

kuan-yiu 02-04-2008 10:05:43

Pues me temo que no puedo ayudarte. Las únicas DLL que uso son para procesos de autentificación y acceso remoto (y ni las hice yo).

Esau 02-04-2008 15:35:05

Ok gracias de todas formas, intentare averiguar algo mas por mi cuenta.

gracias por tu tiempo.

Cañones 09-04-2008 15:57:03

Hola. No se si te sirve o no lo que te puedo decir.
Yo lo que hago es desde el el form del cliente llamo un procedimiento que esta en el dataModule que realiza la transaccion.
Algo asi decis? si te sirve te digo bien como lo hago.
Espero te sirva de algo, si no no importa.
Saludos

Esau 09-04-2008 16:47:28

No estaria mal saber como lo haces..

Gracias

Cañones 09-04-2008 18:20:55

Bueno, te cuento como hago.
Supongamos que tengo el frmMain frmABMproductos(altas, bajas y modificaciones) y frmAMproductos(altas y modificaciones), las bajas se hacen directamente desde el frmABMproductos, tambien tengo un DataModule para productos.
Cuando desde frmABMproductos necesito hacer un alta, creo el frmAMproductos y lo muesto Showmodal (if frmAMproductos.showmodal = mrOK then), antes de eso pongo en modo insert el dataset (en mi caso desde un datasourse como lo indica la teoria de POO) hago lo que tenga que hacer en el frmAMproductos y en aceptar doy modalresult := mrOK
y en frmAMBproductos tengo un if frmAMproductos.showmodal = mrOK then si entra en el bucle llamo al procedimiento, digamos, DataModule.grabar.
en el DataModule.grabar hago lo necesario dependiendo los componentes de conexion.
EJ:
try
elDataSet.CheckBrowseMode;
elDataSet.ApplyUpdates;
IBTransaction.Commit; // esto en mi caso
except
IBTransaction.Rollback;
end;
self.refrescar; // llama a un procedimiento que refresca algunas cosas necesarias
end;

Bueno, espero que me entiendas lo que trato de decirte.

Saludos.

Esau 09-04-2008 18:46:08

Ok Gracias,

keyboy 09-04-2008 19:00:32

Oye Esau, como yo no trabajo con tres capas, poco te puedo decir. Pero viendo tu problema veo que tienes dos ClientDataSet, correspondientes a los DataSet de la capa intermedia. Pero, según tengo entendido, lo más adecuado sería establecer una relación maestro-detalle en la capa intermedia y usar un sólo Provider (conectado al DataSet maestro) y un sólo ClientDataSet. Este ClientDataSet contendrá a la tabla detalle como un "campo" en forma de tabla anidada. Esto es lo que colijo del tópico "master/detail relationships, multi-tiered applications" de la ayuda de Delphi.

Ojalá te sirva de algo.

Bye


La franja horaria es GMT +2. Ahora son las 11:52:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi