PDA

Ver la Versión Completa : Key Violation


servicomp
11-05-2004, 16:14:04
Hola compañeros

Hace pocos dias se me ha dañado una de las tablas de la base de datos que tenia unos indices. Segui los procedimientos acostumbrados y recomendados en el foro, se reconstruyeron los indices y se reindexo de nuevo. pero al momento de almacenar algo en esta tabla nos aparace un mensaje de error de Key violation.

El proceso lo he repetido varias veces pero el problema persiste y la calidad de los datos en la tabla tambien los hemos revisado, asi como la conexión del DBE.

Agradeciendo de antemano la atención prestada

andres1569
11-05-2004, 17:31:34
Hola:

Es necesario que indiques con que SGDB trabajas, intuyo que es Paradox. ¿Te has asegurado de que el nuevo registro no repite la clave primaria (eso da un "key violation"). Si no es así, puede que no se haya corregido bien la tabla, en ese caso esste hilo pasará al foro de Tablas Planas, donde se tratan asuntos relacionados específicamente con dichos problemas.

Saludos

servicomp
14-05-2004, 22:34:12
Efectivamente el problema estaba en la indice primario, ya que estaba usando una variable de autoincremento, lo que estaba pasando era que tenia 245 registros enumerados desde el 1..245, pero al tratar de ingresar un nuevo registro este me colocaba el 164 como el registro que continuaba. por más que he tratado de aparezca el registro 246 como un nuevo registro nno se ha podido.
Parece que la solución sera copiar la tabla en una nueva y luego renombrarla.

sanxpue
14-05-2004, 22:47:52
No no no es esa la salucion.. weno si pero no.. je
Vete al DataBase DeskTop, edita la tabla y en lugar de + ponle I la salvas la vuelves a abrir y ahora al I lo cambias por +, te regenera todo :eek:

roman
14-05-2004, 23:02:54
Parece que la solución sera copiar la tabla en una nueva y luego renombrarla.

Aquí te va otra:

1. Respalda la tabla
2. Ejecuta SetAutoInc(TableFileName, 245);

donde


procedure SetAutoInc(TableFileName: String; NewAutoInc: Integer);
var
FileHandle: Integer;

begin
FileHandle := FileOpen(TableFileName, fmOpenReadWrite);
FileSeek(FileHandle, $49, soFromBeginning);
FileWrite(FileHandle, NewAutoInc, 2);
FileClose(FileHandle);
end;


La tabla debe estar cerrada.

Explicación: El archivo *.db guarda el último valor autoinc en el offset $49 (en Paradox). La rutina simplemente escribe el valor deseado (245 en tu caso) de manera que el siguiente valor será 246.

Lo acabo de probar y funciona.

// Saludos

Paoti
15-05-2004, 02:06:51
Hola!!!

Roman, decime, donde encontraste ese tipo de información!!!!?


De haberlo sabido meses antes, me hubiera podido dormir algunas noches más tranquilo...)

Gracias!!!!


nos vemos

roman
15-05-2004, 06:23:44
Roman, decime, donde encontraste ese tipo de información!!!!?


Muy fácil. El siguiente es un enlace que ningún programador de Delphi puede omitir:

Grupos de noticias de Borland (http://groups.google.com.mx/groups?hl=es&lr=&ie=UTF-8&group=borland.public.delphi)

// Saludos