Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-01-2011
Avatar de vmorillos
vmorillos vmorillos is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 17
Poder: 0
vmorillos Va por buen camino
Smile Transaccion, captura de error

Hola a todos, aqui pidiendo su consejo nuevamente. Debo mencionar primero que uso Zeos 6.6.6, mysql 5 y delphi 7.
Tengo tres tablas: una factura, el detalle de la factura (zDetalle) y una tabla producto. La tabla detalle como es logico tiene una llave compuesta por el codigo de la factura y el codigo de los productos.
Lo que quiero es capturar el error al momento de insertar una llave duplicada en la tabla detalle, para lo cual uso el siguiente codigo:

Código Delphi [-]procedure TForm1.Button1Click(Sender: TObject); var iCodigoProducto,iCodigoFactura,iCantidad : integer; fPrecio : Double; begin iCodigoProducto:=StrToInt(edProducto.Text); iCodigoFactura:=StrToInt(edFactura.Text); iCantidad:=StrToInt(edCantidad.Text); fPrecio:=StrToFloat(edPrecio.Text); ZConnection1.StartTransaction; try zDetalle.Insert; zDetalleProdCodigo.Value:=iCodigoProducto; zDetalleFactCodigo.Value:=iCodigoFactura; zDetalleCantidad.Value:=iCantidad; zDetallePrecio.Value:=fPrecio; zDetalle.Post; // <--- El error es lanzado aqui y no en el EXCEPT ZConnection1.Commit; except on E:EZSQLException do begin ShowMessage('Error codigo: '+IntToStr(E.ErrorCode)+' - '+E.Message); ZConnection1.Rollback; end; end; end;


Pero el error es lanzado justo después de intentar el post y nunca entra al except y muestra el showmessage. Es extraño porque he puesto este otro codigo en otro botón y si entra al except:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
      ZQuery1.SQL.Clear;
      ZQuery1.SQL.Add('SELECT FROM');
      ZQuery1.Active:=false;

      ZConnection1.StartTransaction;

      try
            ZQuery1.active:=true;

            ZConnection1.Commit;
      except
            on E:EZSQLException do
            begin
                ShowMessage('Error codigo: '+IntToStr(E.ErrorCode)+' - '+E.Message);
                ZConnection1.Rollback;
            end;

      end;
end;

Espero su ayuda y muchas gracias de antemano a todos.

PD: En el uses he agregado "ZDbcIntfs"
__________________
dibe
Responder Con Cita
  #2  
Antiguo 20-01-2011
Avatar de vmorillos
vmorillos vmorillos is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 17
Poder: 0
vmorillos Va por buen camino
Smile Salieron mal las etiquetas

Hola a todos, aqui pidiendo su consejo nuevamente. Debo mencionar primero que uso Zeos 6.6.6, mysql 5 y delphi 7.
Tengo tres tablas: una factura, el detalle de la factura (zDetalle) y una tabla producto. La tabla detalle como es logico tiene una llave compuesta por el codigo de la factura y el codigo de los productos.
Lo que quiero es capturar el error al momento de insertar una llave duplicada en la tabla detalle, para lo cual uso el siguiente codigo:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
      iCodigoProducto,iCodigoFactura,iCantidad  : integer;
      fPrecio                                   : Double;
begin
      iCodigoProducto:=StrToInt(edProducto.Text);
      iCodigoFactura:=StrToInt(edFactura.Text);
      iCantidad:=StrToInt(edCantidad.Text);
      fPrecio:=StrToFloat(edPrecio.Text); 


      ZConnection1.StartTransaction;
      try
            zDetalle.Insert;

            zDetalleProdCodigo.Value:=iCodigoProducto;
            zDetalleFactCodigo.Value:=iCodigoFactura;
            zDetalleCantidad.Value:=iCantidad;
            zDetallePrecio.Value:=fPrecio;

            zDetalle.Post;        // <--- El error es lanzado aqui y no en el EXCEPT
            ZConnection1.Commit;
      except
            on E:EZSQLException do
            begin
                ShowMessage('Error codigo: '+IntToStr(E.ErrorCode)+' - '+E.Message);
                ZConnection1.Rollback;
            end;

      end;
end;


Pero el error es lanzado justo después de intentar el post y nunca entra al except y muestra el showmessage. Es extraño porque he puesto este otro codigo en otro botón y si entra al except:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
      ZQuery1.SQL.Clear;
      ZQuery1.SQL.Add('SELECT FROM');
      ZQuery1.Active:=false;

      ZConnection1.StartTransaction;

      try
            ZQuery1.active:=true;

            ZConnection1.Commit;
      except
            on E:EZSQLException do
            begin
                ShowMessage('Error codigo: '+IntToStr(E.ErrorCode)+' - '+E.Message);
                ZConnection1.Rollback;
            end;

      end;
end;

Espero su ayuda y muchas gracias de antemano a todos.

PD: En el uses he agregado "ZDbcIntfs"
__________________
dibe
Responder Con Cita
  #3  
Antiguo 20-01-2011
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Hola vmorillos

No es por querer modificar tu forma de trabajar, pero veo que estas insertando los datos directamente a la tabla.. que pasa si una vez que ingresa todo la persona se arrepiente de crear la Factura....

Bueno, tampoco quiero imponerte mi forma de trabajar (en realidad si...eso quiero )

Yo para estos casos utilizo una Tabla de Memoria, en donde inserto todos los datos de los productos (para el caso, Detalle Factura)...

En el caso de insertar un codigo de producto que ya esta insertado, primero pregunto si dicho articulo existe.... si existe, despues pregunto si ya ha sido ingresado en el Detalle Factura... si ya fue ingresado lanzo mensaje de que el articulo ya existe, desea modificar o ingresar otro codigo...


Ahora bien, para tu caso tambien se puede utilizar...

solo tienes que hacer una consulta antes de insertar el Detalle

por ejemplo, creo que seria algo así


Cita:
Select *
From Detalle_Factura
Where Factura_Producto=iCodigoProducto

If Detalle_Factura.RecordCount > 0 Then
// Aqui informo de que ya esta
Else
// Aqui Inserto el Articulo
Bueno, esto es algo así de memoria, quizas con tus componentes cambie un poco el formato


antes
Salu2
__________________
BlueSteel

Última edición por BlueSteel fecha: 20-01-2011 a las 15:46:18.
Responder Con Cita
  #4  
Antiguo 20-01-2011
Avatar de vmorillos
vmorillos vmorillos is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 17
Poder: 0
vmorillos Va por buen camino
Los codigos de los productos los jalo directamente de la tabla producto, por eso no hay problema. Y respecto de saber si se esta duplicando la llave compuesta (factura, producto) lo que trato es de no sobrecargar a la base de datos (mysql) tal como lo dice Delphius en este hilo : http://www.clubdelphi.com/foros/showthread.php?t=46215

Ademas este es un ejemplo, el código de mi programa es otro. Solo he tomado la parte que no me ejecuta correctamente, que es el ingreso al EXCEPT.

Gracias BlueSteel.
__________________
dibe
Responder Con Cita
  #5  
Antiguo 20-01-2011
Avatar de vmorillos
vmorillos vmorillos is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 17
Poder: 0
vmorillos Va por buen camino
Smile Halle lo que buscaba

Probando y probando he encontrado lo que buscaba

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
      iCodigoProducto,iCodigoFactura,iCantidad  : integer;
      fPrecio                                   : Double;
begin
      iCodigoProducto:=StrToInt(edProducto.Text);
      iCodigoFactura:=StrToInt(edFactura.Text);
      iCantidad:=StrToInt(edCantidad.Text);
      fPrecio:=StrToFloat(edPrecio.Text);


      ZConnection1.StartTransaction;

      try
            zDetalle.Insert;

            zDetalleProdCodigo.Value:=iCodigoProducto;
            zDetalleFactCodigo.Value:=iCodigoFactura;
            zDetalleCantidad.Value:=iCantidad;
            zDetallePrecio.Value:=fPrecio;

            zDetalle.Post;
            ZConnection1.Commit;
      except
            //on E: EZSQLException do   //<--- Ya no uso esta excepcion
            on E:EZDatabaseError do     //<--- Esta esta mejor
            begin
                case E.ErrorCode of
                  1062:                 // Este era el codigo que buscaba
                        begin
                              ShowMessage('Duplicado');     // El mensaje que yo quiera
                        end
                  else
                        ShowMessage('Error codigo: '+IntToStr(E.ErrorCode)+' - '+E.Message);
                end;
                ZConnection1.Rollback;
                zDetalle.Cancel;

            end;

      end;

end;

Gracias a todos por su interés.
Saludos
__________________
dibe
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Procedimiento almacenado no captura error Carlos Hurtado Firebird e Interbase 0 27-01-2007 15:07:39
controlar error en transacción kikodelphi MS SQL Server 2 12-05-2006 02:53:09
Captura de error en Procedimiento almacenado lucasarts_18 Firebird e Interbase 11 28-12-2005 15:02:42
Devolver código de error de una transacción kikodelphi MS SQL Server 7 18-10-2005 14:41:49
captura de Error de Interbase digital Firebird e Interbase 2 25-06-2003 10:22:14


La franja horaria es GMT +2. Ahora son las 01:18:46.


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