PDA

Ver la Versión Completa : Reparar Tablas Paradox


tarco35
27-07-2007, 20:02:35
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
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 (http://www.clubdelphi.com/foros/showthread.php?t=10153), y para que no suceda revisa este articulo de paradox en red (http://www.clubdelphi.com/trucos/index.php?id=105&scroll=0&scrollb=0), simplemente genial

tarco35
29-07-2007, 15:27:06
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
...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
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
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
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.



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
gracias por el codigo... voy a probarlo a ver como va.... gracias de nuevo