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)
-   -   ayuda excepciones (https://www.clubdelphi.com/foros/showthread.php?t=70875)

yevabas 16-11-2010 16:58:47

ayuda excepciones
 
Buenos días, perdon pero estoy comenzando con delphi, y las excepciones no las tengo muy claras, el problema es q no se en que estoy fallando, y siempre me genra este error,-...

Project bas.exe raised exception class EIBInterBaseError with message 'violatio of PRIMARY or KEY UNIQUE constraint "PK_AGENDA" .........

Si alguien me puede ayudar y decir como hago para que la excepcion o me frene el programa y continue ya que si la llave esta duplicada no debe cargarlo y nada mas,, muchas gracia spor la ayuda..


var
Form1: TForm1;

f : TextFile;
Nom,Dir,Ciu,Tel,rec1,u,s,trama: AnsiString;
a,rec: Integer;
cadena,re,sLinea: String;
i: Integer;



implementation

uses base;


{$R *.dfm}

procedure TForm1.Botton1Click(Sender: TObject);


begin
AssignFile (f,'c:\bases\base.txt');
Reset (f);
Readln(f,cadena);
CloseFile (f);
re:=AnsiMidStr(cadena, 7, 8);
TrimRight( re);
i:= StrToInt(re);

while FileExists ('c:\bases\'+cadena+'.txt') do begin
if FileExists('c:\bases\'+cadena+'.txt') then
begin
AssignFile (f,'c:\bases\'+cadena+'.txt');
Reset (f);
while not Eof( F ) do begin
ReadLn( F, sLinea );
trama:=sLinea;
Rec1:=AnsiMidStr(trama, 1, 8);
Nom:=AnsiMidStr(trama, 9, 10);
Dir:=AnsiMidStr(trama, 19, 10);
Ciu:=AnsiMidStr(trama, 29, 10) ;
Tel:=AnsiMidStr(trama, 39, 10) ;

u := StringReplace(Rec1, ' ', '', [rfReplaceAll]);
TrimRight(u);
Form1.IBTable1.Insert; // Ponemos la tabla en modo insercion

Form1.IBTable1.FieldbyName('Recibo').AsInteger := StrToInt(u);
Form1.IBTable1.FieldbyName('Nombre').AsString := Nom; //
Form1.IBTable1.FieldbyName('Direccion').AsString := Dir; //
Form1.IBTable1.FieldbyName('Ciudad').AsString := Ciu; // Insertamos
Form1.IBTable1.FieldbyName('Telefono').AsString := Tel; //

try
Form1.IBTable1.Post; // Guardamos los cambios.
except
on E: EIBInterBaseError do
begin
case E.IBErrorCode of
335544665:
else
raise;
end;
end;
end;
//************************************
end;
CloseFile (f);
//*************************************
i:=i+1;
AssignFile (f,'c:\bases\base.txt');
Rewrite( F );
WriteLn(f,'nombre'+IntToStr(i));
CloseFile (f);

end
else //if
begin
ShowMessage('No hay datos para cargar');
close;
end;
//********************************************



AssignFile (f,'c:\bases\base.txt');
Reset (f);
Readln(f,cadena);
CloseFile (f);
end;
//********************************************
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
close
end;



end.

Casimiro Noteví 16-11-2010 17:02:55

Hola, yevabas, bienvenido a clubdelphi, te aconsejo que leas nuestra guía de estilo para entendernos mejor, muchas gracias por tu colaboración.

p.d. Ese mensaje de error indica que ya tienes una clave igual a la que intentas dar de alta, o sea, que estaría repetida, por eso no te deja.

ContraVeneno 16-11-2010 18:16:58

Código Delphi [-]
with Form1.IBTable1 do begin 
 try
  Post; // Guardamos los cambios.
 except
  on  E: EIBInterBaseError do begin
   Cancel; // <<-- Aquí cancelas  los cambios...
   case E.IBErrorCode of
     335544665: begin
       //si ocurre este error
      end; 
     else
      raise; //cualquier error que no esté dentro del case muestra el mensaje
   end; //case
  end; //E:EIBInterbaseError
end; //with

Aunque no entiendo claramente cuál es el problema, con la estructura que tienes, el sistema no debería bloquearse. :confused::confused:

o tal vez lo que te haga falta es utilizar transacciones...

yevabas 16-11-2010 22:34:40

excepciones
 
Hola contraVeneno

gracias por contestarme y tan rapido ven te explico q estoy haciendo a ver si me entiendes.

lo q estoy tratando de hacer es cargar una base con datos de unos archivos planos, el archivo estaría así;

1 william carrera1 bogota 1111111
2 carlos calle2 cali 2222222
3 fernando diagonal medellin 3333333

el primer dato es la llave primaria para la base, entonces estos datos están en un archivo.txt, pero si por alguna razón se repite uno de estos datos en otro archivo o se vuelve a cargar por error este archivo, pues no se carga porq la clave ya existe, entonces no se como evitar q cuando suceda esto y me frene el programa ya copie tu código y me sale lo mismo, no se si es que estoy equivocado en la excepción q se esta generando o que pasa, lo siento pero lo de transacciones no se nada, como te dije hasta ahora son mis primeros pinos con delphi, pero necesito hacer un programa para cargar estos datos y tenerlos en una base

y muchas gracias por la colaboración q me estas prestando.

ContraVeneno 16-11-2010 23:41:36

Cita:

Empezado por yevabas (Mensaje 382496)
...entonces no se como evitar q cuando suceda esto y me frene el programa ya copie tu código y me sale lo mismo...

:confused::confused: sigo sin captar que tratas de decir...
¿qué quieres evitar?
¿quieres que continue con el siguiente registro o que se detenga por completo?

yevabas 17-11-2010 15:08:55

excepciones
 
buenos dias

Disculpa por no ser tan claro.

Correcto quiere que verifique el siguiente registro a ver si ya esta cargado o no, no quiero que frene el proceso sino continué, en este momento sale el error y la aplicación se frena mostrando un error de duplicación de llave, y no quiero que muestre ningún tipo de error de duplicación de llave primaria sino que termine de revisar todos y cargue los que falte y sino falta nada pues no haga nada pero no muestre errores que no se quede ahí y me saque de la aplicación sino que quede listo para continuar cuando uno le de clic en el botón insertar.

Espero haber sido un poco mas claro y gracias muchas gracias de verdad

ContraVeneno 17-11-2010 18:56:59

en lugar de poner "Raise" para que te muestre el mensaje del error... utilizar ShowMessage o un cuadro de diálogo.
Código Delphi [-]
with Form1.IBTable1 do begin 
 try
  Post; // Guardamos los cambios.
 except
  on  E: EIBInterBaseError do begin
   Cancel; // <<-- Aquí cancelas  los cambios...
   case E.IBErrorCode of
     335544665: begin
       //si ocurre este error
      end; 
     else
      //este ya no: raise; //cualquier error que no esté dentro del case muestra el mensaje
      showmessage(E.Message +', ' + E.ClassName +', '+ E.IBErrorCode);
   end; //case
  end; //E:EIBInterbaseError
end; //with

Con esto te muestra el mensaje, pero no lo hace como una excepción y debería continuar con el siguiente proceso.

yevabas 18-11-2010 16:33:17

gracias por tu ayuda ya esta funcionando no se porq antes no lo hacia.
estaría cometiendo algún error pero ya quedo como quería de nuevo muchas gracias por el tiempo que me dedico y por la gran ayuda prestada...

ContraVeneno 18-11-2010 21:25:47

Cita:

Empezado por yevabas (Mensaje 382660)
...no se porq antes no lo hacia...

Pues si solo cambiaste el "raise" por un mensaje... pues era eso...

El detalle es que la instrucción "Raise" te genera la excepción en el programa y este le da todo el tratamiento que se le da a un error.

Al cambiarlo por un mensaje, pues es solo eso, un mensaje, no hay error y el programa continua.


La franja horaria es GMT +2. Ahora son las 12:49:09.

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