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)
-   -   Reparar Tablas Paradox (https://www.clubdelphi.com/foros/showthread.php?t=46282)

tarco35 27-07-2007 20:02:35

Reparar Tablas Paradox
 
Saludos a todos los foreros.. Tengo un programa terminado en Delphi 6 con Paradox 7, el caso es que a veces las tablas se corrompen (mas de lo que me gustaria) ¿Alguien me puede sugerir algun metodo para implementarle al programa una opcion o procedimiento para chequeo y reparacion de las tablas?? de tal forma que cuando inicialize la aplicacion verifique que todas las tablas necesarias estan correctas.
(Ya tengo implementado un sistema de copias de respaldo, pero tambien me han fallado estas...)
Gracias por su interes...
Reciban un cordial Saludo.

PD: ya se que FireBird es mejor que Paradox, pero ya esta acabado...

cHackAll 27-07-2007 20:40:28

EPA! yo no sabía que las BDs Paradox tuvieran problemas de integridad tan "marcados"... a mi me parece que hay alguna fallita en el diseño; cuentanos un ejemplillo de lo que sucede para ver que se podría hacer.

PD: si el sistema vale la pena aconsejaría que comiences a pensar en migrar a otro SGBD...

tarco35 29-07-2007 14:29:25

Problema con los AutoInc
 
He revisado las tablas y el problema me surge de los campos AutoIncrementales que les tengo puestos de Key primaria y el problema surge cuando se va la luz (problema antiguo, ya lo se) que despues las tablas que usan ese sistema me saltan con un problema de Key Violation al intentar añadir un registro. Uso el programa DBExplor32 para reindexar y empaquetar pero no resuelve el problema... Usando el Database Desktop reestructuro la tabla añadiendo otro autoincremental de llave primaria y borrando la anterior y asi logro corregir la tabla.... !!vaya solucion de pena....!!!! ¿alguna sugerencia para que esto no me pase??...
Gracias por su tiempo...
Un Saludo

eduarcol 29-07-2007 14:37:46

Ok respecto a la integridad de las tablas, a mi tambien me ha pasado pero con ayuda del club lo solucione chequea este hilo, y para que no suceda revisa este articulo de paradox en red, simplemente genial

tarco35 29-07-2007 15:27:06

No va
 
Gracias por tu respuesta... probe las dos herramientas de reparacion de tablas pero ninguna de ellas es capaz de reconstruir el autoincremental... o sea que sigo con el mismo problema...
Gracias ...

cHackAll 30-07-2007 10:34:21

Cita:

Empezado por tarco35
...el problema surge cuando se va la luz...

Vaya en tal caso, ántes de tener que solucionar el problema; por qué no intentas prevenirlo? no creo que "cueste" mucho cerrar la conexión con la BD, hacer un backup y restaurar la conexion cada cierto intervalo de minutos. Al iniciar tu aplicacion verificas si se ha cerrado adecuadamente el programa y dependiendo de eso restauras o no el backup.

Saludos.

eduarcol 30-07-2007 14:05:20

y un UPS???

cHackAll 30-07-2007 16:07:29

Mejor aún.

egostar 31-07-2007 00:17:23

Me pregunto si tus tablas siempre estan abiertas:confused:, de ser así es necesario que trates de mantener cerradas las tablas hasta que realizas una operación de insertar, borrar, actualizar.

Con eso minimizaras los problemas de corrupcion de tablas, ademas de lo ya mencionado de tener un UPS.

Salud OS

tarco35 03-08-2007 22:06:44

Aun Asi
 
Disculpen la tardanza pero he tenido un problemilla de conexion a internet... El caso es que las tabla, no todas, pero si algunas han de estar permanentemente abiertas porque la aplicacion tiene que realizar apuntes de cronometros y cosas así.... por ahora la solucion que he aportado ha sido poner un UPS y ponerle al programa una opcion de cerrado de emergencia, que guarda todos los vectores de datos antes de salir y cierra las tablas... Pero evidentemente no es solucion definitiva ¿Alguien conoce alguna forma de reconstruir este autoincremental siendo llave primaria de la tabla?
Gracias por su colaboracion

egostar 03-08-2007 22:57:19

Cita:

Empezado por tarco35 (Mensaje 220149)
Disculpen la tardanza pero he tenido un problemilla de conexion a internet... El caso es que las tabla, no todas, pero si algunas han de estar permanentemente abiertas porque la aplicacion tiene que realizar apuntes de cronometros y cosas así.... por ahora la solucion que he aportado ha sido poner un UPS y ponerle al programa una opcion de cerrado de emergencia, que guarda todos los vectores de datos antes de salir y cierra las tablas... Pero evidentemente no es solucion definitiva ¿Alguien conoce alguna forma de reconstruir este autoincremental siendo llave primaria de la tabla?
Gracias por su colaboracion

Me imagino que usas un tipo Timer para ingresar datos a las tablas, porque no usar el evento onTimer para grabar en la tabla, de esa forma no tienes porque tener abiertas las tablas.

Salud OS

tarco35 05-08-2007 20:09:27

Es por USB
 
Los datos que tengo que anotar y cronometrar los adquiero a traves del puerto USB y despues de decodificarlos hago los apuntes necesarios... reitero mi pregunta... ¿se puede reconstruir el autoincremental de una tabla?
Gracias

basti 06-08-2007 11:09:27

Este código es para reparar los campos Autonuméricos en paradox. El procedimiento ActualizarAutoInc es cortesía de Román.

Código Delphi [-]

procedure ResetAutoinc(Tabla: TTable);

  function HayAutoinc : string;
  var
    i : Integer;
  begin
    Result := '';
    i := 0;
    while (i < Tabla.FieldCount) and (Result = '')  do
    begin
      if Tabla.Fields[i].DataType = ftAutoinc then
        Result := Tabla.Fields[i].FieldName;
      i := i + 1;
    end;
  end;

  function ValorAutoinc(campo : string) : Integer;
  var
    q : TQuery;
  begin
    q := TQuery.Create(self);
    q.DatabaseName := Tabla.DatabaseName;
    q.SQL.Add(format('Select max(%s) as result from %s', [campo, Tabla.TableName]));
    q.Active := True;
    Result := q.FieldByName('result').AsInteger;
  end;

  procedure ActualizarAutoinc(valor : Integer);
  var
    mystream : tfilestream;
    AParams : TStringList;
    dir : string;
  begin
    AParams := TStringList.Create;
    AParams.Clear;
    Session.GetAliasParams(Tabla.DatabaseName, AParams);
    Dir := Copy(AParams.Strings[0],6,255);
    if dir[length(dir)] <> '\' then
      dir := dir + '\';
    AParams.Free;

    mystream := tfilestream.Create(dir + tabla.TableName,
                fmOpenWrite + fmShareExclusive);
    try
      mystream.Seek(73, soFromBeginning);
      mystream.Writebuffer(valor, SizeOf(valor));
    finally
      mystream.Free;
    end;
  end;

var
  valor : Integer;
  campo : string;
begin
  try
    Tabla.Active := True;
    campo := HayAutoinc;
    if campo <> '' then
    begin
      valor := ValorAutoinc(campo);
      Tabla.Active := False;
      ActualizarAutoinc(valor);
    end;
  finally
    if Tabla.Active then
      Tabla.Active := False;
  end;
end;

tarco35 12-08-2007 12:26:59

Lo pruebo
 
gracias por el codigo... voy a probarlo a ver como va.... gracias de nuevo


La franja horaria es GMT +2. Ahora son las 23:50:36.

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