Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Problema con Try Except

Hola amigos de nuevo aquí con mis dudas pidiendo ayuda.

Resulta que en un bucle Try Except realizo varios post, pero el problema es que cuando falla algun post, resulta que los anteriores ya se han grabado en la BD. Mi pregunta es ¿en el bucle try, si falla algo, todo vuelve a su estado anterior?

Uso Delphi 5 y tablas paradox.

el código es el siguiente:
Código Delphi [-]
TRY
        DbLiquid['NMAQUINA']:=DbMaquinas['NMAQUINA'];
        DbLiquid['FLIQUID']:=DateTimePicker1.Date;
        DbLiquid['HUCHA']:=DbEdit1.Text;
        DbLiquid['RECAUDACION']:=DbEdit2.Text;
        DbLiquid['EXCAMBIO']:=DbEdit3.Text;
        DbLiquid['LECTURAX']:=DbEdit4.Text;
        DbLiquid['LECTURAZ']:=DbEdit5.Text;
        DbLiquid['UBICACION']:=DbMaquinas['UBICACION'];
        DbLiquid['DOMICILIO']:=DbMaquinas['DOMICILIO'];
        DbLiquid['NIF']:=DbMaquinas['NIF'];
        DbLiquid['OBSERVACIONES']:=Edit46.Text;
        DbLiquid['CARGADOR']:=DbLookupComboBox1.Text;
        DbLiquid['BILLETES']:=DbEdit6.Text;
        DbLiquid['PORCENTAJE']:=DbMaquinas['PORCENTAJE'];
        DbLiquid['FULTLIQ']:=DateTimePicker1.Date;
        DbLiquid.Post;
        if DbDevoluc.Locate('NMAQUINA',DbMaquinas['NMAQUINA'],[]) then
        begin
        DbDevoluc.Edit;
        DbDevoluc['FULTLIQ']:=DateTimePicker1.Date;
        DbDevoluc.Post;
        end
        else
        begin
        DbDevoluc.Append;
        DbDevoluc['NMAQUINA']:=DbMaquinas['NMAQUINA'];
        DbDevoluc['FULTLIQ']:=DateTimePicker1.Date;
        DbDevoluc.Post;
        end;
        for i:=0 to 41 do
        begin
                if (ALabels[i].Caption<>'') and (AEdits[i].Text<>'') then
                begin
                DbDLiquid.Append;
                DbDLiquid['NMAQUINA']:=DbMaquinas['NMAQUINA'];
                DbDLiquid['FLIQUID']:=DateTimePicker1.Date;
                DbDLiquid['ABREVIA']:=ALabels[i].Caption;
                //DbDLiquid['UNIDADES']:=AEdits[i].Text;
                DbProducto.Locate('ABREVIA',ALabels[i].Caption,[]);
                DbDLiquid['PRODUCTO']:=DbProducto['PRODUCTO'];
                DbDLiquid['VENTAS']:=AEdits[i].Text;
                DbDLiquid['EXISTENCIAS']:=AEdits2[i].Text;
                DbDLiquid.Post;
                end;
        end;
        for i:=0 to 41 do
        begin
                if (ALabels[i].Caption<>'') and (AEdits[i].Text<>'') then
                begin
                if not DbResultPL.Locate('NMAQUINA;ABREVIA', VarArrayOf([DbMaquinas['NMAQUINA'],ALabels[i].Caption]),[])then
                begin
                        DbResultPL.Append;
                        DbResultPL['NMAQUINA']:=DbMaquinas['NMAQUINA'];
                        DbResultPL['FLIQUID']:=DateTimePicker1.Date;
                        DbResultPL['ABREVIA']:=ALabels[i].Caption;
                        DbProducto.Locate('ABREVIA',ALabels[i].Caption,[]);
                        DbResultPL['PRODUCTO']:=DbProducto['PRODUCTO'];
                        DbResultPL['EXISTANT']:=AEdits2[i].Text;
                        DbResultPL['PRCOSTO']:=DbProducto['PRCOSTO'];
                        DbResultPL['PRPUBLICO']:=DbProducto['PRPUBLICO'];
                        DbResultPL['TOTCOSTO']:=DbResultPL['ENTRADAS']*DbResultPL['PRCOSTO'];
                        DbResultPL['TOTPUBLICO']:=DbResultPL['ENTRADAS']*DbResultPL['PRPUBLICO'];
                        DbResultPL.Post;
                end
                else
                begin
                        DbResultPL.Edit;
                        DbResultPL['EXISTANT']:=AEdits2[i].Text;
                        DbResultPL.Post;
                end;
                end;
        end;
        QDatos.Close;
        Close;
except
        application.MessageBox('¡HA OCURRIDO UN ERROR AL INTENTAR GRABAR LOS DATOS!'+#13+#13+
        'Compruebe:'+#13+'- Si los campos obligatorios están rellenos.',
        '¡Atención!', mb_iconStop + mb_Ok);
        end

Muchas gracias por vuestra ayuda.
Responder Con Cita
  #2  
Antiguo 16-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
En un bucle Try .. Except, si se produce un error o excepción, el programa salta desde la línea que en ese momento se encuentre en ejecución, y en la cual se produzca el error, a la siguiente línea que aparezca después del Except.

Eso no significa para nada que las líneas anteriores no se hayan ejecutado y por lo tanto, si realizas Post estos sigan vigentes.

Si lo que quieres es cancelar los Post realizados, deberás pensar en la transacción asociada y realizar un RollBack según corresponda.

__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 16-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Gracias gluglu por tu rapida respuesta, pero podrías orientarme un poco acerca de la transaccion asociada y del rollback que me comentas.

Gracias de nuevo.
Responder Con Cita
  #4  
Antiguo 16-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
El tema de las transacciones es un tema que no es inmediato y que lamento no poder reducirte a unas cuantas líneas en un hilo.

Te recomiendo empieces por este documento de un compañero del Club, y además en este hilo se habla sobre todo del tema y encontrarás otros varios enlaces adicionales.

En cualquier caso, y perdona que te remita a ella, encontrarás inmensa cantidad de ayuda en la búsqueda del foro respecto al tema de transacciones, así como acerca del RollBack.

__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 16-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Muchas gracias gluglu, mirare lo que me has dicho, y si tengo alguna duda pondre otro hilo.

Gracias de nuevo.
Responder Con Cita
  #6  
Antiguo 16-10-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
muy buena explicacion gluglu, pero un pequeño detalle, en el caso que nos plantea el compañero se trata de tablas Paradox por lo que el asunto de las transacciones le queda grande.

En los componentes BDE se puede utilizar algo llamado cacheupdate, en ese caso las lineas antes del except deberian ser el applyupdate de cada tabla, y en el caso del except el cancelupdate

Espero te sirva y cualquier cosa preguntas, la ayuda de Delphi plantea muy bien ese punto.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #7  
Antiguo 16-10-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Espartaco, te pongo un ejemplo, con BDE y ADO.

Código Delphi [-]
  //BDE
  Database1.StartTransaction;//inicias la transacción
  try
    //Inserciones, modificaciones o eliminaciones sobre la base de datos
    Database1.Commit;//aceptas las operaciones de la base de datos
  except
   Database1.Rollback;//deshace las operaciones realizadas sobre la BD
   showmessage('Se ha producido un error');
   raise;
  end;//try

 //ADO  
 ADOConnection1.BeginTrans;
 try
   //Inserciones, modificaciones o eliminaciones sobre la base de datos 
   ADOConnection1.CommitTrans;
 except
   ADOConnection1.RollbackTrans;
   showmessage('Se ha producido un error'); 
   raise;
 end;//try


Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 17-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Efectivamente eduarcol, he mirado el link de gluglu pero es para firebird.

Al ejemplo de caro me surgen algunas dudas:

- Para utilizar este codigo imagino que no tengo que añadir ninguna libreria.

- Tengo que insertar en el form algun componente?

- y por ultimo, donde pones

Cita:
//Inserciones, modificaciones o eliminaciones sobre la base de datos
puedo poner operaciones para mas de una tabla con sus post correspondientes?

Muchas gracias a todos por vuestra ayuda.
Responder Con Cita
  #9  
Antiguo 17-10-2007
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Sí, puedes poner todas las operaciones que necesites siempre que formen "un conjunto lógico".
No pongas más de lo que necesites porque cuanto mayor sea la transacción más lento se vuelve el rollback en caso de fallo y más espacio se necesita para éste.
Responder Con Cita
  #10  
Antiguo 25-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Antes que nada perdon por tardar en probar las transacciones, pero el trabajo manda, y dar las gracias por vuestra ayuda.

He probado las transacciones como pone Caro, pero tengo un problema, que seguramente sera porque es la primera vez que utilizo esto y algo se me habra pasado.

El caso es que me da un error
Cita:
The transaction isolation level must be dirty read for local databases
y no se por que ocurre.

He insertado en el form un componente Database y en la propiedad DatabaseName he puesto el nombre del alias de la base de datos que utilizo. Antes de esto ya tenia insertados los componentes TTable y TDataSource correspondientes, a estos componentes no les he tocado despues de insertar el componente Database.

No se si me he explicado, creo que si. Gracias de nuevo.
Responder Con Cita
  #11  
Antiguo 27-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Solo para que se refresque el post en la lista y no se pierda, pues necesito la ayuda, espero me contesteis pronto.

Muchas gracias.
Responder Con Cita
  #12  
Antiguo 31-10-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
Me respondo yo.

El error era que no ponia la propiedad TransIsolation del DataBase en Dirty Read, que es obligatorio para bases de datos locales.

Gracias a todos por vuestra ayuda.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:29:51.


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