Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   capturar errores (https://www.clubdelphi.com/foros/showthread.php?t=40391)

jzginez 14-02-2007 22:03:01

capturar errores
 
Hola amigos, estoy usando delphi 7, firebird 1.5 y las fibplus
espero poder explicarme bien.

en mi base de datos tengo 2 tablas:
proveedores:
ID integer
Nombre Varchar(30)
etc. etc.

y compras:
ID integer
ID_Proveedor Integer
Monto decimal(15,2)
etc. etc

y las relaciono con:
Código SQL [-]
ALTER TABLE COMPRAS ADD CONSTRAINT FK_COMPRAS01 FOREIGN KEY (ID_PROVEEDOR) REFERENCES PROVEEDORES (ID);

Con lo cual como debe de ser al intentar borrar un proveedor si existe una compra no me lo permite, eso esta bien el problema es que en delphi e intentado caturar el error para que en lugar de que aparesca el mensage de error de firebird/delphi ("DtmDatos.pFDSProveedores.DeleteQuery violation of FOREING KEY constraint "FK_COMPRAS_1" on tabla "compras") aparesca un mensaje de error personalizado, no logro hacer que este desaparesca o mas bien no aparesca en la pantalla y entonces lo que tengo son dos errores el personalisado y el de delphi, alguien me puede ayudar a evitar que el mensage de error de delphi

Gracias

ArdiIIa 14-02-2007 22:10:18

En el evento omUpdateerror, puede poner algo como esto..
Código Delphi [-]
procedure TDataModule.IBQuery_UpdateError(
  DataSet: TDataSet; E: EDatabaseError; UpdateKind: TUpdateKind;
  var UpdateAction: TIBUpdateAction);
begin
UpdateAction :=  TIBUpdateAction (uaAbort);
Raise EDataBaseError.Create( E.Message);
Dataset.Refresh;
end;

y generar tu propio error....

Caral 14-02-2007 22:12:24

Hola
No se si te servira, pero yo hago una Excepcion al modulo de datos y asi evito el mensaje de delphi.
Código Delphi [-]
 on E:Exception do
         begin
            DataModule1.AC1.RollbackTrans;
            MessageDlg('Se ha producido un error, por favor contacte al administrador.',mtError,[mbok],9);
         end;
Tal vez e sirva o te guie.
Saludos

jzginez 15-02-2007 18:37:12

Gracias compañeros, oye Caral me podrias explicar un poco mas como haces tu excepcion porque lo que encontre en un manual de excepciones es parecido a lo que me comentas pero no me funciona

Gracias

Caral 15-02-2007 18:45:12

Hola jzginez
Cuando voy a hacer un UpDate o un Delete o una insercion o algo, comienzo por un:
Código Delphi [-]
DataModule1.AC1.BeginTrans;
Si la operacion se esta realizando hago un:
Código Delphi [-]
 DataModule1.AC1.CommitTrans;
Y si la operacion no se realizo correctamente hago una Exception, haciendo un:
Código Delphi [-]
 DataModule1.AC1.RollbackTrans;
Y enviando un mensaje, no se si me explico bien, pero seguro algun maestro te lo puede explicar mejor.
Saludos

Caral 15-02-2007 18:47:22

Hola este es un pedacito de codigo que te dira mas.
Código Delphi [-]
procedure TFOrdProd.BitBtn10Click(Sender: TObject);
begin
   If MessageDlg('¿Está seguro que desea eliminar la pieza # '+QOrdenProdItemNumSerie.AsString+' de la orden '+QOrdProdCodOrden.AsString+'?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
   begin
      DataModule1.AC1.BeginTrans;
      try
         QTemp.SQL.Text := 'Delete * from OrdenProdItem where NumSerie = '+QOrdenProdItemNumSerie.AsString;
         QTemp.ExecSQL;
         QTemp.SQL.Text := 'Update Series set Estado = ''Eliminado'' where NumSerie = '+QOrdenProdItemNumSerie.AsString;
         QTemp.ExecSQL;
         DataModule1.AC1.CommitTrans;
      except
         on E:Exception do
         begin
            DataModule1.AC1.RollbackTrans;
            MessageDlg('Se ha producido un error, por favor contacte al administrador.',mtError,[mbok],9);
         end;//on
      end; //try
      QOrdenProdItem.Close;
      QOrdenProdItem.Open;
   end;
end;
Por supuesto los nombres de las tablas y otros son los mios.:D
Saludos

jzginez 15-02-2007 19:05:57

Gracias Caral, voy a tratar de adaptar tu código al mio porque veo que tu usas un BitBtn y a este le asignas el código para borra en la tabla y lo que yo tengo es un actionlist con las acciones predeterminadas para bases de datos y por ejemplo tu tienes
Código Delphi [-]
begin
   If MessageDlg('¿Está seguro que desea eliminar la pieza # '+QOrdenProdItemNumSerie.AsString+' de la orden '+QOrdProdCodOrden.AsString+'?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
   begin
en este boton y eso yo lo tengo el evento beforedelete de la tabla por lo cual no tengo un momento en donde capturar el error


La franja horaria es GMT +2. Ahora son las 08:08:07.

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