PDA

Ver la Versión Completa : Como trabajar las llaves primarias en red


javicho_villa
19-04-2006, 20:07:03
Hola a todos:
Ante todo muchas gracias por la leer este hilo, tengo un problema al guardar registros en Paradox en varios terminales a la vez, el problema se cebtra en generar la clave primaria en los terminales.

probe con un campo autoincremental pero cuando un registro se elimina se pierde ese numero, siendo escencial mantener y reutilizar estos numeros.

Como veran no se puede poner en exclusivo la tabla por que se esta compartioendo con varios terminales.

Cual seria una Solución viable.(uso paradox y delphi 6.0)

Nuevamente Muchas Gracias.

Javier Villa.

Neftali [Germán.Estévez]
19-04-2006, 20:20:24
Si no necesitas que sean correlativos, es decir, que puedes aprovechar los que se borran, yo utilizaría un proceso paralelo que reutilice los números, ya sea en el momento de asignarlos o utilizando una tabla intermedia que guarde los libres.

En todo caso debes eliminar la característica de autoincremental de campo.

javicho_villa
19-04-2006, 20:34:15
Lo que mas molesta es cuando varios usuarios quieren grabar al mismo tiempo en diferentes terminales, cual es el procedimiento a seguir en ese caso.

Lepe
19-04-2006, 21:38:58
Para la clave primaria usaría un autoincremental.
Para el código que sea correlativo, usaría otro campo distinto con un índice.

Hay muchas formas de hacerlo, una de ellas:
- En el OnNewRecord, buscas el hueco del correlativo y lo asignas al campo.
- En el BeforePost y asegurándote que la tabla está en estado dsInsert (se está insertando pero todavía no se ha guardado). Buscas de nuevo el correlativo por si alguien ha grabado mientras este usuario estaba pensando en las musarañas ;).

Esto tiene fallos de todas formas, porque imagina que se da un registro de alta, se guarda, otro usuario hace lo mismo y despues el primer usuario borra su registro. Obviamente queda un hueco (que se puede aprovechar la próxima vez que se inserte un registro).

La rutina para volverse loco es esta:

procedure TDTM.BuscaHuecoCliente(const idActual: Integer);
var
nextIdx, hueco: Longint;
qryHuecos: Tquery;
salir: Boolean;

begin
if not (dtm.TblClientes.state in [dsInsert]) then
begin
frmmdi.Notifica(mAviso,
'Solo se puede buscar huecos al dar de alta un nuevo Cliente', NIL);
exit
end;

hueco := 0;
salir := false;

qryHuecos := Tquery.Create(nil);
try
qryHuecos.DatabaseName := gl.DB.Alias; // alias del bde
qryHuecos.SQL.Text := 'select idCliente from Clientes order by idCliente';
qryHuecos.SessionName := dtm.DtbPPal.SessionName; //session del TDatabase

qryHuecos.Prepare;
qryHuecos.Open;
if not qryHuecos.IsEmpty then
begin
qryHuecos.First;
while not ((qryHuecos.Eof) or salir) do
begin
inc(hueco);
nextIdx := qryHuecos.Fields[0].AsInteger;
if nextIdx - hueco <> 0 then
salir := (hueco <> idactual)
else
qryHuecos.Next;
end; //while
end; // qry vacia

qryHuecos.Close;
finally
FreeAndNil(qryHuecos);
end; // finally
if salir then
dtm.TblClientesIdCliente.AsInteger := hueco
else
dtm.TblClientesIdCliente.AsInteger := nextId +1;
end;

Es penoso porque hay que hacer una búsqueda secuencial para encontrar los huecos.... pero no hay más remedio.

OFFtopic: ¿Quién será el que se ha cargado las etiquetas delphi :D :D

Saludos